Ejemplo n.º 1
0
def ssh_cmd(server, user, username, auth, command, auth_type, mark):
    ip = server.ip
    port = server.port
    ssh = paramiko.SSHClient()
    # know_hosts
    ssh.load_system_host_keys()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    if auth_type == 'SSH-PASSWORD':
        ssh.connect(ip, port=port, username=username, password=auth)
    else:
        private_key = paramiko.RSAKey.from_private_key_file(auth)
        ssh.connect(ip, port=port, username=username, pkey=private_key)
    stdin, stdout, stderr = ssh.exec_command(command)
    out = stdout.read().decode('utf-8')
    error = stderr.read().decode('utf-8')
    ssh.close()
    event_type = 'CommandExcution'
    if stdout.channel.recv_exit_status() == 0:
        result = True
        event_log = out
    else:
        result = False
        event_log = error
    write_ops_tem(user, server, command, event_type, event_log, result, mark)
    return ip, out, error, result
Ejemplo n.º 2
0
def ssh_file(server, user, username, auth, files, remote_path, auth_type, tran_type, mark):
    # print(ip, port, username, auth, files, auth_type, tran_type)
    ip = server.ip
    port = server.port
    scp = paramiko.Transport((ip, port))
    if auth_type == 'SSH-PASSWORD':
        scp.connect(username=username, password=auth)
    else:
        private_key = paramiko.RSAKey.from_private_key_file(auth)
        scp.connect(username=username, pkey=private_key)
    sftp = paramiko.SFTPClient.from_transport(scp)
    return_code = {'success': [], 'fail': []}
    if tran_type == 'sendfile':
        event_type = "SendFile"
        for f in files:
            local_file = 'filesend/' + f
            remote_file = '{0}/{1}'.format(remote_path, f)
            event_log = 'sending file {0} to {1}'.format(f, ip)
            try:
                sftp.mkdir(remote_path)
            except IOError:
                pass
            # print(local_file,remote_file)
            try:
                sftp.put(local_file, remote_file)
                result = True
                return_code['success'].append(event_log)
            except Exception:
                result = False
                return_code['fail'].append(event_log)
            write_ops_tem(user, server, '', event_type, event_log, result, mark)
    else:
        event_type = "GetFile"
        remote_file = remote_path.split('/')[-1]
        local_file = '{0}/{1}'.format("filerev", remote_file)
        event_log = 'get file {0} from {1}'.format(remote_file, ip)
        try:
            sftp.get(remote_path, local_file)
            result = True
            return_code['success'].append(event_log)
        except Exception:
            result = False
            return_code['fail'].append(event_log)
        write_ops_tem(user, server, '', event_type, event_log, result, mark)
    sftp.close()
    scp.close()

    return return_code
Ejemplo n.º 3
0
def transfer_file():
    global track_num
    # pool.apply_async()
    servers_id_list = request.form.getlist('servers')
    remote_user_id = request.form.get('remote_user')
    trans_type = request.form.get('trans_type')
    remote_path = request.form.get('remote_path')
    servers_id_list = list(set(servers_id_list))

    if trans_type == 'getfile':
        files = request.form.get('files')
        event_type = 'GetFile'
        log_type = 'BatchGetFile'
        total_num = len(servers_id_list)
    else:
        files = request.form.getlist('files')
        event_type = 'SendFile'
        log_type = 'BatchSendFile'
        total_num = len(servers_id_list) * len(files)

    msg = {"success": [], "fail": []}
    remote_user = RemoteUser.query.get(remote_user_id)
    mark = track_num + 1
    track_num += 1
    server_remote_user = []
    for server_id in servers_id_list:
        s = ServerRemoteUser.query.filter_by(server=Server.query.get(server_id),
                                             remote_user=remote_user).first()
        if s:
            server_remote_user.append(s)
        else:
            result = False
            no_auth_server = Server.query.get(server_id)
            if trans_type == 'getfile':
                log = 'get {0} from {1} '.format(files, no_auth_server.ip)
                event_log = log + 'no auth user'
                msg["fail"].append(log)
                write_ops_tem(g.user, no_auth_server, '', event_type, event_log, result, mark)
            else:
                for f in files:
                    log = 'send {0} to {1} '.format(f, no_auth_server.ip)
                    event_log = log + 'no auth user'
                    msg['fail'].append(log)
                    write_ops_tem(g.user, no_auth_server, '', event_type, event_log, result, mark)

    uid = g.user.id
    user = User.query.get(uid)
    results = []
    pool = Pool(PROCESS_NUMBER)
    start_time = datetime.now()
    for s in server_remote_user:
        server = s.server
        results.append(pool.apply_async(ssh_file, args=(
            server, user, remote_user.remote_username, s.auth_password,
            files, remote_path, s.auth_type.name, trans_type, mark)))

    pool.close()
    pool.join()

    for r in results:
        message = r.get()
        print(message)
        msg['fail'].extend(message['fail'])
        msg['success'].extend(message['success'])
    finish_time = datetime.now()
    write_ops(g.user, remote_user, "", total_num,
              len(msg['success']), len(msg['fail']), start_time, finish_time, log_type, mark)
    return jsonify(msg)
Ejemplo n.º 4
0
def execute_cmd():
    global track_num
    # pool.apply_async()
    servers_id_list = request.form.getlist('servers')
    remote_user_id = request.form.get('remote_user')
    command = request.form.get('command')
    servers_id_list = list(set(servers_id_list))

    # get auth and no_auth
    remote_user = RemoteUser.query.get(remote_user_id)
    server_remote_user = []
    event_type = 'CommandExcution'
    event_log = 'no auth in server'
    msg = {"success": [], "fail": []}
    mark = track_num + 1
    track_num += 1
    result = False
    for server_id in servers_id_list:
        s = ServerRemoteUser.query.filter_by(server=Server.query.get(server_id),
                                             remote_user=remote_user).first()
        if s:
            server_remote_user.append(s)
        else:
            no_auth_server = Server.query.get(server_id)
            msg['fail'].append(no_auth_server.ip)
            write_ops_tem(g.user, no_auth_server, command, event_type, event_log, result, mark)

    # multiprocessing to execute command
    results = []
    pool = Pool(PROCESS_NUMBER)
    uid = g.user.id
    user = User.query.get(uid)
    print(mark)
    for s in server_remote_user:
        server = s.server
        results.append(pool.apply_async(ssh_cmd, args=(
            server, user, remote_user.remote_username, s.auth_password,
            command, s.auth_type.name, mark)))
    pool.close()
    pool.join()

    # get the result
    total_num = len(servers_id_list)
    success_num = 0
    fail_num = total_num - len(server_remote_user)
    start_time = datetime.now()
    for r in results:
        message = r.get()
        print(message)
        if message[3]:
            success_num += 1
            msg['success'].append(message[0])
        else:
            fail_num += 1
            msg['fail'].append(message[0])

    finish_time = datetime.now()
    log_type = 'BatchRunCommand'
    write_ops(g.user, remote_user, command, total_num,
              success_num, fail_num, start_time, finish_time, log_type, mark)

    return jsonify(msg)