Advertisement
Guest User

Untitled

a guest
May 31st, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.13 KB | None | 0 0
  1. #!/usr/bin/env python2.7
  2. from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
  3. import SocketServer
  4. import json
  5. from collections import defaultdict
  6. from subprocess import Popen, PIPE, STDOUT
  7. from notifications import send_notification
  8.  
  9. allowed_fun = ["state.sls", "state.highstate", "cmd.run", "pillar.get", "grains.get","grains.setval", "service.restart", "service.status", "test.ping"]
  10.  
  11. class S(BaseHTTPRequestHandler):
  12. def _set_headers(self):
  13. self.send_response(200)
  14. self.send_header("Content-type", "application/json")
  15. self.end_headers()
  16.  
  17. def do_GET(self):
  18. self.send_response(403)
  19. self.end_headers()
  20. self.wfile.write("Method GET not allowed\n")
  21.  
  22. def do_HEAD(self):
  23. self.send_response(403)
  24. self.end_headers()
  25.  
  26. def changesonlyout(self, salt_out):
  27. rsr={}
  28. rsr['return']=[]
  29. print(salt_out)
  30. for return_ in salt_out['return']:
  31. res = defaultdict(dict)
  32. for r in return_:
  33. for k, v in return_[r].items():
  34. if type(v) is not int:
  35. if v['changes']:
  36. res[r][k] = v
  37. rsr['return'].append(res)
  38. return(rsr)
  39.  
  40. def do_POST(self):
  41. content_length = int(self.headers['Content-Length'])
  42. post_data = self.rfile.read(content_length)
  43. self._set_headers()
  44.  
  45. rsend = {}
  46. rsend["return"] = []
  47. api_json_arr = json.loads(post_data)
  48. fd = open("/var/log/salt-yapi.log", "a")
  49. fd.write("\n-----\n")
  50. for api_query in api_json_arr:
  51. fd.write(json.dumps(api_json_arr))
  52. call_cli_cmd = []
  53. call_cli_cmd.append("salt")
  54.  
  55. if api_query["tgt"] is None:
  56. self.wfile.write('{"type":"error","class":"not defined","variable":"tgt","msg":"tgt is not defined"}\n')
  57. return
  58. if api_query["fun"] is None:
  59. self.wfile.write('{"type":"error","class":"not defined","variable":"fun","msg":"fun is not defined"}\n')
  60. return
  61. if api_query["eauth"] is None:
  62. self.wfile.write('{"type":"error","class":"not defined","variable":"eauth","msg":"eauth is not defined"}\n')
  63. return
  64. if api_query["username"] is None:
  65. self.wfile.write('{"type":"error","class":"not defined","variable":"username","msg":"username is not defined"}\n')
  66. return
  67. if api_query["password"] is None:
  68. self.wfile.write('{"type":"error","class":"not defined","variable":"password","msg":"password is not defined"}\n')
  69. return
  70. salt_args = api_query.get("arg", "")
  71. username = api_query.get("username", "")
  72. password = api_query.get("password", "")
  73. salt_kwarg = api_query.get("kwarg", {})
  74.  
  75. state_verbose = salt_kwarg.get("state_verbose", False)
  76. if not state_verbose:
  77. state_verbose = api_query.get("state_verbose", False)
  78. call_cli_cmd.append("--state_verbose={state_verbose}".format(state_verbose=state_verbose))
  79.  
  80. timeout = salt_kwarg.get("timeout", 90)
  81. if timeout == 90:
  82. timeout = api_query.get("timeout", 90)
  83. call_cli_cmd.append("-t {timeout}".format(timeout=timeout))
  84.  
  85. out_format = salt_kwarg.get("out", "json")
  86. if out_format == "json":
  87. out_format = api_query.get("out_format", "json")
  88. call_cli_cmd.append("--out={out_format}".format(out_format=out_format))
  89. if out_format == "json":
  90. call_cli_cmd.append("-s")
  91.  
  92. batch_size = salt_kwarg.get("batch-size", None)
  93. if batch_size is None:
  94. batch_size = api_query.get("batch-size", None)
  95. if batch_size is not None:
  96. call_cli_cmd.append("--batch-size={batch_size}".format(batch_size=batch_size))
  97.  
  98. expr_form = api_query.get("expr_form", None)
  99. if expr_form is not None:
  100. call_cli_cmd.append("--{expr_form}".format(expr_form=expr_form))
  101.  
  102. tgt = api_query["tgt"]
  103. call_cli_cmd.append("'{tgt}'".format(tgt=tgt))
  104.  
  105. fun = api_query["fun"]
  106. if fun in allowed_fun:
  107. call_cli_cmd.append(fun)
  108. else:
  109. self.wfile.write('{"type":"error","class":"not allowed","variable":"fun","msg":"fun \"' + fun + '\" is not allowed"}\n')
  110. return
  111.  
  112. if len(api_query.get("arg","")) != 0:
  113. salt_arg = api_query["arg"][0]
  114. call_cli_cmd.append(salt_arg)
  115.  
  116. if len(api_query.get("arg","")) > 1:
  117. if ( fun.startswith("grains") ):
  118. var2 = api_query["arg"][1]
  119. call_cli_cmd.append("{var2}".format(var2=var2))
  120. else:
  121. saltenv = api_query["arg"][1]
  122. call_cli_cmd.append("saltenv={saltenv}".format(saltenv=saltenv))
  123. #if len(api_query.get("arg","")) > 1:
  124. # var2 = api_query["arg"][1]
  125. # saltenv = api_query["arg"][2]
  126. # call_cli_cmd.append("{var2}".format(var2=var2))
  127. # call_cli_cmd.append("saltenv={saltenv}".format(saltenv=saltenv))
  128. else:
  129. saltenv = salt_kwarg.get("saltenv", None)
  130. if saltenv is None:
  131. saltenv = api_query.get("saltenv", None)
  132. if saltenv is not None:
  133. call_cli_cmd.append("saltenv={saltenv}".format(saltenv=saltenv))
  134.  
  135. test = salt_kwarg.get("test", None)
  136. if test is None:
  137. test = api_query.get("test", False)
  138. if test:
  139. call_cli_cmd.append("test=True")
  140.  
  141. client = api_query.get("client", "local")
  142. eauth = api_query.get("eauth", "")
  143. pillar = salt_kwarg.get("pillar", None)
  144. if pillar is not None:
  145. call_cli_cmd.append("pillar='{pillar}'".format(pillar=json.dumps(pillar)))
  146.  
  147. fd.write("\n++++\n")
  148. call_cli_str = " ".join(call_cli_cmd)
  149. fd.write(call_cli_str)
  150. send_notification(api_json_arr, call_cli_str, " ")
  151. print call_cli_str
  152. salt_call = Popen(call_cli_str, shell=True, stdin=PIPE, stdout=PIPE, close_fds=True)
  153. salt_output = salt_call.stdout.read()
  154. fd.write("\n++++\n")
  155. fd.write(salt_output)
  156.  
  157.  
  158. rsend["return"].append(json.loads(salt_output.strip()))
  159.  
  160. fd.write("\n++++\n")
  161. fd.write(json.dumps(rsend))
  162. fd.write("\n-----\n")
  163. send_notification(api_json_arr, call_cli_str, " ")
  164. fd.close()
  165. if ( fun == "test.ping" ):
  166. self.wfile.write(json.dumps(rsend))
  167. elif (fun == "grains.setval"):
  168. self.wfile.write(json.dumps(rsend))
  169. else:
  170. self.wfile.write(json.dumps(self.changesonlyout(rsend)))
  171.  
  172. def run(server_class=HTTPServer, handler_class=S, port=8082):
  173. server_address = ('', port)
  174. httpd = server_class(server_address, handler_class)
  175. print 'Starting httpd...'
  176. httpd.serve_forever()
  177.  
  178. if __name__ == "__main__":
  179. from sys import argv
  180.  
  181. if len(argv) == 2:
  182. run(port=int(argv[1]))
  183. else:
  184. run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement