LINUX.ORG.RU

Не передаются параметры в cmd

 


0

1
#!/bin/env python3
import CloudFlare
import configparser
import cmd


# noinspection PyUnusedLocal
class CfToolShell(cmd.Cmd):
    config = configparser.ConfigParser()
    config.read('config.ini', 'UTF-8')
    doc_header = "Эта утилита предназначена для смены DNS записей в cloudflare при переезде. Использовать с особой " \
                 "осторожностью. help <topic> для информации по каждой команде. "
    prompt = "[cf-tool]: "
    cf = CloudFlare.CloudFlare(email=config['cloudflare']['email'], token=config['cloudflare']['token'])

    def do_get_zones(self, arg):
        """Выводит список зон для текущего аккаунта"""
        zones = self.cf.zones.get()
        print(f'Обнаружены следующие зоны в аккаунте {self.config["cloudflare"]["email"]}: ')
        for zone in zones:
            zone_id = zone['id']
            zone_name = zone['name']
            print(zone_id, zone_name)

    def do_get_zone_records(self, zone_id=""):
        """Выводит список dns записей в зоне"""
        try:
            records = self.cf.zones.dns_records.get(zone_id)
            for record in records:
                ip = record['content']
                rtype = record['type']
                name = record['name']
                print(name, rtype, ip)
        except CloudFlare.exceptions.CloudFlareAPIError:
            print("Переданы неверные параметры")

    def do_update_zone_records(self, zone_id, old_ip, new_ip):
        """Заменяет старые dns записи на новые. Работает только для записей типа А. Необходимо передать зону,
        старый IP, новый IP """
        try:
            records = self.cf.zones.dns_records.get(zone_id)
            for record in records:
                if record['content'] == old_ip and record['type'] == 'A':
                    print(f"IP для записи {record['name']} будет заменён на {record['content']}")
                    records['content'] = new_ip
            for dns_record in records:
                r = self.cf.zones.dns_records.post(zone_id, data=dns_record)
        except CloudFlare.exceptions.CloudFlareAPIError as e:
            print(f"Произошла ошибка: {e}")


if __name__ == '__main__':
    try:
        CfToolShell().cmdloop()
    except (KeyboardInterrupt, EOFError):
        print('\nBye!')

Пытаюсь пачкой поменять айпишники в cloudflare. Но по непонятной причине в cmd теряются аргументы. Выдаёт

Traceback (most recent call last):
  File "/home/u0000/PycharmProjects/cf-tool/cf-tool.py", line 55, in <module>
    CfToolShell().cmdloop()
  File "/usr/lib/python3.8/cmd.py", line 138, in cmdloop
    stop = self.onecmd(line)
  File "/usr/lib/python3.8/cmd.py", line 217, in onecmd
    return func(arg)
TypeError: do_update_zone_records() missing 2 required positional arguments: 'old_ip' and 'new_ip'

А где теряются эти агруметы? Я же их передал. Что не так? А вот если в метод эти аргументы как do_update_zone_records(self, zone_id='', old_ip='', new_ip=''), то всё срабатывает. Но тогда апишка cloudflare отвечает что «No route for that URI». Можете объяснить что не так?


Ответ на: комментарий от Morin

При запуске скрипта появляется шелл. Если туда отправить «[cf-tool]: update_zone_records 127.0.0.1 127.0.0.2», то программа отваливается.

u0000
() автор топика

Repeatedly issue a prompt, accept input, parse an initial prefix off the received input, and dispatch to action methods, passing them the remainder of the line as argument.

Он весь остаток строки запихивает в первый аргумент метода.

deadNightTiger ★★★★★
()
Ответ на: комментарий от u0000

Ну все… тогда придется идти в дворники…

anonymous
()
Ответ на: комментарий от deadNightTiger

Да, и правда. А как переопределить это поведение? Слышал про декораторы, но так и не понял как оно работает.

u0000
() автор топика
Ответ на: комментарий от u0000

Можешь принять эту строку и разделить ее на аргументы самостоятельно, используя shlex.split() или просто метод split() у строки.

deadNightTiger ★★★★★
()
Ответ на: комментарий от deadNightTiger

Я нахерачил дополнительно инпутов. Но так или иначе, это сработало. Спасибо.

u0000
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.