Skip to content

Commit c49723a

Browse files
authored
Merge pull request #2 from Egor-oop/backup-optimization
Backup optimization
2 parents 497c7f1 + 7c50a26 commit c49723a

File tree

10 files changed

+57
-141
lines changed

10 files changed

+57
-141
lines changed

router_move/backup.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import socket
2-
from router_move.backup_mikrotik import backup_mikrotik
3-
from router_move.backup_eltex import backup_eltex
4-
from router_move.backup_cisco import backup_cisco
2+
from backup_mikrotik import backup_mikrotik
3+
from backup_eltex import backup_eltex
4+
from backup_cisco import backup_cisco
55
import sys
66

77

88
def run_backup(directory: str) -> None:
9-
paths = sys.path
109
try:
1110
backup_mikrotik(directory)
1211
backup_eltex(directory)
@@ -16,4 +15,7 @@ def run_backup(directory: str) -> None:
1615

1716

1817
if __name__ == '__main__':
19-
run_backup('/Users/egorgulido/Desktop')
18+
try:
19+
run_backup(sys.argv[1])
20+
except IndexError:
21+
print('Please, provide a path to a directory to make backups')

router_move/backup_cisco.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,33 @@
22
import telnetlib
33
import datetime
44
import os
5-
from router_move.fetch_devices import fetch_devices
5+
from fetch_devices import fetch_devices
66

77

88
def backup_cisco(directory: str) -> None:
99
devices = fetch_devices('cisco')
10-
1110
day = str(datetime.date.today())
1211
path = f'{directory}/{day}/cisco'
1312
if not os.path.isdir(path):
1413
os.makedirs(path)
1514

16-
os.chdir(path)
17-
1815
for device in devices:
1916
try:
20-
tn = telnetlib.Telnet(device.ip)
17+
tn = telnetlib.Telnet(device[2])
2118
tn.read_until(b"ame:")
22-
tn.write(device.user_name.encode("ascii") + b"\n")
19+
tn.write(device[3].encode("ascii") + b"\n")
2320
tn.read_until(b"Password:")
24-
tn.write(device.user_password.encode("ascii") + b"\n")
21+
tn.write(device[4].encode("ascii") + b"\n")
2522
tn.write(b"terminal length 0\n")
2623
tn.write(b"sh run\n")
2724
tn.write(b"exit\n")
2825
output = tn.read_until(b'\nend')
2926
output = output.decode("ascii")
3027
output = output.splitlines()
3128

32-
filename = f'{device.name}_backup.rsc'
29+
filename = f'{path}/{device[1]}_backup.rsc'
3330
if os.path.isfile(filename):
34-
filename = f'{device.name}_{secrets.token_urlsafe(6)}_backup.rsc'
31+
filename = f'{path}/{device[1]}_{secrets.token_urlsafe(6)}_backup.rsc'
3532

3633
fp = open(filename, "w")
3734
fp.write('\n'.join(output[5:]))

router_move/backup_eltex.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,23 @@
22
import telnetlib
33
import datetime
44
import os
5-
from router_move.fetch_devices import fetch_devices
5+
from fetch_devices import fetch_devices
66

77

88
def backup_eltex(directory: str) -> None:
99
devices = fetch_devices('eltex')
10-
1110
day = str(datetime.date.today())
1211
path = f'{directory}/{day}/eltex'
1312
if not os.path.isdir(path):
1413
os.makedirs(path)
1514

16-
os.chdir(path)
17-
1815
for device in devices:
1916
try:
20-
tn = telnetlib.Telnet(device.ip)
17+
tn = telnetlib.Telnet(device[2])
2118
tn.read_until(b"ame:")
22-
tn.write(device.user_name.encode("ascii") + b"\n")
19+
tn.write(device[3].encode("ascii") + b"\n")
2320
tn.read_until(b"Password:")
24-
tn.write(device.user_password.encode("ascii") + b"\n")
21+
tn.write(device[4].encode("ascii") + b"\n")
2522
tn.read_until(b'#')
2623
tn.write(b'terminal datadump\n')
2724
tn.read_until(b'#')
@@ -31,9 +28,9 @@ def backup_eltex(directory: str) -> None:
3128
output = output.decode("ascii")
3229

3330
output = output[:-4]
34-
filename = f'{device.name}_backup.rsc'
31+
filename = f'{path}/{device[1]}_backup.rsc'
3532
if os.path.isfile(filename):
36-
filename = f'{device.name}_{secrets.token_urlsafe(6)}_backup.rsc'
33+
filename = f'{path}/{device[1]}_{secrets.token_urlsafe(6)}_backup.rsc'
3734

3835
fp = open(filename, "w")
3936
fp.write(output)

router_move/backup_mikrotik.py

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,35 @@
1-
from router_move import libapi
2-
from router_move.fetch_devices import fetch_devices
1+
import libapi
2+
from fetch_devices import fetch_devices
33
import ftplib
44
import os
55
import datetime
66
import secrets
7-
# from app import Device
87

98

109
def backup_mikrotik(directory: str) -> None:
1110
devices = fetch_devices('mikrotik')
11+
12+
day = str(datetime.date.today())
13+
14+
path = f'{directory}/{day}/mikrotik'
15+
16+
if not os.path.isdir(path):
17+
os.makedirs(path)
18+
1219
for device in devices:
13-
print("Connect to {}:".format(device.ip))
14-
filename = f'{device.name}_backup.rsc'
20+
print("Connect to {}:".format(device[2]))
21+
filename = f'{device[1]}_backup.rsc'
1522

1623
# Создание сокета и объекта устройства
1724
try:
18-
s = libapi.socketOpen(device.ip)
25+
s = libapi.socketOpen(device[2])
1926
except Exception as e:
2027
continue
2128
dev_api = libapi.ApiRos(s)
2229

2330
# Авторизация на устройстве
2431
try:
25-
if not dev_api.login(device.user_name, device.user_password):
32+
if not dev_api.login(device[3], device[4]):
2633
break
2734
except Exception as e:
2835
continue
@@ -38,48 +45,40 @@ def backup_mikrotik(directory: str) -> None:
3845
# Закрытие сокета
3946
libapi.socketClose(s)
4047

41-
day = str(datetime.date.today())
42-
43-
path = f'{directory}/{day}/mikrotik'
44-
45-
if not os.path.isdir(path):
46-
os.makedirs(path)
47-
48-
os.chdir(path)
4948
filename_pattern = '{}_backup.rsc'
5049
for device in devices:
51-
print("Connect to {}:".format(device.ip))
52-
filename = filename_pattern.format(device.name)
50+
print("Connect to {}:".format(device[2]))
51+
filename = filename_pattern.format(device[1])
5352

5453
try:
55-
with ftplib.FTP(device.ip, device.user_name, device.user_password) as con:
56-
if os.path.isfile(filename):
57-
filename = f'{device.name}_{secrets.token_urlsafe(6)}_backup.rsc'
58-
with open(filename, "wb") as f:
59-
con.retrbinary('RETR ' + filename_pattern.format(device.name), f.write)
54+
with ftplib.FTP(device[2], device[3], device[4]) as con:
55+
if os.path.isfile(f'{path}/{filename}'):
56+
filename = f'{device[1]}_{secrets.token_urlsafe(6)}_backup.rsc'
57+
with open(f'{path}/{filename}', "wb") as f:
58+
con.retrbinary('RETR ' + filename_pattern.format(device[1]), f.write)
6059
print(" File transfer: done")
6160
except Exception as e:
6261
continue
6362

6463
for device in devices:
65-
print("Connect to {}:".format(device.ip))
64+
print("Connect to {}:".format(device[2],))
6665

6766
# Создание сокета и объекта устройства
6867
try:
69-
s = libapi.socketOpen(device.ip)
68+
s = libapi.socketOpen(device[2],)
7069
except Exception as e:
7170
continue
7271
dev_api = libapi.ApiRos(s)
7372

7473
# Авторизация на устройстве
7574
try:
76-
if not dev_api.login(device.user_name, device.user_password):
75+
if not dev_api.login(device[3], device[4]):
7776
break
7877
except Exception as e:
7978
continue
8079

8180
# Команда для добавление bridge-интерфейса
82-
command = ["/file/remove", f"=numbers={device.name}_backup"]
81+
command = ["/file/remove", f"=numbers={device[1]}_backup"]
8382

8483
# Выполнение команды на устройстве
8584
dev_api.writeSentence(command)

router_move/create_folder.py

Lines changed: 0 additions & 12 deletions
This file was deleted.

router_move/fetch_devices.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
from router_move import app
2-
from router_move.models import Device
1+
import sqlite3
2+
import os
33

44

55
def fetch_devices(device_type: str) -> list:
6-
with app.app_context():
7-
return Device.query.filter_by(device_type=device_type).all()
6+
path = os.path.dirname(os.path.abspath(__file__))
7+
con = sqlite3.connect(f'{path}/database.db')
8+
cur = con.cursor()
9+
res = cur.execute(f"SELECT * FROM device WHERE device_type='{device_type}'")
10+
devices = res.fetchall()
11+
con.close()
12+
return devices

router_move/templates/authorization.html

Lines changed: 0 additions & 11 deletions
This file was deleted.

router_move/templates/base.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
<div class="tree-text">
1414
<a href="/devices">Devices</a></button><br>
1515
<a href="/backup">Backup</a></button><br>
16-
<a href="/statistic">Statistic</a></button>
1716
</div>
1817
</div>
1918
<div class="main">

router_move/templates/statistic.html

Lines changed: 0 additions & 28 deletions
This file was deleted.

router_move/views.py

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55

66
from crontab import CronTab
77

8-
from router_move.backup import run_backup
9-
108

119
@app.route('/', methods=['POST', 'GET'])
1210
@app.route('/devices', methods=['POST', 'GET'])
@@ -64,7 +62,7 @@ def backups():
6462
directory = BackupDirectory(request.form['directory'])
6563
db.session.add(directory)
6664
db.session.commit()
67-
run_backup(directory.path)
65+
os.system(f'/usr/bin/python3 {os.path.dirname(__file__)}/backup.py {BackupDirectory.query.all()[-1].path}')
6866
context = {'directory': directory.path}
6967
return render_template('backup.html', **context)
7068

@@ -80,48 +78,18 @@ def backupsettings():
8078
if job.comment == 'startbackup':
8179
my_cron.remove(job)
8280

83-
job = my_cron.new(command=f'/usr/bin/python3 {os.path.dirname(__file__)}/backup.py', comment='startbackup')
81+
job = my_cron.new(
82+
command=f'/usr/bin/python3 {os.path.dirname(__file__)}/backup.py {BackupDirectory.query.all()[-1].path}',
83+
comment='startbackup')
8484

8585
if request.form.get('day') != 'star':
8686
job.day.on(request.form.get('day'))
8787
if request.form.get('hours') != 'star':
8888
job.hour.on(request.form.get('hours'))
8989
if request.form.get('minute') != 'star':
9090
job.minute.on(request.form.get('minute'))
91-
'''
92-
job.day.on(request.form.get('day'))
93-
job.hour.on(request.form.get('hours'))
94-
job.minute.on(request.form.get('minute'))
95-
'''
9691
job.dow.on(*weekdays_list)
9792

9893
my_cron.write()
9994

10095
return render_template('backupsettings.html')
101-
102-
103-
@app.route('/statistic')
104-
def statistic():
105-
# with connection.cursor() as cur:
106-
# cur.execute('''SELECT * FROM statistic''')
107-
# results = cur.fetchall()
108-
# statistic_list = []
109-
# for result in results:
110-
# statistic_list.append(result)
111-
#
112-
# context = {'destatistic': statistic_list}
113-
# connection.commit()
114-
return render_template('statistic.html')
115-
116-
117-
@app.route('/authorization', methods=['POST', 'GET'])
118-
def authorization():
119-
# if request.method == 'POST':
120-
# with connection.cursor() as cur:d
121-
# login = cur.execute("SELECT name FROM users;")
122-
# passwd = cur.execute("SELECT passwd FROM users;")
123-
#
124-
# if request.form.get('login') == login:
125-
# if request.form.get('passwd') == passwd:
126-
# redirect('/devices')
127-
return render_template('authorization.html')

0 commit comments

Comments
 (0)