Skip to content

Commit 3e192b8

Browse files
author
yongpeng1
committed
Merge branch 'dev'
2 parents eadad2c + b54ea21 commit 3e192b8

File tree

4 files changed

+75
-50
lines changed

4 files changed

+75
-50
lines changed

common/db.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ def delete_by_id(self, table, id):
9191

9292
def update_by_id(self, table, data, id):
9393
sql = "UPDATE %s SET data='%s' WHERE data -> '$.id'='%s'" % (table, data.replace("'", r"\'").
94-
replace(r"\n", r'\\n').replace(r'\"', r''), id)
94+
replace(r"\n", r'\\n').replace(r'\"', r'').
95+
replace(r'\\', r'/'), id)
9596
logger.info(sql)
9697
try:
9798
self.cursor.execute(sql)
@@ -115,9 +116,9 @@ def update_by_id_kv(self, table, k, v, id):
115116
return False, str(e)
116117

117118
def insert(self, table, data):
118-
# 转义'
119+
# 转义
119120
sql = "INSERT INTO %s(data) VALUES('%s') " % (table, data.replace("'", r"\'").replace(r"\n", r'\\n').
120-
replace(r'\"', r''))
121+
replace(r'\"', r'').replace(r'\\', r'/'))
121122
logger.info(sql)
122123
try:
123124
self.cursor.execute(sql)

common/saltstack_api.py

Lines changed: 58 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -45,84 +45,96 @@ def list_all_key(self):
4545
params = {'client': 'wheel', 'fun': 'key.list_all'}
4646
content = self.post_request(params)
4747
if isinstance(content, dict):
48-
minions = content['return'][0]['data']['return']
49-
return minions
48+
return content['return'][0]['data']['return']
5049
else:
5150
return {"status": False, "message": "Salt API Error : " + content}
5251

5352
def delete_key(self, node_name):
5453
params = {'client': 'wheel', 'fun': 'key.delete', 'match': node_name}
5554
content = self.post_request(params)
5655
if isinstance(content, dict):
57-
ret = content['return'][0]['data']['success']
58-
return ret
56+
return content['return'][0]['data']['success']
5957
else:
6058
return {"status": False, "message": "salt api error : " + content}
6159

6260
def accept_key(self, node_name):
6361
params = {'client': 'wheel', 'fun': 'key.accept', 'match': node_name}
6462
content = self.post_request(params)
6563
if isinstance(content, dict):
66-
ret = content['return'][0]['data']['success']
67-
return ret
64+
return content['return'][0]['data']['success']
6865
else:
6966
return {"status": False, "message": "Salt API Error : " + content}
7067

7168
def reject_key(self, node_name):
7269
params = {'client': 'wheel', 'fun': 'key.reject', 'match': node_name}
7370
content = self.post_request(params)
7471
if isinstance(content, dict):
75-
ret = content['return'][0]['data']['success']
76-
return ret
72+
return content['return'][0]['data']['success']
7773
else:
7874
return {"status": False, "message": "Salt API Error : " + content}
7975

80-
def remote_noarg_execution(self, tgt, fun):
76+
def remote_noarg_execution(self, tgt, fun, types="tgt_type"):
8177
# Execute commands without parameters
82-
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'expr_form': 'list'}
78+
params = {'client': 'local', 'tgt': tgt, 'fun': fun, types: 'list'}
8379
content = self.post_request(params)
8480
if isinstance(content, dict):
8581
ret = content['return'][0][tgt]
82+
# 如果返回结果是空,说明salt可能版本小于2017.7.0的版本,使用次方法处理
83+
if not ret and types != "expr_form": # types != "expr_form" 很重要确保最多执行两次,否则肯能发送死循环
84+
return self.remote_noarg_execution(tgt, fun, types="expr_form")
8685
return ret
8786
else:
8887
return {"status": False, "message": "Salt API Error : " + content}
8988

90-
def remote_noarg_execution_notgt(self, tgt, fun):
89+
def remote_noarg_execution_notgt(self, tgt, fun, types="tgt_type"):
9190
# Execute commands without parameters
92-
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'expr_form': 'list'}
91+
params = {'client': 'local', 'tgt': tgt, 'fun': fun, types: 'list'}
9392
content = self.post_request(params)
9493
if isinstance(content, dict):
9594
ret = content['return'][0]
95+
# 如果返回结果是空,说明salt可能版本小于2017.7.0的版本,使用次方法处理
96+
if not ret and types != "expr_form": # types != "expr_form" 很重要确保最多执行两次,否则肯能发送死循环
97+
return self.remote_noarg_execution_notgt(tgt, fun, types="expr_form")
9698
return ret
9799
else:
98100
return {"status": False, "message": "Salt API Error : " + content}
99101

100-
def remote_execution(self, tgt, fun, arg):
102+
def remote_execution(self, tgt, fun, arg, types="tgt_type"):
101103
# Command execution with parameters
102-
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg, 'expr_form': 'list'}
104+
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg, types: 'list'}
103105
content = self.post_request(params)
104106
if isinstance(content, dict):
105107
ret = content['return'][0][tgt]
108+
# 如果返回结果是空,说明salt可能版本小于2017.7.0的版本,使用次方法处理
109+
if not ret and types != "expr_form": # types != "expr_form" 很重要确保最多执行两次,否则肯能发送死循环
110+
return self.remote_execution(tgt, fun, arg, types="expr_form")
106111
return ret
107112
else:
108113
return {"status": False, "message": "Salt API Error : " + content}
109114

110-
def remote_execution_notgt(self, tgt, fun, arg):
115+
def remote_execution_notgt(self, tgt, fun, arg, types="tgt_type"):
111116
# Command execution with parameters
112-
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg, 'expr_form': 'list'}
117+
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg, types: 'list'}
113118
content = self.post_request(params)
114119
if isinstance(content, dict):
115120
ret = content['return'][0]
121+
# 如果返回结果是空,说明salt可能版本小于2017.7.0的版本,使用次方法处理
122+
if not ret and types != "expr_form": # types != "expr_form" 很重要确保最多执行两次,否则肯能发送死循环
123+
return self.remote_execution_notgt(tgt, fun, arg, types="expr_form")
116124
return ret
117125
else:
118126
return {"status": False, "message": "Salt API Error : " + content}
119127

120-
def shell_remote_execution(self, tgt, arg):
128+
def shell_remote_execution(self, tgt, arg, types="tgt_type"):
121129
# Shell command execution with parameters
122-
params = {'client': 'local', 'tgt': tgt, 'fun': 'cmd.run', 'arg': arg, 'expr_form': 'list'}
130+
# Changed in version 2017.7.0: Renamed from expr_form to tgt_type
131+
params = {'client': 'local', 'tgt': tgt, 'fun': 'cmd.run', 'arg': arg, types: 'list'}
123132
content = self.post_request(params)
124133
if isinstance(content, dict):
125134
ret = content['return'][0]
135+
# 如果返回结果是空,说明salt可能版本小于2017.7.0的版本,使用次方法处理
136+
if not ret and types != "expr_form": # types != "expr_form" 很重要确保最多执行两次,否则肯能发送死循环
137+
return self.shell_remote_execution(tgt, arg, types="expr_form")
126138
return ret
127139
else:
128140
return {"status": False, "message": "Salt API Error : " + content}
@@ -132,8 +144,7 @@ def grain(self, tgt, arg):
132144
params = {'client': 'local', 'tgt': tgt, 'fun': 'grains.item', 'arg': arg}
133145
content = self.post_request(params)
134146
if isinstance(content, dict):
135-
ret = content['return'][0]
136-
return ret
147+
return content['return'][0]
137148
else:
138149
return {"status": False, "message": "Salt API Error : " + content}
139150

@@ -142,59 +153,64 @@ def grains(self, tgt):
142153
params = {'client': 'local', 'tgt': tgt, 'fun': 'grains.items'}
143154
content = self.post_request(params)
144155
if isinstance(content, dict):
145-
ret = content['return'][0]
146-
return {"status": True, "message": "", "data": ret}
156+
return {"status": True, "message": "", "data": content['return'][0]}
147157
else:
148158
return {"status": False, "message": "Salt API Error : " + content}
149159

150-
def target_remote_execution(self, tgt, fun, arg):
151-
# Use targeting for remote execution
152-
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg, 'expr_form': 'nodegroup'}
153-
content = self.post_request(params)
154-
if isinstance(content, dict):
155-
jid = content['return'][0]['jid']
156-
return jid
157-
else:
158-
return {"status": False, "message": "Salt API Error : " + content}
160+
# def target_remote_execution(self, tgt, fun, arg):
161+
# # Use targeting for remote execution
162+
# params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg, 'expr_form': 'nodegroup'}
163+
# content = self.post_request(params)
164+
# if isinstance(content, dict):
165+
# jid = content['return'][0]['jid']
166+
# return jid
167+
# else:
168+
# return {"status": False, "message": "Salt API Error : " + content}
159169

160170
def deploy(self, tgt, arg):
161171
# Module deployment
162172
params = {'client': 'local', 'tgt': tgt, 'fun': 'state.sls', 'arg': arg}
163-
content = self.post_request(params)
164-
return content
173+
return self.post_request(params)
165174

166175
def async_deploy(self, tgt, arg):
167176
# Asynchronously send a command to connected minions
168177
params = {'client': 'local_async', 'tgt': tgt, 'fun': 'state.sls', 'arg': arg}
169178
content = self.post_request(params)
170179
if isinstance(content, dict):
171-
jid = content['return'][0]['jid']
172-
return jid
180+
return content['return'][0]['jid']
173181
else:
174182
return {"status": False, "message": "salt api error : " + content}
175183

176-
def target_deploy(self, tgt, arg):
184+
def target_deploy(self, tgt, arg, types="tgt_type"):
177185
# Based on the list forms deployment
178-
params = {'client': 'local', 'tgt': tgt, 'fun': 'state.sls', 'arg': arg, 'expr_form': 'list'}
186+
params = {'client': 'local', 'tgt': tgt, 'fun': 'state.sls', 'arg': arg, types: 'list'}
179187
content = self.post_request(params)
180188
if isinstance(content, dict):
181189
try:
182-
return content.get("return")[0]
190+
ret = content.get("return")[0]
191+
# 如果返回结果是空,说明salt可能版本小于2017.7.0的版本,使用次方法处理
192+
if not ret and types != "expr_form": # types != "expr_form" 很重要确保最多执行两次,否则肯能发送死循环
193+
return self.target_deploy(tgt, arg, types="expr_form")
194+
return ret
183195
except Exception as e:
184196
return {"status": False, "message": str(e)}
185197
else:
186198
return {"status": False, "message": "Salt API Error : " + content}
187199

188-
def pillar_items(self, tgt, arg=[]):
200+
def pillar_items(self, tgt, arg=[], types="tgt_type"):
189201
# Get pillar item
190202
if arg:
191-
params = {'client': 'local', 'tgt': tgt, 'fun': 'pillar.item', 'arg': arg, 'expr_form': 'list'}
203+
params = {'client': 'local', 'tgt': tgt, 'fun': 'pillar.item', 'arg': arg, types: 'list'}
192204
else:
193-
params = {'client': 'local', 'tgt': tgt, 'fun': 'pillar.items', 'arg': arg, 'expr_form': 'list'}
205+
params = {'client': 'local', 'tgt': tgt, 'fun': 'pillar.items', 'arg': arg, types: 'list'}
194206
content = self.post_request(params)
195207
if isinstance(content, dict):
196208
try:
197-
return content.get("return")[0]
209+
ret = content.get("return")[0]
210+
# 如果返回结果是空,说明salt可能版本小于2017.7.0的版本,使用次方法处理
211+
if not ret and types != "expr_form": # types != "expr_form" 很重要确保最多执行两次,否则肯能发送死循环
212+
return self.pillar_items(tgt, arg=[], types="expr_form")
213+
return ret
198214
except Exception as e:
199215
return {"status": False, "message": str(e)}
200216
else:

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ gevent==1.3.4
1414
gunicorn==19.8.1
1515
Flask-Celery-Helper==1.1.0
1616
Flask-APScheduler==1.8.0
17-
SQLAlchemy==1.2.9
17+
SQLAlchemy==1.3.0
1818
pycrypto==2.6.1

resources/execute.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,12 @@ def post(self):
5555
audit_log(user_info["username"], minion_id, args["product_id"], "minion", "shell")
5656

5757
minion_count = str(len(minion_id))
58-
cmd_succeed = str(len(result))
59-
cmd_failure = str(len(minion_id) - len(result))
58+
result_len = len(result)
59+
for k, v in result.items():
60+
if not v:
61+
result_len -= 1
62+
cmd_succeed = str(result_len)
63+
cmd_failure = str(len(minion_id) - result_len)
6064
succeed_minion = []
6165
for i in result:
6266
succeed_minion.append(i)
@@ -110,8 +114,12 @@ def post(self):
110114
audit_log(user_info["username"], minion_id, args["product_id"], "minion", "sls")
111115

112116
minion_count = str(len(minion_id))
113-
cmd_succeed = str(len(result))
114-
cmd_failure = str(len(minion_id) - len(result))
117+
result_len = len(result)
118+
for k, v in result.items():
119+
if not v:
120+
result_len -= 1
121+
cmd_succeed = str(result_len)
122+
cmd_failure = str(len(minion_id) - result_len)
115123
succeed_minion = []
116124
for i in result:
117125
succeed_minion.append(i)

0 commit comments

Comments
 (0)