Уведомления

Группа в Telegram: @pythonsu

#1 Май 11, 2017 20:46:29

VoisHunter
Зарегистрирован: 2017-05-11
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, как сделать парсер из файла

Есть скрипт, он делает бек-ап на Микротике и льет на FTP, но хостов много и могут меняться, и каждый раз править или вписывать 200 хостов как то не хочется, как дописать парсер который берет поочередно ip ? Сам скрипт ниже

# versioning
Version = datetime.date.today()
#print "\n" + str(Version)
# hosts array IP1
hosts = ( "1.2.3.4", )
# username
users = ( "login",)
iterUser = iter(users)
# userpassword
passwords = ( "pass", )
iterPassword = iter(passwords)
# FTPD IP
FtpdIP = "5.6.7.8"
# ftp user account
ftpUser = "login"
ftpPass = "pass"
# keep backups for 4 weeks
backtime = datetime.timedelta(weeks=-4)
sshCli = SSHClient()
sshCli.set_missing_host_key_policy(AutoAddPolicy())
print "header done"
# loop host adresses
for host in hosts:
print "\n" + str(host)
# iterate through user-password pairs
user = iterUser.next()
Password = iterPassword.next()
# define operations
CreateLocalBckp = "system backup save name=" + str(host) + "_" + str(Version) + ".backup"
UploadToFtp = "tool fetch address=" + str(FtpdIP) + " mode=ftp dst-path=" + str(host) + "_" + str(Version) + ".backup src-path=" + str(host) + "_" + str(Version)+ ".backup" + " user=" + str(ftpUser) + " password=" + str(ftpPass) + " upload=yes"
RemoveLocalBckp = 'file remove "' + str(host) + "_" + str(Version) + ".backup" + '"'
# try for not to fail the whole script on one error
try:
print "connecting.." + str(host) + "@" + str(user) + ":" + str(Password)
sshCli.connect(str(host), port=22, username=str(user), password=str(Password))
print "connected.."
# creating local backup
print "creating local backup.. /" + CreateLocalBckp
sshCli.exec_command(CreateLocalBckp)
# sleep after each command because mikrotik can not do it so fast as script executes
time.sleep(2)
print "local backup created.."
# uloading local backup to ftp
print "uploading local backup to ftp.. /" + UploadToFtp
sshCli.exec_command(UploadToFtp)
time.sleep(2)
print "backup uploaded to remote location.."
# removing local backup
time.sleep(2)
print "removing local backup.. /" + RemoveLocalBckp
sshCli.exec_command(RemoveLocalBckp)
time.sleep(2)
print "local backup removed.."
sshCli.close()
# try delete old file (if exists)
try:
os.remove("/tftp/" + str(host) + "_" + str(Version + backtime) +".cfg")
except:
print "Error while trying to delete old backup " + "/tftp/" + str(host) + "_" + str(Version + backtime) +".cfg"
except:
print "Error connecting to host", host

Офлайн

#2 Май 12, 2017 02:27:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10001
Репутация: +  857  -
Профиль   Отправить e-mail  

Подскажите, как сделать парсер из файла

VoisHunter
как дописать парсер который берет поочередно ip ?
Надо на функциях всё делать.
Вот это “брал поочерёдно ip” - это называется параметризация. Параметризация кода - это когда можешь менять ip, с которыми работаешь, когда можешь менять место, откуда берутся ip. Функции позволяют параметризировать код. У тебя же код не параметризован, поэтому подать ему другие адреса ты не можешь, для этого тебе надо менять сам код.

Если хочешь написать хороший код, то надо сначала всё разделить в задаче. Список ip должна получать одна функция, подключаться к ftp-серверу должна другая функция, данные для авторизации на ftp-сервере должна получать третья функция. Все эти функции друг про друга не должны знать, у них только есть параметры и возвращаемые значения, через которые они могут что-то принимать снаружи и возвращаться наружу.

Пример на псевдокоде отправки архива на ftp-сервер
servername = 'ftp.host.com'
port = 21
authfile = 'secret.dat'
backupdir = '/home/user/backup'
destination_directory = '/backups'

login, password = get_auth_info(authfile)
connection = ftp_server_connect(servername, port, login, password)

archive = get_backup_archive(backupdir)
connetion_send(connection, archive, destination_directory)
Например, функция get_auth_info() не знает, для кого она добывает имя и пароль, для ftp-сервера, для ssh-сервера или для mysql-сервера. Функция ftp_server_connect() не знает, как будет использоваться соединение, которая она возвращает, будет ли туда что-то посылаться или, наоборот, скачиваться оттуда. Функция get_backup_archive() только добывает архивный файл и не знает, зачем его запросили и что с ним будут делать. Функция connetion_send() не знает, что это за соединение, с ftp-сервером или с imap-сервером, и не знает, что файл, который она передаёт, является архивным, а не присланным по почте или взятым с диска.

Вот когда дойдёшь до всего этого, когда коды станут такими, тогда и сможешь их чуть-чуть менять там под что-либо (и то, если потребуется). А пока у тебя всё скопом, тебе всё придётся только заново писать, иначе ты и новое не напишешь, и то, что написал, тоже сломаешь.



Офлайн

#3 Май 12, 2017 09:37:09

VoisHunter
Зарегистрирован: 2017-05-11
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, как сделать парсер из файла

Спасибо! Уже разобрался, и спасибо за пояснение )

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version