コード例 #1
0
    def do_nmap(self, host_list):
        ip_items = HostLoginifo.objects.filter(ip__in=host_list)
        ns = prpcrypt()
        for ip_item in ip_items:
            docker_dct = {}
            tmp_sship_list = []
            doobj = J_ssh_do([ip_item.ip, ip_item.ssh_port, ip_item.ssh_user])
            if ip_item.ssh_type == 0:
                ssh_passwd = ns.decrypt(ip_item.ssh_passwd)
                login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ssh_passwd)
                res = doobj.pass_do(login_info, self.docker_cmd_list)
            if ip_item.ssh_type == 1:
                login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa)
                res = doobj.rsa_do(login_info, self.docker_cmd_list)
            if ip_item.ssh_type == 2:
                login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa)
                res = doobj.dsa_do(login_info, self.docker_cmd_list)
            if ip_item.ssh_type == 3:
                login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa, ip_item.rsa_pass)
                res = doobj.imoocc_rsa_do(login_info, self.docker_cmd_list)

            # port_list = res["docker ps |awk -F '->' '{print $1}'|grep -v 'CONTAINER'|awk -F ':' '{print $NF}'|grep '^[0-9]'"].split("\n")
            port_list = res[
                "docker ps |awk -F '->' '{print $1}'|grep -v 'CONTAINER'|awk 'BEGIN{FS~/s+/;}{print $NF\" \"$1\" \"$2;}'|sed s/0.0.0.0://"].split(
                "\n")
            for d_item in port_list:
                if d_item:
                    print("...............d_item", d_item)
                    d_port, d_id, d_dn = re.split('\s+', d_item)[:3]
                    d_cid = d_id + d_dn
                    docker_dct[d_port] = sn_trans(d_cid)

            sship_list = [(ip_item.ip, port) for port in docker_dct.keys() if port]

            nr = prpcrypt()
            canlogin_list, notlogin_list = self.try_docker_login(sship_list, self.password_list, self.docker_cmd)
            for ip, port in sship_list:
                # sship_obj = {}
                # sship_obj[ip] = port
                if canlogin_list.has_key(port):
                    id = ConnectionInfo.objects.all().count() + 1
                    item_val = canlogin_list[port]
                    ssh_passwd = nr.encrypt(item_val[1])
                    ConnectionInfo.objects.create(id=id, ssh_username=item_val[2], ssh_userpasswd=ssh_passwd,
                                                  ssh_hostip=ip, ssh_host_port=port,
                                                  ssh_status=1, ssh_type=4, sn_key=docker_dct[port])
                    py_id = PhysicalServerInfo.objects.get(conn_phy__sn_key=self.ip_key_dic[ip]).id
                    VirtualServerInfo.objects.create(server_ip=ip, server_type="Docker Contianer",
                                                     system_ver=item_val[3], sys_hostname=item_val[4], mac=item_val[5],
                                                     sn=docker_dct[port], vir_phy_id=py_id, conn_vir_id=id)

                if notlogin_list.has_key(port):
                    item_val = notlogin_list[ip]
                    ConnectionInfo.objects.create(id=id, ssh_username=item_val[2], ssh_hostip=ip,
                                                  ssh_host_port=item_val[0],
                                                  ssh_status=0, ssh_type=5, sn_key=docker_dct[port])
                    py_id = PhysicalServerInfo.objects.get(conn_phy__sn_key=self.ip_key_dic[ip]).id
                    VirtualServerInfo.objects.create(server_ip=ip, server_type="Docker Contianer", vir_phy_id=py_id,
                                                     conn_vir_id=id)
コード例 #2
0
ファイル: views.py プロジェクト: xmlgrg/hops
def detail(request, types):
    """
    详情页
    """
    did = int(request.GET.get('dID'))
    machine_obj = Machines()
    sn_states = SnStates().sn_states()
    if types == "p":
        phy_servers = machine_obj.filter_machines(PhysicalServerInfo,
                                                  pk=did)[0]
        item = phy_servers.__dict__
        detail_name = "物理设备"
        template = 'detail/detail_p.html'
    elif types == "v":
        vir_servers = machine_obj.filter_machines(VirtualServerInfo, pk=did)[0]
        item = vir_servers.__dict__
        detail_name = "虚拟设备"
        template = 'detail/detail_v.html'
    elif types == "n":
        networks = machine_obj.filter_machines(NetWorkInfo, pk=did)[0]

        print("networks..................."), networks
        item = networks.__dict__
        print("item......................."), item
        detail_name = "网络设备"
        template = 'detail/detail_n.html'
    elif types == "o":
        others = machine_obj.filter_machines(OtherMachineInfo, pk=did)[0]
        item = others.__dict__
        detail_name = "其它设备"
        template = "detail/detail_o.html"
    elif types == "c":
        conn = machine_obj.filter_machines(ConnectionInfo, pk=did)[0]
        conn.ssh_userpasswd = prpcrypt().decrypt(conn.ssh_userpasswd)
        item = conn.__dict__
        detail_name = "用户连接"
        template = 'detail/detail_c.html'
    elif types == "nc":
        item = machine_obj.filter_machines(NetConnectionInfo, pk=did)[0]
        item.tel_userpasswd = prpcrypt().decrypt(item.tel_userpasswd)
        item.tel_enpasswd = prpcrypt().decrypt(item.tel_enpasswd)
        detail_name = "用户连接的网络设备"
        template = 'detail/detail_nc.html'
    elif types == 'op':
        item = machine_obj.filter_machines(MachineOperationsInfo, pk=did)[0]
        detail_name = '设备操作记录'
        template = 'detail/detail_opts.html'
    context = {
        'title': "详情页",
        'item': item,
        'detail_name': detail_name,
        'sn_states': sn_states
    }
    return render(request, template_name=template, context=context)
コード例 #3
0
 def dosnmp(self):
     nr = prpcrypt()
     for vm_item in self.vmware_p_list:
         vm_sn = self.ip_key_dic[vm_item]
         p_item = ConnectionInfo.objects.filter(sn_key=vm_sn)
         try:
             vmip = p_item[0].ssh_hostip.split(',')[0]
             ssh_passwd = nr.decrypt(p_item[0].ssh_userpasswd)
             ne = SnmpESXI(host=vmip,
                           user=p_item[0].ssh_username,
                           passwd=ssh_passwd)
             res = ne.dosnmp()
             py_id = PhysicalServerInfo.objects.get(
                 conn_phy__sn_key=vm_sn).id
             for v_item in res:
                 v_uuid = v_item['uuid']
                 v_vmname = v_item['name']
                 v_obj = VirtualServerInfo.objects.filter(
                     sn__contains=v_uuid)
                 if v_obj:
                     v_obj.update(vir_phy=py_id,
                                  server_type=u"VMX:%s" % (v_vmname))
                 else:
                     logger.error("Error:no vmx matched! %s %s" %
                                  (v_uuid, v_vmname))
                     print("Error:no vmx matched! %s %s" %
                           (v_uuid, v_vmname))
         except Exception as e:
             print("Vmware host sdk connect failed!%s" %
                   (p_item[0].ssh_hostip))
             logger.error("Error:Vmware host sdk connect failed!%s" %
                          (p_item[0].ssh_hostip))
コード例 #4
0
def NetDevLogin(dev_ips={}, backup_sw="False", back_server=""):
    crpt_do = prpcrypt()
    for ip, login_info in dev_ips.items():
        if backup_sw == "True":
            jn = J_net_do(ip, login_info)
            res = jn.cisco_backup(back_server=back_server, sw_backup=True)
        else:
            jn = J_net_do(ip, login_info)
            res = jn.cisco_login()

        if res["status"] == "success" and res["level"] == 2:
            dev_obj = NetWorkInfo.objects.filter(host_ip=ip)
            if dev_obj:
                dev_sn_key = dev_obj[0].sn
                dev_id = dev_obj[0].id

                con_obj = NetConnectionInfo.objects.filter(sn_key=dev_sn_key)
                con_user, con_passwd, con_en_passwd = res["login_info"]
                crpt_pass = crpt_do.encrypt(
                    con_passwd) if con_passwd else crpt_do.encrypt('')
                en_crpt_pass = crpt_do.encrypt(
                    con_en_passwd) if con_passwd else crpt_do.encrypt('')

                if not con_obj:
                    NetConnectionInfo.objects.create(tel_username=con_user,
                                                     tel_userpasswd=crpt_pass,
                                                     tel_enpasswd=en_crpt_pass,
                                                     tel_host_port='21',
                                                     tel_hostip=ip,
                                                     sn_key=dev_sn_key,
                                                     dev_info_id=dev_id,
                                                     tel_status=1,
                                                     tel_type=int(
                                                         res["level"]))
コード例 #5
0
 def do_nmap(self, p_kvm_list):
     for item in p_kvm_list:
         ip_items = HostLoginifo.objects.filter(ip=item)
         docker_dct = {}
         nr = prpcrypt()
         for ip_item in ip_items:
             doobj = J_ssh_do([ip_item.ip, ip_item.ssh_port, ip_item.ssh_user])
             if ip_item.ssh_type == 0:
                 ssh_passwd = nr.decrypt(ip_item.ssh_passwd)
                 login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ssh_passwd)
                 res = doobj.pass_do(login_info, self.p_kvm_cmds)
             if ip_item.ssh_type == 1:
                 login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa)
                 res = doobj.rsa_do(login_info, self.p_kvm_cmds)
             if ip_item.ssh_type == 2:
                 login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa)
                 res = doobj.dsa_do(login_info, self.p_kvm_cmds)
             if ip_item.ssh_type == 3:
                 login_info = (
                 ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa, ip_item.rsa_pass)
                 res = doobj.imoocc_rsa_do(login_info, self.p_kvm_cmds)
             kvm_mac_list = res[self.p_kvm_cmds[0]].split('\n')
             for kvm_item in kvm_mac_list:
                 if kvm_item:
                     kvm_mac_str = mac_trans(kvm_item)[-10:]
                     py_id = PhysicalServerInfo.objects.get(conn_phy__sn_key=self.ip_key_dic[item]).id
                     v_obj = VirtualServerInfo.objects.filter(mac__contains=kvm_mac_str)
                     if v_obj:
                         v_obj.update(vir_phy=py_id, server_type="KVM")
                     else:
                         p_ob = PhysicalServerInfo.objects.filter(mac__contains=kvm_mac_str)
                         if p_ob and len(p_ob) < 2:
                             p_ob.update(vir_phy=py_id, server_type="KVM")
コード例 #6
0
 def run(self, ip, cmd):
     if ip and cmd:
         print ".......................ip", ip
         ip_item = HostLoginifo.objects.get(ip=ip)
         cn = prpcrypt()
         if ip_item.ssh_type == 0:
             ssh_passwd = cn.decrypt(ip_item.ssh_passwd)
             login_info = (ip_item.ip, int(ip_item.ssh_port),
                           ip_item.ssh_user, ssh_passwd)
             res = self.pass_do(login_info, cmd)
         if ip_item.ssh_type == 1:
             login_info = (ip_item.ip, int(ip_item.ssh_port),
                           ip_item.ssh_user, ip_item.ssh_rsa)
             res = self.rsa_do(login_info, cmd)
         if ip_item.ssh_type == 2:
             login_info = (ip_item.ip, int(ip_item.ssh_port),
                           ip_item.ssh_user, ip_item.ssh_rsa)
             res = self.dsa_do(login_info, cmd)
         if ip_item.ssh_type == 3:
             login_info = (ip_item.ip, int(ip_item.ssh_port),
                           ip_item.ssh_user, ip_item.ssh_rsa,
                           ip_item.rsa_pass)
             res = self.imoocc_rsa_do(login_info, cmd)
         return res
     else:
         return ""
コード例 #7
0
ファイル: J_do.py プロジェクト: hapeeeeee/yunwei
    def pass_do(self, login_info, cmd_list=""):
        '''
        用户密码方式登录
        :param login_info:登录的信息,如:('10.211.55.3', 22, 'parallels', 'xxx777')
        :param cmd_list:登录机器后,需要执行的命令
        :return:
        '''
        try:
            # transport = paramiko.Transport((login_info[0], login_info[1]))
            # print(transport.banner_timeout)
            # transport.banner_timeout = 30
            # print(transport.banner_timeout)

            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            if len(login_info[3]) == 32:
                crpt_de = prpcrypt()
                pp = crpt_de.decrypt(login_info[3])
                login_info[3] = str(pp).split('\\')[0].split('\'')[-1]
            ssh.connect(login_info[0],
                        login_info[1],
                        login_info[2],
                        login_info[3],
                        timeout=3)
            self.result["status"] = "success"
            for cmd in cmd_list:
                stdin, stdout, stderr = ssh.exec_command(cmd, timeout=10)
                std_res = stdout.read()
                self.result[cmd] = std_res
        except Exception as e:
            self.result["status"] = "failed"
            self.result["res"] = str(e)
        return self.result
コード例 #8
0
def snmp_begin(s_ownip, s_net, s_port, s_user, s_key, s_cmds):
    if not s_net:
        return False

    nm_item = NmapDev([])
    canlogin_list, notlogin_list = nm_item.try_login(s_net, s_port, s_user,
                                                     s_key, s_cmds)
    crpt_do = prpcrypt()

    if canlogin_list:
        for item in canlogin_list:
            # crpt_pass = crpt_do.encrypt(canlogin_list[item][1]) if len(canlogin_list[item][1]) != 32 else \
            # canlogin_list[item][1]
            list = Host.objects.filter(hostip=s_net)
            for i in list:
                i.hostip = item
                i.port = str(canlogin_list[item][0])
                i.password = s_key
                i.username = canlogin_list[item][2]
                i.ssh_status = 1
                i.system_ver = canlogin_list[item][3] if canlogin_list[item][
                    3] else "未获取"
                i.host_name = canlogin_list[item][4] if canlogin_list[item][
                    4] else "未获取"
                i.mac_address = canlogin_list[item][5] if canlogin_list[item][
                    5] else "未获取"
                i.sn = canlogin_list[item][6] if canlogin_list[item][
                    6] else "请使用root用户登录获取"
                i.save()

    if notlogin_list:
        list = Host.objects.filter(hostip=s_net)
        try:
            for i in list:
                i.ssh_status = 0
                i.save()
        except Exception as e:
            print(e)
            x = 1
コード例 #9
0
def snmp_begin(nmap_type, ports, password_list, i_key_file, syscmd_list,
               black_list, s_emails):
    '''
    执行系统主机扫描
    :param nmap_type:
    :param ports:
    :param password_list:
    :param i_key_file:
    :param i_key_file:
    :param syscmd_list:
    :param black_list:
    :param s_emails:
    :return:
    '''
    if nmap_type is None:
        return False

    nmap_net = '%s.0/24' % nmap_type
    #实例化扫描
    nm_item = NmapDev(black_list)
    #启动了SSH的设备IP和端口(sship_list),所有扫描到的主机IP(host_list),未启动SSH的设备(unkown__list)
    sship_list, host_list, unkown_list = nm_item.nmap_sship(ports, nmap_net)
    #可以登录SSH的设备IP,端口及登录信息等(canlogin_list);无法登录的SSH(notlogin_list)
    # 说明
    # canlogin_lst = {port, password,root,system_info, sys_hostname, sys_mac, machine_type}
    # canlogin_lst = {端口,密码,root,系统信息,系统名,mac地址,sn号,机器类型}
    canlogin_list, notlogin_list = nm_item.try_login(sship_list, password_list,
                                                     syscmd_list)
    #可以通过密钥登录的设备(key_login_list),无法通过密钥登录的设备(key_not_login_list)
    key_login_list, key_not_login_list = nm_item.try_key_login(
        notlogin_list, i_key_file, syscmd_list)

    print("Password Login ...", canlogin_list, notlogin_list)
    logger.info("Use password login:%s,%s" % (canlogin_list, notlogin_list))
    print("Key Login ...", key_login_list, key_not_login_list)
    logger.info("Use key login:%s,%s" % (key_login_list, key_not_login_list))

    email_message = u"(1)可以ssh 用户密码登录的服务器列表: \n %s \n \n (2)可以ssh 用户密钥登录的服务器列表 \n %s \n \n(3)无法ssh登录列表 \n %s \n \n (4)未知主机 \n %s" % (
        canlogin_list, key_login_list, notlogin_list, unkown_list)
    # email_message = u"发不出去我现在也很绝望啊"

    email_sub = u"系统扫描结果"
    receive_addr = s_emails
    email_s = sendmail(receive_addr, email_sub, email_message)
    x = email_s.send()
    print(x)

    HostLoginifo.objects.filter(ip__contains=nmap_type).delete()
    crpt_do = prpcrypt()

    if canlogin_list:
        for item in canlogin_list:
            mathine_t = canlogin_list[item][7] if canlogin_list[item][
                7] else u"未知(需要安装dmidecode工具)"
            crpt_pass = crpt_do.encrypt(
                canlogin_list[item]
                [1]) if canlogin_list[item][1] else crpt_do.encrypt('')
            HostLoginifo.objects.update_or_create(
                ip=item,
                ssh_port=str(canlogin_list[item][0]),
                ssh_passwd=crpt_pass,
                ssh_user=canlogin_list[item][2],
                ssh_status=1,
                ssh_type=0,
                system_ver=canlogin_list[item][3],
                hostname=canlogin_list[item][4],
                mac_address=canlogin_list[item][5],
                sn=canlogin_list[item][6],
                mathine_type=mathine_t)
    if key_login_list:
        for item in key_login_list:
            mathine_t = key_login_list[item][9] if key_login_list[item][
                9] else u"未知(需要安装dmidecode工具)"
            HostLoginifo.objects.update_or_create(
                ip=item,
                ssh_port=key_login_list[item][0],
                ssh_rsa=key_login_list[item][1],
                ssh_user=key_login_list[item][2],
                rsa_pass=key_login_list[item][3],
                ssh_status=1,
                ssh_type=key_login_list[item][4],
                system_ver=key_login_list[item][5],
                hostname=key_login_list[item][6],
                mac_address=key_login_list[item][7],
                sn=key_login_list[item][8],
                mathine_type=mathine_t)
    return unkown_list, key_not_login_list
コード例 #10
0
def snmp_begin(nmap_type, ports, password_list, imoocc_key_file, syscmd_list,
               black_list, s_emails):
    '''
    执行系统主机扫描
    :param nmap_type:
    :param ports:
    :param password_list:
    :param imoocc_key_file:
    :param imoocc_key_file:
    :param syscmd_list:
    :param black_list:
    :param s_emails:
    :return:
    '''
    if nmap_type is None: return False

    nmap_net = '%s.0/24' % nmap_type
    nm_item = NmapDev(black_list)
    sship_list, host_list, unkown_list = nm_item.nmap_sship(ports, nmap_net)
    print(".................ssh ip list", sship_list)

    canlogin_list, notlogin_list = nm_item.try_login(sship_list, password_list,
                                                     syscmd_list)
    key_login_list, key_not_login_list = nm_item.try_key_login(
        notlogin_list, imoocc_key_file, syscmd_list)

    print("Password Login ...", canlogin_list, notlogin_list)
    logger.info("Use password login:%s,%s" % (canlogin_list, notlogin_list))
    print("Key Login ...", key_login_list, key_not_login_list)
    logger.info("Use key login:%s,%s" % (key_login_list, key_not_login_list))

    email_message = u"可以ssh 用户密码登录的服务器列表 \n %s \n 可以ssh 用户密钥登录的服务器列表 \n %s \n 无法ssh登录列表 \n %s \n 未知主机 \n %s"%(canlogin_list,\
                    key_login_list,notlogin_list,unkown_list)
    email_sub = u"系统扫描结果"
    receive_addr = s_emails
    email_s = sendmail(receive_addr, email_sub, email_message)
    email_s.send()

    HostLoginifo.objects.filter(ip__contains=nmap_type).delete()
    crpt_do = prpcrypt()

    if canlogin_list:
        for item in canlogin_list:
            mathine_t = canlogin_list[item][7] if canlogin_list[item][
                7] else u"未知(需要安装dmidecode工具)"
            crpt_pass = crpt_do.encrypt(
                canlogin_list[item]
                [1]) if canlogin_list[item][1] else crpt_do.encrypt('')
            HostLoginifo.objects.update_or_create(
                ip=item,
                ssh_port=str(canlogin_list[item][0]),
                ssh_passwd=crpt_pass,
                ssh_user=canlogin_list[item][2],
                ssh_status=1,
                ssh_type=0,
                system_ver=canlogin_list[item][3],
                hostname=canlogin_list[item][4],
                mac_address=canlogin_list[item][5],
                sn=canlogin_list[item][6],
                mathine_type=mathine_t)
    if key_login_list:
        for item in key_login_list:
            mathine_t = key_login_list[item][9] if key_login_list[item][
                9] else u"未知(需要安装dmidecode工具)"
            HostLoginifo.objects.update_or_create(
                ip=item,
                ssh_port=key_login_list[item][0],
                ssh_rsa=key_login_list[item][1],
                ssh_user=key_login_list[item][2],
                rsa_pass=key_login_list[item][3],
                ssh_status=1,
                ssh_type=key_login_list[item][4],
                system_ver=key_login_list[item][5],
                hostname=key_login_list[item][6],
                mac_address=key_login_list[item][7],
                sn=key_login_list[item][8],
                mathine_type=mathine_t)
    return unkown_list, key_not_login_list
コード例 #11
0
def adhoc_task(request):
    if request.method == "POST":
        result = {}
        jobs = request.body
        init_jobs = json.loads(jobs)

        mod_type = init_jobs[
            "mod_type"] if not init_jobs["mod_type"] else "shell"
        sn_keys = init_jobs["sn_key"]
        exec_args = init_jobs[u"exec_args"]
        group_name = init_jobs[
            u"group_name"] if not init_jobs[u"group_name"] else "imoocc"
        taskid = init_jobs.get("taskid")
        if not sn_keys or not exec_args or not taskid:
            result = {
                'status': "failed",
                "code": 002,
                "info": u"传入的参数mod_type不匹配!"
            }
            return HttpResponse(json.dumps(result),
                                content_type="application/json")
        else:
            rlog = InsertAdhocLog(taskid=taskid)
        if mod_type not in ("shell", "yum", "copy"):
            result = {'status': "failed", "code": 003, "info": u"传入的参数不完整!"}
            rlog.record(id=10008)
        else:
            try:
                sn_keys = set(sn_keys)
                hosts_obj = ConnectionInfo.objects.filter(sn_key__in=sn_keys)
                rlog.record(id=10000)

                if len(sn_keys) != len(hosts_obj):
                    rlog.record(id=40004)
                else:
                    rlog.record(id=10002)
                    resource = {}
                    hosts_list = []
                    vars_dic = {}
                    cn = prpcrypt()
                    hosts_ip = []
                    for host in hosts_obj:
                        sshpasswd = cn.decrypt(host.ssh_userpasswd)
                        if host.ssh_type in (1, 2):
                            """
                            resource =  {
                                "dynamic_host": {
                                    "hosts": [
                                                {"hostname": "192.168.1.108", "port": "22", "username": "******", "ssh_key": "/etc/ansible/ssh_keys/id_rsa"},
                                                {"hostname": "192.168.1.109", "port": "22", "username": "******","ssh_key": "/etc/ansible/ssh_keys/id_rsa"}
                                              ],
                                    "vars": {
                                             "var1":"ansible",
                                             "var2":"saltstack"
                                             }
                                }
                            }
                            """
                            hosts_list.append({
                                "hostname": host.sn_key,
                                "ip": host.ssh_hostip,
                                "port": host.ssh_host_port,
                                "username": host.ssh_username,
                                "ssh_key": host.ssh_rsa
                            })
                            hosts_ip.append(host.sn_key)
                        elif host.ssh_type in (0, 4):
                            hosts_list.append({
                                "hostname": host.sn_key,
                                "ip": host.ssh_hostip,
                                "port": host.ssh_host_port,
                                "username": host.ssh_username,
                                "password": sshpasswd
                            })
                            hosts_ip.append(host.sn_key)
                        elif host.ssh_type == 3:
                            hosts_list.append({
                                "hostname": host.sn_key,
                                "ip": host.ssh_hostip,
                                "port": host.ssh_host_port,
                                "username": host.ssh_username,
                                "ssh_key": host.ssh_rsa,
                                "password": sshpasswd
                            })
                            hosts_ip.append(host.sn_key)

                    resource[group_name] = {
                        "hosts": hosts_list,
                        "vars": vars_dic
                    }
                    rlog.record(id=10004)
                    #任务锁检查
                    lockstatus = DsRedis.get(rkey="tasklock")
                    if lockstatus is False or lockstatus == '1':
                        # 已经有任务在执行
                        rlog.record(id=40005)
                    else:
                        # 开始执行任务
                        DsRedis.setlock("tasklock", 1)
                        jdo = ANSRunner(resource=resource, redisKey='1')
                        jdo.run_model(host_list=hosts_ip,
                                      module_name=mod_type,
                                      module_args=exec_args)
                        res = jdo.get_model_result()
                        rlog.record(id=19999, input_con=res)
                        rlog.record(id=20000)
                        DsRedis.setlock("tasklock", 0)
                        result = {"status": "success", "info": res}

            except Exception as e:
                import traceback
                print traceback.print_exc()
                DsRedis.setlock("tasklock", 0)
                result = {"status": "failed", "code": 005, "info": e}
            finally:
                return HttpResponse(json.dumps(result),
                                    content_type="application/json")
コード例 #12
0
ファイル: views.py プロジェクト: vtatv/mydevops
def adhoc_task_g(request):
    if request.method == "POST":
        result = {}

        mod_type_tmp = request.POST.get('gmod').strip()
        mod_type = mod_type_tmp if mod_type_tmp else "shell"
        exec_args = request.POST.get('gexecargs')
        taskid = request.POST.get('gtaskid').strip()
        group_name = request.POST.get('group').strip()
        gob = GroupInfo.objects.filter(group_name=group_name)
        if not gob:
            result = {'status': "failed", "code": 006, "info": u"传入的组名不存在!"}
            return HttpResponse(json.dumps(result),
                                content_type="application/json")
        if group_name.split('_')[1] == '1':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp1_id=gob[0].id)
        if group_name.split('_')[1] == '2':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp2_id=gob[0].id)
        if group_name.split('_')[1] == '3':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp3_id=gob[0].id)
        if group_name.split('_')[1] == '4':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp4_id=gob[0].id)
        if group_name.split('_')[1] == '5':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp5_id=gob[0].id)
        if group_name.split('_')[1] == '6':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp6_id=gob[0].id)
        if group_name.split('_')[1] == '7':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp7_id=gob[0].id)
        if group_name.split('_')[1] == '8':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp8_id=gob[0].id)
        if group_name.split('_')[1] == '9':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp9_id=gob[0].id)
        if group_name.split('_')[1] == '10':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp10_id=gob[0].id)
        if group_name.split('_')[1] == '11':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp11_id=gob[0].id)
        if group_name.split('_')[1] == '12':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp12_id=gob[0].id)
        if group_name.split('_')[1] == '13':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp13_id=gob[0].id)
        if group_name.split('_')[1] == '14':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp14_id=gob[0].id)
        if group_name.split('_')[1] == '15':
            zhuji_obj = ConnectionInfo.objects.filter(conn_grp15_id=gob[0].id)
        if not zhuji_obj:
            result = {
                'status': "failed",
                "code": 007,
                "info": u"传入的组为空,没有包含主机!"
            }
            return HttpResponse(json.dumps(result),
                                content_type="application/json")
        zhuji_list = [i.ssh_hostip for i in zhuji_obj]
        if not exec_args or not taskid:
            result = {'status': "failed", "code": 002, "info": u"传入的参数不完整!"}
            return HttpResponse(json.dumps(result),
                                content_type="application/json")
        else:
            rlog = InsertAdhocLog(taskid=taskid)
        if mod_type not in ("shell", "yum", "copy"):
            result = {
                'status': "failed",
                "code": 003,
                "info": u"传入的参数mod_type不匹配!"
            }
            rlog.record(id=10008)
            return HttpResponse(json.dumps(result),
                                content_type="application/json")
        else:
            try:
                zhuji_list = set(zhuji_list)
                hosts_obj = ConnectionInfo.objects.filter(
                    ssh_hostip__in=zhuji_list)
                rlog.record(id=10000)

                if len(zhuji_list) != len(hosts_obj):
                    rlog.record(id=40004)
                else:
                    rlog.record(id=10002)
                    resource = {}
                    hosts_list = []
                    vars_dic = {}
                    cn = prpcrypt()
                    hosts_ip = []
                    for host in hosts_obj:
                        sshpasswd = cn.decrypt(host.ssh_userpasswd)
                        if host.ssh_type in (1, 2):
                            """
                            #组装符合下面格式的resource传入到封装好的ansible API中
                            resource =  {
                                "dynamic_host": {
                                    "hosts": [
                                                {"hostname": "192.168.1.108", "port": "22", "username": "******", "ssh_key": "/etc/ansible/ssh_keys/id_rsa"},
                                                {"hostname": "192.168.1.109", "port": "22", "username": "******","ssh_key": "/etc/ansible/ssh_keys/id_rsa"}
                                              ],
                                    "vars": {
                                             "var1":"ansible",
                                             "var2":"saltstack"
                                             }
                                }
                            }
                            """
                            hosts_list.append({
                                "hostname": host.sn_key,
                                "ip": host.ssh_hostip,
                                "port": host.ssh_host_port,
                                "username": host.ssh_username,
                                "ssh_key": host.ssh_rsa
                            })
                            hosts_ip.append(host.sn_key)
                        elif host.ssh_type in (0, 4):
                            hosts_list.append({
                                "hostname": host.sn_key,
                                "ip": host.ssh_hostip,
                                "port": host.ssh_host_port,
                                "username": host.ssh_username,
                                "password": sshpasswd
                            })
                            hosts_ip.append(host.sn_key)
                        elif host.ssh_type == 3:
                            hosts_list.append({
                                "hostname": host.sn_key,
                                "ip": host.ssh_hostip,
                                "port": host.ssh_host_port,
                                "username": host.ssh_username,
                                "ssh_key": host.ssh_rsa,
                                "password": sshpasswd
                            })
                            hosts_ip.append(host.sn_key)

                    resource[group_name] = {
                        "hosts": hosts_list,
                        "vars": vars_dic
                    }
                    rlog.record(id=10003)
                    #任务锁检查
                    lockstatus = DsRedis.get(rkey="tasklock")
                    if lockstatus is None or lockstatus == '1':
                        # 已经有任务在执行
                        rlog.record(id=40005)
                        result = {
                            'status': "failed",
                            "code": 004,
                            "info": u"已经有任务在执行,或者tasklock没有设置初始值!"
                        }
                    else:
                        # 开始执行任务
                        rlog.record(id=10004)
                        DsRedis.setlock("tasklock", 1)
                        jdo = ANSRunner(resource=resource)
                        jdo.run_model(host_list=hosts_ip,
                                      module_name=mod_type,
                                      module_args=exec_args)
                        res = jdo.get_model_result()
                        rlog.record(id=19999, input_con=res)
                        rlog.record(id=20000)
                        DsRedis.setlock("tasklock", 0)
                        result = {
                            "status": "success",
                            "code": 001,
                            "info": res
                        }

            except Exception as e:
                import traceback
                print traceback.print_exc()
                DsRedis.setlock("tasklock", 0)
                result = {"status": "failed", "code": 005, "info": e}
            finally:
                return HttpResponse(json.dumps(result),
                                    content_type="application/json")
コード例 #13
0
def gen_new_passwd():
    # 生成新用户名密码
    crpt_do = prpcrypt()
    crpt_new = crpt_do.encrypt(str(random.randint(0, 600000)))
    return crpt_new