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
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
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)
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)