# coding: utf-8 import sys reload(sys) sys.setdefaultencoding('utf8') import os import re import time import textwrap import getpass import readline import django from multiprocessing import Pool os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings' if django.get_version() != '1.6': django.setup() from jumpserver.api import ServerError, User, Asset, Jtty, get_object from jumpserver.api import logger from jumpserver.api import BisGroup as AssetGroup login_user = get_object(User, username=getpass.getuser()) def color_print(msg, color='red', exits=False): """ Print colorful string. 颜色打印字符或者退出 """ color_msg = {'blue': '\033[1;36m%s\033[0m', 'green': '\033[1;32m%s\033[0m', 'red': '\033[1;31m%s\033[0m'} print color_msg.get(color, 'blue') % msg if exits: time.sleep(2) sys.exit() def verify_connect(user, option): """ Check user was permed or not . Check ip is unique or not. 鉴定用户是否有该主机权限 或 匹配到的ip是否唯一 """ ip_matched = [] try: assets_info = login_user.get_asset_info() except ServerError, e: color_print(e, 'red') return False for ip, asset_info in assets_info.items(): if option in asset_info[1:] and option: ip_matched = [asset_info[1]] break for info in asset_info[1:]: if option in info: ip_matched.append(ip) logger.debug('%s matched input %s: %s' % (login_user.username, option, ip_matched)) ip_matched = list(set(ip_matched)) if len(ip_matched) > 1: # 如果匹配ip不唯一 ip_comment = {} for ip in ip_matched: ip_comment[ip] = assets_info[ip][2] for ip in sorted(ip_comment): if ip_comment[ip]: print '%-15s -- %s' % (ip, ip_comment[ip]) else: print '%-15s' % ip print '' elif len(ip_matched) < 1: # 如果没匹配到 color_print('没有该主机,或者您没有该主机的权限 No Permission or No host.', 'red') else: # 恰好是1个 asset = get_object(Asset, ip=ip_matched[0]) jtty = Jtty(user, asset) jtty.connect() def print_prompt(): """ Print prompt 打印提示导航 """ msg = """\033[1;32m### Welcome Use JumpServer To Login. ### \033[0m 1) Type \033[32mIP or Part IP, Host Alias or Comments \033[0m To Login. 2) Type \033[32mP/p\033[0m To Print The Servers You Available. 3) Type \033[32mG/g\033[0m To Print The Server Groups You Available. 4) Type \033[32mG/g(1-N)\033[0m To Print The Server Group Hosts You Available. 5) Type \033[32mE/e\033[0m To Execute Command On Several Servers. 6) Type \033[32mQ/q\033[0m To Quit. """ print textwrap.dedent(msg) # def remote_exec_cmd(ip, port, username, password, cmd): # try: # time.sleep(5) # ssh = paramiko.SSHClient() # ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # ssh.connect(ip, port, username, password, timeout=5) # stdin, stdout, stderr = ssh.exec_command("bash -l -c '%s'" % cmd) # out = stdout.readlines() # err = stderr.readlines() # color_print('%s:' % ip, 'blue') # for i in out: # color_print(" " * 4 + i.strip(), 'green') # for j in err: # color_print(" " * 4 + j.strip(), 'red') # ssh.close() # except Exception as e: # color_print(ip + ':', 'blue') # color_print(str(e), 'red') # def multi_remote_exec_cmd(hosts, username, cmd): # pool = Pool(processes=5) # for host in hosts: # username, password, ip, port = get_connect_item(username, host) # pool.apply_async(remote_exec_cmd, (ip, port, username, password, cmd)) # pool.close() # pool.join() # def exec_cmd_servers(username): # color_print("You can choose in the following IP(s), Use glob or ips split by comma. q/Q to PreLayer.", 'green') # user.get_asset_info(printable=True) # while True: # hosts = [] # inputs = raw_input('\033[1;32mip(s)>: \033[0m') # if inputs in ['q', 'Q']: # break # get_hosts = login_user.get_asset_info().keys() # # if ',' in inputs: # ips_input = inputs.split(',') # for host in ips_input: # if host in get_hosts: # hosts.append(host) # else: # for host in get_hosts: # if fnmatch.fnmatch(host, inputs): # hosts.append(host.strip()) # # if len(hosts) == 0: # color_print("Check again, Not matched any ip!", 'red') # continue # else: # print "You matched ip: %s" % hosts # color_print("Input the Command , The command will be Execute on servers, q/Q to quit.", 'green') # while True: # cmd = raw_input('\033[1;32mCmd(s): \033[0m') # if cmd in ['q', 'Q']: # break # exec_log_dir = os.path.join(log_dir, 'exec_cmds') # if not os.path.isdir(exec_log_dir): # os.mkdir(exec_log_dir) # os.chmod(exec_log_dir, 0777) # filename = "%s/%s.log" % (exec_log_dir, time.strftime('%Y%m%d')) # f = open(filename, 'a') # f.write("DateTime: %s User: %s Host: %s Cmds: %s\n" % # (time.strftime('%Y/%m/%d %H:%M:%S'), username, hosts, cmd)) # multi_remote_exec_cmd(hosts, username, cmd) def main(): """ he he 主程序 """ if not login_user: # 判断用户是否存在 color_print(u'没有该用户,或许你是以root运行的 No that user.', exits=True) print_prompt() gid_pattern = re.compile(r'^g\d+$') try: while True: try: option = raw_input("\033[1;32mOpt or IP>:\033[0m ") except EOFError: print_prompt() continue except KeyboardInterrupt: sys.exit(0) if option in ['P', 'p']: login_user.get_asset_info(printable=True) continue elif option in ['G', 'g']: login_user.get_asset_group_info(printable=True) continue elif gid_pattern.match(option): gid = option[1:].strip() asset_group = get_object(AssetGroup, id=gid) if asset_group and asset_group.is_permed(user=login_user): asset_group.get_asset_info(printable=True) continue elif option in ['E', 'e']: # exec_cmd_servers(login_name) pass elif option in ['Q', 'q', 'exit']: sys.exit() else: try: verify_connect(login_user, option) except ServerError, e: color_print(e, 'red') except IndexError: pass if __name__ == '__main__': main()