#!/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». Можете объяснить что не так?