Example #1
0
def host_grains(tgt):
    '''
    Salt API得到grains信息,进行格式化输出
    '''
    sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])
    ret = sapi.remote_noarg_execution(tgt,'grains.items')
    return ret
Example #2
0
def remote_execution(request):
    """
    remote command execution
    """

    ret = ''
    tgtcheck = ''
    danger = ('rm', 'reboot', 'init ', 'shutdown')
    user = request.user
    if request.method == 'POST':
        action = request.get_full_path().split('=')[1]
        if action == 'exec':
            tgt = request.POST.get('tgt')
            arg = request.POST.get('arg')
            tgtcheck = HostList.objects.filter(hostname=tgt)
            argcheck = arg not in danger
            if tgtcheck and argcheck:
                sapi = SaltAPI(url=settings.SALT_API['url'],
                               username=settings.SALT_API['user'],
                               password=settings.SALT_API['password'])
                ret = sapi.remote_execution(tgt, 'cmd.run', arg)
            elif not tgtcheck:
                ret = '亲,目标主机不正确,请重新输入'
            elif not argcheck:
                ret = '亲,命令很危险, 你这样子老大会不开森'
        Message.objects.create(type='salt',
                               action='execution',
                               action_ip=tgt,
                               content='saltstack execution command: %s ' %
                               (arg))

    return render_to_response('salt_remote_execution.html', {'ret': ret},
                              context_instance=RequestContext(request))
Example #3
0
def code_deploy(request):
    """
    Pull code for building, pushed to the server
    """
    
    ret = ''
    host = {'ga': 'test-01', 'beta': 'localhost.localdomain'}
    user = request.user
    if request.method == 'POST':
        action = request.get_full_path().split('=')[1]
        if action == 'push':
            pro = request.POST.get('project')
            url = request.POST.get('url')
            ver = request.POST.get('version')
            env = request.POST.get('env')
            capi = Code_Work(pro=pro,url=url,ver=ver)    
            data = {pro:{'ver':ver}}
            obj = capi.work()      #构建rpm包
            if obj['comment'][0]['result'] and obj['comment'][1]['result'] and obj['comment'][2]['result']:
                json_api = BuildJson()
                json_api.build_data(host[env],data)   #刷新pillar数据,通过deploy下发SLS执行代码发布
                sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])
                if env == 'beta':
                    jid = sapi.target_deploy('beta','deploy.'+pro)
                elif env == 'ga':
                    jid = sapi.target_deploy('tg','deploy.'+pro)
                else:
                    jid = sapi.target_deploy('beta','deploy.'+pro)
                time.sleep(8)
                db = db_operate()
                sql = 'select returns from salt_returns where jid=%s' 
                ret=db.select_table(settings.RETURNS_MYSQL,sql,str(jid))    #通过jid获取执行结果
    return render_to_response('code_deploy.html',
           {'ret': ret},context_instance=RequestContext(request))
Example #4
0
def salt_delete_key(request):
    """
    delete salt minions key
    """
    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
        ip = request.META['HTTP_X_FORWARDED_FOR']
    else:
        ip = request.META['REMOTE_ADDR']
    user = request.user
    node_name = request.GET.get('node_name')
    sapi = SaltAPI(url=settings.SALT_API['url'],
                   username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    ret = sapi.delete_key(node_name)
    id_list = HostList.objects.filter(hostname=node_name)
    if id_list:
        for i in id_list:
            host_list = get_object_or_404(HostList, pk=i.id)
            host_list.delete()
            Message.objects.create(type='hostlist',
                                   action='delete',
                                   action_ip=ip,
                                   username=user,
                                   content='delete %s' % (node_name))
    Message.objects.create(type='salt-key',
                           action='delete',
                           action_ip=ip,
                           username=user,
                           content='delete %s salt-key' % (node_name))
    return HttpResponseRedirect(reverse('key_list'))
Example #5
0
def salt_accept_key(request):
    """
    accept salt minions key
    """
    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
        ip = request.META['HTTP_X_FORWARDED_FOR']
    else:
        ip = request.META['REMOTE_ADDR']
    user = request.user
    node_name = request.GET.get('node_name')
    what = request.GET.get('what')
    sapi = SaltAPI(url=settings.SALT_API['url'],
                   username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    if what == "accept":
        ret = sapi.accept_key(node_name)
        HostList.objects.create(hostname=node_name)
    if what == "reject":
        ret = sapi.reject_key(node_name)
    Message.objects.create(type='salt-key',
                           action=what,
                           action_ip=ip,
                           username=user,
                           content='saltstack accept %s key' % (node_name))
    return HttpResponseRedirect(reverse('key_list'))
Example #6
0
def remote_execution(request):
    """
    remote command execution
    """

    ret = ''
    tgtcheck = ''
    danger = ('rm','reboot','init ','shutdown')
    user = request.user
    if request.method == 'POST':
        action = request.get_full_path().split('=')[1]
        if action == 'exec':
            tgt = request.POST.get('tgt')
            arg = request.POST.get('arg')    
            tgtcheck = HostList.objects.filter(hostname=tgt)
            argcheck = arg not in danger
            if tgtcheck and argcheck:
                sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])
                ret = sapi.remote_execution(tgt,'cmd.run',arg)
            elif not tgtcheck:
                ret = '亲,目标主机不正确,请重新输入'     
            elif not argcheck:
                ret = '亲,命令很危险, 你这样子老大会不开森'
        Message.objects.create(type='salt', action='execution', action_ip=tgt, content='saltstack execution command: %s ' % (arg))
         
    return render_to_response('salt_remote_execution.html',
           {'ret': ret},context_instance=RequestContext(request)) 
Example #7
0
def targeting_execution(request,arg=''):
    """
    remote command execution
    """

    ret = ''
    ret2= ''
    arg2= "salt-ssh '*' -r '"
    tgtcheck = ''
    danger = ('rm', 'reboot', 'init ', 'shutdown', 'll')
    user = request.user
    if request.method == 'POST':
        action = request.get_full_path().split('=')[1]
        if action == 'exec':
            #tgt = request.POST.get('tgt')
            arg = request.POST.get('arg')
            #tgtcheck = HostList.objects.filter(ip=tgt)     #目标主机名为以ip搜索, 改ip为hostname以hostname搜索
            argcheck = arg not in danger
            #if tgtcheck and argcheck:
            sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'],
                               password=settings.SALT_API['password'])
            #ret = sapi.remote_execution(tgt, 'cmd.run', arg)
            arg2=arg2+arg+"'"
            #ret2=arg2
            ret= sapi.remote_ssh('cmd.run',arg2)
            #elif not tgtcheck:
            #    ret = '亲,目标主机不正确,请重新输入'
            #elif not argcheck:
            #    ret = '亲,命令很危险, 你这样子老大会不开森'
        Message.objects.create(type='salt-ssh', action='targeting', action_ip='*',
                               content='saltstack execution command: %s ' % (arg))

    return render(request, 'targeting_execution.html',
                  {'ret': ret,'arg':arg})
Example #8
0
def host_grains(tgt):
    '''
    Salt API得到grains信息,进行格式化输出
    '''
    sapi = SaltAPI(url=settings.SALT_API['url'],
                   username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    ret = sapi.remote_noarg_execution(tgt, 'grains.items')
    return ret
Example #9
0
def salt_file_download(request):
    def file_iterator(file_name, chunk_size=512):
        with open(file_name) as f:
            while True:
                c = f.read(chunk_size)
                if c:
                    yield c
                else:
                    break

    if request.method == 'POST':
        tgt_select = request.POST.get('tgt_select', None)
        remote_file = request.POST.get('remote_file', None)
        sapi = SaltAPI(url=settings.SALT_API['url'],
                       username=settings.SALT_API['user'],
                       password=settings.SALT_API['password'])
        ret_bak = sapi.file_bak(tgt_select, 'cp.push', remote_file, 'list')
        if tgt_select == 'localhost':
            return render(request, 'redirect.html', {})
        remote_path = remote_file.replace(remote_file.split('/')[-1], '')
        dl_path = './media/salt/filedownload/user_%s/%s%s' % (
            request.user.id, tgt_select, remote_path)
        dl_file = '%s%s' % (dl_path, remote_file.split('/')[-1])
        if not os.path.exists(dl_path):
            os.makedirs(dl_path)
        try:
            shutil.copy(
                '/var/cache/salt/master/minions/%s/files/%s' %
                (tgt_select, remote_file), dl_file)
            tar_file = make_tar(dl_file, '/tmp')
            dl_filename = 'attachment;filename="{0}"'.format(
                tar_file.replace('/tmp/', '%s%s' % (tgt_select, remote_path)))
            ret = u'主机:%s\n结果:远程文件 %s 下载成功!' % (tgt_select, remote_file)
            Message.objects.create(type=u'文件管理',
                                   user=request.user,
                                   action=u'文件下载',
                                   action_ip=UserIP(request),
                                   content=u'下载文件 \n%s' % ret)
            response = StreamingHttpResponse(file_iterator(tar_file))
            response['Content-Type'] = 'application/octet-stream'
            response['Content-Disposition'] = dl_filename

            return response

        except:
            print 'No such file or dirctory'
            ret = u'主机:%s\n结果:远程文件 %s 下载失败,请确认文件是否存在!' % (tgt_select,
                                                          remote_file)
            Message.objects.create(type=u'文件管理',
                                   user=request.user,
                                   action=u'文件下载',
                                   action_ip=UserIP(request),
                                   content=u'下载文件 \n%s' % ret)
            return render(request, 'salt_file_download.html', {'ret': ret})

    return render(request, 'salt_file_download.html', {})
Example #10
0
def salt_key_list(request):
    """
    list all key 
    """

    user = request.user
    sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])  
    minions,minions_pre = sapi.list_all_key() 
    
    return render_to_response('salt_key_list.html', {'all_minions': minions, 'all_minions_pre': minions_pre}) 
Example #11
0
def salt_delete_key(request):
    """
    delete salt minions key
    """

    node_name = request.GET.get('node_name')
    sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])  
    ret = sapi.delete_key(node_name)
    Message.objects.create(type='salt', action='key', action_ip=node_name, content='saltstack delete node key')
    return HttpResponseRedirect(reverse('key_list'))
Example #12
0
def salt_key_list(request):
    """
    list all key
    """
    #user = request.user
    sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    minions, minions_pre = sapi.list_all_key()

    return render(request, 'salt_key_list.html', {'all_minions': minions, 'all_minions_pre': minions_pre})
Example #13
0
def salt_delete_key(request):
    """
    delete salt minions key
    """

    node_name = request.GET.get('node_name')
    sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    ret = sapi.delete_key(node_name)
    Message.objects.create(type='salt', action='key', action_ip=node_name, content='saltstack delete node key')
    return HttpResponseRedirect(reverse('key_list'))
Example #14
0
def salt_key_list(request):
    """
    list all key 
    """

    user = request.user
    sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])  
    minions,minions_pre,minions_rej = sapi.list_all_key()
    minions_count = len(minions) 
    minions_pre_count = len(minions_pre) 
    minions_rej_count = len(minions_rej) 
    return render_to_response('salt_key_list.html', {'all_minions': minions, 'all_minions_pre': minions_pre,'all_minions_rej': minions_rej,'minions_count':minions_count,'minions_pre_count':minions_pre_count,'minions_rej_count':minions_rej_count,'request':request}) 
Example #15
0
def module_deploy(request):
    """
    deploy (nginx/php/mysql..etc) module
    """

    ret = []
    jid = []
    user = request.user
    if request.method == 'POST':
        action = request.get_full_path().split('=')[1]
        if action == 'deploy':
            tgt = request.POST.get('tgt')
            arg = request.POST.getlist('module')
            tgtcheck = HostList.objects.filter(hostname=tgt)
        if tgtcheck:
            Message.objects.create(type='salt', action='deploy', action_ip=tgt,
                                   content='saltstack %s module depoy' % (arg))
            sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'],
                           password=settings.SALT_API['password'])
            db = db_operate()

            if 'sysinit' in arg:
                obj = sapi.async_deploy(tgt, arg[-1])  # 先执行初始化模块,其他任意 sysinit 在最后的模块
                sql = "insert INTO salt_returns VALUES(%s) " % obj
                print (sql)
                jid.append(obj)
                arg.remove('sysinit')
                if arg:
                    for i in arg:
                        obj = sapi.async_deploy(tgt, i)
                        jid.append(obj)
            else:
                for i in arg:
                    obj = sapi.async_deploy(tgt, i)
                    sql = "insert INTO salt_returns VALUES(%s) " % obj
                    db.mysql_command(settings.OMS_MYSQL, sql)
                    jid.append(obj)
                    msg = '%s deploy %s module success,jid is %s' % (tgt, i, obj)
                    ret.append(msg)
                    # db = db_operate()
                    # for i in jid:
                    #     # time.sleep(10)
                    #     sql = 'select returns from salt_returns where returns=%s'
                    #     result=db.select_table(settings.OMS_MYSQL,sql,str(i))    #通过jid获取执行结果
                    #     print result
                    #     ret.extend(result)
                    # sapi.async_deploy('test-01','zabbix.api')   #调用zabbix.api执行模块监控
        else:
            ret = '亲,目标主机不对,请重新输入'

    return render(request, 'salt_module_deploy.html', {'ret': ret})
Example #16
0
def AjaxResult(jid, check_type):
    '''
    定义ajax查询结果函数
    '''

    true = True
    sapi = SaltAPI(url=settings.SALT_API['url'],
                   username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    ret = sapi.salt_runner(jid)
    if check_type == 'deploy':
        rst = ret['data']
        rst_all = ''
        for k in rst:
            r_str = ''
            for k1 in rst[k]:
                if 'cmd_' in k1:
                    v1 = rst[k][k1]
                    if v1['result']:
                        result = u'成功'
                    else:
                        result = u'失败'
                    try:
                        stderr = v1['changes']['stderr']
                    except:
                        stderr = ''
                    v_str = u'运行结果:' + result + u'\n错误:' + stderr + u'\n内容:' + v1[
                        'comment'] + u'\n命令:' + v1['name'] + u'\n开始时间:' + v1[
                            'start_time'] + u'\n耗时:' + str(
                                v1['duration']) + '\n'
                    r_str = u'主机:' + k + '\n' + v_str + '-' * 80 + '\n'
            rst_all = rst_all + r_str
    else:
        rst_all = ''
        for k in ret:
            r_str = u'主机:' + k + u'\n运行结果:\n' + ret[k] + '\n' + '-' * 80 + '\n'
            rst_all = rst_all + r_str

    try:
        # 记录查询操作日志
        message = get_object_or_404(Message, action=jid)
        m = re.search('\[([^:]*)\]', message.content)
        module = m.groups()[0]
        message.content = '[%s]\n----\n%s' % (module, rst_all)
        message.save()
    except:
        print 'Err'
        pass

    return rst_all
Example #17
0
def module_deploy(request):
    """
    deploy (nginx/php/mysql..etc) module
    """

    ret = []
    jid = []
    user = request.user
    if request.method == 'POST':
        action = request.get_full_path().split('=')[1]
        if action == 'deploy':
            tgt = request.POST.get('tgt')
            arg = request.POST.getlist('module')
            tgtcheck = HostList.objects.filter(hostname=tgt)
        if tgtcheck:
            Message.objects.create(type='salt',
                                   action='deploy',
                                   action_ip=tgt,
                                   content='saltstack %s module depoy' % (arg))
            sapi = SaltAPI(url=settings.SALT_API['url'],
                           username=settings.SALT_API['user'],
                           password=settings.SALT_API['password'])
            if 'sysinit' in arg:
                obj = sapi.async_deploy(tgt, arg[-1])  #先执行初始化模块,其他任意
                jid.append(obj)
                arg.remove('sysinit')
                if arg:
                    for i in arg:
                        obj = sapi.async_deploy(tgt, i)
                        jid.append(obj)
            else:
                for i in arg:
                    obj = sapi.async_deploy(tgt, i)
                    jid.append(obj)
            db = db_operate()
            for i in jid:
                time.sleep(10)
                sql = 'select returns from salt_returns where jid=%s'
                result = db.select_table(settings.RETURNS_MYSQL, sql,
                                         str(i))  #通过jid获取执行结果
                ret.append(result)
            #sapi.async_deploy('test-01','zabbix.api')   #调用zabbix.api执行模块监控
        else:
            ret = '亲,目标主机不对,请重新输入'

    return render_to_response('salt_module_deploy.html', {'ret': ret},
                              context_instance=RequestContext(request))
Example #18
0
def get_server_asset_info(tgt):
    '''
    Salt API得到资产信息,进行格式化输出
    '''
    global asset_info
    info = []
    sapi = SaltAPI(url=settings.SALT_API['url'],
                   username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    ret = sapi.remote_noarg_execution(tgt, 'grains.items')
    manufacturer = ret['manufacturer']
    info.append(manufacturer)
    productname = ret['productname']
    info.append(productname)
    serialnumber = ret['serialnumber']
    info.append(serialnumber)
    cpu_model = ret['cpu_model']
    info.append(cpu_model)
    num_cpus = int(ret['num_cpus'])
    info.append(num_cpus)
    num_gpus = int(ret['num_gpus'])
    info.append(num_gpus)
    mem_total = str(round(int(ret['mem_total']) / 1024.0, ))[:-2] + 'G'
    info.append(mem_total)
    #disk_size = ret['disk_size']
    disk_size = 10
    info.append(disk_size)
    #raidlevel = ret['raidlevel']
    raidlevel = 5
    info.append(raidlevel)
    id = ret['id']
    info.append(id)
    #lan_ip = ret['lan_ip'][0]
    lan_ip = ret['fqdn_ip4']
    info.append(lan_ip)
    #lan_mac = ret['hwaddr_interfaces'][0]
    lan_mac = 'mac'
    info.append(lan_mac)
    sys_ver = ret['os'] + ret['osrelease'] + '-' + ret['osarch']
    info.append(sys_ver)
    virtual = ret['virtual']
    info.append(virtual)
    #idc_name = ret['idc_name']
    idc_name = 'testidc'
    info.append(idc_name)
    asset_info.append(info)
Example #19
0
def GetAssetInfo(tgt):
    '''
    Salt API获取主机信息并进行格式化输出
    '''
    info = {}
    sapi = SaltAPI(url=settings.SALT_API['url'],
                   username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    ret = sapi.remote_server_info(tgt, 'grains.items')
    info['sn'] = GetInfo(ret, 'serialnumber')
    info['hostname'] = GetInfo(ret, 'fqdn')
    info['nodename'] = tgt
    info['os'] = GetInfo(ret, 'os') + GetInfo(
        ret, 'osrelease') + ' ' + GetInfo(ret, 'osarch')
    info['manufacturer'] = GetInfo(ret, 'manufacturer')
    info['cpu_model'] = GetInfo(ret, 'cpu_model')
    info['productname'] = GetInfo(ret, 'productname')
    info['cpu_nums'] = GetInfo(ret, 'num_cpus')
    info['disk'] = str(DISKINFO[0]) + "GB"
    info['network'] = GetInfo(ret, 'PublicIp')
    info['kernel'] = GetInfo(ret, 'kernel') + GetInfo(ret, 'kernelrelease')
    info['zmqversion'] = GetInfo(ret, 'zmqversion')
    info['shell'] = GetInfo(ret, 'shell')
    info['saltversion'] = GetInfo(ret, 'saltversion')
    info['locale'] = GetInfoDict(ret, 'locale_info')
    info['selinux'] = GetInfoDict(ret, 'selinux')
    info['networkarea'] = GetInfo(ret, 'netRegion')

    if 'virtual_subtype' in ret:
        virtual = GetInfo(ret, 'virtual') + '-' + GetInfo(
            ret, 'virtual_subtype')
    else:
        virtual = GetInfo(ret, 'virtual')
    info['virtual'] = virtual

    mem = GetInfo(ret, 'mem_total')
    if mem > 1000:
        mem = int(mem) / 1000.0
        memory = ('%.1f' % mem) + 'G'
    else:
        memory = str(mem) + 'M'
    info['memory'] = memory

    return info
Example #20
0
def salt_key_manage(request, hostname=None):
    '''
    接受或拒绝salt主机,同时更新数据库
    '''
    if request.user.is_superuser:
        if request.method == 'GET':
            sapi = SaltAPI(url=settings.SALT_API['url'],
                           username=settings.SALT_API['user'],
                           password=settings.SALT_API['password'])
            hostname = request.GET.get('hostname')
            salthost = SaltHost.objects.get(hostname=hostname)
            action = ''
            if request.GET.has_key('add'):
                ret = sapi.accept_key(hostname)
                if ret:
                    salthost.status = True
                    salthost.save()
                    action = u'添加主机'
            if request.GET.has_key('delete'):
                ret = sapi.delete_key(hostname)
                if ret:
                    salthost.status = False
                    salthost.save()
                    action = u'删除主机'
            if request.GET.has_key('flush'):
                ret = sapi.salt_alive(hostname)
                try:
                    alive = ret[hostname]
                    alive = True
                except:
                    alive = False
                salthost.alive = alive
                salthost.save()
                action = u'刷新主机'
            if action:
                Message.objects.create(type=u'部署管理',
                                       user=request.user,
                                       action=action,
                                       action_ip=UserIP(request),
                                       content=u'%s %s' %
                                       (action, salthost.hostname))
        return redirect('key_list')
    else:
        raise Http404
Example #21
0
def get_server_asset_info(tgt):
    '''
    Salt API得到资产信息,进行格式化输出
    '''
    global asset_info
    info = []
    sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])
    ret = sapi.remote_noarg_execution(tgt,'grains.items')
    manufacturer = ret['manufacturer']
    info.append(manufacturer)
    productname = ret['productname']
    info.append(productname)
    serialnumber = ret['serialnumber'] 
    info.append(serialnumber)
    cpu_model = ret['cpu_model']
    info.append(cpu_model)
    num_cpus = int(ret['num_cpus'])
    info.append(num_cpus)
    num_gpus = int(ret['num_gpus'])
    info.append(num_gpus)
    mem_total = str(round(int(ret['mem_total'])/1024.0,))[:-2] + 'G'
    info.append(mem_total)
    #disk_size = ret['disk_size']
    disk_size = 10
    info.append(disk_size)
    #raidlevel = ret['raidlevel']
    raidlevel = 5
    info.append(raidlevel)
    id = ret['id']
    info.append(id)
    #lan_ip = ret['lan_ip'][0]
    lan_ip = ret['fqdn_ip4']
    info.append(lan_ip)
    #lan_mac = ret['hwaddr_interfaces'][0]
    lan_mac = 'mac'
    info.append(lan_mac)
    sys_ver = ret['os'] + ret['osrelease'] + '-' + ret['osarch']
    info.append(sys_ver)
    virtual = ret['virtual']
    info.append(virtual)
    #idc_name = ret['idc_name']
    idc_name = 'testidc'
    info.append(idc_name)
    asset_info.append(info)
Example #22
0
def salt_accept_key(request):
    """
    accept salt minions key
    """
    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
        ip =  request.META['HTTP_X_FORWARDED_FOR']  
    else:
        ip = request.META['REMOTE_ADDR'] 
    user = request.user
    node_name = request.GET.get('node_name')
    what = request.GET.get('what')
    sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])  
    if what == "accept":
        ret = sapi.accept_key(node_name)
        HostList.objects.create(hostname=node_name)
    if what == "reject":
        ret = sapi.reject_key(node_name)    
    Message.objects.create(type='salt-key', action=what, action_ip=ip, username=user,content='saltstack accept %s key'%(node_name))
    return HttpResponseRedirect(reverse('key_list')) 
Example #23
0
def salt_delete_key(request):
    """
    delete salt minions key
    """
    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
        ip =  request.META['HTTP_X_FORWARDED_FOR']  
    else:
        ip = request.META['REMOTE_ADDR'] 
    user = request.user
    node_name = request.GET.get('node_name')
    sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])  
    ret = sapi.delete_key(node_name)
    id_list = HostList.objects.filter(hostname=node_name)
    if id_list:
        for i in id_list:
            host_list = get_object_or_404(HostList, pk=i.id)
            host_list.delete()
            Message.objects.create(type='hostlist', action='delete', action_ip=ip, username=user,content='delete %s' %(node_name))
    Message.objects.create(type='salt-key', action='delete', action_ip=ip, username=user, content='delete %s salt-key' %(node_name))
    return HttpResponseRedirect(reverse('key_list'))
Example #24
0
def autoget_host_info(tgt):
    '''
    Salt API得到资产信息,进行格式化输出
    '''
    global host_info
    info = {}
    grains_ret = False
    #ver_info = []
    sapi = SaltAPI(url=settings.SALT_API['url'],
                   username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    try:
        ret = sapi.remote_noarg_execution(tgt, 'test.ping')
    except Exception as e:
        ret = False
    if ret:
        try:
            grains_ret = sapi.remote_noarg_execution(tgt, 'grains.items')
        except Exception as e:
            grains_ret = False
    if grains_ret:
        info['ip'] = grains_ret['ip'].split('/')[0]
        info['version'] = grains_ret['saltversioninfo']
        info['cpu_model'] = grains_ret['cpu_model']
        info['mem'] = grains_ret['mem_total']
        info['os_ver'] = grains_ret['os'] + '_' + grains_ret[
            'osrelease'] + '_' + grains_ret['osarch']
        info['manufacturer'] = grains_ret['manufacturer']
        info['productname'] = grains_ret['productname']
    else:
        info['ip'] = ''
        info['version'] = ''
        info['cpu_model'] = ''
        info['mem'] = ''
        info['os_ver'] = ''
        info['manufacturer'] = ''
        info['productname'] = ''

    info['hostname'] = tgt
    info['status'] = ret
    host_info[info['hostname']] = info
Example #25
0
def salt_key_import(request):
    '''
    导入salt主机
    '''
    if request.user.is_superuser:
        sapi = SaltAPI(url=settings.SALT_API['url'],
                       username=settings.SALT_API['user'],
                       password=settings.SALT_API['password'])
        minions, minions_pre = sapi.list_all_key()
        alive = False
        ret_alive = sapi.salt_alive('*')
        for node_name in minions:
            try:
                alive = ret_alive[node_name]
                alive = True
            except:
                alive = False
            try:
                SaltHost.objects.create(hostname=node_name,
                                        alive=alive,
                                        status=True)
            except:
                salthost = SaltHost.objects.get(hostname=node_name)
                now = datetime.datetime.now()
                alive_old = SaltHost.objects.get(hostname=node_name).alive
                if alive != alive_old:
                    salthost.alive_time_last = now
                    salthost.alive = alive
                salthost.alive_time_now = now
                salthost.save()
        for node_name in minions_pre:
            try:
                SaltHost.objects.get_or_create(hostname=node_name,
                                               alive=alive,
                                               status=False)
            except:
                print 'not create'

        return redirect('key_list')
    else:
        raise Http404
Example #26
0
def module_deploy(request):
    """
    deploy (nginx/php/mysql..etc) module
    """

    ret = [] 
    jid = []
    user = request.user
    if request.method == 'POST':
        action = request.get_full_path().split('=')[1]
        if action == 'deploy':
            tgt = request.POST.get('tgt')
            arg = request.POST.getlist('module')
            tgtcheck = HostList.objects.filter(hostname=tgt)
        if tgtcheck:
            Message.objects.create(type='salt', action='deploy', action_ip=tgt, content='saltstack %s module depoy' % (arg))
            sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])  
            if 'sysinit' in arg:                        
                obj = sapi.async_deploy(tgt,arg[-1])    #先执行初始化模块,其他任意
                jid.append(obj)
                arg.remove('sysinit')
                if arg:
                    for i in arg:
                        obj = sapi.async_deploy(tgt,i)     
                        jid.append(obj)
            else:
                for i in arg:
                    obj = sapi.async_deploy(tgt,i)
                    jid.append(obj)
            db = db_operate()
            for i in jid:
                time.sleep(10)
                sql = 'select returns from salt_returns where jid=%s'
                result=db.select_table(settings.RETURNS_MYSQL,sql,str(i))    #通过jid获取执行结果
                ret.append(result)
            #sapi.async_deploy('test-01','zabbix.api')   #调用zabbix.api执行模块监控
        else:
           ret = '亲,目标主机不对,请重新输入'   

    return render_to_response('salt_module_deploy.html', 
           {'ret': ret},context_instance=RequestContext(request)) 
Example #27
0
def deploy_init_status(request):  
    """
    List all waiting for the host operating system is installed
    """
    user = request.user
    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
        userip =  request.META['HTTP_X_FORWARDED_FOR']  
    else:
        userip = request.META['REMOTE_ADDR'] 
    #获取待初始化的信息,从数据库中查询是否存在,未存在的插入到列表
    all_system_list = SystemInstall.objects.filter(status='99')
    sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])
    minions = sapi.list_all_key()
    for tgt in all_system_list:
        if tgt.hostname not in minions[0]:
            sapi.accept_key(tgt.hostname)
            Message.objects.create(type='salt', action='initkey', action_ip=userip, username=user, content='%s accept key' % (tgt.hostname))
            if tgt.hostname in sapi.list_all_key()[0]:
                ret = HostList.objects.filter(hostname=tgt.hostname)
                if ret:
                    print "already in database"
                    #SystemInstall.objects.filter(hostname=h).delete()
                    Message.objects.create(type='sql', action='init', action_ip=tgt.hostname, username=user, content='已经存在')
                else:
                    HostList.objects.create(hostname=tgt.hostname)
                    #SystemInstall.objects.filter(hostname=h).delete()               #安装后,装机列表此IP信息删除,转让到安装记录里供审计
                    #Message.objects.create(type='sql', action='add', action_ip=tgt.hostname, username=user, content='添加主机')
                    Message.objects.create(type='asstes', action='create', action_ip=userip, username=user, content='add %s in hostlist' % (tgt.hostname))
    paginator = Paginator(all_system_list,15)
    try:
        page = int(request.GET.get('page','1'))
    except ValueError:
        page = 1

    try:
        all_system_list = paginator.page(page)
    except :
        all_system_list = paginator.page(paginator.num_pages)

    return render_to_response('deploy_init_status.html', {'all_system_list': all_system_list, 'page': page, 'paginator':paginator,'request':request},context_instance=RequestContext(request))
Example #28
0
def autoget_host_info(tgt):
    '''
    Salt API得到资产信息,进行格式化输出
    '''
    global host_info
    info = {}
    grains_ret = False
    #ver_info = []
    sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])
    try:
        ret = sapi.remote_noarg_execution(tgt,'test.ping')
    except Exception as e:
        ret = False
    if ret:
        try:
            grains_ret = sapi.remote_noarg_execution(tgt,'grains.items')
        except Exception as e:
            grains_ret = False
    if grains_ret:
        info['ip'] =  grains_ret['ip'].split('/')[0]
        info['version'] = grains_ret['saltversioninfo']
        info['cpu_model'] = grains_ret['cpu_model']
        info['mem'] = grains_ret['mem_total']
        info['os_ver'] = grains_ret['os']+'_'+grains_ret['osrelease']+'_'+grains_ret['osarch']
        info['manufacturer'] = grains_ret['manufacturer']
        info['productname'] = grains_ret['productname']
    else:
        info['ip'] =  ''
        info['version'] = ''
        info['cpu_model'] = ''
        info['mem'] = ''
        info['os_ver'] = ''
        info['manufacturer'] = ''
        info['productname'] = ''   
        
     
    info['hostname'] = tgt
    info['status'] = ret
    host_info[info['hostname']] = info
Example #29
0
def code_deploy(request):
    """
    Pull code for building, pushed to the server
    """

    ret = ''
    host = {'ga': 'test-01', 'beta': 'localhost.localdomain'}
    user = request.user
    if request.method == 'POST':
        action = request.get_full_path().split('=')[1]
        if action == 'push':
            pro = request.POST.get('project')
            url = request.POST.get('url')
            ver = request.POST.get('version')
            env = request.POST.get('env')
            capi = Code_Work(pro=pro, url=url, ver=ver)
            data = {pro: {'ver': ver}}
            obj = capi.work()  #构建rpm包
            if obj['comment'][0]['result'] and obj['comment'][1][
                    'result'] and obj['comment'][2]['result']:
                json_api = BuildJson()
                json_api.build_data(host[env],
                                    data)  #刷新pillar数据,通过deploy下发SLS执行代码发布
                sapi = SaltAPI(url=settings.SALT_API['url'],
                               username=settings.SALT_API['user'],
                               password=settings.SALT_API['password'])
                if env == 'beta':
                    jid = sapi.target_deploy('beta', 'deploy.' + pro)
                elif env == 'ga':
                    jid = sapi.target_deploy('tg', 'deploy.' + pro)
                else:
                    jid = sapi.target_deploy('beta', 'deploy.' + pro)
                time.sleep(8)
                db = db_operate()
                sql = 'select returns from salt_returns where jid=%s'
                ret = db.select_table(settings.RETURNS_MYSQL, sql,
                                      str(jid))  #通过jid获取执行结果
    return render_to_response('code_deploy.html', {'ret': ret},
                              context_instance=RequestContext(request))
Example #30
0
def remote_execution(request):
    """
    remote command execution
    """

    ret = ''
    tgtcheck = ''
    danger = ('rm','reboot','init ','shutdown')
    user = request.user
    if request.method == 'POST':
        action = request.get_full_path().split('=')[1]
        if action == 'exec':
	    if request.POST.has_key('Dstart'):
		arg = 'sudo -u hadoop -s -H /home/hadoop/hadoop/bin/hadoop-daemon.sh start datanode'
	    elif request.POST.has_key('Dstop'):
		arg = 'sudo -u hadoop -s -H /home/hadoop/hadoop/bin/hadoop-daemon.sh stop datanode'
	    elif request.POST.has_key('Dstatus'):
		arg = 'sudo -u hadoop -s -H /home/hadoop/java/bin/jps'
	    elif request.POST.has_key('Tstart'):
		arg = 'sudo -u hadoop -s -H /home/hadoop/hadoop/bin/hadoop-daemon.sh start tasktracker'
	    elif request.POST.has_key('Tstop'):
		arg = 'sudo -u hadoop -s -H /home/hadoop/hadoop/bin/hadoop-daemon.sh stop tasktracker'
	    elif request.POST.has_key('Tstatus'):
		arg = 'sudo -u hadoop -s -H /home/hadoop/java/bin/jps'
            tgt = request.POST.get('tgt')
            tgtcheck = HostList_yz1.objects.filter(ip=tgt)
            argcheck = arg.split()[0] not in danger
            if tgtcheck and argcheck:
                sapi = SaltAPI(url=settings_local.SALT_API['url'],username=settings_local.SALT_API['user'],password=settings_local.SALT_API['password'])
                ret = sapi.remote_execution(tgt,'cmd.run',arg)
            elif not tgtcheck:
                ret = '亲,目标主机不正确,请重新输入'     
            elif not argcheck:
                ret = '亲,命令很危险, 你这样子老大会不开森'
        Message.objects.create(type='salt', action='execution', action_ip=tgt, content='saltstack execution command: %s ' % (arg))
            
    return render_to_response('salt_remote_execution.html',
           {'ret': ret},context_instance=RequestContext(request))
Example #31
0
def salt_key_list(request):
    """
    list all key 
    """

    user = request.user
    sapi = SaltAPI(url=settings.SALT_API['url'],
                   username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    minions, minions_pre, minions_rej = sapi.list_all_key()
    minions_count = len(minions)
    minions_pre_count = len(minions_pre)
    minions_rej_count = len(minions_rej)
    return render_to_response(
        'salt_key_list.html', {
            'all_minions': minions,
            'all_minions_pre': minions_pre,
            'all_minions_rej': minions_rej,
            'minions_count': minions_count,
            'minions_pre_count': minions_pre_count,
            'minions_rej_count': minions_rej_count,
            'request': request
        })
Example #32
0
def remote_execution(request):
    """
    remote command execution
    """
    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
        ip =  request.META['HTTP_X_FORWARDED_FOR']  
    else:
        ip = request.META['REMOTE_ADDR']      
    tgtcheck = ''
    ret_cmd_msg = []
    hosts = []
    node = ''
    danger = ('rm','reboot','init ','shutdown')
    user = request.user
    ret_err = ''
    ret = 'none'
    tgt = 'none'
    hostlists = HostList.objects.all()
    if request.method == 'POST':
        action = request.POST.get('action')
        tgt = request.POST.getlist('tgt')
        arg = request.POST.get('arg')
        if action != '' and len(tgt) != 0  and arg !='':
            if action == 'exec':#远程命令执行            
                arg1 = arg.split()[0]
                print arg1
                hosts = tgt
                for node in hosts:               
                    argcheck = arg1 not in danger
                    if argcheck:
                        sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])
                        ret = sapi.remote_execution(node,'cmd.run',arg)
                        cmd_msg="\n"+str(node)+":\n"+"="*24+"\n"+str(ret)
                        #print node,ret[node]
                        ret_cmd_msg.append(cmd_msg)
                        ret_err = '' 
                        Message.objects.create(type='salt-run', action='cmd_run', action_ip=ip, username=user, content='%s cmd.run %s' % (node,arg))
                        
                    elif not argcheck:
                        ret_err = '命令很危险, 你这样子老大会不开森'
            if action == 'grains':#远程命令执行
                arg1 = arg.split()[0]
                print arg1
                hosts = tgt
                for node in hosts:
                    ret_str_msg = ""               
                    argcheck = arg1 not in danger
                    if argcheck:
                        sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])
                        ret = sapi.remote_execution(node,'grains.item',arg)
                        if type(ret[arg]) == dict:
                            for k, v in ret[arg].items():
                                ret_str_msg  = str(k)+":   "+ str(v)+"\n"+ret_str_msg                               
                            cmd_msg="\n"+str(node)+":\n"+"="*24+"\n"+ret_str_msg
                        else:
                            cmd_msg="\n"+str(node)+":\n"+"="*24+"\n"+str(ret[arg])
                        #print node,ret[node]
                        ret_cmd_msg.append(cmd_msg)
                        ret_err = ''
                        Message.objects.create(type='salt', action='grains', action_ip=ip, username=user, content='%s grains.item %s' % (node,arg))
                                 
                    elif not argcheck:
                        ret_err = '命令很危险, 你这样子老大会不开森'
        elif len(tgt) == 0:
            ret_err = "目标主机不能为空"
        elif arg == '':
            ret_err = "命令不能为空"
            
        #Message.objects.create(type='salt', action='execution', action_ip=ip, username=user, content='saltstack execution command: %s ' % (arg))
         
    return render_to_response('salt_remote_execution.html',
           {'ret':ret,'ret_err': ret_err,'ret_cmd_msg':ret_cmd_msg,'hostlists':hostlists,'request':request},context_instance=RequestContext(request)) 
Example #33
0
def salt_group_manage(request, id=None):
    '''
    salt主机分组管理,同时更新salt-master配置文件
    '''

    action = ''
    page_name = ''
    if id:
        group = get_object_or_404(SaltGroup, pk=id)
        action = 'edit'
        page_name = '编辑分组'
    else:
        group = SaltGroup()
        action = 'add'
        page_name = '新增分组'

    if request.method == 'GET':
        if request.GET.has_key('delete'):
            id = request.GET.get('id')
            group = get_object_or_404(SaltGroup, pk=id)
            group.delete()
            Message.objects.create(type=u'部署管理',
                                   user=request.user,
                                   action=u'删除分组',
                                   action_ip=UserIP(request),
                                   content='删除分组 %s' % group.nickname)
            with open('./saltconfig/nodegroup.conf', 'r') as f:
                with open('./nodegroup', 'w') as g:
                    for line in f.readlines():
                        if group.groupname not in line:
                            g.write(line)
            shutil.move('./nodegroup', './saltconfig/nodegroup.conf')
            return redirect('group_list')

    if request.method == 'POST':
        form = SaltGroupForm(request.POST, instance=group)
        if form.is_valid():
            minions = request.POST.getlist('minions')
            # 前台分组以别名显示,组名不变
            if action == 'add':
                group = form.save(commit=False)
                group.groupname = form.cleaned_data['nickname']
            else:
                try:
                    group.minions.clear()
                except:
                    pass
                form.save
            group.save()
            for m in minions:
                group.minions.add(m)

            Message.objects.create(type=u'部署管理',
                                   user=request.user,
                                   action=page_name,
                                   action_ip=UserIP(request),
                                   content='%s %s' %
                                   (page_name, group.nickname))

            minions_l = []
            for m in group.minions.values('hostname'):
                minions_l.append(m['hostname'])
            minions_str = ','.join(minions_l)
            try:
                with open('./saltconfig/nodegroup.conf', 'r') as f:
                    with open('./nodegroup', 'w') as g:
                        for line in f.readlines():
                            if group.groupname not in line:
                                g.write(line)
                        g.write("  %s: 'L@%s'\n" %
                                (group.groupname, minions_str))
                shutil.move('./nodegroup', './saltconfig/nodegroup.conf')
            except:
                with open('./saltconfig/nodegroup.conf', 'w') as g:
                    g.write("nodegroups:\n  %s: 'L@%s'\n" %
                            (group.groupname, minions_str))

            sapi = SaltAPI(url=settings.SALT_API['url'],
                           username=settings.SALT_API['user'],
                           password=settings.SALT_API['password'])
            jid = sapi.local_run('cmd.run', 'systemctl restart salt-api')
            return redirect('group_list')
    else:
        form = SaltGroupForm(instance=group)

    return render(request, 'salt_group_manage.html', {
        'form': form,
        'action': action,
        'page_name': page_name
    })
Example #34
0
# Import salt modules
import salt.config
import salt.utils.event
from lion import settings

# Import third party libs
import MySQLdb
from deploy.saltapi import SaltAPI


# Create MySQL connect
conn = MySQLdb.connect(host="localhost", user="******", passwd="chenpiao", db="salt")
cursor = conn.cursor()

sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])
node_name = []
cpu_mode = []
items = sapi.remote_noarg_execution('Django','grains.items')
CPU = items.get('cpu_model','none')
HOSTNAME = items.get('host','none')
MAC = items.get('hwaddr_interfaces','none').get('eth0','none')
IP = items.get('ip4_interfaces','none').get('eth0','none')[0]
OS = items.get('osfullname','none') + '_' + items.get('osrelease','none') + '_' + items.get('osarch','none')
MEM = items.get('mem_total','none')

sql = "insert ignore into info(host,ip_addr,cpu_mode,mem_total,os,mac) values(%s,%s,%s,%s,%s,%s)"
param = (HOSTNAME,IP,CPU,MEM,OS,MAC)
n = cursor.execute(sql,param)
print 'insert',n
conn.commit()
Example #35
0
def UploadFile(request, form, group=False):
    '''
    定义文件上传函数
    '''

    danger = []
    check = False
    is_group = False
    rst = ''
    ret = ''
    jid = ''
    fileupload = FileUpload()
    if request.method == 'POST':
        form = SaltFileForm(request.POST, request.FILES, instance=fileupload)
        remote_path = request.POST.get('remote_path')
        for i in UserDirectory.objects.filter(name='ENGINEDEV_PATH'):
            danger = i.directory.split(',')
        if len(danger) == 0:
            danger = ['/etc', '/boot']
        if remote_path not in danger or request.user.is_superuser:
            if form.is_valid and request.is_ajax():
                cur_name = request.FILES['file_path'].name
                if request.POST.get('check_type') == 'panel-group':
                    grp = request.POST.get('tgt_select')
                    tgt_list = SaltGroup.objects.get(nickname=grp).groupname
                    expr_form = 'nodegroup'
                    is_group = True
                    tgt_select = [tgt_list]
                else:
                    tgt_select = request.POST.getlist('tgt_select')
                    tgt_list = ','.join(tgt_select)
                    expr_form = 'list'
                for tgt in tgt_select:
                    fileupload = form.save(commit=False)
                    fileupload.user = request.user
                    fileupload.target = tgt
                    fileupload.file_tag = '%s-%s-%s' % (
                        cur_name, request.user.id,
                        datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
                    fileupload.save()
                # 替换路径为<salt://>形式,详细可查看salt上传文件命令
                local_path = str(fileupload.file_path).replace(
                    'salt/fileupload', 'salt://fileupload')
                remote_path = '%s/%s' % (fileupload.remote_path, cur_name)
                sapi = SaltAPI(url=settings.SALT_API['url'],
                               username=settings.SALT_API['user'],
                               password=settings.SALT_API['password'])
                # 备份远程文件
                ret_bak = sapi.file_bak(tgt_list, 'cp.push', remote_path,
                                        expr_form)
                # 上传文件到远程
                ret = sapi.file_copy(tgt_list, 'cp.get_file', local_path,
                                     remote_path, expr_form)
                # 分组上传文件时,只需从其中一台salt主机备份文件,备份完成后设置group_forloop为false
                group_forloop = True

                for k in ret:
                    if request.POST.get('check_type') == 'panel-group':
                        bakup_path = './media/salt/filebakup/user_%s/%s' % (
                            request.user.id, tgt_list)
                    else:
                        bakup_path = './media/salt/filebakup/user_%s/%s' % (
                            request.user.id, k)
                    if not os.path.exists(
                            '%s%s' % (bakup_path, fileupload.remote_path)):
                        os.makedirs('%s%s' %
                                    (bakup_path, fileupload.remote_path))
                    if ret[k]:
                        rst = rst + u'主机:' + k + '\n上传结果:\n' + ret[k] + '\n'
                        if ret_bak[k]:
                            bak_file = '%s%s/%s' % (bakup_path,
                                                    fileupload.remote_path,
                                                    fileupload.file_tag)
                            # 替换路径为<salt://>形式,以便文件回滚
                            bak_path = bak_file.replace(
                                './media/salt', 'salt:/')
                            if request.POST.get(
                                    'check_type'
                            ) == 'panel-group' and group_forloop:
                                shutil.copy(
                                    '/var/cache/salt/master/minions/%s/files/%s'
                                    % (k, remote_path), bak_file)
                                try:
                                    FileRollback.objects.get_or_create(
                                        user=request.user,
                                        target=tgt_list,
                                        cur_path=remote_path,
                                        bak_path=bak_path,
                                        file_tag=fileupload.file_tag,
                                        remark=fileupload.remark,
                                        is_group=True)
                                except:
                                    print 'not create'
                                group_forloop = False
                            else:
                                try:
                                    shutil.copy(
                                        '/var/cache/salt/master/minions/%s/files/%s'
                                        % (k, remote_path), bak_file)
                                except:
                                    print 'No such file or dirctory'
                                try:
                                    FileRollback.objects.get_or_create(
                                        user=request.user,
                                        target=k,
                                        cur_path=remote_path,
                                        bak_path=bak_path,
                                        file_tag=fileupload.file_tag,
                                        remark=fileupload.remark)
                                except:
                                    print 'not create'

                            rst = rst + u'远程文件%s备份成功...' % remote_path + '\n' + '-' * 80 + '\n'

                        else:
                            rst = rst + u'远程文件%s不存在,备份失败...' % remote_path + '\n' + '-' * 80 + '\n'
                    else:
                        rst = rst + u'主机:' + k + '\n上传结果:\n失败\n' + '-' * 80 + '\n'
        else:
            rst = u'无权限更改此目录'

    return {'ret': rst, 'check': check, 'is_group': is_group}
Example #36
0
def RemoteExec(request, fun, group=False):
    '''
    定义远程命令函数
    '''

    danger = []
    for i in UserCommand.objects.filter(name='ENGINEDEV'):
        danger = i.command.split(',')
    if len(danger) == 0:
        danger = ['reboot', 'shutdown']
    check = False
    is_group = False
    ret = ''
    jid = ''
    arg = ''
    if request.method == 'POST':
        if request.is_ajax():
            if request.POST.get('check_type') == 'panel-group':
                grp = request.POST.get('tgt_select')
                tgt_list = SaltGroup.objects.get(nickname=grp).groupname
                expr_form = 'nodegroup'
                is_group = True
            else:
                tgt_select = request.POST.getlist('tgt_select[]')
                if not tgt_select:
                    tgt_list = request.POST.get('tgt_select')
                else:
                    tgt_list = ','.join(tgt_select)
                expr_form = 'list'
            if fun == 'cmd.run':
                arg = request.POST.get('arg')
            else:
                arg = request.POST.get('module_list')
                arg = 'module.user_%s.%s' % (request.user.id, arg)
            sapi = SaltAPI(url=settings.SALT_API['url'],
                           username=settings.SALT_API['user'],
                           password=settings.SALT_API['password'])
            if arg not in danger or request.user.is_superuser:
                try:
                    if fun == 'cmd.run':
                        jid = sapi.remote_execution(tgt_list, fun,
                                                    arg + ';echo ":::"$?',
                                                    expr_form)
                        if is_group:
                            s = SaltGroup.objects.get(groupname=tgt_list)
                            s_len = s.minions.all().count()
                        else:
                            s = tgt_list.split(',')
                            s_len = len(s)
                        rst = {}
                        while (len(rst) < s_len):
                            rst = sapi.salt_runner(jid)
                            #time.sleep(1)
                        for k in rst:
                            ret = ret + u'主机:' + k + '\n运行结果:\n%s\n' % rst[k]
                            r = rst[k].split(':::')[-1].strip()
                            if r != '0':
                                ret = ret + '%s 执行失败!\n' % arg + '-' * 80 + '\n'
                            else:
                                ret = ret + '%s 执行成功!\n' % arg + '-' * 80 + '\n'

                    else:
                        jid = sapi.remote_execution(tgt_list, fun, arg,
                                                    expr_form)
                        rst = sapi.salt_runner(jid)
                        rst = ret['data']
                        rst_all = ''
                        for k in rst:
                            r_str = ''
                            for k1 in rst[k]:
                                if 'cmd_' in k1:
                                    v1 = rst[k][k1]
                                    if v1['result']:
                                        result = u'成功'
                                    else:
                                        result = u'失败'
                                    try:
                                        stderr = v1['changes']['stderr']
                                    except:
                                        stderr = ''
                                    v_str = u'运行结果:' + result + u'\n错误:' + stderr + u'\n内容:' + v1[
                                        'comment'] + u'\n命令:' + v1[
                                            'name'] + u'\n开始时间:' + v1[
                                                'start_time'] + u'\n耗时:' + str(
                                                    v1['duration']) + '\n'
                                    r_str = u'主机:' + k + '\n' + v_str + '-' * 80 + '\n'
                            rst_all = rst_all + r_str
                        ret = rst_all
                except:
                    pass
                if not arg or not tgt_list:
                    ret = u'未选择主机或未输入命令...'
                if ret:
                    ret = ret + '\nJobs NO. %s' % jid
                else:
                    check = True
                    ret = u'命令执行中,请稍候查询结果...\nJobs NO. %s' % jid
            else:
                ret = u'无权限执行此命令!'
    return {
        'ret': ret,
        'arg': arg,
        'jid': jid,
        'check': check,
        'is_group': is_group
    }
Example #37
0
def deploy_init_status(request):
    """
    List all waiting for the host operating system is installed
    """
    user = request.user
    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
        userip = request.META['HTTP_X_FORWARDED_FOR']
    else:
        userip = request.META['REMOTE_ADDR']
    #获取待初始化的信息,从数据库中查询是否存在,未存在的插入到列表
    all_system_list = SystemInstall.objects.filter(status='99')
    sapi = SaltAPI(url=settings.SALT_API['url'],
                   username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    minions = sapi.list_all_key()
    for tgt in all_system_list:
        if tgt.hostname not in minions[0]:
            sapi.accept_key(tgt.hostname)
            Message.objects.create(type='salt',
                                   action='initkey',
                                   action_ip=userip,
                                   username=user,
                                   content='%s accept key' % (tgt.hostname))
            if tgt.hostname in sapi.list_all_key()[0]:
                ret = HostList.objects.filter(hostname=tgt.hostname)
                if ret:
                    print "already in database"
                    #SystemInstall.objects.filter(hostname=h).delete()
                    Message.objects.create(type='sql',
                                           action='init',
                                           action_ip=tgt.hostname,
                                           username=user,
                                           content='已经存在')
                else:
                    HostList.objects.create(hostname=tgt.hostname)
                    #SystemInstall.objects.filter(hostname=h).delete()               #安装后,装机列表此IP信息删除,转让到安装记录里供审计
                    #Message.objects.create(type='sql', action='add', action_ip=tgt.hostname, username=user, content='添加主机')
                    Message.objects.create(type='asstes',
                                           action='create',
                                           action_ip=userip,
                                           username=user,
                                           content='add %s in hostlist' %
                                           (tgt.hostname))
    paginator = Paginator(all_system_list, 15)
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    try:
        all_system_list = paginator.page(page)
    except:
        all_system_list = paginator.page(paginator.num_pages)

    return render_to_response('deploy_init_status.html', {
        'all_system_list': all_system_list,
        'page': page,
        'paginator': paginator,
        'request': request
    },
                              context_instance=RequestContext(request))
Example #38
0
def salt_ajax_file_rollback(request):
    '''
    执行文件回滚
    '''
    true = True
    if request.method == 'POST':
        if request.is_ajax():
            r_list = []
            if request.POST.get('check_type') == 'rollback_file':
                if request.POST.get('get_type') == 'panel-group':
                    grp = request.POST.get('tgt_select')
                    tgt_select = SaltGroup.objects.get(nickname=grp).groupname
                else:
                    tgt_select = request.POST.get('tgt_select')
                rollback_list = FileRollback.objects.filter(target=tgt_select)
                r_list = []
                for r in rollback_list:
                    r_list.append(r.cur_path)
                func = lambda x, y: x if y in x else x + [y]
                r_list = reduce(func, [
                    [],
                ] + r_list)
                return HttpResponse(json.dumps(r_list))

            if request.POST.get('check_type') == 'rollback_history_list':
                if request.POST.get('get_type') == 'panel-group':
                    grp = request.POST.get('tgt_select')
                    tgt_select = SaltGroup.objects.get(nickname=grp).groupname
                else:
                    tgt_select = request.POST.get('tgt_select')
                cur_path = request.POST.get('rollback_list', None)
                rollback_history_list = FileRollback.objects.filter(
                    cur_path=cur_path).filter(target=tgt_select)
                for r in rollback_history_list:
                    r_list.append(r.bak_path)
                return HttpResponse(json.dumps(r_list))

            if request.POST.get('check_type') == 'rollback_history_remark':
                if request.POST.get('get_type') == 'panel-group':
                    grp = request.POST.get('tgt_select')
                    tgt_select = SaltGroup.objects.get(nickname=grp).groupname
                else:
                    tgt_select = request.POST.get('tgt_select')
                bak_path = request.POST.get('rollback_remark', None)
                rollback_history_remark = FileRollback.objects.filter(
                    bak_path=bak_path).filter(target=tgt_select)
                for r in rollback_history_remark:
                    r_list.append(r.remark)

                return HttpResponse(json.dumps(r_list))

            else:
                if request.POST.get('check_type') == 'panel-group':
                    grp = request.POST.get('tgt_select')
                    tgt_select = SaltGroup.objects.get(nickname=grp).groupname
                    expr_form = 'nodegroup'
                else:
                    tgt_select = request.POST.get('tgt_select')
                    expr_form = 'list'
                remote_path = request.POST.get('remote_path')
                history_version = request.POST.get('history_version')
                sapi = SaltAPI(url=settings.SALT_API['url'],
                               username=settings.SALT_API['user'],
                               password=settings.SALT_API['password'])
                ret = sapi.file_copy(tgt_select, 'cp.get_file',
                                     history_version, remote_path, expr_form)
                rst = ''
                for k in ret:
                    rst = rst + u'主机:' + k + '\n回滚结果:\n' + ret[
                        k] + '\n' + '-' * 80 + '\n'

                Message.objects.create(type=u'文件管理',
                                       user=request.user,
                                       action=u'文件回滚',
                                       action_ip=UserIP(request),
                                       content=u'文件回滚 %s' % rst)

                return HttpResponse(json.dumps(rst))
Example #39
0
def GetAssetInfo(tgt):
    '''
    Salt API获取主机信息并进行格式化输出
    '''
    global asset_info
    info = {}
    sapi = SaltAPI(url=settings.SALT_API['url'],
                   username=settings.SALT_API['user'],
                   password=settings.SALT_API['password'])
    ret = sapi.remote_server_info(tgt, 'grains.items')
    info['sn'] = GetInfo(ret, 'serialnumber')
    info['hostname'] = GetInfo(ret, 'fqdn')
    info['nodename'] = tgt
    info['os'] = GetInfo(ret, 'os') + GetInfo(
        ret, 'osrelease') + ' ' + GetInfo(ret, 'osarch')
    info['manufacturer'] = GetInfo(ret, 'manufacturer')
    info['cpu_model'] = GetInfo(ret, 'cpu_model')
    info['productname'] = GetInfo(ret, 'productname')
    info['cpu_nums'] = GetInfo(ret, 'num_cpus')
    info['disk'] = str(DISKINFO[0]) + "GB"
    info['network'] = GetInfo(ret, 'PublicIp')
    info['kernel'] = GetInfo(ret, 'kernel') + GetInfo(ret, 'kernelrelease')
    info['zmqversion'] = GetInfo(ret, 'zmqversion')
    info['shell'] = GetInfo(ret, 'shell')
    info['saltversion'] = GetInfo(ret, 'saltversion')
    info['locale'] = GetInfoDict(ret, 'locale_info')
    info['selinux'] = GetInfoDict(ret, 'selinux')
    info['networkarea'] = GetInfo(ret, 'netRegion')

    if 'virtual_subtype' in ret:
        virtual = GetInfo(ret, 'virtual') + '-' + GetInfo(
            ret, 'virtual_subtype')
    else:
        virtual = GetInfo(ret, 'virtual')
    info['virtual'] = virtual

    #    try:
    #        hwaddr = ret['hwaddr_interfaces']
    #        ipaddr = ret['ip4_interfaces']
    #        hwaddr.pop('lo')
    #        ipaddr.pop('lo')
    #        network = ''
    #        for i in ipaddr:
    #            ip = ''
    #            for j in ipaddr[i]:
    #                ip = ip + j + '/'
    #            network = network + i + ': ' + ip.strip('/') + '-' + hwaddr[i] + '\n'
    #        info['network'] =  network
    #    except:
    #        info['network'] = 'Nan'
    #
    mem = GetInfo(ret, 'mem_total')
    if mem > 1000:
        mem = int(mem) / 1000.0
        memory = ('%.1f' % mem) + 'G'
    else:
        memory = str(mem) + 'M'
    info['memory'] = memory

    #    ret = sapi.remote_server_info(tgt, 'disk.usage')
    #    disk = ''
    #    for i in ret:
    #        r = int(ret[i]['1K-blocks'])/1000
    #        if r > 1000:
    #            r = r/1000
    #            s = str(r) + 'G'
    #            if r > 1000:
    #                r = r/1000.0
    #                s = ('%.1f'%r) + 'T'
    #        else:
    #            s = str(r) + 'M'
    #        disk = disk + i + ': ' + s + '\n'
    #    info['disk'] = disk

    asset_info.append(info)
Example #40
0
def module_deploy(request):
    ret = []
    ret_err = '' 
    jid = []
    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
        ip =  request.META['HTTP_X_FORWARDED_FOR']  
    else:
        ip = request.META['REMOTE_ADDR'] 
    user = request.user
    hostlists = HostList.objects.all()
    if request.method == 'POST':
        action = request.get_full_path().split('=')[1]
        tgt = request.POST.getlist('tgt')
        if len(tgt) == 0:
           ret_err = "目标主机不能为空"
        else:
            ret_err =""
            if action == 'deploy':                          
                arg = request.POST.getlist('module')           
                #Message.objects.create(type='salt', action='deploy', action_ip=tgt, content='saltstack %s module depoy' % (arg))
                sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])  
                for host in tgt:
                    if 'sysinit' in arg:
                        obj = sapi.async_deploy(host,arg[-1])    #先执行初始化模块,其他任意
                        jid.append(obj)
                        joblist.objects.create(fun='sysinit',tgt=host,status='2',jid=obj)
                        Message.objects.create(type='salt-module', action='deploy', action_ip=ip, username=user, content='%s sysinit_jid %s' % (host,obj))
                        arg.remove('sysinit')
                        if arg:
                            for i in arg:
                                obj = sapi.async_deploy(host,i)     
                                jid.append(obj)
                                joblist.objects.create (fun=i,tgt=host,status='2',jid=obj)
                                Message.objects.create(type='salt-module', action='deploy', action_ip=ip, username=user, content='%s %s_jid %s' % (host,i,obj))
                        
                    else:
                        if arg:
                            for i in arg:
                                obj = sapi.async_deploy(host,i)
                                jid.append(obj)
                                joblist.objects.create (fun=i,tgt=host,status='2',jid=obj)
                                Message.objects.create(type='salt-module', action='deploy', action_ip=ip, username=user, content='%s %s_jid %s' % (host,i,obj))
                    #return HttpResponseRedirect(reverse('job_list'))
                
            elif action == 'sysinit':
                #tgt = request.POST.getlist('tgt')
                arg = 'sysinit'
                #tgtcheck = HostList.objects.filter(hostname=tgt)
                sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])
                for h in tgt:
                    #Message.objects.create(type='salt-module', action='os_init', action_ip=ip, username=user, content='%s %s_jid %s' % (host,i,obj))
                    sapi.accept_key(h)
                    #sapi.remote_noarg_execution(h,'test.ping')
                    install_ret = SystemInstall.objects.filter(hostname=h)
                    for each_ret in install_ret:
                        sroom_id = each_ret.sroom_id
                    if sroom_id:
                        arg = "sysinit_"+str(sroom_id)                    
                    obj = sapi.async_deploy(h,arg) 
                    SystemInstall.objects.filter(hostname=h).delete()               #安装后,装机列表此IP信息删除,转让到安装记录里供审计
                    Message.objects.create(type='installed', action='os_init', action_ip=ip, username=user, content='%s acceptkey_%s_del_sysinstall' % (h,arg))
                    #Message.objects.create(type='salt', action=arg, action_ip=h, content='已经初始化')
                    #time.sleep(5)
                    #obj = sapi.async_deploy(h,arg)    #先执行初始化模块,其他任意
                     #jid.append(obj)
                    joblist.objects.create (fun=arg,tgt=h,status='2',jid=obj)
                return HttpResponseRedirect(reverse('job_list'))

    return render_to_response('salt_module_deploy.html',{'ret': ret,'hostlists': hostlists,'ret_err':ret_err,'jid':jid,'request':request},context_instance=RequestContext(request)) 
Example #41
0
def salt_advanced_manage(request):
    ret = ''
    if request.method == 'POST':
        if request.is_ajax():
            tgt_selects = request.POST.getlist('tgt_select', None)
            args = request.POST.getlist('arg', None)
            checkgrp = request.POST.getlist('ifcheck', None)
            check_type = request.POST.get('check_type', None)
            if check_type == 'panel-group':
                expr_form = 'nodegroup'
            else:
                expr_form = 'list'
            s = '::'.join(str(i) for i in checkgrp)
            checkgrp = s.replace('0::1', '1').split('::')
            sapi = SaltAPI(url=settings.SALT_API['url'],
                           username=settings.SALT_API['user'],
                           password=settings.SALT_API['password'])
            for i in range(0, len(tgt_selects)):
                try:
                    jid = sapi.remote_execution(tgt_selects[i], 'cmd.run',
                                                args[i] + ';echo ":::"$?',
                                                expr_form)
                    if check_type == 'panel-group':
                        s = SaltGroup.objects.get(groupname=tgt_selects[i])
                        s_len = s.minions.all().count()
                    else:
                        s = tgt_selects[i].split(',')
                        s_len = len(s)
                    rst = {}
                    while (len(rst) < s_len):
                        rst = sapi.salt_runner(jid)
                        #time.sleep(1)
                    j = 0
                    for k in rst:
                        ret = ret + u'L%s-%s 主机:' % (
                            i, j) + k + '\n运行结果:\n' + rst[k] + '\n'
                        j = j + 1
                        r = rst[k].split(':::')[-1].strip()
                        if r != '0':
                            ret = ret + '%s 执行失败!\nJobs NO. %s\n' % (
                                args[i], jid) + '-' * 80 + '\n'
                            if checkgrp[i] == '0':
                                try:
                                    Message.objects.create(
                                        type=u'部署管理',
                                        user=request.user,
                                        action=jid,
                                        action_ip=UserIP(request),
                                        content=u'高级管理 %s' % ret)
                                except:
                                    print 'Log Err'
                                return HttpResponse(json.dumps(ret))
                            else:
                                continue
                        else:
                            ret = ret + '%s 执行成功!\nJobs NO. %s\n' % (
                                args[i], jid) + '-' * 80 + '\n'
                except:
                    print 'Err'
            try:
                Message.objects.create(type=u'部署管理',
                                       user=request.user,
                                       action=jid,
                                       action_ip=UserIP(request),
                                       content=u'高级管理 %s' % ret)
            except:
                print 'Log Err'

            return HttpResponse(json.dumps(ret))

    return render(request, 'salt_remote_exec_advance.html', {'ret': ret})
Example #42
0
def GetAssetInfo(tgt):
    '''
    Salt API获取主机信息并进行格式化输出
    '''
    global asset_info
    info = {}
    sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password'])
    ret = sapi.remote_server_info(tgt, 'grains.items')
    info['sn']=GetInfo(ret,'serialnumber')
    info['hostname']=GetInfo(ret,'fqdn')
    info['nodename']=tgt
    info['os']=GetInfo(ret,'os')+GetInfo(ret,'osrelease')+' '+GetInfo(ret,'osarch')
    info['manufacturer']=GetInfo(ret,'manufacturer')
    info['cpu_model']=GetInfo(ret,'cpu_model')
    info['productname']=GetInfo(ret,'productname')
    info['cpu_nums']=GetInfo(ret,'num_cpus')
    info['kernel'] = GetInfo(ret,'kernel') + GetInfo(ret,'kernelrelease')
    info['zmqversion'] = GetInfo(ret,'zmqversion')
    info['shell'] = GetInfo(ret,'shell')
    info['saltversion'] = GetInfo(ret,'saltversion')
    info['locale'] = GetInfoDict(ret, 'locale_info')
    info['selinux'] = GetInfoDict(ret, 'selinux')

    if 'virtual_subtype' in ret:
        virtual = GetInfo(ret,'virtual') + '-' + GetInfo(ret,'virtual_subtype')
    else:
        virtual=GetInfo(ret,'virtual')
    info['virtual'] = virtual

    try:
        hwaddr = ret['hwaddr_interfaces']
        ipaddr = ret['ip4_interfaces']
        hwaddr.pop('lo')
        ipaddr.pop('lo')
        network = ''
        for i in ipaddr:
            ip = ''
            for j in ipaddr[i]:
                ip = ip + j + '/'
            network = network + i + ': ' + ip.strip('/') + '-' + hwaddr[i] + '\n'
        info['network'] =  network
    except:
        info['network'] = 'Nan'

    mem=GetInfo(ret,'mem_total')
    if mem > 1000:
        mem = int(mem)/1000.0
        memory = ('%.1f'%mem) + 'G'
    else:
        memory = str(mem) + 'M'
    info['memory'] = memory

    ret = sapi.remote_server_info(tgt, 'disk.usage')
    disk = ''
    for i in ret:
        r = int(ret[i]['1K-blocks'])/1000
        if r > 1000:
            r = r/1000
            s = str(r) + 'G'
            if r > 1000:
                r = r/1000.0
                s = ('%.1f'%r) + 'T'
        else:
            s = str(r) + 'M'
        disk = disk + i + ': ' + s + '\n'
    info['disk'] = disk

    asset_info.append(info)
Example #43
0
def module_deploy(request):
    ret = []
    ret_err = ''
    jid = []
    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
        ip = request.META['HTTP_X_FORWARDED_FOR']
    else:
        ip = request.META['REMOTE_ADDR']
    user = request.user
    hostlists = HostList.objects.all()
    if request.method == 'POST':
        action = request.get_full_path().split('=')[1]
        tgt = request.POST.getlist('tgt')
        if len(tgt) == 0:
            ret_err = "目标主机不能为空"
        else:
            ret_err = ""
            if action == 'deploy':
                arg = request.POST.getlist('module')
                #Message.objects.create(type='salt', action='deploy', action_ip=tgt, content='saltstack %s module depoy' % (arg))
                sapi = SaltAPI(url=settings.SALT_API['url'],
                               username=settings.SALT_API['user'],
                               password=settings.SALT_API['password'])
                for host in tgt:
                    if 'sysinit' in arg:
                        obj = sapi.async_deploy(host, arg[-1])  #先执行初始化模块,其他任意
                        jid.append(obj)
                        joblist.objects.create(fun='sysinit',
                                               tgt=host,
                                               status='2',
                                               jid=obj)
                        Message.objects.create(type='salt-module',
                                               action='deploy',
                                               action_ip=ip,
                                               username=user,
                                               content='%s sysinit_jid %s' %
                                               (host, obj))
                        arg.remove('sysinit')
                        if arg:
                            for i in arg:
                                obj = sapi.async_deploy(host, i)
                                jid.append(obj)
                                joblist.objects.create(fun=i,
                                                       tgt=host,
                                                       status='2',
                                                       jid=obj)
                                Message.objects.create(type='salt-module',
                                                       action='deploy',
                                                       action_ip=ip,
                                                       username=user,
                                                       content='%s %s_jid %s' %
                                                       (host, i, obj))

                    else:
                        if arg:
                            for i in arg:
                                obj = sapi.async_deploy(host, i)
                                jid.append(obj)
                                joblist.objects.create(fun=i,
                                                       tgt=host,
                                                       status='2',
                                                       jid=obj)
                                Message.objects.create(type='salt-module',
                                                       action='deploy',
                                                       action_ip=ip,
                                                       username=user,
                                                       content='%s %s_jid %s' %
                                                       (host, i, obj))
                    #return HttpResponseRedirect(reverse('job_list'))

            elif action == 'sysinit':
                #tgt = request.POST.getlist('tgt')
                arg = 'sysinit'
                #tgtcheck = HostList.objects.filter(hostname=tgt)
                sapi = SaltAPI(url=settings.SALT_API['url'],
                               username=settings.SALT_API['user'],
                               password=settings.SALT_API['password'])
                for h in tgt:
                    #Message.objects.create(type='salt-module', action='os_init', action_ip=ip, username=user, content='%s %s_jid %s' % (host,i,obj))
                    sapi.accept_key(h)
                    #sapi.remote_noarg_execution(h,'test.ping')
                    install_ret = SystemInstall.objects.filter(hostname=h)
                    for each_ret in install_ret:
                        sroom_id = each_ret.sroom_id
                    if sroom_id:
                        arg = "sysinit_" + str(sroom_id)
                    obj = sapi.async_deploy(h, arg)
                    SystemInstall.objects.filter(
                        hostname=h).delete()  #安装后,装机列表此IP信息删除,转让到安装记录里供审计
                    Message.objects.create(
                        type='installed',
                        action='os_init',
                        action_ip=ip,
                        username=user,
                        content='%s acceptkey_%s_del_sysinstall' % (h, arg))
                    #Message.objects.create(type='salt', action=arg, action_ip=h, content='已经初始化')
                    #time.sleep(5)
                    #obj = sapi.async_deploy(h,arg)    #先执行初始化模块,其他任意
                    #jid.append(obj)
                    joblist.objects.create(fun=arg, tgt=h, status='2', jid=obj)
                return HttpResponseRedirect(reverse('job_list'))

    return render_to_response('salt_module_deploy.html', {
        'ret': ret,
        'hostlists': hostlists,
        'ret_err': ret_err,
        'jid': jid,
        'request': request
    },
                              context_instance=RequestContext(request))
Example #44
0
def GetAssetInfo(tgt):
    '''
    Salt API获取主机信息并进行格式化输出
    '''
    global asset_info
    info = {}
    sapi = SaltAPI()
    ret = sapi.remote_server_info(tgt, 'grains.items')
    info['sn'] = GetInfo(ret, 'serialnumber')
    info['hostname'] = GetInfo(ret, 'fqdn')
    info['nodename'] = tgt
    info['os'] = GetInfo(ret, 'os') + GetInfo(
        ret, 'osrelease') + ' ' + GetInfo(ret, 'osarch')
    info['manufacturer'] = GetInfo(ret, 'manufacturer')
    info['cpu_model'] = GetInfo(ret, 'cpu_model')
    info['productname'] = GetInfo(ret, 'productname')
    info['cpu_nums'] = GetInfo(ret, 'num_cpus')
    info['kernel'] = GetInfo(ret, 'kernel') + GetInfo(ret, 'kernelrelease')
    info['zmqversion'] = GetInfo(ret, 'zmqversion')
    info['shell'] = GetInfo(ret, 'shell')
    info['saltversion'] = GetInfo(ret, 'saltversion')
    info['locale'] = GetInfoDict(ret, 'locale_info')
    info['selinux'] = GetInfoDict(ret, 'selinux')

    if 'virtual_subtype' in ret:
        virtual = GetInfo(ret, 'virtual') + '-' + GetInfo(
            ret, 'virtual_subtype')
    else:
        virtual = GetInfo(ret, 'virtual')
    info['virtual'] = virtual

    try:
        hwaddr = ret['hwaddr_interfaces']
        ipaddr = ret['ip4_interfaces']
        hwaddr.pop('lo')
        ipaddr.pop('lo')
        network = ''
        for i in ipaddr:
            ip = ''
            for j in ipaddr[i]:
                ip = ip + j + '/'
            network = network + i + ': ' + ip.strip(
                '/') + '-' + hwaddr[i] + '\n'
        info['network'] = network
    except:
        info['network'] = 'Nan'

    mem = GetInfo(ret, 'mem_total')
    if mem > 1000:
        mem = int(mem) / 1000.0
        memory = ('%.1f' % mem) + 'G'
    else:
        memory = str(mem) + 'M'
    info['memory'] = memory

    ret = sapi.remote_server_info(tgt, 'disk.usage')
    disk = ''
    for i in ret:
        r = int(ret[i]['1K-blocks']) / 1000
        if r > 1000:
            r = r / 1000
            s = str(r) + 'G'
            if r > 1000:
                r = r / 1000.0
                s = ('%.1f' % r) + 'T'
        else:
            s = str(r) + 'M'
        disk = disk + i + ': ' + s + '\n'
    info['disk'] = disk

    asset_info.append(info)
Example #45
0
def remote_execution(request):
    """
    remote command execution
    """
    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
        ip = request.META['HTTP_X_FORWARDED_FOR']
    else:
        ip = request.META['REMOTE_ADDR']
    tgtcheck = ''
    ret_cmd_msg = []
    hosts = []
    node = ''
    danger = ('rm', 'reboot', 'init ', 'shutdown')
    user = request.user
    ret_err = ''
    ret = 'none'
    tgt = 'none'
    hostlists = HostList.objects.all()
    if request.method == 'POST':
        action = request.POST.get('action')
        tgt = request.POST.getlist('tgt')
        arg = request.POST.get('arg')
        if action != '' and len(tgt) != 0 and arg != '':
            if action == 'exec':  #远程命令执行
                arg1 = arg.split()[0]
                print arg1
                hosts = tgt
                for node in hosts:
                    argcheck = arg1 not in danger
                    if argcheck:
                        sapi = SaltAPI(url=settings.SALT_API['url'],
                                       username=settings.SALT_API['user'],
                                       password=settings.SALT_API['password'])
                        ret = sapi.remote_execution(node, 'cmd.run', arg)
                        cmd_msg = "\n" + str(
                            node) + ":\n" + "=" * 24 + "\n" + str(ret)
                        #print node,ret[node]
                        ret_cmd_msg.append(cmd_msg)
                        ret_err = ''
                        Message.objects.create(type='salt-run',
                                               action='cmd_run',
                                               action_ip=ip,
                                               username=user,
                                               content='%s cmd.run %s' %
                                               (node, arg))

                    elif not argcheck:
                        ret_err = '命令很危险, 你这样子老大会不开森'
            if action == 'grains':  #远程命令执行
                arg1 = arg.split()[0]
                print arg1
                hosts = tgt
                for node in hosts:
                    ret_str_msg = ""
                    argcheck = arg1 not in danger
                    if argcheck:
                        sapi = SaltAPI(url=settings.SALT_API['url'],
                                       username=settings.SALT_API['user'],
                                       password=settings.SALT_API['password'])
                        ret = sapi.remote_execution(node, 'grains.item', arg)
                        if type(ret[arg]) == dict:
                            for k, v in ret[arg].items():
                                ret_str_msg = str(k) + ":   " + str(
                                    v) + "\n" + ret_str_msg
                            cmd_msg = "\n" + str(
                                node) + ":\n" + "=" * 24 + "\n" + ret_str_msg
                        else:
                            cmd_msg = "\n" + str(
                                node) + ":\n" + "=" * 24 + "\n" + str(ret[arg])
                        #print node,ret[node]
                        ret_cmd_msg.append(cmd_msg)
                        ret_err = ''
                        Message.objects.create(type='salt',
                                               action='grains',
                                               action_ip=ip,
                                               username=user,
                                               content='%s grains.item %s' %
                                               (node, arg))

                    elif not argcheck:
                        ret_err = '命令很危险, 你这样子老大会不开森'
        elif len(tgt) == 0:
            ret_err = "目标主机不能为空"
        elif arg == '':
            ret_err = "命令不能为空"

        #Message.objects.create(type='salt', action='execution', action_ip=ip, username=user, content='saltstack execution command: %s ' % (arg))

    return render_to_response('salt_remote_execution.html', {
        'ret': ret,
        'ret_err': ret_err,
        'ret_cmd_msg': ret_cmd_msg,
        'hostlists': hostlists,
        'request': request
    },
                              context_instance=RequestContext(request))