Here is the source for a web application that provides backup that has been developed in Flask/Python. The main application is presented here:
# system backup - flask application
from flask import Flask, render_template, request, flash, redirect
import os
import pprint
from pathlib import Path
from IPython import embed # embed()
import datetime
import zipfile
import zipfile, shutil
zip_dir = '/tmp/allzips'
def backupToZip(folder):
zipname = os.path.basename(folder) + '.zip'
zipFilename = os.path.join(zip_dir, zipname)
print('Creating %s...' % (zipFilename))
backupZip = zipfile.ZipFile(zipFilename, 'w')
filePaths = []
for root, directories, files in os.walk(folder):
for filename in files:
filePath = os.path.join(root, filename)
filePaths.append(filePath)
for f in filePaths:
print('Adding ' + str(f) + ' in ' + str(zipFilename))
backupZip.write(f)
backupZip.close()
print('Done.')
def get_sub_dirs(a_directory_path):
d = a_directory_path
# return [o for o in os.listdir(d) if os.path.isdir(os.path.join(d,o)) and not o.startswith('.')]
return [os.path.join(d, o) for o in os.listdir(d) if os.path.isdir(os.path.join(d,o)) and not o.startswith('.')]
def modified_1_day(base_dir, dirs_list):
result_dir_list = []
compare_date = datetime.datetime.today() - datetime.timedelta(hours = 24)
for di in dirs_list:
d = os.path.join(base_dir, di)
create_dt = os.stat(d).st_mtime
created_date = datetime.datetime.fromtimestamp(create_dt)
if created_date > compare_date:
result_dir_list.append(d)
return result_dir_list
def modified_7_day(base_dir, dirs_list):
result_dir_list = []
compare_date = datetime.datetime.today() - datetime.timedelta(hours = 168)
for di in dirs_list:
d = os.path.join(base_dir, di)
create_dt = os.stat(d).st_ctime
created_date = datetime.datetime.fromtimestamp(create_dt)
if created_date > compare_date:
result_dir_list.append(d)
return result_dir_list
def modified_14_day(base_dir, dirs_list):
result_dir_list = []
compare_date = datetime.datetime.today() - datetime.timedelta(hours = 336)
for di in dirs_list:
d = os.path.join(base_dir, di)
create_dt = os.stat(d).st_mtime
created_date = datetime.datetime.fromtimestamp(create_dt)
if created_date > compare_date:
result_dir_list.append(d)
return result_dir_list
def modified_30_day(base_dir, dirs_list):
result_dir_list = []
compare_date = datetime.datetime.today() - datetime.timedelta(hours = 672)
for di in dirs_list:
d = os.path.join(base_dir, di)
create_dt = os.stat(d).st_mtime
created_date = datetime.datetime.fromtimestamp(create_dt)
if created_date > compare_date:
result_dir_list.append(d)
return result_dir_list
app = Flask(__name__)
@app.route("/")
def index():
return redirect('/dirs')
@app.route("/dirs", methods=['GET', 'POST'])
def dirs_view():
backuplog = []
with open('/home/bmzi/temp/backup_checks.log', 'r') as logfile:
for l in logfile.readlines():
backuplog.append(l.strip())
home_dir = str(Path.home())
if request.method == 'POST':
dir_name = request.form['dirname']
if not dir_name:
dir_name = home_dir
time_option = request.form.get('timeoption')
if os.path.isdir(os.path.join(home_dir, dir_name)):
sub_dirs = get_sub_dirs(dir_name)
if time_option == 'time modified':
return render_template('dirs.html', sub_dirs=sub_dirs, home_dir=home_dir)
elif time_option == 'in last 24 hrs':
sub_dirs = modified_1_day(dir_name, sub_dirs)
return render_template('dirs.html', sub_dirs=sub_dirs, home_dir=home_dir)
elif time_option == 'in last week':
sub_dirs = modified_7_day(dir_name, sub_dirs)
return render_template('dirs.html', sub_dirs=sub_dirs, home_dir=home_dir)
elif time_option == 'in last 2 weeks':
sub_dirs = modified_14_day(dir_name, sub_dirs)
return render_template('dirs.html', sub_dirs=sub_dirs, home_dir=home_dir)
elif time_option == 'in last month':
sub_dirs = modified_30_day(dir_name, sub_dirs)
return render_template('dirs.html', sub_dirs=sub_dirs, home_dir=home_dir)
else:
msg = 'Directory \"' + dir_name + '\" does not exists'
flash(msg)
sub_dirs = get_sub_dirs(home_dir)
return render_template('dirs.html', sub_dirs=sub_dirs, home_dir=home_dir)
else:
home_dir = str(Path.home())
sub_dirs = get_sub_dirs(home_dir)
return render_template('dirs.html', sub_dirs=sub_dirs, home_dir=home_dir, backuplog=backuplog)
@app.route('/dirs_selected',methods=['POST'])
def dirs_selected_view():
if request.method == 'POST':
dirs_selected = request.form.getlist('dirs')
return render_template('dirs_selected.html', dirs_selected=dirs_selected)
@app.route('/result', methods=['GET','POST'])
def result_view():
subdirs = request.form.getlist('subdirs')
if not os.path.isdir(zip_dir):
os.makedirs(zip_dir)
if request.method == 'POST':
for elem in subdirs:
backupToZip(elem)
ziplist = os.listdir(zip_dir)
return render_template('result.html', subdirs=subdirs, ziplist=ziplist)
if __name__ == "__main__":
app.config.from_mapping(SECRET_KEY='dev')
app.run(debug=True)
Note:
Above is the main application created using flask and Python. Templates and static files are also availabe and I will share them upon your request.
I use this program for local backup, using flask webserver helped to create a GUI for local backup. For sure with some modification this app can be used for backing up a client on local network.