...

Web Backup

 

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.

Application home page