1 #!/usr/bin/env python 2 # -*- coding:utf8 -*- 3 # __author__ = '北方姆Q' 4 5 import requests 6 import json 7 from django.conf import settings 8 from requests.packages.urllib3.exceptions import InsecureRequestWarning 9 from plugins.duia.singleton import Singleton 10 11 requests.packages.urllib3.disable_warnings(InsecureRequestWarning) 12 13 14 class SaltFactory(Singleton): 15 def __init__(self, url=settings.SALT_URL, username=settings.SALT_USER, password=settings.SALT_USER_PASSWORD): 16 """ 17 18 :param url: 默认api url 19 :param username: api 用户 20 :param password: api 用户密码 21 """ 22 self.url = url 23 self.username = username 24 self.password = password 25 self.header = {"Content-type": "application/json"} 26 self.login_url = url + "login" if url.endswith('/') else url + "/login" 27 self.login_data = {'username': self.username, 'password': self.password, 'eauth': 'pam'} 28 self.token = self.worker(self.login_url, self.login_data)['token'] # 获取该用户的token,便于操作 29 self.header['X-Auth-Token'] = self.token 30 self.minions_url = self.url + "minions" if self.url.endswith('/') else self.url + "/minions" 31 32 def worker(self, url, data): 33 """ 34 所有命令真实执行者,更细节的命令可以通过这个执行 35 :param url: api下各url 36 :param data: 需要传入的参数 37 :return: 命令执行结果,dict 38 """ 39 data = json.dumps(data) 40 response = requests.post(url, headers=self.header, data=data, verify=False) 41 return response.json()['return'][0] 42 43 def get_data_by_jid(self, jid, display=False): 44 """ 45 获取某个任务id的执行结果 46 :param jid: 任务id,str 47 :param display: 结果展示长度,默认精简展示 48 :return: 命令执行结果,如果任务不存在或者未运行结束为空字典,dict 49 """ 50 assert isinstance(jid, str) 51 data = { 52 'client': 'runner', 53 'fun': 'jobs.lookup_jid', 54 'jid': jid 55 } 56 ret = self.worker(self.url, data) 57 58 if display is False: 59 for node_value in ret.values(): 60 for job_key, job_value in node_value.items(): 61 node_value[job_key] = job_value['result'] 62 return ret 63 64 def get_data(self, client='local_batch', tgt='*', fun='test.ping', arg=None, tgt_type='glob', batch='100%'): 65 """ 66 运行一条命令并等待结果 67 :param client: 连接方式 68 69 * ``local`` - 普通执行 70 * ``local_batch`` - 分批执行 - Default 71 * ``local_async`` - 异步执行 72 73 :param tgt: 受控目标 74 :param fun: 执行模块 75 :param arg: 运行参数(pillar也写在里面),list 76 77 ['pwd', 'test=True'] 78 ['sleep 5 && touch /root/file || touch /root/test'] 79 ['keepalived.keepalived.', 'test=True', 'saltenv=prod'] 80 81 :param tgt_type: 受控目标类型 82 83 * ``glob`` - Bash glob completion - Default 84 * ``pcre`` - Perl style regular expression 85 * ``list`` - Python list of hosts 86 * ``grain`` - Match based on a grain comparison 87 * ``grain_pcre`` - Grain comparison with a regex 88 * ``pillar`` - Pillar data comparison 89 * ``pillar_pcre`` - Pillar data comparison with a regex 90 * ``nodegroup`` - Match on nodegroup 91 * ``range`` - Use a Range server for matching 92 * ``compound`` - Pass a compound match string 93 * ``ipcidr`` - Match based on Subnet (CIDR notation) or IPv4 address. 94 95 :param batch: 一批的数量,数字或者百分比,str 96 :return: 命令执行结果,dict 97 """ 98 data = { 99 'client': client, 100 'tgt': tgt, 101 'fun': fun, 102 'tgt_type': tgt_type, 103 'batch': batch 104 } 105 if arg: 106 data['arg'] = arg 107 ret = self.worker(self.url, data) 108 return ret 109 110 def get_minions(self): 111 """ 112 获取所有minions名 113 :return: 全minions名的generator 114 """ 115 response = requests.get(self.minions_url, headers=self.header, verify=False) 116 minions_list = [minion for minion in response.json()['return'][0].keys()] 117 return minions_list
前端json解析
1 function syntaxHighlight(json) { 2 if (typeof json != 'string') { 3 json = JSON.stringify(json, undefined, 2); 4 } 5 json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); 6 return json.replace(/("(\u[a-zA-Z0-9]{4}|\[^u]|[^\"])*"(s*:)?|(true|false|null)|-?d+(?:.d*)?(?:[eE][+-]?d+)?)/g, function(match) { 7 var cls = 'number'; 8 if (/^"/.test(match)) { 9 if (/:$/.test(match)) { 10 cls = 'key'; 11 } else { 12 cls = 'string'; 13 } 14 } else if (/true|false/.test(match)) { 15 cls = 'boolean'; 16 } else if (/null/.test(match)) { 17 cls = 'null'; 18 } 19 return '<span class="' + cls + '">' + match + '</span>'; 20 }); 21 }