Пример #1
0
    def getdomains(self):
        self.__warning = "\r\n".join([
            'Attention: 腾讯云域名获取失败,请检查:'
            '腾讯云URL:  + %s' % tencent_url,
            #'%s : %s' %(secretid, secretkey)
        ])
        self.__params = {
            'Action': 'DescribeCdnHosts',
            'Nonce': random.randint(1, 1000000),
            'SecretId': self.__secretid,
            'Timestamp': int(time.time()),
        }
        self.signkey(self.__httpmethod)
        url = "https://" + tencent_url
        try:
            ret = requests.post(url, data=self.__params, verify=False)
        except Exception as e:
            message['text'] = self.__warning + '\nException: ' + e.message
            logger.error(message['text'])
            sendTelegram(message).send()
            return self.__params, False

        else:
            if ret.json()['code'] != 0:
                message['text'] = self.__warning + '\n' + ret.json()['message']
                logger.error(message['text'])
                sendTelegram(message).send()
                return ret.json(), False

            else:
                logger.info(str(self.__params) + ": 腾讯云域名获取成功!")
                return ret.json(), True
Пример #2
0
 def ExePost(self, uri, info):
     url = self.__url + uri
     self.__warning = "\r\n".join([ 
             '@arno',
             'Attention: %s 失败,请检查:' %info,
             'URL:  + %s' %url,
             #'%s : %s' %(secretid, secretkey)
           ])
     #logger.info(self.__data)
     try:
         ret = requests.post(url, data=self.__data, verify=False)
     except Exception as e:
         message['text'] = self.__warning + '\nException: ' + e.message
         logger.error(message['text'])
         sendTelegram(message).send()
         return error, False
     else:
         result = ret.json()
         if result['status']['code'] != "1":
             message['text'] = self.__warning + '\n' + str(result['status'])
             logger.error(message['text'])
             sendTelegram(message).send()
             return result, False
         else:
             logger.info("%s 成功!" %info)
             return result, True
Пример #3
0
    def purge(self, domains, uri="/"):
        self.__params = {
            'Action': 'RefreshCdnUrl',
            'Nonce': random.randint(1, 1000000),
            'SecretId': self.__secretid,
            'Timestamp': int(time.time()),
        }
        self.signkey(self.__httpmethod, domains, uri)
        url = "https://" + tencent_url
        #logger.info(self.__params)
        try:
            ret = requests.post(url, data=self.__params, verify=False)
        except Exception as e:
            message[
                'text'] = self.__warning + '\n%s | Exception: ' % url + e.message
            logger.error(message['text'])
            sendTelegram(message).send()
            return self.__params, False

        else:
            if ret.json()['code'] != 0:
                message['text'] = self.__warning + '\n%s: ' % url + ret.json(
                )['message']
                logger.error(message['text'])
                sendTelegram(message).send()
                return ret.json(), False

            else:
                logger.info(str(self.__params) + ": 缓存清理成功!")
                return ret.json(), True
Пример #4
0
 def purge(self, domains, uri='/'):
     date = getDate()
     headers = {'Date': date, 'Content-Type': 'application/json', 'Accept': 'application/json'}
     url     = 'http://open.chinanetcenter.com/ccm/purge/ItemIdReceiver'
     signed_apikey = self.signApikey(date)
     self.__warning = "\r\n".join([ 
                 'Attention: 网宿域名缓存清理失败,请检查:'
                 '网宿URL:  + %s' %url,
                 #'headers:  + %s' %headers,
                 '%s : %s' %(self.__username, signed_apikey)
             ])
 
     #判断是目录刷新还是文件刷新
     if uri == '/' or uri[-1] == '/':
         type_f = 'dirs' #目录刷新
     else:
         type_f = 'urls' #文件刷新
 
     data    = {type_f: []} #需要刷新的域名或者文件链接
 
     #格式化域名或者文件链接   
     for domain in domains:
         data[type_f].append('%s%s' %(domain, uri))
         #if domain['service-type'] == 'web-https':
         #    data[type_f].append('https://%s%s' %(domain['domain-name'], uri))
 
     try:
         ret = requests.post(url, headers=headers, auth=(self.__username, signed_apikey), data=json.dumps(data))
         logger.info(str(ret.status_code)+': '+ret.content)
 
     except Exception, e:
         message['text'] = self.__warning + '\nException: ' + e.message
         logger.error(message['text'])
         sendTelegram(message).send()
         return {}, False
Пример #5
0
def get_svn_lock_files(svn_master_id, excepts=[], key=None):
    file_list = []
    try:
        svn_master = svn_master_t.objects.get(id=svn_master_id)
    except Exception as e:
        message['text'] = "@arno\r\nsvn master[id%s] 不存在\r\n%s" % (
            svn_master_id, str(e))
        logger.error(message['text'])
        sendTelegram(message).send()
        return False, file_list
    else:
        if key == "fenghuang_caipiao":
            locks = svn_master.svn_gray_lock.all()
        elif key == "fenghuang_zyp":
            locks = svn_master.svnzyp_gray_lock.all()
        elif key == "fenghuang_zyp_front":
            locks = svn_master.svnzypfront_gray_lock.all()
        elif key == "fenghuang_zyp_front2":
            locks = svn_master.svnzypfront2_gray_lock.all()
        else:
            locks = []

        for svn_record in locks:
            isExcept = False
            for excepti in excepts:
                if svn_record.revision == excepti['revision']:
                    logger.info("排除svn锁: %s" % excepti['revision'])
                    isExcept = True
                    break
            if isExcept: continue
            for change in svn_record.changelist[1:-1].split('], ['):
                file_list.append(change.split('\'')[3])
        return True, file_list
Пример #6
0
    def DeleteZoneRecord(self, zone_id, record_id):
        '''
            删除解析记录
        '''
        result = {}

        url = self.__url + '/%s/' % zone_id + 'dns_records/' + record_id

        self.__warning = "\r\n".join([
            '@arno',
            'Attention: CF域名解析删除失败,请检查:',
            'URL:  + %s' % url,
            #'%s : %s' %(secretid, secretkey)
        ])

        try:
            ret = requests.delete(url, headers=self.__headers, verify=False)
            result = ret.json()

        except Exception as e:
            result = {'result': None, 'errors': str(e), 'success': False}

        if not result['success']:
            message['text'] = self.__warning + '\n' + str(result)
            logger.error(message['text'].replace('\r\n', '\n'))
            sendTelegram(message).send()

        return result
Пример #7
0
    def purge(self, zone_id):
        '''
            清理缓存:"purge_everything":true
        '''
        result = {}
        data = {"purge_everything": True}
        url = self.__url + '/%s/' % zone_id + 'purge_cache'

        self.__warning = "\r\n".join([
            '@arno',
            'Attention: CF域名缓存清理失败,请检查:',
            'URL:  + %s' % url,
            #'%s : %s' %(secretid, secretkey)
        ])

        try:
            ret = requests.post(url,
                                data=json.dumps(data),
                                headers=self.__headers,
                                verify=False)
            result = ret.json()

        except Exception as e:
            result = {'result': None, 'errors': str(e), 'success': False}

        if not result['success']:
            message['text'] = self.__warning + '\n' + str(result)
            logger.error(message['text'].replace('\r\n', '\n'))
            sendTelegram(message).send()

        return result
Пример #8
0
    def getdomains(self):
        date = getDate()
        headers = {'Date': date, 'Accept': 'application/json'}
        url = 'https://open.chinanetcenter.com/api/domain'
        signed_apikey = self.signApikey(date)
        self.__warning = "\r\n".join([
            'Attention: 网宿域名获取失败,请检查:'
            '网宿URL:  + %s' % url,
            #'headers:  + %s' %headers,
            '%s : %s' % (self.__username, signed_apikey)
        ])
        try:
            ret = requests.get(url,
                               headers=headers,
                               auth=(self.__username, signed_apikey))

        except Exception as e:
            message['text'] = self.__warning + '\nException: ' + e.message
            logger.error(message['text'])
            sendTelegram(message).send()
            return {}, False

        else:
            if ret.status_code != 200:
                message['text'] = self.__warning + '\n' + str(
                    ret.content.replace('<', '&lt;').replace('>', '&gt;'))
                logger.error(message['text'])
                sendTelegram(message).send()
                return ret.content, False

            else:
                logger.info("网宿域名获取成功!")
                return ret.json(), True
Пример #9
0
    def getdomains(self, product=[]):
        '''
            通过aws 特有的标签,识别所需要的配置
        '''
        product = self.__product

        # 建立aws 客户端
        client = self.createCli()

        # 警告信息
        self.__warning = "\r\n".join([
            'Attention: aws域名获取失败,请检查:',
            'aws账号:  + %s' % self.__username,
        ])

        # 获取分发内容的列表
        try:
            ret = client.list_distributions()

        except Exception as e:
            content = self.__warning + '\r\n' + str(e).replace(
                '<', '&lt;').replace('>', '&gt;')[:2047]
            sendTelegramAlert(content)
            return [], False

        # 对域名进行筛选
        try:
            if ret['ResponseMetadata'][
                    'HTTPStatusCode'] != 200 or 'DistributionList' not in ret.keys(
                    ):
                content = self.__warning + '\r\n' + str(ret).replace(
                    '<', '&lt;').replace('>', '&gt;')[:2047]
                sendTelegramAlert(content)
                return [], False

        except Exception as e:
            message['text'] = self.__warning + '\r\n' + str(e).replace(
                '<', '&lt;').replace('>', '&gt;')[:2047]
            logger.error(message['text'])
            sendTelegram(message).send()
            return [], False

        else:
            tmplist = []
            for item in ret['DistributionList']['Items']:
                li = item['Comment'].replace(' ', '').split('-')  # 获取注释,并拆分为列表
                if len(li) < 2: continue
                if li[0] in product:  # 如果产品在所新人的列表中,则录入
                    tmpdict = {
                        'item': item,
                        'Id': item['Id'],
                        'domains': item['Aliases']['Items'],
                        'product': li[0],
                        'customer': li[1],
                    }
                    tmplist.append(tmpdict)
            logger.info("%s: aws 账号 cdn云域名获取成功。" % self.__username)
            return tmplist, True
Пример #10
0
def sendTelegramRe(message):
    #message['group'] = 'arno_test'
    if len(message["text"]) > 10:
        message["text"] = '\n'.join(message["text"])
        message["doc"] = True
        message['doc_name'] = 'domain.txt'
    else:
        message["doc"] = False
        message["text"] = '\r\n'.join(message["text"]) +'\r\n'+ message['caption']
    sendTelegram(message).send()
Пример #11
0
 def ExePost(self, uri, info):
     url = self.__url + uri
     self.__warning = "\r\n".join([ 
             '@arno',
             'Attention: %s 失败,请检查:' %info,
             'URL:  + %s' %url,
             #'%s : %s' %(secretid, secretkey)
           ])
     #logger.info(self.__data)
     try:
         ret = requests.post(url, data=self.__data, verify=False, timeout=15)
     except Exception, e:
         message['text'] = self.__warning + '\nException: ' + str(e.message)
         logger.error(message['text'])
         sendTelegram(message).send()
         return str(e.message), False
Пример #12
0
 def getdomains(self):
     date = getDate()
     headers = {'Date': date, 'Accept': 'application/json'}
     url     = 'https://open.chinanetcenter.com/api/domain'
     signed_apikey = self.signApikey(date)
     self.__warning  = "\r\n".join([ 
             'Attention: 网宿域名获取失败,请检查:'
             '网宿URL:  + %s' %url,
             #'headers:  + %s' %headers,
             '%s : %s' %(self.__username, signed_apikey)
           ])
     try:
         ret = requests.get(url, headers=headers, auth=(self.__username, signed_apikey))
 
     except Exception, e:
         message['text'] = self.__warning + '\nException: ' + e.message
         logger.error(message['text'])
         sendTelegram(message).send()
         return {}, False
Пример #13
0
    def CreateZoneRecord(self,
                         zone_id,
                         record_type,
                         record_name,
                         record_content,
                         proxied=False):
        '''
            新增解析记录,{'type':'A', 'name':'example.com', 'content': '127.0.0.1', 'proxied':false}
        '''
        datas = {
            'type': record_type,
            'name': record_name,
            'content': record_content,
            'proxied': proxied
        }
        result = {}

        url = self.__url + '/%s/' % zone_id + 'dns_records'

        self.__warning = "\r\n".join([
            '@arno',
            'Attention: CF域名解析新增失败,请检查:',
            'URL:  + %s' % url,
            #'%s : %s' %(secretid, secretkey)
        ])

        try:
            ret = requests.post(url,
                                data=json.dumps(datas),
                                headers=self.__headers,
                                verify=False)
            result = ret.json()

        except Exception as e:
            result = {'result': None, 'errors': str(e), 'success': False}

        if not result['success']:
            message['text'] = self.__warning + '\n' + str(result)
            logger.error(message['text'].replace('\r\n', '\n'))
            sendTelegram(message).send()

        return result
Пример #14
0
def SendTelegram(request):
    title = u'发送telegram信息'
    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
        clientip = request.META['HTTP_X_FORWARDED_FOR']
    else:
        clientip = request.META['REMOTE_ADDR']
    logger.info('%s is requesting %s' % (clientip, request.get_full_path()))

    if request.method == 'POST':
        try:
            message = json.loads(request.body)
            if not isinstance(message, dict):
                logger.error('%s is not dict.' % message)
                s = sendTelegram({
                    'text': clientip + ': 发送telegram信息失败,参数不是字典!',
                    'bot': 'sa_monitor_bot',
                    'group': 'arno_test'
                })  #arno_test
                if s.send():
                    return HttpResponse(content='参数错误!', status=500)
                else:
                    return HttpResponse(content='telegram 发送失败!', status=502)
        except Exception as e:
            logger.error(e.message)
            s = sendTelegram({
                'text': clientip + ': 发送telegram信息失败!\r\n' + e.message,
                'bot': 'sa_monitor_bot',
                'group': 'arno_test'
            })  #arno_test
            if s.send():
                return HttpResponse(content='参数错误!', status=500)
            else:
                return HttpResponse(content='telegram 发送失败!', status=502)

        s = sendTelegram(message)
        if s.send():
            return HttpResponse('发送成功!')
        else:
            return HttpResponse(content='telegram 发送失败,参数错误!', status=502)
    else:
        return HttpResponse(status=403)
Пример #15
0
def sendAlert(ip, results):
    java = ""
    ruiying = ""
    fenghuang = ""
    for result in results:
        if result[0] == 26:
            java += '\r\n' + result[1]
        elif result[0] == 27:
            ruiying += '\r\n' + result[1]
        else:
            fenghuang += '\r\n' + result[1]
    if java:
        message['doc'] = False
        message['text'] = ip + java
        message['group'] = 'java_domain'  #java_domain
        if len(message['text']) >= 4096:
            message['doc'] = True
            message['text'] = message['text'].replace('\r\n', '\n')
        sendTelegram(message).send()
    if ruiying:
        message['doc'] = False
        message['text'] = ip + ruiying
        message['group'] = 'arno_test'  #ruiying_domain
        if len(message['text']) >= 4096:
            message['doc'] = True
            message['text'] = message['text'].replace('\r\n', '\n')
        sendTelegram(message).send()
    if fenghuang:
        message['doc'] = False
        message['text'] = ip + fenghuang
        message['group'] = 'domain_alert'  #domain_alert
        if len(message['text']) >= 4096:
            message['doc'] = True
            message['text'] = message['text'].replace('\r\n', '\n')
        sendTelegram(message).send()
Пример #16
0
 def GetCdnMiddleSourceList(self):
     self.__warning = "\r\n".join([
         'Attention: 腾讯云中间源ip列表获取失败,请检查:'
         '腾讯云URL:  + %s' % tencent_url,
         #'%s : %s' %(secretid, secretkey)
     ])
     self.__params = {
         'Action': 'GetCdnMiddleSourceList',
         'Nonce': random.randint(1, 1000000),
         'SecretId': self.__secretid,
         'Timestamp': int(time.time()),
     }
     self.signkey(self.__httpmethod)
     url = "https://" + tencent_url
     #logger.info(self.__params)
     try:
         ret = requests.post(url, data=self.__params, verify=False)
     except Exception, e:
         message[
             'text'] = self.__warning + '\n%s | Exception: ' % url + e.message
         logger.error(message['text'])
         sendTelegram(message).send()
         return self.__params, False
Пример #17
0
 def GetLog(self, limit=1):
     '''
         获取svn 提交日志
     '''
     logger.info("需要获取的日志是 %d 条" % limit)
     log_list = []
     try:
         info = self.conn.log_default(limit=limit, changelist=True)
         #logger.info(info)
     except Exception as e:
         message['text'] = '@arno\r\n%s: 获取svn信息失败!\r\n%s' % (self.__url,
                                                              str(e))
         #logger.error(message['text'])
         sendTelegram(message).send()
     else:
         for i in range(limit):
             try:
                 t = info.next()
             except Exception as e:
                 continue
             if not t: break
             tmpdict = {
                 'revision':
                 t.revision,
                 'author':
                 t.author,
                 'date':
                 t.date.astimezone(
                     get_localzone()).strftime('%Y/%m/%d %H:%M:%S'),
                 'log':
                 t.msg,
                 'changelist':
                 t.changelist,
             }
             log_list.append(tmpdict)
     return log_list
Пример #18
0
    def receive(self, text=None, bytes=None, **kwargs):
        """
        Called when a message is received with either text or bytes
        filled out.
        """
        #self.close()

        self.clientip = '127.0.0.1'
        self.username = self.message.user.username
        try:
            self.role = self.message.user.userprofile.role
        except:
            self.role = 'none'

        data = json.loads(self.message['text'])
        step = 0

        ### step one ###
        info = {}
        info['step'] = 'one'
        self.message.reply_channel.send({'text': json.dumps(info)})

        ### final step ###
        info = {}
        info['step'] = 'final'
        info['results'] = {}
        svn_customer_dict = {}

        count = 1
        for customer_id in data['customer']:
            customer_name = 'none'
            for value in data['item']['svn_customer']['in']:
                if int(customer_id) == value['id']:
                    customer_name = value['name']
                    break
            try:
                svn_customer = svn_customer_t.objects.get(id=customer_id)
            except Exception as e:
                message[
                    'text'] = "所选中的客户[%s] 记录不存在,请联系管理员!" % customer_name + '\nException: ' + str(
                        e)
                logger.error(message['text'])
                sendTelegram(message).send()
                info['results'][data['minion_id'] + '-' +
                                str(count)] = message['text']
                self.message.reply_channel.send({'text': json.dumps(info)})
                self.close()
                return False
                count += 1
            else:
                if svn_customer.iscrond != 1:
                    message[
                        'text'] = "所选中的客户[%s] 不支持同步计划任务,请联系管理员!" % customer_name + '\nException: ' + str(
                            e)
                    logger.error(message['text'])
                    sendTelegram(message).send()
                    info['results'][data['minion_id'] + '-' +
                                    str(count)] = message['text']
                    self.message.reply_channel.send({'text': json.dumps(info)})
                    self.close()
                    return False
                    count += 1

                svn_customer_dict[svn_customer.name] = {
                    'master_ip': [
                        ip.strip()
                        for ip in svn_customer.master_ip.split('\r\n')
                        if ip.strip() != ""
                    ],
                    'ip': [
                        ip.strip()
                        for ip in svn_customer.crond_ip.split('\r\n')
                        if ip.strip() != ""
                    ],
                    'port':
                    svn_customer.port,
                    'ismaster':
                    True if svn_customer.ismaster == 1 else False,
                    'crond_file':
                    svn_customer.crond_file,
                }

        try:
            svn_master = svn_master_t.objects.get(id=data['svn_master_id'])
            api = svn_master.api.strip('/') + '/crond_config'
            logger.info('posting: %s' % api)
            #logger.info('posting: %s' %svn_customer_dict)
            ret = requests.post(api, data=json.dumps(svn_customer_dict))
        except Exception as e:
            message['text'] = 'Exception: ' + str(e)
            logger.error(message['text'])
            sendTelegram(message).send()
            info['results'][data['minion_id']] = message['text']
        else:
            info['results'][data['minion_id']] = ret.content

        self.message.reply_channel.send({'text': json.dumps(info)})
        self.close()
Пример #19
0
    def receive(self, text=None, bytes=None, **kwargs):
        """
        Called when a message is received with either text or bytes
        filled out.
        """
        #self.close()

        self.clientip = '127.0.0.1'
        self.username = self.message.user.username
        try:
            self.role = self.message.user.userprofile.role
        except:
            self.role = 'none'

        data = json.loads(self.message['text'])
        step = 0

        ### step one ###
        info = {}
        info['step'] = 'one'
        self.message.reply_channel.send({'text': json.dumps(info)})

        ### final step ###
        info = {}
        info['step'] = 'final'
        info['results'] = {}
        svn_customer_dict = {}
        info['results'][data['minion_id']] = ""

        #给升级的产品上锁
        project = project_t.objects.get(id=data['id'])

        if project.svn_mst_lock == 1:
            info['results'][
                data['minion_id']] = "此环境的升级已被锁,请等待其他人升级完成,或者请联系管理员!"
            self.message.reply_channel.send({'text': json.dumps(info)})
            self.close()
            return False
        else:
            project.svn_mst_lock = 1
            project.save()

        #获取需要同步的客户
        svn_customer_l = []
        for svn_customer_name in data['customer']['real']:
            #customer_name = svn_customer_name.split(',')[0]
            #info['results'][data['minion_id']] += name + '\r\n'
            count = 1
            for customer_name in svn_customer_name.split(','):
                customer_name = customer_name.strip()

                #if count > 1: continue

                try:
                    svn_customer = svn_customer_t.objects.get(
                        name=customer_name)
                except Exception as e:
                    message[
                        'text'] = "所选中的客户[%s] 记录不存在,请联系管理员!" % customer_name + '\nException: ' + str(
                            e)
                    logger.error(message['text'])
                    sendTelegram(message).send()
                    info['results'][data['minion_id']] = message['text']
                    project.svn_mst_lock = 0
                    project.save()
                    self.message.reply_channel.send({'text': json.dumps(info)})
                    self.close()
                    return False
                else:
                    #if svn_customer.isrsynccode == 0: continue
                    svn_customer_l.append(svn_customer)
                    svn_customer_dict[svn_customer.name] = {
                        'master_ip': [
                            ip.strip()
                            for ip in svn_customer.master_ip.split('\r\n')
                            if ip.strip() != ""
                        ],
                        'ip': [
                            ip.strip() for ip in svn_customer.ip.split('\r\n')
                            if ip.strip() != ""
                        ] if count == 1 else [],
                        'port':
                        svn_customer.port,
                        'ismaster':
                        True if svn_customer.ismaster == 1 else False,
                        'isrsynccode':
                        True if count == 1 else False,
                        'cmd': [
                            cmd.strip()
                            for cmd in svn_customer.cmd.split('\r\n')
                            if cmd.strip() != ""
                        ],
                        'gray_domain':
                        svn_customer.gray_domain,
                        'online_domain':
                        svn_customer.online_domain,
                        'src_d':
                        svn_customer.src_d,
                        'dst_d':
                        svn_customer.dst_d,
                    }
                count += 1

        #调用接口执行代码同步
        numAll = len(svn_customer_dict)
        #logger.info(numAll)
        numExe = 0
        numCon = 1
        customerNameList = svn_customer_dict.keys()

        while numExe < numAll:
            try:
                svn_master = svn_master_t.objects.get(id=data['svn_master_id'])
                api = svn_master.api.strip('/') + '/remote/execute'
                logger.info('posting: %s' % api)

                ret = requests.post(api,
                                    data=json.dumps({
                                        'author':
                                        self.username.replace('_', ''),
                                        'svn_customer_dict':
                                        svn_customer_dict,
                                        'customers':
                                        customerNameList[numExe:numExe +
                                                         numCon],
                                        'script':
                                        data['script'].split('\n'),
                                    }))
                logger.info(customerNameList[numExe:numExe + numCon])
                numExe += numCon
            except Exception as e:
                message['text'] = api + '\nException: ' + str(e)
                logger.error(message['text'])
                sendTelegram(message).send()
                info['results'][data['minion_id']] = message['text']
            else:
                info['results'][data['minion_id']] += ret.content

        #给升级的产品解锁
        project.svn_mst_lock = 0
        project.save()

        self.message.reply_channel.send({'text': json.dumps(info)})
        self.close()
Пример #20
0
    def receive(self, text=None, bytes=None, **kwargs):
        """
        Called when a message is received with either text or bytes
        filled out.
        """
        #self.close()

        self.clientip = '127.0.0.1'
        self.username = self.message.user.username
        try:
            self.role = self.message.user.userprofile.role
        except:
            self.role = 'none'

        data = json.loads(self.message['text'])
        step = 0

        ### step one ###
        info = {}
        info['step'] = 'one'
        self.message.reply_channel.send({'text': json.dumps(info)})

        ### final step ###
        info = {}
        info['step'] = 'final'
        info['results'] = {}
        svn_customer_dict = {}
        info['results'][data['minion_id']] = ""

        #获取需要同步的文件
        svn_files = []
        svn_files_all = []
        for svn_record in data['svn_records']:
            changelist = svn_record['changelist']
            if not isinstance(changelist, list):
                for i in changelist[1:-1].split('], ['):
                    svn_files.append([i.split('\'')[1], i.split('\'')[3]])
                    svn_files_all.append([i.split('\'')[1], i.split('\'')[3]])
            else:
                svn_files += changelist
                svn_files_all += changelist

        # 这里做一个判断,如果升级文件超过一定数量,通知升级人员考虑全目录升级
        limit = 20
        if len(svn_files_all) > limit and self.username not in ['phexus_sa', 'arno']:
        # if len(svn_files_all) > limit:
            message['text'] = "升级文件数量: %s。超过 %s, 请考虑是否选择目录升级,或者联系管理员!" %(len(svn_files_all), limit)
            info['results'][data['minion_id']] = message['text']
            logger.error(message['text'])
            sendTelegram(message).send()
            self.message.reply_channel.send({'text': json.dumps(info)})
            self.close()
            return False

        #给升级的产品上锁
        project = project_t.objects.get(id=data['id'])

        if project.svn_mst_lock == 1:
            info['results'][data['minion_id']] = "此环境的升级已被锁,请等待其他人升级完成,或者请联系管理员!"
            self.message.reply_channel.send({'text': json.dumps(info)})
            self.close()
            return False
        else:
            project.svn_mst_lock = 1
            project.save()

        #给升级到灰度的svn 文件上锁以及解锁
        if len(data['codeEnv']) == 1 and data['codeEnv'][0] == 'gray_env':
            if data['end'] == 'front':
                sr = svn_zyp_front_gray_lock_t()
            elif data['end'] == 'front2':
                sr = svn_zyp_front2_gray_lock_t()

            for svn_record in data['svn_records']:
                sr.revision   = svn_record['revision']
                sr.author     = svn_record['author']
                sr.date       = svn_record['date']
                sr.log        = svn_record['log']
                sr.changelist = svn_record['changelist']
                try:
                    sr.save()
                except Exception as e:
                    logger.error(str(e))
                    logger.error("svn 记录锁已存在:%s" %svn_record)
                    if data['end'] == 'front':
                        sr = svn_zyp_front_gray_lock_t.objects.get(revision=svn_record['revision'])
                    elif data['end'] == 'front2':
                        sr = svn_zyp_front2_gray_lock_t.objects.get(revision=svn_record['revision'])
                    
                else:
                    logger.info("svn 记录锁:%s" %svn_record)

                try:
                    svn_master = svn_master_t.objects.get(id=data['svn_master_id'])
                    
                    if data['end'] == 'front':
                        svn_master.svnzypfront_gray_lock.add(sr)
                    elif data['end'] == 'front2':
                        svn_master.svnzypfront2_gray_lock.add(sr)
                    
                except Exception as e:
                    message['text'] = "@arno\r\nsvn 记录锁 存入svn master 失败:%s\r\n%s" %(svn_record, str(e))
                    info['results'][data['minion_id']] = "svn 记录锁 存入svn master 失败:%s\r\n%s" %(svn_record, str(e))
                    logger.error(message['text'])
                    sendTelegram(message).send()
                    project.svn_mst_lock = 0
                    project.save()
                    self.message.reply_channel.send({'text': json.dumps(info)})
                    self.close()
                    return False

            #info['results'][data['minion_id']] = "svn 记录锁 存入svn master 成功:%s" %svn_record
        
        elif len(data['codeEnv']) == 1 and data['codeEnv'][0] == 'online_env':
            #判断是否存在文件冲突
            islock = False
            status, svn_lock_files = get_svn_lock_files(data['svn_master_id'], data['svn_records'], data['key'])
            logger.info(svn_lock_files)
            for fileT in svn_files:
                if is_file_in_list(fileT[1], svn_lock_files):
                    islock = True
                    logger.info(fileT[1])
                    info['results'][data['minion_id']] += str(fileT)
            if islock:
                info['results'][data['minion_id']] = "文件锁存在,无法将灰度升级到运营:\r\n%s" %info['results'][data['minion_id']]
                logger.info(info['results'][data['minion_id']])
                project.svn_mst_lock = 0
                project.save()
                self.message.reply_channel.send({'text': json.dumps(info)})
                self.close()
                return False

            #判断是需要将灰度锁删除
            if int(data['isdeletegraylock'][0]) == 1:
                for svn_record in data['svn_records']:
                    try:
                        if data['key'] == "fenghuang_caipiao":
                            sr = svn_gray_lock_t.objects.filter(revision=svn_record['revision']).delete()
                        elif data['key'] == "fenghuang_zyp":
                            sr = svn_zyp_lottery_gray_lock_t.objects.filter(revision=svn_record['revision']).delete()
                        elif data['key'] == "fenghuang_zyp_front":
                            sr = svn_zyp_front_gray_lock_t.objects.filter(revision=svn_record['revision']).delete()
                        elif data['key'] == "fenghuang_zyp_front2":
                            sr = svn_zyp_front2_gray_lock_t.objects.filter(revision=svn_record['revision']).delete()
                    except Exception as e:
                        info['results'][data['minion_id']] = "svn 记录锁删除失败:%s" %svn_record
                        logger.error(info['results'][data['minion_id']])
                        self.message.reply_channel.send({'text': json.dumps(info)})
                        self.close()
                        return False
                    else:
                        pass
                        #info['results'][data['minion_id']] = "svn 记录锁删除成功:%s" %svn_record
                        #logger.info(info['results'][data['minion_id']])

        elif len(data['codeEnv']) == 2:
            #判断是否存在文件冲突
            islock = False
            status, svn_lock_files = get_svn_lock_files(data['svn_master_id'], key=data['key'])
            #logger.info(svn_lock_files)
            for fileT in svn_files:
                if is_file_in_list(fileT[1], svn_lock_files):
                    islock = True
                    info['results'][data['minion_id']] += str(fileT)
            if islock:
                info['results'][data['minion_id']] = "文件锁存在,无法直接升级到运营:\r\n%s" %info['results'][data['minion_id']]
                logger.info(info['results'][data['minion_id']])
                project.svn_mst_lock = 0
                project.save()
                self.message.reply_channel.send({'text': json.dumps(info)})
                self.close()
                return False

        else:
            info['results'][data['minion_id']] = "要升级的环境[%s]不存在,请联系管理员!" %data['codeEnv']
            logger.error(info['results'][data['minion_id']])
            project.svn_mst_lock = 0
            project.save()
            self.message.reply_channel.send({'text': json.dumps(info)})
            self.close()
            return False

        #获取需要同步的客户
        svn_customer_l = []
        for svn_customer_name in data['customer']['real']:
            #customer_name = svn_customer_name.split(',')[0]
            #info['results'][data['minion_id']] += name + '\r\n'
            count = 1
            for customer_name in svn_customer_name.split(','):
                customer_name = customer_name.strip()
                try:
                    svn_customer = svn_customer_t.objects.get(name=customer_name)
                except Exception as e:
                    message['text'] = "所选中的客户[%s] 记录不存在,请联系管理员!" %customer_name + '\nException: ' + str(e)
                    logger.error(message['text'])
                    sendTelegram(message).send()
                    info['results'][data['minion_id']] = message['text']
                    project.svn_mst_lock = 0
                    project.save()
                    self.message.reply_channel.send({'text': json.dumps(info)})
                    self.close()
                    return False
                else:
                    if svn_customer.isrsynczypcode == 0: continue
                    svn_customer_l.append(svn_customer)
                    svn_customer_dict[svn_customer.name] = {
                        'master_ip': [ ip.strip() for ip in svn_customer.master_ip.split('\r\n') if ip.strip() != "" ],
                        'ip': [ ip.strip() for ip in svn_customer.ip.split('\r\n') if ip.strip() != "" ],
                        'port': svn_customer.port,
                        'ismaster': True if svn_customer.iszypmaster == 1 else False, 
                        'isrsynccode': True if count == 1 else False,
                        'cmd': [cmd.strip() for cmd in svn_customer.cmd.split('\r\n') if cmd.strip() != "" ],
                        'gray_domain':   svn_customer.gray_domain,
                        'online_domain': svn_customer.online_domain,
                        'src_d': svn_customer.src_d,
                        'dst_d': svn_customer.dst_d,
                        'minion': [ minion.strip() for minion in svn_customer.minion.split('\r\n') if minion.strip() != "" ],
                    }

                    #获取minion ssh 登陆信息
                    minion_dict = {}
                    for minion_id in svn_customer_dict[svn_customer.name]['minion']:
                        try:
                            minion = minion_t.objects.get(minion_id=minion_id, status=1)
                        except Exception as e:
                            continue
                        else:
                            if not minion: continue
                        minion_dict[minion_id] = {
                            'ip': [],
                            'user': minion.user,
                            'port': minion.port,
                        }

                        minion_l = minion_ip_t.objects.filter(minion_id=minion_id).all()
                        minion_dict[minion_id]['ip'] = [ minion.ip_addr for minion in minion_l if minion.status == 1 and minion.alive == 1 ]

                    svn_customer_dict[svn_customer.name]['minion'] = minion_dict

                    count += 1

        #获取需要通知的部门同事
        atUsers = {}
        for id in data['department']:
            department = department_user_t.objects.get(id=int(id), status=1)
            atUsers[department.name] = {
                'department': department.department,
                'atUsers': department.AtUsers(),
            }

        #执行代码同步
        # if platform.system() != "Linux":
        #     message['text'] = "请在 linux 环境里面进行代码同步。"
        #     logger.error(message['text'])
        #     sendTelegram(message).send()
        #     info['results'][data['minion_id']] = message['text']
        #     project.svn_mst_lock = 0
        #     project.save()
        #     self.message.reply_channel.send({'text': json.dumps(info)})
        #     self.close()
        #     return False

        # 调用接口执行代码同步
        while len(svn_files) !=0 or int(data['isrsyncwhole'][0]) == 1:
            #svn_files_c = svn_files[:20]
            #svn_files   = svn_files[20:]
            svn_files_c = svn_files_all
            svn_files   = []
            try:
                svn_master = svn_master_t.objects.get(id=data['svn_master_id'])
                api = svn_master.front_api.strip('/') + '/svn_code'
                logger.info('posting: %s' %api)
                logger.info('posting: %d' %int(data['isrsyncwhole'][0]))
                ret = requests.post(api, data=json.dumps({
                    'author': self.username.replace('_', ''),
                    'svn_records': data['svn_records'],
                    'changelist_c': svn_files_c,
                    'changelist': svn_files_all,
                    'code_env': data['codeEnv'],
                    'isrsyncwhole': int(data['isrsyncwhole'][0]),
                    'svn_customer_dict': svn_customer_dict,
                    'atUsers': atUsers,
                    'end': data['end'],
                }))
            except Exception as e:
                message['text'] = api + '\nException: ' + str(e)
                logger.error(message['text'])
                sendTelegram(message).send()
                info['results'][data['minion_id']] = message['text']
            else:
                info['results'][data['minion_id']] += ret.content
            
            break

        #更新svn记录
        # if data['key'] == "fenghuang_caipiao":
        #     for svn_record in data['svn_records']:
        #         if len(data['codeEnv']) == 1 and data['codeEnv'][0] == 'gray_env':
        #             updateSvnRecord(revision=svn_record['revision'], svn_gray_l=svn_customer_l)
        #         elif len(data['codeEnv']) == 1 and data['codeEnv'][0] == 'online_env':
        #             updateSvnRecord(revision=svn_record['revision'], svn_online_l=svn_customer_l)
        #         elif len(data['codeEnv']) == 2:
        #             updateSvnRecord(revision=svn_record['revision'], svn_gray_l=svn_customer_l, svn_online_l=svn_customer_l)

        #给升级的产品解锁
        project.svn_mst_lock = 0
        project.save()

        self.message.reply_channel.send({'text': json.dumps(info)})
        self.close()
Пример #21
0
 def sendTelegramAlert(self, content=""):
     message['text'] = content
     logger.error(message['text'])
     sendTelegram(message).send()
Пример #22
0
                '%s : %s' %(self.__username, signed_apikey)
              ])
        try:
            ret = requests.get(url, headers=headers, auth=(self.__username, signed_apikey))
    
        except Exception, e:
            message['text'] = self.__warning + '\nException: ' + e.message
            logger.error(message['text'])
            sendTelegram(message).send()
            return {}, False
    
        else:
            if ret.status_code != 200:
                message['text'] = self.__warning + '\n' + str(ret.content.replace('<', '&lt;').replace('>', '&gt;'))
                logger.error(message['text'])
                sendTelegram(message).send()
                return ret.content, False
    
            else:
                logger.info("网宿域名获取成功!")
                return ret.json(), True

    def purge(self, domains, uri='/'):
        date = getDate()
        headers = {'Date': date, 'Content-Type': 'application/json', 'Accept': 'application/json'}
        url     = 'http://open.chinanetcenter.com/ccm/purge/ItemIdReceiver'
        signed_apikey = self.signApikey(date)
        self.__warning = "\r\n".join([ 
                    'Attention: 网宿域名缓存清理失败,请检查:'
                    '网宿URL:  + %s' %url,
                    #'headers:  + %s' %headers,
Пример #23
0
def UpdateServers(request):
    if request.is_websocket():
        clientip = getIp(request)
        username = request.user.username
        try:
            role = request.user.userprofile.role
        except:
            role = 'none'
        if not username:
            request.websocket.send('userNone')
            logger.info('user: 用户名未知 | [WS]%s is requesting. %s' %
                        (clientip, request.get_full_path()))
            ### close websocket ###
            request.websocket.close()

        logger.info('user:%s | [WS]%s is requesting. %s' %
                    (username, clientip, request.get_full_path()))

        for postdata in request.websocket:
            if not postdata:
                ### close websocket ###
                request.websocket.close()
                break
            data = json.loads(postdata)
            step = 0

            for record in data['records']:
                step += 1
                return_info = {}
                return_info['record'] = record
                return_info['step'] = step
                return_info['info'] = ""
                return_info['permission'] = True
                return_info['result'] = True

                #判断是否有权限
                if not HasServerPermission(request, record, "change"):
                    return_info['permission'] = False
                    return_info['result'] = False
                    request.websocket.send(json.dumps(return_info))
                    ### close websocket ###
                    request.websocket.close()
                    break

                #修改密码
                cmd = 'echo "%s" |passwd root --stdin' % data[
                    'password'].replace('`', '\`')  # `这个符号在Linux命令行有特殊含义,需要转义
                result = Command(record['minion_id'], 'cmd.run', cmd,
                                 'glob').CmdRun()[record['minion_id']]

                if 'all authentication tokens updated successfully' not in result:
                    return_info['result'] = False
                    return_info['info'] = result
                    request.websocket.send(json.dumps(return_info))
                    continue

                #密码加密并存放
                crypto, status = encryptPasswd(data['password'], record)
                if not status:
                    return_info['result'] = False
                    return_info['info'] = "密码修改成功,但是密码加密失败:" + result
                    message['text'] = "@arno\r\n" + return_info['info']
                    sendTelegram(message).send()
                    request.websocket.send(json.dumps(return_info))
                    continue
                try:
                    update = minion_t.objects.get(
                        minion_id=record['minion_id'])
                    update.password = crypto
                    update.save()
                except Exception as e:
                    sendTelegram(message).send()
                    return_info['result'] = False
                    return_info['info'] = "密码修改成功,但是密码存入失败:" + str(e)
                    message['text'] = "@arno\r\n" + return_info['info']
                    sendTelegram(message).send()
                    request.websocket.send(json.dumps(return_info))
                    continue

                request.websocket.send(json.dumps(return_info))
            ### close websocket ###
            request.websocket.close()

    else:
        return HttpResponseForbidden('nothing!')
Пример #24
0
    def receive(self, text=None, bytes=None, **kwargs):
        """
        Called when a message is received with either text or bytes
        filled out.
        """
        #self.close()

        self.clientip = '127.0.0.1'
        self.username = self.message.user.username
        try:
            self.role = self.message.user.userprofile.role
        except:
            self.role = 'none'

        data = json.loads(self.message['text'])
        step = 0

        for record in data['records']:
            step += 1
            return_info = {}
            return_info['record'] = record
            return_info['step'] = step
            return_info['info'] = ""
            return_info['permission'] = True
            return_info['result'] = True

            #判断是否有权限
            if not HasServerPermission(self.message, record, "change"):
                return_info['permission'] = False
                return_info['result'] = False
                self.message.reply_channel.send(
                    {'text': json.dumps(return_info)})
                ### close websocket ###
                self.close()
                break

            #修改密码
            cmd = 'echo "%s" |passwd root --stdin' % data['password'].replace(
                '`', '\`')  # `这个符号在Linux命令行有特殊含义,需要转义
            result = Command(record['minion_id'], 'cmd.run', cmd,
                             'glob').CmdRun()[record['minion_id']]

            if 'all authentication tokens updated successfully' not in result:
                return_info['result'] = False
                return_info['info'] = result
                self.message.reply_channel.send(
                    {'text': json.dumps(return_info)})
                continue

            #密码加密并存放
            crypto, status = encryptPasswd(data['password'], record)
            if not status:
                return_info['result'] = False
                return_info['info'] = "密码修改成功,但是密码加密失败:" + result
                message['text'] = "@arno\r\n" + return_info['info']
                sendTelegram(message).send()
                self.message.reply_channel.send(
                    {'text': json.dumps(return_info)})
                continue
            try:
                update = minion_t.objects.get(minion_id=record['minion_id'])
                update.password = crypto
                update.save()
            except Exception as e:
                sendTelegram(message).send()
                return_info['result'] = False
                return_info['info'] = "密码修改成功,但是密码存入失败:" + str(e)
                message['text'] = "@arno\r\n" + return_info['info']
                sendTelegram(message).send()
                self.message.reply_channel.send(
                    {'text': json.dumps(return_info)})
                continue

            self.message.reply_channel.send({'text': json.dumps(return_info)})
        self.close()
Пример #25
0
class CfApi(object):
    def __init__(self, url, email, key):
        self.__url = url.rstrip('/')
        self.__email = email
        self.__key = key
        self.__headers = {
            'X-Auth-Email': self.__email,
            'X-Auth-Key': self.__key,
            'Content-Type': 'application/json'
        }

    def GetDnsLists(self,
                    page=1,
                    status='active',
                    match='all',
                    order='name',
                    direction='asc'):
        url = self.__url + '?per_page=50&page=%s&status=%s&match=%s&order=%s&direction=%s' % (
            page, status, match, order, direction)
        try:
            ret = requests.get(url, headers=self.__headers, verify=False)
            return ret.json()
        except Exception as e:
            logger.error("获取CF dns列表失败: %s" % str(e))
            return {u'result': [str(e)], u'success': False}

    def GetZoneId(self, zone):
        url = self.__url + '?name=%s' % (zone)
        try:
            ret = requests.get(url, headers=self.__headers, verify=False)
            zone_id = ret.json()['result'][0]['id']
            #logger.info(ret.json())
            return {u'zone_id': zone_id}
        except:
            return {u'zone_id': None}

    def GetDnsRecord(self, zone, record_name):
        self.__zone_id = self.GetZoneId(zone)['zone_id']
        self.__record_id = self.GetDnsRecordId(self.__zone_id, record_name)
        url = self.__url + '/%s/' % self.__zone_id + 'dns_records/%s' % self.__record_id
        #logger.info(url)
        try:
            ret = requests.get(url, headers=self.__headers, verify=False)
            return ret.json()
        except:
            return False

    def GetZoneRecords(self, zone_id):
        url = self.__url + '/%s/' % zone_id + 'dns_records?per_page=100'
        try:
            ret = requests.get(url, headers=self.__headers, verify=False)
            return ret.json()
        except:
            return {'result': []}

    def GetDnsRecordId(self, zone_id, record_name):
        self.__record_id = ''
        url = self.__url + '/%s/' % zone_id + 'dns_records?per_page=100&name=%s' % record_name
        try:
            ret = requests.get(url, headers=self.__headers, verify=False)
            #logger.info(ret.json())
            if len(ret.json()['result']) == 0:
                pass
            elif len(ret.json()['result']) == 1:
                self.__record_id = ret.json()['result'][0]['id']
            else:
                self.__record_id = 'id more than one'
        except:
            self.__record_id = 'bad arguments'

        return self.__record_id

    def CreateZoneRecord(self,
                         zone_id,
                         record_type,
                         record_name,
                         record_content,
                         proxied=False):
        '''
            新增解析记录,{'type':'A', 'name':'example.com', 'content': '127.0.0.1', 'proxied':false}
        '''
        datas = {
            'type': record_type,
            'name': record_name,
            'content': record_content,
            'proxied': proxied
        }
        result = {}

        url = self.__url + '/%s/' % zone_id + 'dns_records'

        self.__warning = "\r\n".join([
            '@arno',
            'Attention: CF域名解析新增失败,请检查:',
            'URL:  + %s' % url,
            #'%s : %s' %(secretid, secretkey)
        ])

        try:
            ret = requests.post(url,
                                data=json.dumps(datas),
                                headers=self.__headers,
                                verify=False)
            result = ret.json()

        except Exception, e:
            result = {'result': None, 'errors': str(e), 'success': False}

        if not result['success']:
            message['text'] = self.__warning + '\n' + str(result)
            logger.error(message['text'].replace('\r\n', '\n'))
            sendTelegram(message).send()

        return result