Пример #1
0
    def howToConnectFtp(self, emailFrom):
        answer = ""
        cpanelUsersAccounts = getAccountsList()

        # Получаем список всех хостинг услуг по адресу контактной почты
        ListOfHostingServices = DomainbyApi.getListofHostingServices(emailFrom)

        if not len(ListOfHostingServices):
            return "Подробная информация по настройке FTP: https://domain.by/info-help/cpanel/#question_10"

        for hosting in ListOfHostingServices:

            domainName = hosting["DomainName"]

            if (cpanelUsersAccounts[domainName].email
                    not in hosting["AllEmails"]
                    or cpanelUsersAccounts[domainName].email != emailFrom):
                self.changeContactEmailInCpanel(emailFrom, domainName,
                                                cpanelUsersAccounts)
            else:
                self.botLog.debug(
                    'Контактная почта в панели хостинга совпадает с панелью доменов.'
                )

            answer += self.accessToFtp(domainName,
                                       cpanelUsersAccounts[domainName].server,
                                       hosting["ServiceStatus"])

        return answer
Пример #2
0
    def blockByEmail(self, message):
        cpanelUsersAccounts = getAccountsList()

        if (len(message.split(' ')) < 2):
            self.botLog.critical("[/blockmail] Email не указан.")
            self.sendMessageGroup("[/blockmail] Email не указан.")
            return

        _email = message.split(' ')[1]

        if (_email == "" or '@' not in _email):
            self.botLog.critical(
                "[/blockmail] Email не указан или указан неверно.")
            self.sendMessageGroup(
                "[/blockmail] Email не указан или указан неверно.")
            return

        _domain = _email.split('@')[1]
        _hosting = self.getServerbyEmail(_domain)

        if (_hosting is None):
            self.botLog.info("[/blockmail] Аккаунт хостинга не найден : %s" %
                             _email)
            self.sendMessageGroup(
                "[/blockmail] Аккаунт хостинга не найден : %s" % _email)
            return

        _username = cpanelApiClient[_hosting].call_v1(
            'domainuserdata', domain=_domain)['data']['userdata']['user']
        self.botLog.debug("[/blockmail] Имя пользователя: %s" % _username)

        _answer = (cpanelApiClient[_hosting].uapi('Email',
                                                  'suspend_login',
                                                  user=_username,
                                                  email=_email))
        _status = int(_answer['result']['status'])
        _message = _answer['result']['messages']

        if (_status == 1):
            self.botLog.info(
                "Возможность входа для почтового аккаунта: %s заблокирована. Аккаунт хостинга: %s. Сервер: %s"
                % (_email, _username, _hosting))
            self.sendMessageGroup(
                "Возможность входа для почтового аккаунта: %s заблокирована. Аккаунт хостинга: %s. Сервер: %s"
                % (_email, _username, _hosting))
            return

        self.botLog.critical("[/blockmail] Ошибка блокировки: %s %s" %
                             (_answer, _message))
        self.sendMessageGroup("[/blockmail] Ошибка блокировки: %s %s" (
            _answer, _message))
Пример #3
0
    def unSuspendOutgoingEmail(self, message):
        cpanelUsersAccounts = getAccountsList()

        if (len(message.split(' ')) < 2):
            self.botLog.critical("[/unSuspendOutgoingEmail] Email не указан.")
            self.sendMessageGroup("[/unSuspendOutgoingEmail] Email не указан.")
            return

        _email = message.split(' ')[1]

        if (_email == "" or '@' not in _email):
            self.botLog.critical(
                "[/unSuspendOutgoingEmail] Email указан неверно.")
            self.sendMessageGroup(
                "[/unSuspendOutgoingEmail] Email указан неверно.")
            return

        _domain = _email.split('@')[1]
        _hosting = self.getServerbyEmail(_domain)

        if (_hosting is None):
            self.botLog.info(
                "[/unSuspendOutgoingEmail] Аккаунт хостинга не найден : %s" %
                _email)
            self.sendMessageGroup(
                "[/unSuspendOutgoingEmail] Аккаунт хостинга не найден : %s" %
                _email)
            return

        _username = cpanelApiClient[_hosting].call_v1(
            'domainuserdata', domain=_domain)['data']['userdata']['user']
        self.botLog.debug("[/unSuspendOutgoingEmail] Имя пользователя: %s" %
                          _username)

        _answer = cpanelApiClient[_hosting].call_v1('unsuspend_outgoing_email',
                                                    user=_username)
        _status = int(_answer['metadata']['result'])

        if (_status == 1):
            self.botLog.info(
                "Возможность отправки почты для: %s разблокирована. Сервер: %s"
                % (_username, _hosting))
            self.sendMessageGroup(
                "Возможность отправки почты для: %s разблокирована. Сервер: %s"
                % (_username, _hosting))
            return

        self.botLog.critical(
            "[/unSuspendOutgoingEmail] Ошибка разблокировки: %s" % (_message))
        self.sendMessageGroup(
            "[/unSuspendOutgoingEmail] Ошибка разблокировки: %s" % (_message))
Пример #4
0
    def grantAccessToSsh(self, emailFrom):
        answer = ""
        cpanelUsersAccounts = getAccountsList()

        # Получаем список всех хостинг услуг по адресу контактной почты
        ListOfHostingServices = DomainbyApi.getListofHostingServices(emailFrom)

        if not len(ListOfHostingServices):
            return "На данный контактный адрес почты не найдено зарегистрированных услуг.\n Заявка должна быть оформлена с контактного адреса почты хостинга."

        for hostingService in ListOfHostingServices:
            try:
                domainName = hostingService["DomainName"]
                server = cpanelUsersAccounts[domainName].server
                username = cpanelUsersAccounts[domainName].username
                package = cpanelUsersAccounts[domainName].package

                if ("xS" in package):
                    answer = "Для аккаунта хостинга %s отсутствует возможность доступа по SSH:\n https://domain.by/info-help/hosting/#question_12 \n\n" % (
                        domainName)
                    continue

                # TODO CHECK IT
                if (cpanelUsersAccounts[domainName].email
                        not in hostingService["AllEmails"]
                        or cpanelUsersAccounts[domainName].email != emailFrom):
                    self.changeContactEmailInCpanel(emailFrom, domainName,
                                                    cpanelUsersAccounts)
                else:
                    self.botLog.debug(
                        'Контактная почта в панели хостинга совпадает с панелью доменов.'
                    )

                output = cpanelApiClient[server].call_v1('modifyacct',
                                                         user=username,
                                                         HASSHELL=1)
                answer += "Произведена активация ssh доступа для %s:\n" % (
                    domainName)
                self.botLog.debug(output)

                answer += self.accessToSsh(domainName, server, username,
                                           hostingService["ServiceStatus"])
            except KeyError:
                self.botLog.error(
                    "Аккаунт хостинга не обнаружен на серверах: %s" %
                    domainName)
                self.sendMessageGroup(
                    "Аккаунт хостинга не обнаружен на серверах: %s" %
                    domainName)

        return answer
Пример #5
0
    def getServerbyEmail(self, _domain):
        cpanelUsersAccounts = getAccountsList()

        self.botLog.info(
            "[getServerbyEmail] Производится поиск домена %s на хостинге..." %
            _domain)

        for key, capi in cpanelApiClient.items():
            _local = capi.call('domainuserdata', domain=_domain)
            _status = int(_local['result'][0]['status'])

            if (_status == 1):
                return key
        return None
Пример #6
0
    def managerParse(self, ticket):

        if (re.match(u'Смена\s{1,}(ТП)?(тарифного)?', ticket.subject)):
            try:
                _domain = (re.search(
                    '\s[a-zA-Z]{1,15}((-|\.)[a-zA-Z]{1,10})?((-|\.)[a-zA-Z]{1,10})?\.([a-zA-Z]{1,6})(\.|\s)',
                    ticket.message).group(0)
                           ).strip().lower().encode('idna').decode('utf-8')
                _package = re.search('на (xS|S|M|L|XXL|MAX)',
                                     ticket.message).group(0).split()[1]

                cpanelUsersAccounts = getAccountsList()
                hosting = cpanelUsersAccounts[_domain].server
                username = cpanelUsersAccounts[_domain].username

                answer = cpanelApiClient[hosting].call(
                    'changepackage', user=username, pkg=_package)['result'][0]
                status = int(answer['status'])
                message = answer['statusmsg']

                if (status == 1):
                    self.CheckHandlerLog.info(
                        "[managerParse][%s][%s] смена тарифного плана. " %
                        (ticket.ticket_id, _domain))
                    self.openbot.sendMessageMe(
                        "[managerParse][%s][%s] смена тарифного плана. " %
                        (ticket.ticket_id, _domain))
                    hdapi.postQuickReply(
                        ticket.ticket_id,
                        "[OpenContactBot] Тарифный план изменен на %s для домена: %s "
                        % (_package, _domain), HdTicketStatus.CLOSED,
                        self.openbot)
                    return True
                else:
                    self.CheckHandlerLog.critical(
                        "[managerParse][%s][%s] %s." %
                        (ticket.ticket_id, _domain, ticket.message))
                    self.openbot.sendMessageMe(
                        "[managerParse][%s][%s] %s. " %
                        (ticket.ticket_id, _domain, ticket.message))
            except Exception as inst:
                self.CheckHandlerLog.critical("[managerParse] %s" % type(inst))
                self.CheckHandlerLog.critical("[managerParse] %s" % inst.args)
        return False
Пример #7
0
    def restoreCpanelPassword(self, emailFrom):
        answer = ""
        cpanelUsersAccounts = getAccountsList()

        ListOfHostingServices = DomainbyApi.getListofHostingServices(emailFrom)

        if not len(ListOfHostingServices):
            return "На данный контактный адрес почты не найдено зарегистрированных услуг. Заявка на восстановление доступа должна быть отправлена с контактного адреса хостинга."

        suspended = False

        for hosting in ListOfHostingServices:
            domainName = hosting["DomainName"]

            if (cpanelUsersAccounts[domainName].email
                    not in hosting["AllEmails"]
                    or cpanelUsersAccounts[domainName].email != emailFrom):
                self.changeContactEmailInCpanel(emailFrom, domainName,
                                                cpanelUsersAccounts)
            else:
                self.botLog.debug(
                    'Контактная почта в панели хостинга совпадает с панелью доменов.'
                )

            if (hosting["ServiceStatus"] == ServiceStatusTypes.OK.name):
                answer += self.resetCpanelPasswordText(
                    domainName, cpanelUsersAccounts[domainName].server,
                    cpanelUsersAccounts[domainName].username,
                    cpanelUsersAccounts[domainName].email,
                    hosting["ServiceStatus"])
            else:
                suspended = True
                answer += self.HostingAccountSuspended(domainName)

        if (len(ListOfHostingServices) == 1
                and not suspended) or len(ListOfHostingServices) > 1:
            answer += self.additionalFtpInfo()

        return answer
Пример #8
0
    def parseDomainbyTask(self, ticket):
        if re.match(u'Ошибки при автоматическом запуске хостинга',
                    ticket.subject):
            try:
                if ('Время ожидания операции истекло' in ticket.message):
                    self.CheckHandlerLog.info("[Таймаут][{0}] Закрыт".format(
                        ticket.ticket_id))
                    self.openbot.sendMessageMe("[Таймаут][{0}] Закрыт".format(
                        ticket.ticket_id))
                elif ('Данного хостинга нету на сервере' in ticket.message):
                    self.CheckHandlerLog.info(
                        "[Таймаут][{0}] Хостинг отсутствует на сервере.".
                        format(ticket.ticket_id))
                    self.openbot.sendMessageMe(
                        "[Таймаут][{0}] Хостинг отсутствует на сервере.".
                        format(ticket.ticket_id))

                Datebase().setTicketClose(ticket.ticket_id)
                return True

            except Exception as inst:
                self.CheckHandlerLog.critical(
                    "[parseDomainbyTask][запуск хостинга] %s" % (inst))
                self.CheckHandlerLog.critical(sys.exc_info()[0])
                return False

        if re.match(
                u'Изменение тарифного плана виртуального хостинга для домена',
                ticket.subject
        ) or (re.search(
                u'\<td\>В ДМС изменен тарифный план виртуального хостинга для домена',
                ticket.message) is not None):
            try:
                domain = re.search(
                    u'Изменение тарифного плана виртуального хостинга для домена (.+?)</td>',
                    ticket.message).group(1).strip().lower().encode(
                        'idna').decode('utf-8')
                #prevPackage = re.search(u'с плана \"(.+?)" на план',ticket.message).group(1)
                afterPackage = re.search(u'на план \"(.+?)"\.<br',
                                         ticket.message).group(1)

                cpanelUsersAccounts = getAccountsList()
                hosting = cpanelUsersAccounts[domain].server
                username = cpanelUsersAccounts[domain].username

                answer = cpanelApiClient[hosting].call(
                    'changepackage', user=username,
                    pkg=afterPackage)['result'][0]
                status = int(answer['status'])
                message = answer['statusmsg']
                #self.CheckHandlerLog.info("[Package][%s] Сообщение: %s" %(domain , message))

                if (status == 1):
                    self.CheckHandlerLog.info(
                        "[Package][%s][%s] смена тарифного плана. " %
                        (ticket.ticket_id,
                         domain.encode('idna').decode('idna')))
                    self.openbot.sendMessageMe(
                        "[Package][%s][%s] смена тарифного плана. " %
                        (ticket.ticket_id,
                         domain.encode('idna').decode('idna')))
                    Datebase().setTicketClose(ticket.ticket_id)
                else:
                    self.CheckHandlerLog.critical(
                        "[Package][%s][%s] %s." %
                        (ticket.ticket_id,
                         domain.encode('idna').decode('idna'), ticket.message))
                    self.openbot.sendMessageMe(
                        "[Package][%s][%s] %s. " %
                        (ticket.ticket_id,
                         domain.encode('idna').decode('idna'), ticket.message))
                return True
            except Exception as inst:
                self.CheckHandlerLog.critical("[Package] %s" % (inst))
                self.CheckHandlerLog.critical(sys.exc_info()[0])
                return False
        else:
            self.CheckHandlerLog.critical(
                "[parseDomainbyTask][%s] Заявка не классифицирована." %
                (ticket.ticket_id))
            self.openbot.sendMessageMe(
                "[parseDomainbyTask][%s] Заявка не классифицирована. " %
                (ticket.ticket_id))
            return False
Пример #9
0
    def handle(self, msg):
        self.botLog.debug(msg)

        content_type, chat_type, chat_id = telepot.glance(msg)
        id, username = msg['from']['id'], msg['from']['username']
        #combine = dict(list(activeTickets.items()) + list(activeRepTickets.items()))

        if (content_type, chat_type, chat_id, id, username) is None:
            self.botLog.critical("Сообщение не обработано.")
            return

        if (content_type != 'text'):
            self.send(username, chat_id, '',
                      '[NOT IMPLEMENTED] Данный контент не поддерживается.')
            return

        message = msg['text']

        if (self.checkAuth(id, username)):
            if (chat_type == 'private'):
                main_keyboard = [['Домены', 'Хостинг'], ['Другое', 'Выход']]
                sub_keyboard = [['Sub option #1_1', 'Sub option #1_2'],
                                ['Sub option #1_3', 'Sub option #1_4'],
                                ['Back to Main menu']]

                if message == '/start':
                    self.sendMessage(chat_id,
                                     '.',
                                     reply_markup={
                                         'keyboard': main_keyboard,
                                         'resize_keyboard': True
                                     })
                elif message in [j for i in main_keyboard for j in i]:

                    if message == 'Домены':
                        sub_buttons = {'keyboard': sub_keyboard}
                        self.sendMessage(chat_id,
                                         '.',
                                         reply_markup=sub_buttons)
                    elif message == 'Выход':
                        self.sendMessage(
                            chat_id,
                            ".",
                            reply_markup={'remove_keyboard': True})

                elif message in [j for i in sub_keyboard for j in i]:
                    # an option from Sub keyboard is chosen:
                    if message == 'Sub option #1_1':
                        self.sendMessage(chat_id, 'Sub selected %s' % message)
                    if message == 'Back to Main menu':
                        self.sendMessage(
                            chat_id,
                            'Main options',
                            reply_markup={'keyboard': main_keyboard})
                else:
                    self.sendMessage(
                        chat_id,
                        'Invalid Message. please select an option from keyboard'
                    )
            elif (chat_type == 'group'):

                # Replace double spaces and cleanup
                message = ' '.join(message.strip().split())

                if (message[0] == '/'):

                    if (len(message.split(' ')) > 1):
                        checkCmd = message.split(' ')[0]
                    else:
                        checkCmd = message

                    self.botLog.warning("Получена комманда: %s" % checkCmd)

                    if (checkCmd == '/help'):
                        self.sendMessageGroup("""
/help     - Данное меню.
/update   - Проверка наличия обновлений.
/fupdate  - Принудительное обновление.
/version  - Отображает версию ядра.
/uptime   - Отображает время с момента запуска.
/exclude  - Добавляет или удаляет доменное имя в список исключений. (/exclude domain.by)
/cpreload - Принудительно загружает список аккаунтов из cpanel.
/bemail   - Блокировка авторизации для почтового аккаунта (/blockemail)
/unemail  - Разблокировка авторизации для почтового аккаунта (/unblockemail)
/restore  - Функция для тестирования ответа сервера (/restore email)
/smail    - Блокировка возможности отправки исходящей почты для аккаунта (/suspendemail email)
/unsmail  - Разблокировка возможности отправки исходящей почты для аккаунта (/unsuspendemail email)
/session  - Генерирует одноразовую ссылку для авторизации в cpanel пользователя (/session domain.by)

Следующие команды используются , как ответ(reply) на сообщение:

.move    - Перемещает заявку на менеджеров.

.restore - Генерирует ссылку для сброса пароля.

.spam    - Перемещает заявку в спам с блокировкой отправителя в hd.

.close   - Перемещает заявку в закрытые.

.exclude - Добавляет или удаляет доменное имя в список исключений. Пример: .exclude domain.by

.ssh     - Добавляет пользователю возможность подключения по ssh.

.ftp     - Предоставляет информацию по подключению к FTP.
""")
                        return
                    if (checkCmd == '/restore'):
                        subcommand = message.split()[1]
                        self.sendMessageGroup(
                            '[/restore]%s' %
                            (self.restoreCpanelPassword(subcommand)))
                        return
                    if (checkCmd == '/ssh'):
                        subcommand = message.split()[1]
                        self.sendMessageGroup(
                            '[/ssh]%s' % (self.grantAccessToSsh(subcommand)))
                        return
                    if (checkCmd == '/update'):
                        self.sendMessageGroup(
                            "Проводим проверку наличия обновлений...")
                        Util.checkUpdate(self.botLog, self)
                        return
                    if (checkCmd == '/fupdate'):
                        self.sendMessageGroup(
                            "Производим принудительное обновление...")
                        Util.checkUpdate(self.botLog, self, True)
                        return
                    if (checkCmd == '/version'):
                        self.sendMessageGroup(
                            'Текущая версия: %s \nВерсия на сервере: %s' %
                            (Util.getCurrentVersion(),
                             Util.getVersionAtServer()))
                        return
                    if (checkCmd == '/uptime'):
                        self.sendMessageGroup('Время работы: %s' %
                                              (Util.getUpime()))
                        return
                    if (checkCmd == '/cpreload'):
                        self.sendMessageGroup(
                            'Принудительная загрузка хостинг аккаунтов.')
                        loadDataFromServers(True)
                        self.sendMessageGroup(
                            "...Завершено.Найдено %s аккаунтов." %
                            (len(getAccountsList())))
                        self.botLog.info("...Загружено %s аккаунтов." %
                                         (len(getAccountsList())))
                        return
                    if (checkCmd == '/exclude'):

                        if (len(message.split(' ')) > 1):
                            subcommand = message.split(' ')[1]
                        else:
                            self.botLog.critical(
                                "[/exclude] Имя домена не указано.")
                            self.sendMessageGroup(
                                "Имя домена не указано. Cписок исключений: %s"
                                % (",".join(Config.getExcludeDomainList())))
                            return

                        tempExcludeList = Config.getExcludeDomainList()

                        if (subcommand in tempExcludeList):
                            tempExcludeList.remove(subcommand)
                        else:
                            tempExcludeList.append(subcommand)

                        Config.setConfigValue('exclude', 'create',
                                              ",".join(tempExcludeList))
                        Config.saveConfig()

                        self.sendMessageGroup(
                            "[.exclude] Сохранен список исключений: %s" %
                            (",".join(tempExcludeList)))
                        return
                    if (checkCmd in ['/bemail', '/blockemail']):
                        self.blockByEmail(message)
                        return
                    if (checkCmd in ['/unemail', '/unblockemail']):
                        self.unBlockEmail(message)
                        return
                    if (checkCmd in ['/smail', '/suspendemail']):
                        self.suspendOutgoingEmail(message)
                        return
                    if (checkCmd in ['/unsmail', 'unsuspendemail']):
                        self.unSuspendOutgoingEmail(message)
                        return
                    if (checkCmd == '/session'):

                        if (len(message.split(' ')) > 1):
                            subcommand = message.split(' ')[1]
                        else:
                            self.botLog.critical(
                                "[/session] Имя домена не указано.")
                            self.sendMessageGroup("Имя домена не указано.")
                            return

                        try:
                            answer = getDataFromApi(
                                '/api/session/{0}'.format(subcommand))

                            _str = ""

                            for server in answer:
                                _str += "".join(
                                    "[{0}] \n Cсылка: {1} \n\n".format(
                                        server, answer[server]['url']))

                            self.sendMessageGroup(_str)

                        except Exception as exc:
                            self.botLog.critical(
                                "[/session] Во время выполнения возникло исключение: %s"
                                % repr(exc))
                            self.sendMessageGroup(
                                "[/session] Во время выполнения возникло исключение: %s"
                                % repr(exc))

                        return

                    self.botLog.critical(
                        "[command] Команда не обработана: %s" % checkCmd)
                    self.sendMessageGroup(
                        "[command] Команда не обработана: %s" % checkCmd)

                    return
                try:
                    #Implement accept reply to ticket message
                    if msg['reply_to_message'] is not None:

                        #The don`t ticket`s reply
                        if (re.search('\[(Ticket|Reply)]\[(.+?)]',
                                      msg['reply_to_message']['text']) is
                                None):
                            self.botLog.error(
                                "[handle][NOT_ERROR] Не удалось извлечь идентификатор заявки.\n"
                            )
                            return

                        ticket_id = re.search(
                            '\[(Ticket|Reply)]\[(.+?)]',
                            msg['reply_to_message']['text']).group(2)
                        original_message_id = (
                            GroupId, msg['reply_to_message']['message_id'])
                        ticket_email = Datebase().getEmailByTicketId(ticket_id)

                        if (message[0] == '.'):
                            command = message.split(' ')[0]

                            self.botLog.warning("Получена комманда: %s" %
                                                command)

                            if (command == '.restore'):
                                try:
                                    reset_answer = self.restoreCpanelPassword(
                                        ticket_email)
                                    trueAnswer = [
                                        'не найдено зарегистрированных услуг',
                                        'Сбросить пароль вы можете по ссылке'
                                    ]

                                    self.botLog.warning(reset_answer)

                                    if any(x in reset_answer
                                           for x in trueAnswer):
                                        hdapi.postQuickReply(
                                            ticket_id, reset_answer,
                                            HdTicketStatus.CLOSED, self)
                                    else:
                                        self.sendMessageGroup(reset_answer)

                                except Exception as exc:
                                    self.botLog.critical(
                                        "[.restore] Во время выполнения возникло исключение: %s"
                                        % repr(exc))
                                    self.sendMessageGroup(
                                        "[.restore] Во время выполнения возникло исключение: %s"
                                        % repr(exc))
                                return

                            if (command == '.move'):
                                try:
                                    dept_id = dept.DOMAIN
                                    Datebase().moveTicketTo(
                                        dept_id.value, ticket_id)
                                    self.deleteMessage(original_message_id)
                                    self.botLog.critical(
                                        "[.move] Заявка %s перемещена в отдел: %s"
                                        % (ticket_id, dept_id.name))
                                    self.sendMessageGroup(
                                        "[.move] Заявка %s перемещена в отдел: %s"
                                        % (ticket_id, dept_id.name))
                                except Exception as exc:
                                    self.botLog.critical(
                                        "[.move] Во время выполнения возникло исключение: %s"
                                        % repr(exc))
                                return

                            if (command == '.spam'):
                                spam_email = ticket_email

                                Datebase().setSpamEmail(spam_email)
                                Datebase().setTicketSpam(ticket_id)
                                self.deleteMessage(original_message_id)
                                return

                            if (command == '.ssh'):
                                try:
                                    reset_answer = self.grantAccessToSsh(
                                        ticket_email)
                                    trueAnswer = [
                                        'не найдено зарегистрированных услуг',
                                        'как в панели управления хостингом',
                                        'отсутствует возможность доступа',
                                    ]

                                    self.botLog.warning(reset_answer)

                                    if any(x in reset_answer
                                           for x in trueAnswer):
                                        hdapi.postQuickReply(
                                            ticket_id, reset_answer,
                                            HdTicketStatus.CLOSED, self)
                                    else:
                                        self.sendMessageGroup(reset_answer)
                                except Exception as exc:
                                    self.botLog.critical(
                                        "[.ssh] Во время выполнения возникло исключение: %s"
                                        % repr(exc))
                                    self.sendMessageGroup(
                                        "[.ssh] Во время выполнения возникло исключение: %s"
                                        % repr(exc))
                                return

                            if (command == '.ftp'):
                                try:
                                    reset_answer = self.howToConnectFtp(
                                        ticket_email)
                                    trueAnswer = [
                                        'Подробная информация по настройке FTP',
                                        'как и для доступа в cPanel'
                                    ]

                                    self.botLog.warning(reset_answer)

                                    if any(x in reset_answer
                                           for x in trueAnswer):
                                        hdapi.postQuickReply(
                                            ticket_id, reset_answer,
                                            HdTicketStatus.CLOSED, self)
                                    else:
                                        self.sendMessageGroup(reset_answer)
                                except Exception as exc:
                                    self.botLog.critical(
                                        "[.ftp] Во время выполнения возникло исключение: %s"
                                        % repr(exc))
                                    self.sendMessageGroup(
                                        "[.ftp] Во время выполнения возникло исключение: %s"
                                        % repr(exc))
                                return

                            if (command == '.close'):
                                Datebase().setTicketClose(ticket_id)
                                self.deleteMessage(original_message_id)
                                return

                            if (command == '.exclude'):
                                subcommand = message.split(' ')[1]

                                if (subcommand is None or subcommand == ""):
                                    self.botLog.critical(
                                        "[.exclude] Имя домена не указано.")
                                    return

                                tempExcludeList = Config.getExcludeDomainList()

                                if (subcommand in tempExcludeList):
                                    self.deleteMessage(original_message_id)
                                    tempExcludeList.remove(subcommand)
                                else:
                                    tempExcludeList.append(subcommand)

                                Config.setConfigValue(
                                    'exclude', 'create',
                                    ",".join(tempExcludeList))
                                Config.saveConfig()

                                Datebase().setTicketClose(ticket_id)
                                self.deleteMessage(original_message_id)

                                self.sendMessageGroup(
                                    "[.exclude] Сохранен список исключений: %s"
                                    % (",".join(tempExcludeList)))
                                return

                            self.botLog.critical(
                                "[command] Команда не обработана: %s" %
                                command)
                            self.sendMessageGroup(
                                "[command] Команда не обработана: %s" %
                                command)
                            return

                        hdapi.postQuickReply(ticket_id, msg['text'],
                                             HdTicketStatus.OPEN, self)

                except Exception as exc:
                    self.botLog.debug("[Exception][handle] %s" % repr(exc))
                    self.sendMessageMe("[Exception][handle] %s" % repr(exc))
                    pass
        else:
            self.send(username, chat_id, message,
                      'Вы не авторизованы ¯\_(ツ)_/¯')
Пример #10
0
    def checkBlockError(self, browser):
        exclude_list = cfg.getExcludeDomainList()

        soup = BeautifulSoup(browser.response.text, "html.parser")

        haveValue = True
        i = 1

        temp = []
        while (haveValue):
            try:
                domain = soup.find(
                    id=
                    "ctl00_contentHolder_TaskList_ucStop_rptServiceList_ctl0%s_lblDomain"
                    % i).text.replace('www.', '')
                status = soup.find(
                    id=
                    "ctl00_contentHolder_TaskList_ucStop_rptServiceList_ctl0%s_lblCpanelError"
                    % i).text
                url_block = "https://domain.by/BackEnd/Support/" + soup.find(
                    id=
                    "ctl00_contentHolder_TaskList_ucStop_rptServiceList_ctl0%s_hlAction"
                    % i).get('href')

                if (status != "Ошибка"):
                    i += 1
                    continue

                if (re.search('[а-яА-Я]', domain)):
                    domain = domain.encode("idna").decode("utf-8")

                if (domain not in listBlockHosting):
                    self.dLog.info(
                        "[Domain.by] Обнаружена ошибка блокировки: %s" %
                        domain.encode("utf-8").decode("idna"))
                    self.openbot.sendMessageGroup(
                        "[Domain.by] Обнаружена ошибка блокировки: %s" %
                        domain.encode("utf-8").decode("idna"))
                    listBlockHosting.append(domain)

                    if (len(listBlockHosting) > 0):
                        save_obj(listBlockHosting, 'listBlockHosting')

                    if (domain in exclude_list):
                        self.dLog.info(
                            "[Domain.by] [Ошибка блокировки] %s в списке исключений."
                            % domain.encode("utf-8").decode("idna"))
                        self.openbot.sendMessageGroup(
                            "[Domain.by] [Ошибка блокировки]  %s в списке исключений."
                            % domain.encode("utf-8").decode("idna"))
                        i += 1
                        continue

                    browser.open(url_block)

                    hosting = getAccountsList()[domain].server
                    self.dLog.info(
                        "[Domain.by] [Ошибка блокировки] Расположен на сервере: %s"
                        % hosting)

                    dataToPost = self._get_form_post_data(browser)
                    dataToPost[
                        "ctl00$contentHolder$HostingServersList$HostingServers"] = hostingServerDmsList[
                            hosting]
                    dataToPost["ctl00$contentHolder$cbCpanelSynchro"] = "on"
                    dataToPost["ctl00$contentHolder$btnStop"] = "Блокировать"

                    browser.open(url_block, method='post', data=dataToPost)

                    self.dLog.info(
                        'Для доменного имени %s необходимо произвести смену хостинг сервера на %s'
                        % (domain.encode("utf-8").decode("idna"), hosting))
                    self.openbot.sendMessageMe(
                        "[Domain.by] [Ошибка блокировки]  Для доменного имени %s необходимо произвести смену хостинг сервера на %s."
                        % domain.encode("utf-8").decode("idna"), hosting)

                i += 1

            except KeyError as inst:
                i += 1
                self.dLog.critical(
                    "[checkBlockError] %s не найден на хостинге." % domain)
                self.openbot.sendMessageGroup(
                    "[checkBlockError] %s не найден на хостинге." % domain)
                pass
            except RuntimeError as inst:
                self.dLog.critical("[checkBlockError] %s" % inst)
                self.openbot.sendMessageGroup(
                    "[Domain.by][checkBlockError][RuntimeError]: %s" % (inst))
            except Exception as inst:
                haveValue = False