def __nginx_backup(self, proxy_server, web_server, nginx_module, deploy_pillar): self.proxy_server = proxy_server self.web_server = web_server self.nginx_module = nginx_module self.deploy_pillar = deploy_pillar try: ##########nginx backup####### s, backup = commands.getstatusoutput("salt " + self.proxy_server + " state.sls queue=True " + self.nginx_module + " " + self.deploy_pillar) self.f.write(backup) self.f.flush() self.result.append(backup) if backup.find('Failed: 0') < 0: print "!!!!!!!!!!!!!!!!!! [backup server] ERROR !!!!!!!!!!!!!!!!!!!" return 1 self.f.write('\n\n\n\n\n') return 0 except Exception, e: print e self.f.write('error') self.f.close() dingding_robo(self.web_server, self.site, 'error', self.username, self.phone_number) logs(self.username, self.ip, self.site, 'Failed') return 1
def __svn_update(self, web_server, svn_path, svn_username, svn_password, svn_revision): self.web_server = web_server self.svn_path = svn_path self.svn_username = svn_username self.svn_password = svn_password self.svn_revision = svn_revision try: #####svn update######## update_cmd = '\'svn update -r %s %s --username=%s --password=%s \'' % ( self.svn_revision, self.svn_path, self.svn_username, self.svn_password) s, update = commands.getstatusoutput("salt " + self.web_server + " cmd.run " + update_cmd) self.f.write(update) self.f.flush() self.result.append(update) if update.find('Error') > 0 or update.find('error') > 0: print "!!!!!!!!!!!!!!!!!! [update svn] ERROR !!!!!!!!!!!!!!!!!!!" return 1 self.f.write('\n\n\n\n\n') return 0 except Exception, e: print e self.f.write('error') self.f.close() dingding_robo(self.web_server, self.site, 'error', self.username, self.phone_number) logs(self.username, self.ip, self.site, 'Failed') return 1
def flushMemcached(request): data = request.POST.getlist('mcName') project = 'memcache flush' username = request.user ip = request.META['REMOTE_ADDR'] saltCmd = LocalClient() result = [] for name in data: for info in memcache.objects.filter(memcacheName=name): try: cmd = saltCmd.cmd( info.saltMinion.saltname, 'cmd.run', ['echo "flush_all" | nc %s %s' % (info.ip, info.port)]) result.append(cmd) if cmd[info.saltMinion.saltname] == 'OK': msg = 'Success' else: msg = 'error' host = info.ip + ":" + info.port dingding_robo(host, project, msg, username, request.POST['phone_number']) print result except Exception, e: print e
def deployServices(self, env, services, phone_number): self.env = env self.services = services self.phone_number = phone_number result = [] obj = winconf.objects.filter(env=self.env).filter( servicename=self.services) for name in obj: stop = self.salt.cmd(name.hostname.saltname, 'cmd.run', ['net stop %s' % name.servicename]) result.append(stop) while True: task_list = self.salt.cmd( name.hostname.saltname, 'cmd.run', ['tasklist | findstr %s' % name.tasklist_name]) if not task_list[name.hostname.saltname]: print 'proccess has been exit.' break time.sleep(3) update = self.salt.cmd(name.hostname.saltname, 'cmd.run', [ 'svn up %s --username=%s --password=%s' % (name.localpath, name.username, name.password) ]) result.append(update) start = self.salt.cmd(name.hostname.saltname, 'cmd.run', ['net start %s' % name.servicename]) result.append(start) action = 'deploy ' + name.servicename logs(self.user, self.ip, action, result) servicename = name.servicename.strip('"') dingding_robo(name.hostname.saltname, servicename, start, self.user, self.phone_number) return result
def servicesAction(self, services, action, phone_number): self.services = services self.action = action self.phone_number = phone_number result = [] for s in self.services: sName, host = s.split(',') if action == 'start': getMes = self.salt.cmd(host, 'cmd.run', ['net start %s' % sName]) elif action == 'stop': getMes = self.salt.cmd(host, 'cmd.run', ['net stop %s' % sName]) elif action == 'restart': getMes = self.salt.cmd(host, 'cmd.run', ['net stop %s' % sName]) result.append(getMes) getMes = self.salt.cmd(host, 'cmd.run', ['net start %s' % sName]) result.append(getMes) info = self.action + ' ' + sName.strip('"') dingding_robo(host, info, getMes, self.user, self.phone_number) logs(self.user, self.ip, info, result) return result
def __svn_update(self, web_server, svn_path, svn_username, svn_password, svn_revision): self.web_server = web_server self.svn_path = svn_path self.svn_username = svn_username self.svn_password = svn_password self.svn_revision = svn_revision try: #####svn update######## update_cmd = 'svn update -r %s %s --username=%s --password=%s' % ( self.svn_revision, self.svn_path, self.svn_username, self.svn_password) print '-----svn----', update_cmd data = { 'client': 'local', 'tgt': self.web_server, 'fun': 'cmd.run', 'arg': update_cmd } update = salt_api.salt_cmd(data) print update if update['return'][0][self.web_server].find( 'Error') > 0 or update['return'][0][self.web_server].find( 'error') > 0: print "!!!!!!!!!!!!!!!!!! [update svn] ERROR !!!!!!!!!!!!!!!!!!!" return 1 except Exception, e: print e self.f.write('error') self.f.close() dingding_robo(self.web_server, self.site, 'error', self.username, self.phone_number) logs(self.username, self.ip, self.site, 'Failed') return 1
def command_exec(username, phone, ip, svc_name, cmd, zone, output): cmd_host = cmd_host_qcd if zone == 'qcd' else cmd_host_aws _cmd = 'svn co http://svn.65dg.me/svn/gotemplate /srv/gotemplate ' \ ' --non-interactive --username={username} --password={password} && ' \ 'svn co http://svn.65dg.me/svn/{svc_name} /srv/{svc_name} ' \ ' --non-interactive --username={username} --password={password} && ' \ 'mkdir -p {log_path} && ' \ 'cd /srv/{svc_name} && ' \ '/srv/{svc_name}/{cmd} -c /srv/gotemplate/{svc_name}/conf.ctmpl >> {output} 2>&1' \ ''.format(username=svn_username, password=svn_password, svc_name=svc_name, cmd=cmd, output=output, log_path=os.path.dirname(output)) print(_cmd) salt_api = SaltApi() data = { 'client': 'local', 'fun': 'cmd.run', 'tgt': cmd_host, 'arg': _cmd } result = salt_api.salt_cmd(data) if result != 0: result = result['return'] if not os.path.exists(os.path.dirname(output)): try: os.makedirs(os.path.dirname(output)) except Exception as e: print(e) logs(username, ip, cmd, e) dingding_robo(cmd_host, 'command job', ' error ', username, phone) return str(e) with open(output, 'w') as f: if isinstance(result, list): for r in result: if isinstance(r, dict): for k, v in r.items(): f.write('--> ') f.write(k) f.write('\n') f.write(v) else: f.write(str(r)) else: f.write(str(result)) logs(username, ip, cmd, 'running') dingding_robo(cmd_host, 'command job', result, username, phone) return result
def __nginx_backup(self, hosts, block_ip, block_server, nginx_upstream, is_block): self.hosts = hosts self.block_ip = block_ip self.block_server = block_server self.nginx_upstream = nginx_upstream upstream_host = '' try: for ip in self.hosts: if is_block == 1: upstream_host += 'server %s; ' % ip else: if len(self.hosts) == 1: upstream_host += 'server %s; ' % ip elif ip != self.block_ip: upstream_host += 'server %s; ' % ip if not upstream_host: print 'not upstream_host!!!!' exit() for lb in nginx_api: url = "%s/upstream/%s" % (lb, self.nginx_upstream) r = requests.post(url, data=upstream_host) self.f.write('curl ' + url) self.f.write('\n\n\n\n\n') self.f.flush() if r.text != 'success': exit() r = requests.get(url) self.f.write(r.text) self.f.flush() self.f.write('\n\n\n\n\n') return 0 except Exception, e: print e self.f.write('error') self.f.close() dingding_robo(self.block_server, self.site, 'is error', self.username, self.phone_number) logs(self.username, self.ip, self.site, 'Failed') return 1
def kettle_run(user, ip, cmd_type, file_path, kettle_log_file, phone_number): salt_api = SaltApi() file_path = kettle_svn_path + file_path kettle_log_file = kettle_log_path + kettle_log_file if int(cmd_type) == 1: cmd = '%span.sh -file %s -logfile %s' % (kettle_install_dir, file_path, kettle_log_file) elif int(cmd_type) == 2: cmd = '%skitchen.sh -file %s -logfile %s' % ( kettle_install_dir, file_path, kettle_log_file) exists_file_cmd = 'ls %s' % file_path exists_file = { 'client': 'local', 'tgt': kettle_host, 'fun': 'cmd.run', 'arg': exists_file_cmd } file_result = salt_api.salt_cmd(exists_file) if file_result['return'][0][kettle_host] != file_path: logs(user, ip, cmd, 'not %s file.' % file_path) dingding_robo(kettle_host, 'kettle job', 'it is error', user, phone_number) return 0 data = { 'client': 'local', 'tgt': kettle_host, 'fun': 'cmd.run', 'arg': cmd } result = salt_api.salt_cmd(data) if result != 0: result = result['return'] logs(user, ip, cmd, 'running') dingding_robo(kettle_host, 'kettle job', result, user, phone_number) return result
def submit_tickets(request): tasks_info = '' title = request.POST['title'] ticket_type = request.POST['ticket_type'] handler = request.POST['handler'] owner = str(request.user) if ticket_type == 'go': function = request.POST['function'] hosts = request.POST.getlist('hosts') project = request.POST['project'] project = project.strip() go_command = request.POST['go_command'] supervisor_name = go_command.replace(" ", "_") svn_repo = svn_repo_url + project statsd = request.POST['statsd'] sentry = request.POST['sentry'] go_command = go_command + " -c /srv/gotemplate/%s/conf.ctmpl" % project salt_command = { "title":title, "ticket_type":ticket_type, "function":function, "hosts":hosts, "project":project, "svn_repo":svn_repo, "supervisor_name":supervisor_name, "go_command":go_command, "statsd":statsd, "sentry":sentry, "handler":handler, "owner":owner } ## create svn repo address if not gogroup.objects.filter(name=project): data = { 'client':'local', 'tgt': svn_host, 'fun':'cmd.script', 'arg':['salt://scripts/create_svn.sh',project] } salt_result = salt_api.salt_cmd(data) if salt_result['return'][0][svn_host]['stdout'] == 'ok': tasks_info = 'Your project svn_repo is %s.\n\n' % (svn_repo) else: tasks_info = 'Error creating svn repo(%s),please tell ops..\n\n' % (svn_repo) else: tasks_info = 'Your project svn_repo is %s.\n\n' % (svn_repo) elif ticket_type == 'webpage': print '--------site_name-----:',request.POST.getlist('site_name') site_name = request.POST.getlist('site_name') salt_command = { "title":title, "ticket_type":ticket_type, "site_name":site_name, "handler":handler, "owner":owner } elif ticket_type == 'uat_jenkins': print request.POST jenkins_name = request.POST['jenkins_name'] uat_env = request.POST['uat_env'] salt_command = { "title":title, "ticket_type":ticket_type, "uat_env": uat_env, "jenkins_name":jenkins_name, "handler":handler, "owner":owner } try: salt_command = json.dumps(salt_command) ticket_type = TicketType.objects.get(type_name=ticket_type) handler = User.objects.get(username=handler) task_id = str(uuid.uuid1()) TicketTasks.objects.create(tasks_id=task_id,title=title,ticket_type=ticket_type,creator=request.user,content=salt_command,handler=handler,state='1') tasks_info = tasks_info + 'The %s order submitted to success!' % task_id result = [{'TicketTasks':tasks_info}] logs(user=request.user,ip=request.META['REMOTE_ADDR'],action='add ticket (%s)' % title,result='successful') user = User.objects.get(username=handler) phone_number = UserProfile.objects.get(user=user).phone_number info = 'You have a message,please visit to workflow page.' dingding_robo(phone_number=phone_number,types=2,info=info) except Exception, e: print e result = [{'TicketTasks':'The order submitted to failed!'}] logs(user=request.user,ip=request.META['REMOTE_ADDR'],action='add ticket (%s)' % title,result='failed')
def handle_tickets(request): task_id = request.POST['id'] submit = request.POST['submit'] reply = request.POST['reply'] operating_id = TicketTasks.objects.get(tasks_id=task_id) content = TicketTasks.objects.get(tasks_id=task_id).content content = json.loads(content) username = User.objects.get(username=content['handler']) phone_number = UserProfile.objects.get(user=username).phone_number handle_result = 0 if submit == 'reject': TicketTasks.objects.filter(tasks_id=task_id).update(state='4') TicketOperating.objects.create(operating_id=operating_id,handler=username,content=reply,result='2',submitter=content['owner']) logs(user=request.user,ip=request.META['REMOTE_ADDR'],action='handle ticket (%s)' % content['title'],result='successful') info = 'Your "%s" order be reject,please visit to workflow page.' % content['title'] owner = User.objects.get(username=content['owner']) owner_phone_number = UserProfile.objects.get(user=owner).phone_number dingding_robo(phone_number=owner_phone_number,types=2,info=info) result = [{'HandleTasks':'The task_id handle to success!'}] return render(request,'getdata.html',{'result':result}) if content['ticket_type'] == 'go': #'----------------------------ticket_type--------------------' for host in content['hosts']: data = { 'client':'local', 'tgt':host, 'fun':'state.sls', 'arg':['goservices.supervisor_submodule','pillar={"goprograme":"%s","svnrepo":"%s","supProgrameName":"%s","goRunCommand":"%s"}' % (content['project'],content['svn_repo'],content['supervisor_name'],content['go_command'])] } result = salt_api.salt_cmd(data) try: minion_host = minion.objects.get(saltname=host) supervisor_info = gostatus.objects.get(hostname=minion_host) supervisor_obj = xmlrpclib.Server('http://%s:%s@%s:%s/RPC2' % ( supervisor_info.supervisor_username, supervisor_info.supervisor_password, supervisor_info.supervisor_host, supervisor_info.supervisor_port)) if supervisor_obj.supervisor.getProcessInfo(content['supervisor_name']): deploy_result = 1 print '-------successful-----' except Exception, e: print e deploy_result = 0 handle_result = 1 TicketTasks.objects.filter(tasks_id=task_id).update(state='5') TicketOperating.objects.create(operating_id=operating_id,handler=username,content=reply,result='3',submitter=content['owner']) logs(user=request.user,ip=request.META['REMOTE_ADDR'],action='handle ticket (%s)' % content['title'],result='failed') info = 'The "%s" order is failed,please check in %s host.' % (content['title'],host) dingding_robo(phone_number=phone_number,types=2,info=info) result = [{'HandleTasks':'The task_id handle to failed!'}] print '------failed-------------' return render(request,'getdata.html',{'result':result}) #-------------------------new project----------------------------------- try: if deploy_result == 1: if gogroup.objects.filter(name=content['project']): print 'The %s project is existing!!' % content['project'] else: obj = gogroup(name=content['project']) obj.save() project = gogroup.objects.get(name=content['project']) obj = svn(username=svn_username, password=svn_password, repo=content['svn_repo'], localpath=go_local_path + content['project'], movepath=go_move_path + content['project'], revertpath=go_revert_path, executefile=go_local_path + content['project'] + '/' + content['project'] ,project=project) obj.save() #-------------------------gotemplate----------------------------------- project = gogroup.objects.get(name=content['project']) ip = minion_host.ip if GOTemplate.objects.filter(hostname=minion_host).filter(project=project).filter(env=1): print 'The %s gotemplate project is existing!!' % content['project'] else: obj = GOTemplate( username=svn_username, password=svn_password, repo=svn_gotemplate_repo, localpath=svn_gotemplate_local_path, env=1, hostname=minion_host, project=project) obj.save() #-------------------------goservices----------------------------------- if goservices.objects.filter(saltminion=minion_host).filter(group=project).filter(name=content['supervisor_name']).filter(env=1): print 'The %s goservice is existing!!' % content['supervisor_name'] else: obj = goservices( ip=ip, name=content['supervisor_name'] , env=1, group=project, saltminion=minion_host, owner=content['owner'], has_statsd=content['statsd'], has_sentry=content['sentry'], comment=content['function']) obj.save() except Exception, e: print e handle_result = 1 TicketTasks.objects.filter(tasks_id=task_id).update(state='5') TicketOperating.objects.create(operating_id=operating_id,handler=username,content=reply,result='3',submitter=content['owner']) logs(user=request.user,ip=request.META['REMOTE_ADDR'],action='handle ticket (%s)' % content['title'],result='failed') result = [{'HandleTasks':'The task_id handle to failed!'}]
try: data = { 'client':'local', 'tgt': webpage_host, 'fun':'cmd.script', 'arg':['salt://scripts/webpage.py','"%s"' % str(content['site_name'])] } salt_api.salt_cmd(data) except Exception, e: print e handle_result = 1 TicketTasks.objects.filter(tasks_id=task_id).update(state='5') TicketOperating.objects.create(operating_id=operating_id,handler=username,content=reply,result='3',submitter=content['owner']) logs(user=request.user,ip=request.META['REMOTE_ADDR'],action='handle ticket (%s)' % content['title'],result='failed') info = 'The "%s" order is failed,please check in %s host.' % (content['title'],host) dingding_robo(phone_number=phone_number,types=2,info=info) result = [{'HandleTasks':'The task_id handle to failed!'}] elif content['ticket_type'] == 'uat_jenkins': try: jenkins = existGitlabProject(content['jenkins_name'],content['uat_env']) print '-----jenkins---',jenkins if jenkins == 2: result = [{'HandleTasks': 'The project name is not exist.'}] handle_result = 1 elif jenkins == 3: result = [{'HandleTasks': 'jenkins creating is error.'}] handle_result = 1 elif jenkins == 4: result = [{'HandleTasks': 'svn repo creating is error.'}] handle_result = 1 elif jenkins == 5:
if test_url.status_code == 200: repo_info = "The svn repo url is %s%s." % (svnrooturl, svnName) mes = {host: repo_info} result.append(mes) notification_mes = 'It is successful.' else: notification_mes = 'It is error.' else: result.append(cmdinfo) notification_mes = 'It is error.' except Exception, e: print e result.append(cmdinfo) notification_mes = 'The system is error.....' dingding_robo(host, 'create svn repo "%s"' % svnName, notification_mes, username, request.POST['phone_number']) logs(username, ip, 'create svn repo "%s"' % svnName, notification_mes) return render(request, 'getdata.html', {'result': result}) @login_required @deny_resubmit(page_key='deploy_svn_add_user') def svnAddUser(request): username = request.user ip = request.META['REMOTE_ADDR'] env = request.POST['env'] host = request.POST['hostname'] svnName = request.POST['svnName'] svnPassword = request.POST['svnPassword'] result = []
def __iis_recycle(self, web_server, recycle_cmd, web_url, action): self.web_server = web_server self.recycle_cmd = recycle_cmd self.web_url = web_url self.action = action try: ####recycle iis####### s, recycle = commands.getstatusoutput("salt " + self.web_server + " cmd.run '" + self.recycle_cmd + "'") self.f.write(recycle) self.f.flush() self.result.append(recycle) if recycle.find('Fail') > 0 or recycle.find('fail') > 0: print "!!!!!!!!!!!!!!!!!! [recycle iis] ERROR !!!!!!!!!!!!!!!!!!" return 1 self.f.write('\n\n\n\n\n') i = 0 while i < 5: start_time = time.time() s, testUrl = commands.getstatusoutput("curl -H \"Host:" + self.site + "\" -I " + self.web_url) self.f.write(testUrl) self.f.flush() self.f.write('\n\n\n\n\n') print time.time() - start_time if time.time() - start_time < 2: break i = i + 1 if i == 5: print "!!!!!!!!!!!!!!!!!! [recycle iis] TIMEOUT !!!!!!!!!!!!!!!!!!" self.f.write('error') self.f.close() return 1 if self.action == 'recycle': dingding_robo(self.web_server, 'recycle ' + self.site, 'success', self.username, self.phone_number) elif self.action == 'revert': dingding_robo(self.web_server, 'revert ' + self.site, 'success', self.username, self.phone_number) else: dingding_robo(self.web_server, self.site, 'success', self.username, self.phone_number) return 0 except Exception, e: print e self.f.write('error') self.f.close() if self.action == 'recycle': dingding_robo(self.web_server, self.site, 'error', self.username, self.phone_number) elif self.action == 'revert': dingding_robo(self.web_server, self.site, 'error', self.username, self.phone_number) else: dingding_robo(self.web_server, self.site, 'error', self.username, self.phone_number) logs(self.username, self.ip, self.site, 'Failed') return 1
def submit_tickets(request): title = request.POST['title'] ticket_type = request.POST['ticket_type'] handler = request.POST['handler'] owner = str(request.user) if ticket_type == 'go': function = request.POST['function'] hosts = request.POST.getlist('hosts') project = request.POST['project'] go_command = request.POST['go_command'] supervisor_name = request.POST['supervisor_name'] svn_repo = request.POST['svn_repo'] statsd = request.POST['statsd'] sentry = request.POST['sentry'] go_command = go_command + " -c /srv/gotemplate/%s/conf.ctmpl" % project salt_command = { "title": title, "ticket_type": ticket_type, "function": function, "hosts": hosts, "project": project, "svn_repo": svn_repo, "supervisor_name": supervisor_name, "go_command": go_command, "statsd": statsd, "sentry": sentry, "handler": handler, "owner": owner } elif ticket_type == 'webpage': print '--------site_name-----:', request.POST.getlist('site_name') site_name = request.POST.getlist('site_name') salt_command = { "title": title, "ticket_type": ticket_type, "site_name": site_name, "handler": handler, "owner": owner } try: salt_command = json.dumps(salt_command) ticket_type = TicketType.objects.get(type_name=ticket_type) handler = User.objects.get(username=handler) task_id = str(uuid.uuid1()) TicketTasks.objects.create(tasks_id=task_id, title=title, ticket_type=ticket_type, creator=request.user, content=salt_command, handler=handler, state='1') result = [{ 'TicketTasks': 'The %s order submitted to success!' % (task_id) }] logs(user=request.user, ip=request.META['REMOTE_ADDR'], action='add ticket (%s)' % title, result='successful') user = User.objects.get(username=handler) phone_number = UserProfile.objects.get(user=user).phone_number info = 'You have a message,please visit to workflow page.' dingding_robo(phone_number=phone_number, types=2, info=info) except Exception, e: print e result = [{'TicketTasks': 'The order submitted to failed!'}] logs(user=request.user, ip=request.META['REMOTE_ADDR'], action='add ticket (%s)' % title, result='failed')
def __iis_recycle(self, web_server, recycle_cmd, web_url, action): self.web_server = web_server self.recycle_cmd = recycle_cmd self.web_url = web_url self.action = action try: ####recycle iis####### data = { 'client': 'local', 'tgt': self.web_server, 'fun': 'cmd.run', 'arg': self.recycle_cmd } print '----------', self.web_server, self.recycle_cmd recycle = salt_api.salt_cmd(data) print recycle if recycle['return'][0][self.web_server].find('successfully') < 0: print "!!!!!!!!!!!!!!!!!! [recycle iis] ERROR !!!!!!!!!!!!!!!!!!" return 1 c = 6 while c > 1: print c r = requests.get(self.web_url, headers={'Host': self.site}, timeout=60, allow_redirects=False) c -= 1 if self.action == 'recycle': dingding_robo(self.web_server, 'recycle ' + self.site, 'success', self.username, self.phone_number) elif self.action == 'revert': dingding_robo(self.web_server, 'revert ' + self.site, 'success', self.username, self.phone_number) else: dingding_robo(self.web_server, self.site, 'success', self.username, self.phone_number) return 0 except Exception, e: print e self.f.write('error') self.f.close() if self.action == 'recycle': dingding_robo(self.web_server, self.site, 'is error', self.username, self.phone_number) elif self.action == 'revert': dingding_robo(self.web_server, self.site, 'is error', self.username, self.phone_number) else: dingding_robo(self.web_server, self.site, 'is error', self.username, self.phone_number) logs(self.username, self.ip, self.site, 'Failed') return 1