diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..228e4b42f --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.pyc +ApachController/ +0*.py +bin/ +lib/ +share/ +public/ diff --git a/.idea/CyberCP.iml b/.idea/CyberCP.iml new file mode 100644 index 000000000..15888c8f0 --- /dev/null +++ b/.idea/CyberCP.iml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..f99b31113 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..ac5943840 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 000000000..0a2f41f73 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,1073 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1559525918903 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file://$PROJECT_DIR$/plogical/adminPass.py + 1 + + + file://$PROJECT_DIR$/serverStatus/views.py + 474 + + + file://$PROJECT_DIR$/CLManager/templates/CLManager/createPackage.html + 46 + + + file://$PROJECT_DIR$/IncBackups/templates/IncBackups/createBackup.html + 43 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CLManager/CLManagerMain.py b/CLManager/CLManagerMain.py new file mode 100644 index 000000000..d476c7b05 --- /dev/null +++ b/CLManager/CLManagerMain.py @@ -0,0 +1,191 @@ +import threading as multi +from plogical.acl import ACLManager +import plogical.CyberCPLogFileWriter as logging +from plogical.processUtilities import ProcessUtilities +from django.shortcuts import render +import os +from serverStatus.serverStatusUtil import ServerStatusUtil +import json +from django.shortcuts import HttpResponse +from math import ceil +from websiteFunctions.models import Websites +from .models import CLPackages + + +class CLManagerMain(multi.Thread): + + def __init__(self, request=None, templateName=None, function=None, data=None): + multi.Thread.__init__(self) + self.request = request + self.templateName = templateName + self.function = function + self.data = data + + def run(self): + try: + if self.function == 'submitCageFSInstall': + self.submitCageFSInstall() + elif self.function == 'enableOrDisable': + self.enableOrDisable() + + except BaseException, msg: + logging.CyberCPLogFileWriter.writeToFile(str(msg) + ' [ContainerManager.run]') + + def renderC(self): + + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadError() + + data = {} + data['CL'] = 0 + data['CAGEFS'] = 0 + CLPath = '/etc/sysconfig/cloudlinux' + CageFSPath = '/usr/sbin/cagefsctl' + + if os.path.exists(CLPath): + data['CL'] = 1 + + if os.path.exists(CageFSPath): + data['CAGEFS'] = 1 + + if data['CL'] == 0: + return render(self.request, 'CLManager/notAvailable.html', data) + elif data['CAGEFS'] == 0: + return render(self.request, 'CLManager/notAvailable.html', data) + else: + return render(self.request, self.templateName, self.data) + + def submitCageFSInstall(self): + try: + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + else: + logging.CyberCPLogFileWriter.statusWriter(ServerStatusUtil.lswsInstallStatusPath, + 'Not authorized to install container packages. [404].', + 1) + return 0 + + execPath = "/usr/local/CyberCP/bin/python2 /usr/local/CyberCP/CLManager/CageFS.py" + execPath = execPath + " --function submitCageFSInstall" + ProcessUtilities.outputExecutioner(execPath) + + except BaseException, msg: + logging.CyberCPLogFileWriter.statusWriter(ServerStatusUtil.lswsInstallStatusPath, str(msg) + ' [404].', 1) + + def findWebsitesJson(self, currentACL, userID, pageNumber): + finalPageNumber = ((pageNumber * 10)) - 10 + endPageNumber = finalPageNumber + 10 + websites = ACLManager.findWebsiteObjects(currentACL, userID)[finalPageNumber:endPageNumber] + + json_data = "[" + checker = 0 + + command = '/usr/sbin/cagefsctl --list-enabled' + Enabled = ProcessUtilities.outputExecutioner(command) + + for items in websites: + if Enabled.find(items.externalApp) > -1: + status = 1 + else: + status = 0 + dic = {'domain': items.domain, 'externalApp': items.externalApp, 'status': status} + + if checker == 0: + json_data = json_data + json.dumps(dic) + checker = 1 + else: + json_data = json_data + ',' + json.dumps(dic) + + json_data = json_data + ']' + + return json_data + + def websitePagination(self, currentACL, userID): + websites = ACLManager.findAllSites(currentACL, userID) + + pages = float(len(websites)) / float(10) + pagination = [] + + if pages <= 1.0: + pages = 1 + pagination.append('
  • ') + else: + pages = ceil(pages) + finalPages = int(pages) + 1 + + for i in range(1, finalPages): + pagination.append('
  • ' + str(i) + '
  • ') + + return pagination + + def getFurtherAccounts(self, userID=None, data=None): + try: + currentACL = ACLManager.loadedACL(userID) + pageNumber = int(data['page']) + json_data = self.findWebsitesJson(currentACL, userID, pageNumber) + pagination = self.websitePagination(currentACL, userID) + + cageFSPath = '/home/cyberpanel/cagefs' + + if os.path.exists(cageFSPath): + default = 'On' + else: + default = 'Off' + + final_dic = {'status': 1, 'listWebSiteStatus': 1, 'error_message': "None", "data": json_data, + 'pagination': pagination, 'default': default} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + except BaseException, msg: + dic = {'status': 1, 'listWebSiteStatus': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + def enableOrDisable(self): + try: + websites = Websites.objects.all() + if self.data['mode'] == 1: + for items in websites: + command = '/usr/sbin/cagefsctl --enable %s' % (items.externalApp) + ProcessUtilities.executioner(command) + else: + for items in websites: + command = '/usr/sbin/cagefsctl --disable %s' % (items.externalApp) + ProcessUtilities.executioner(command) + except BaseException, msg: + logging.CyberCPLogFileWriter.writeToFile(str(msg)) + + def fetchPackages(self, currentACL): + + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadErrorJson() + + json_data = "[" + checker = 0 + + for items in CLPackages.objects.all(): + dic = {'name': items.name, 'SPEED': items.speed, 'VMEM': items.vmem, 'PMEM': items.pmem, 'IO': items.io, 'IOPS': items.iops, 'EP': items.ep, + 'NPROC': items.nproc, 'inodessoft': items.inodessoft, 'inodeshard': items.inodeshard} + + if checker == 0: + json_data = json_data + json.dumps(dic) + checker = 1 + else: + json_data = json_data + ',' + json.dumps(dic) + + json_data = json_data + ']' + + final_dic = {'status': 1, 'error_message': "None", "data": json_data} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + diff --git a/CLManager/CLPackages.py b/CLManager/CLPackages.py new file mode 100644 index 000000000..951acbee7 --- /dev/null +++ b/CLManager/CLPackages.py @@ -0,0 +1,82 @@ +#!/usr/local/CyberCP/bin/python2 +import os +import os.path +import sys +import django +sys.path.append('/usr/local/CyberCP') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") +django.setup() +import argparse +from websiteFunctions.models import Websites +from CLManager.models import CLPackages +import pwd + +class CLinuxPackages: + + @staticmethod + def listAll(): + for items in Websites.objects.all(): + itemPackage = items.package + try: + clPackage = CLPackages.objects.get(owner=itemPackage) + statement = '%s %s' % (pwd.getpwnam(items.externalApp).pw_uid, clPackage.name) + print statement + except: + pass + + + @staticmethod + def listPackages(): + for items in CLPackages.objects.all(): + print items.name + + @staticmethod + def userIDPackage(user): + website = Websites.objects.get(externalApp=user) + itemPackage = website.package + try: + clPackage = CLPackages.objects.get(owner=itemPackage) + print clPackage + except: + pass + + + @staticmethod + def packageForUser(package): + for items in Websites.objects.all(): + itemPackage = items.package + try: + clPackage = CLPackages.objects.get(owner=itemPackage) + if clPackage.name == package: + print pwd.getpwnam(items.externalApp).pw_uid + except: + pass + +def main(): + + parser = argparse.ArgumentParser(description='CyberPanel Container Manager') + parser.add_argument('--userid', help='User ID') + parser.add_argument('--package', help='Package') + parser.add_argument('--function', help='Function') + parser.add_argument('--list-all', help='List all users/packages.', action='store_true') + parser.add_argument('--list-packages', help='List all packages.', action='store_true') + + + args = vars(parser.parse_args()) + + if args['userid']: + CLinuxPackages.userIDPackage(args['userid']) + elif args['package']: + CLinuxPackages.packageForUser(args['package']) + elif args['list_all']: + CLinuxPackages.listAll() + elif args['list_packages']: + CLinuxPackages.listPackages() + + + + + +if __name__ == "__main__": + main() + diff --git a/CLManager/CageFS.py b/CLManager/CageFS.py new file mode 100644 index 000000000..1fb87ff24 --- /dev/null +++ b/CLManager/CageFS.py @@ -0,0 +1,60 @@ +#!/usr/local/CyberCP/bin/python2 +import sys +sys.path.append('/usr/local/CyberCP') +import plogical.CyberCPLogFileWriter as logging +import argparse +from plogical.mailUtilities import mailUtilities +from serverStatus.serverStatusUtil import ServerStatusUtil + + +class CageFS: + packages = ['talksho'] + users = ['5001'] + + @staticmethod + def submitCageFSInstall(): + try: + + mailUtilities.checkHome() + + statusFile = open(ServerStatusUtil.lswsInstallStatusPath, 'w') + + logging.CyberCPLogFileWriter.statusWriter(ServerStatusUtil.lswsInstallStatusPath, + "Starting Packages Installation..\n", 1) + + command = 'sudo yum install cagefs -y' + ServerStatusUtil.executioner(command, statusFile) + + command = 'sudo /usr/sbin/cagefsctl --init' + ServerStatusUtil.executioner(command, statusFile) + + command = 'sudo /usr/sbin/cagefsctl --update-etc' + ServerStatusUtil.executioner(command, statusFile) + + command = 'sudo /usr/sbin/cagefsctl --force-update' + ServerStatusUtil.executioner(command, statusFile) + + logging.CyberCPLogFileWriter.statusWriter(ServerStatusUtil.lswsInstallStatusPath, + "Packages successfully installed.[200]\n", 1) + + except BaseException, msg: + logging.CyberCPLogFileWriter.statusWriter(ServerStatusUtil.lswsInstallStatusPath, str(msg) + ' [404].', 1) + +def main(): + + parser = argparse.ArgumentParser(description='CyberPanel CageFS Manager') + parser.add_argument('--function', help='Function') + + + args = vars(parser.parse_args()) + + if args["function"] == "submitCageFSInstall": + CageFS.submitCageFSInstall() + + + + + +if __name__ == "__main__": + main() + diff --git a/CLManager/__init__.py b/CLManager/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/CLManager/admin.py b/CLManager/admin.py new file mode 100644 index 000000000..13be29d96 --- /dev/null +++ b/CLManager/admin.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib import admin + +# Register your models here. diff --git a/CLManager/apps.py b/CLManager/apps.py new file mode 100644 index 000000000..1f97e1e94 --- /dev/null +++ b/CLManager/apps.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class ClmanagerConfig(AppConfig): + name = 'CLManager' diff --git a/CLManager/migrations/__init__.py b/CLManager/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/CLManager/models.py b/CLManager/models.py new file mode 100644 index 000000000..cdbab13b0 --- /dev/null +++ b/CLManager/models.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models +from packages.models import Package + +# Create your models here. + +class CLPackages(models.Model): + owner = models.ForeignKey(Package) + name = models.CharField(max_length=50,unique=True) + speed = models.CharField(max_length=50) + vmem = models.CharField(max_length=50) + pmem = models.CharField(max_length=50) + io = models.CharField(max_length=50) + iops = models.CharField(max_length=50) + ep = models.CharField(max_length=50) + nproc = models.CharField(max_length=50) + inodessoft = models.CharField(max_length=50) + inodeshard = models.CharField(max_length=50) \ No newline at end of file diff --git a/CLManager/static/CLManager/CLManager.js b/CLManager/static/CLManager/CLManager.js new file mode 100644 index 000000000..547a407d5 --- /dev/null +++ b/CLManager/static/CLManager/CLManager.js @@ -0,0 +1,934 @@ +app.controller('installCageFS', function ($scope, $http, $timeout, $window) { + + $scope.installDockerStatus = true; + $scope.installBoxGen = true; + $scope.dockerInstallBTN = false; + + $scope.submitCageFSInstall = function () { + + $scope.installDockerStatus = false; + $scope.installBoxGen = true; + $scope.dockerInstallBTN = true; + + url = "/CloudLinux/submitCageFSInstall"; + + var data = {}; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberPanelLoading = true; + if (response.data.status === 1) { + $scope.installBoxGen = false; + getRequestStatus(); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + }; + + function getRequestStatus() { + $scope.cyberPanelLoading = false; + + url = "/serverstatus/switchTOLSWSStatus"; + + var data = {}; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + if (response.data.abort === 0) { + $scope.requestData = response.data.requestStatus; + $timeout(getRequestStatus, 1000); + } else { + // Notifications + $scope.cyberPanelLoading = true; + $timeout.cancel(); + $scope.requestData = response.data.requestStatus; + if (response.data.installed === 1) { + $timeout(function () { + $window.location.reload(); + }, 3000); + } + + } + } + + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + + + } + + } +}); + +app.controller('listWebsitesCage', function ($scope, $http) { + + var globalPageNumber; + $scope.getFurtherWebsitesFromDB = function (pageNumber) { + $scope.cyberPanelLoading = false; + globalPageNumber = pageNumber; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = {page: pageNumber}; + + + dataurl = "/CloudLinux/submitWebsiteListing"; + + $http.post(dataurl, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + $scope.cyberPanelLoading = true; + if (response.data.listWebSiteStatus === 1) { + var finalData = JSON.parse(response.data.data); + $scope.WebSitesList = finalData; + $scope.pagination = response.data.pagination; + $scope.default = response.data.default; + $("#listFail").hide(); + } else { + $("#listFail").fadeIn(); + $scope.errorMessage = response.data.error_message; + console.log(response.data); + + } + } + + function cantLoadInitialData(response) { + $scope.cyberPanelLoading = true; + console.log("not good"); + } + + + }; + $scope.getFurtherWebsitesFromDB(1); + + $scope.cyberPanelLoading = true; + + $scope.searchWebsites = function () { + + $scope.cyberPanelLoading = false; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + patternAdded: $scope.patternAdded + }; + + dataurl = "/websites/searchWebsites"; + + $http.post(dataurl, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + $scope.cyberPanelLoading = true; + if (response.data.listWebSiteStatus === 1) { + + var finalData = JSON.parse(response.data.data); + $scope.WebSitesList = finalData; + $("#listFail").hide(); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + } + + function cantLoadInitialData(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Connect disrupted, refresh the page.', + type: 'error' + }); + } + + + }; + + $scope.enableOrDisable = function (domain, all, mode, toggle = 0) { + $scope.cyberPanelLoading = false; + + url = "/CloudLinux/enableOrDisable"; + + var data = { + domain: domain, + all: all, + mode: mode, + toggle: toggle + }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberPanelLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: response.data.success, + type: 'success' + }); + + if (all === 0) { + $scope.getFurtherWebsitesFromDB(globalPageNumber); + } + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + }; + + $scope.refreshStatus = function () { + $scope.getFurtherWebsitesFromDB(globalPageNumber); + } + + +}); + +app.controller('createCLPackage', function ($scope, $http) { + + $scope.cyberPanelLoading = true; + $scope.modifyPackageForm = true; + $scope.toggleView = function () { + $scope.modifyPackageForm = false; + }; + + $scope.createPackage = function () { + $scope.cyberPanelLoading = false; + + url = "/CloudLinux/submitCreatePackage"; + + var data = { + selectedPackage: $scope.selectedPackage, + name: $scope.name, + SPEED: $scope.SPEED, + VMEM: $scope.VMEM, + PMEM: $scope.PMEM, + IO: $scope.IO, + IOPS: $scope.IOPS, + EP: $scope.EP, + NPROC: $scope.NPROC, + INODESsoft: $scope.INODESsoft, + INODEShard: $scope.INODEShard, + }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberPanelLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: 'Successfully created.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + }; + +}); + +app.controller('listCloudLinuxPackages', function ($scope, $http) { + + $scope.cyberPanelLoading = true; + + $scope.fetchPackageas = function () { + $scope.cyberPanelLoading = false; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = {}; + + + dataurl = "/CloudLinux/fetchPackages"; + + $http.post(dataurl, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + $scope.cyberPanelLoading = true; + if (response.data.status === 1) { + $scope.packages = JSON.parse(response.data.data); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialData(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + + }; + $scope.fetchPackageas(); + + $scope.deleteCLPackage = function (name) { + $scope.cyberPanelLoading = false; + + url = "/CloudLinux/deleteCLPackage"; + + var data = { + name: name + }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberPanelLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: 'Successfully deleted.', + type: 'success' + }); + $scope.fetchPackageas(); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + }; + $scope.populatePackage = function (name, speed, vmem, pmem, io, iops, ep, nproc, inodessoft, inodeshard) { + $scope.name = name; + $scope.SPEED = speed; + $scope.VMEM = vmem; + $scope.PMEM = pmem; + $scope.IO = io; + $scope.IOPS = iops; + $scope.EP = ep; + $scope.NPROC = nproc; + $scope.inodessoft = inodessoft; + $scope.inodeshard = inodeshard; + + }; + + $scope.saveSettings = function () { + $scope.cyberPanelLoading = false; + + url = "/CloudLinux/saveSettings"; + + var data = { + name: $scope.name, + SPEED: $scope.SPEED, + VMEM: $scope.VMEM, + PMEM: $scope.PMEM, + IO: $scope.IO, + IOPS: $scope.IOPS, + EP: $scope.EP, + NPROC: $scope.NPROC, + INODESsoft: $scope.inodessoft, + INODEShard: $scope.inodeshard, + }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberPanelLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: 'Changes successfully applied.', + type: 'success' + }); + $scope.fetchPackageas(); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + }; + +}); + + +app.controller('websiteContainerLimitCL', function ($scope, $http, $timeout, $window) { + + + // Get CPU Usage of User + + var cpu = []; + var dataset; + var totalPoints = 100; + var updateInterval = 1000; + var now = new Date().getTime(); + + var options = { + series: { + lines: { + lineWidth: 1.2 + }, + bars: { + align: "center", + fillColor: {colors: [{opacity: 1}, {opacity: 1}]}, + barWidth: 500, + lineWidth: 1 + } + }, + xaxis: { + mode: "time", + tickSize: [5, "second"], + tickFormatter: function (v, axis) { + var date = new Date(v); + + if (date.getSeconds() % 20 == 0) { + var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours(); + var minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes(); + var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds(); + + return hours + ":" + minutes + ":" + seconds; + } else { + return ""; + } + }, + axisLabel: "Time", + axisLabelUseCanvas: true, + axisLabelFontSizePixels: 12, + axisLabelFontFamily: 'Verdana, Arial', + axisLabelPadding: 10 + }, + yaxes: [ + { + min: 0, + max: 100, + tickSize: 5, + tickFormatter: function (v, axis) { + if (v % 10 == 0) { + return v + "%"; + } else { + return ""; + } + }, + axisLabel: "CPU loading", + axisLabelUseCanvas: true, + axisLabelFontSizePixels: 12, + axisLabelFontFamily: 'Verdana, Arial', + axisLabelPadding: 6 + }, { + max: 5120, + position: "right", + axisLabel: "Disk", + axisLabelUseCanvas: true, + axisLabelFontSizePixels: 12, + axisLabelFontFamily: 'Verdana, Arial', + axisLabelPadding: 6 + } + ], + legend: { + noColumns: 0, + position: "nw" + }, + grid: { + backgroundColor: {colors: ["#ffffff", "#EDF5FF"]} + } + }; + + function initData() { + for (var i = 0; i < totalPoints; i++) { + var temp = [now += updateInterval, 0]; + + cpu.push(temp); + } + } + + function GetData() { + + var data = { + domain: $("#domain").text() + }; + $.ajaxSetup({cache: false}); + + $.ajax({ + url: "/CloudLinux/getUsageData", + dataType: 'json', + success: update, + type: "POST", + headers: {'X-CSRFToken': getCookie('csrftoken')}, + contentType: "application/json", + data: JSON.stringify(data), // Our valid JSON string + error: function () { + setTimeout(GetData, updateInterval); + } + }); + } + + var temp; + + function update(_data) { + cpu.shift(); + + now += updateInterval; + + temp = [now, _data.cpu]; + cpu.push(temp); + + + dataset = [ + {label: "CPU:" + _data.cpu + "%", data: cpu, lines: {fill: true, lineWidth: 1.2}, color: "#00FF00"} + ]; + + $.plot($("#flot-placeholder1"), dataset, options); + setTimeout(GetData, updateInterval); + } + + // Memory Usage of User + + var memory = []; + var datasetMemory; + var totalPointsMemory = 100; + var updateIntervalMemory = 1000; + var nowMemory = new Date().getTime(); + + var optionsMemory = { + series: { + lines: { + lineWidth: 1.2 + }, + bars: { + align: "center", + fillColor: {colors: [{opacity: 1}, {opacity: 1}]}, + barWidth: 500, + lineWidth: 1 + } + }, + xaxis: { + mode: "time", + tickSize: [5, "second"], + tickFormatter: function (v, axis) { + var date = new Date(v); + + if (date.getSeconds() % 20 == 0) { + var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours(); + var minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes(); + var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds(); + + return hours + ":" + minutes + ":" + seconds; + } else { + return ""; + } + }, + axisLabel: "Time", + axisLabelUseCanvas: true, + axisLabelFontSizePixels: 12, + axisLabelFontFamily: 'Verdana, Arial', + axisLabelPadding: 10 + }, + yaxes: [ + { + min: 0, + max: $scope.memory, + tickSize: 5, + tickFormatter: function (v, axis) { + if (v % 10 == 0) { + return v + "MB"; + } else { + return ""; + } + }, + axisLabel: "CPU loading", + axisLabelUseCanvas: true, + axisLabelFontSizePixels: 12, + axisLabelFontFamily: 'Verdana, Arial', + axisLabelPadding: 6 + }, { + max: 5120, + position: "right", + axisLabel: "Disk", + axisLabelUseCanvas: true, + axisLabelFontSizePixels: 12, + axisLabelFontFamily: 'Verdana, Arial', + axisLabelPadding: 6 + } + ], + legend: { + noColumns: 0, + position: "nw" + }, + grid: { + backgroundColor: {colors: ["#ffffff", "#EDF5FF"]} + } + }; + + function initDataMemory() { + for (var i = 0; i < totalPointsMemory; i++) { + var temp = [nowMemory += updateIntervalMemory, 0]; + + memory.push(temp); + } + } + + function GetDataMemory() { + + var data = { + domain: $("#domain").text(), + type: 'memory' + }; + $.ajaxSetup({cache: false}); + + $.ajax({ + url: "/CloudLinux/getUsageData", + dataType: 'json', + headers: {'X-CSRFToken': getCookie('csrftoken')}, + success: updateMemory, + type: "POST", + contentType: "application/json", + data: JSON.stringify(data), // Our valid JSON string + error: function () { + setTimeout(GetDataMemory, updateIntervalMemory); + } + }); + } + + var tempMemory; + + function updateMemory(_data) { + memory.shift(); + + nowMemory += updateIntervalMemory; + + tempMemory = [nowMemory, _data.memory]; + memory.push(tempMemory); + + + datasetMemory = [ + { + label: "Memory:" + _data.memory + "MB", + data: memory, + lines: {fill: true, lineWidth: 1.2}, + color: "#00FF00" + } + ]; + + $.plot($("#memoryUsage"), datasetMemory, optionsMemory); + setTimeout(GetDataMemory, updateIntervalMemory); + } + + // Disk Usage + + var readRate = [], writeRate = []; + var datasetDisk; + var totalPointsDisk = 100; + var updateIntervalDisk = 5000; + var now = new Date().getTime(); + + var optionsDisk = { + series: { + lines: { + lineWidth: 1.2 + }, + bars: { + align: "center", + fillColor: {colors: [{opacity: 1}, {opacity: 1}]}, + barWidth: 500, + lineWidth: 1 + } + }, + xaxis: { + mode: "time", + tickSize: [30, "second"], + tickFormatter: function (v, axis) { + var date = new Date(v); + + if (date.getSeconds() % 20 == 0) { + var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours(); + var minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes(); + var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds(); + + return hours + ":" + minutes + ":" + seconds; + } else { + return ""; + } + }, + axisLabel: "Time", + axisLabelUseCanvas: true, + axisLabelFontSizePixels: 12, + axisLabelFontFamily: 'Verdana, Arial', + axisLabelPadding: 10 + }, + yaxes: [ + { + min: 0, + max: $scope.networkSpeed, + tickSize: 5, + tickFormatter: function (v, axis) { + if (v % 10 == 0) { + return v + "mb/sec"; + } else { + return ""; + } + }, + axisLabel: "CPU loading", + axisLabelUseCanvas: true, + axisLabelFontSizePixels: 12, + axisLabelFontFamily: 'Verdana, Arial', + axisLabelPadding: 6 + }, { + max: 5120, + position: "right", + axisLabel: "Disk", + axisLabelUseCanvas: true, + axisLabelFontSizePixels: 12, + axisLabelFontFamily: 'Verdana, Arial', + axisLabelPadding: 6 + } + ], + legend: { + noColumns: 0, + position: "nw" + }, + grid: { + backgroundColor: {colors: ["#ffffff", "#EDF5FF"]} + } + }; + + function initDataDisk() { + for (var i = 0; i < totalPointsDisk; i++) { + var temp = [now += updateIntervalDisk, 0]; + + readRate.push(temp); + writeRate.push(temp); + } + } + + function GetDataDisk() { + + var data = { + domain: $("#domain").text(), + type: 'io' + }; + + $.ajaxSetup({cache: false}); + + $.ajax({ + url: "/CloudLinux/getUsageData", + dataType: 'json', + headers: {'X-CSRFToken': getCookie('csrftoken')}, + success: updateDisk, + type: "POST", + contentType: "application/json", + data: JSON.stringify(data), // Our valid JSON string + error: function () { + setTimeout(GetDataMemory, updateIntervalMemory); + } + }); + } + + var tempDisk; + + function updateDisk(_data) { + readRate.shift(); + writeRate.shift(); + + now += updateIntervalDisk; + + tempDisk = [now, _data.readRate]; + readRate.push(tempDisk); + + tempDisk = [now, _data.readRate]; + writeRate.push(tempDisk); + + datasetDisk = [ + { + label: "Read IO/s " + _data.readRate + " mb/s ", + data: readRate, + lines: {fill: true, lineWidth: 1.2}, + color: "#00FF00" + }, + { + label: "Write IO/s " + _data.writeRate + " mb/s ", + data: writeRate, + lines: {lineWidth: 1.2}, + color: "#FF0000" + } + ]; + + $.plot($("#diskUsage"), datasetDisk, optionsDisk); + setTimeout(GetDataDisk, updateIntervalDisk); + } + + + $(document).ready(function () { + + // Report Memory Usage + + initDataMemory(); + + datasetMemory = [ + {label: "Memory", data: memory, lines: {fill: true, lineWidth: 1.2}, color: "#00FF00"} + ]; + + $.plot($("#memoryUsage"), datasetMemory, optionsMemory); + setTimeout(GetDataMemory, updateIntervalMemory); + + // Report CPU Usage + + initData(); + + dataset = [ + {label: "CPU", data: cpu, lines: {fill: true, lineWidth: 1.2}, color: "#00FF00"} + ]; + + $.plot($("#flot-placeholder1"), dataset, options); + setTimeout(GetData, updateInterval); + + // Report Disk Usage + + initDataDisk(); + + datasetDisk = [ + {label: "Read IO/s: ", data: readRate, lines: {fill: true, lineWidth: 1.2}, color: "#00FF00"}, + {label: "Write IO/s: ", data: writeRate, color: "#0044FF", bars: {show: true}, yaxis: 2} + ]; + + $.plot($("#diskUsage"), datasetDisk, optionsDisk); + setTimeout(GetDataDisk, updateIntervalDisk); + }); +}); \ No newline at end of file diff --git a/CLManager/templates/CLManager/createPackage.html b/CLManager/templates/CLManager/createPackage.html new file mode 100644 index 000000000..e7e0c2fba --- /dev/null +++ b/CLManager/templates/CLManager/createPackage.html @@ -0,0 +1,146 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "Create Cloud Linux Package - CyberPanel" %}{% endblock %} +{% block content %} + + {% load static %} +
    +
    +

    {% trans "Create CloudLinux Package." %}

    +

    {% trans "Each CloudLinux package have one associated (owner) CyberPanel package. During website creation associated CloudLinux package will be assigned to website user." %}

    +
    +
    +
    +

    + {% trans "Create Package" %} +

    +
    + + +
    + + +
    + +
    + +
    +
    + + + + +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    Ex 100%
    +
    + + +
    + +
    + +
    +
    Ex 256m or 1G
    +
    + +
    + +
    + +
    +
    Ex 256m or 1G
    +
    + + +
    + +
    + +
    +
    Ex 1024
    +
    + +
    + +
    + +
    +
    Ex 1024
    +
    + +
    + +
    + +
    +
    Ex 10
    +
    + +
    + +
    + +
    +
    Ex 10
    +
    + +
    + +
    + +
    +
    Ex 1024
    +
    + +
    + +
    + +
    +
    Ex 1024
    +
    + + +
    + + + + +
    + +
    + + +
    +
    + +
    + + +
    +
    +
    + + +
    + + +{% endblock %} diff --git a/CLManager/templates/CLManager/listPackages.html b/CLManager/templates/CLManager/listPackages.html new file mode 100644 index 000000000..c7442359c --- /dev/null +++ b/CLManager/templates/CLManager/listPackages.html @@ -0,0 +1,236 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "Manage CloudLinux Packages - CyberPanel" %}{% endblock %} +{% block content %} + + {% load static %} + {% get_current_language as LANGUAGE_CODE %} + + + +
    + +
    +

    {% trans "Manage CloudLinux Packages" %}

    +

    {% trans "Manage/Delete CloudLinux Packages." %}

    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameSPEEDVMEMPMEMIOIOPSEPNPROCINODES softINODES hardActions
    + Delete + Edit + +
    + +
    +

    {% trans "Cannot list websites. Error message:" %} {$ errorMessage $}

    +
    + +
    + +
    + + + + +
    + + +
    + +
    +
    +
    + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/CLManager/templates/CLManager/listWebsites.html b/CLManager/templates/CLManager/listWebsites.html new file mode 100644 index 000000000..cd0e24528 --- /dev/null +++ b/CLManager/templates/CLManager/listWebsites.html @@ -0,0 +1,117 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "CageFS - CyberPanel" %}{% endblock %} +{% block content %} + + {% load static %} + {% get_current_language as LANGUAGE_CODE %} + + + +
    + +
    +

    {% trans "List Websites" %}

    +

    {% trans "Enable/Disable and view CageFS status for websites." %}

    +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + + + +
    Domain UserActions
    + Disable + Enable +
    + +
    +

    {% trans "Cannot list websites. Error message:" %} {$ errorMessage $}

    +
    + +
    + +
    + + + + +
    + + +
    + +
    +
    +
    + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/CLManager/templates/CLManager/monitorUsage.html b/CLManager/templates/CLManager/monitorUsage.html new file mode 100644 index 000000000..8eccc09b8 --- /dev/null +++ b/CLManager/templates/CLManager/monitorUsage.html @@ -0,0 +1,87 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "Monitor Usage - CyberPanel" %}{% endblock %} +{% block content %} + + {% load static %} + {% get_current_language as LANGUAGE_CODE %} + + + +
    + +
    +

    {% trans "List Websites" %}

    +

    {% trans "Monitor usage of your websites." %}

    +
    + +
    +
    +

    + {% trans "Websites" %} +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DomainLaunchIP AddressPackageOwnerStateEmail
    +
    + +
    +

    {% trans "Cannot list websites. Error message:" %} {$ errorMessage $}

    +
    + +
    + +
    + + + + +
    + + +
    + +
    +
    +
    + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/CLManager/templates/CLManager/notAvailable.html b/CLManager/templates/CLManager/notAvailable.html new file mode 100644 index 000000000..c597c3827 --- /dev/null +++ b/CLManager/templates/CLManager/notAvailable.html @@ -0,0 +1,67 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "Not available - CyberPanel" %}{% endblock %} +{% block content %} + + {% load static %} + {% get_current_language as LANGUAGE_CODE %} + + + +
    +
    +

    {% trans "Not available" %}

    +

    {% trans "Either CageFS is not installed or you are not on CloudLinux OS." %}

    +
    + + {% if not CL %} + +
    +
    +
    +

    {% trans "CageFS is only available with CloudLinux OS. " %} Click + Here {% trans " for conversion details." %}

    +
    +
    +
    + + {% else %} + +
    +
    +

    + {% trans "Install Packages" %} +

    +
    + +

    {% trans "CageFS is not installed on this server. Please proceed to installation." %}

    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + + + +
    + + +
    +
    +
    + + {% endif %} + +
    +{% endblock %} + diff --git a/CLManager/templates/CLManager/websiteContainerLimit.html b/CLManager/templates/CLManager/websiteContainerLimit.html new file mode 100644 index 000000000..13fac7c7b --- /dev/null +++ b/CLManager/templates/CLManager/websiteContainerLimit.html @@ -0,0 +1,52 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{{ domain }}{% trans " usage - CyberPanel" %}{% endblock %} +{% block content %} + + {% load static %} + {% get_current_language as LANGUAGE_CODE %} + + + +
    + +
    +

    {% trans "Usage" %}

    +

    {% trans "View CPU, Memory and Disk usage for " %} {{ domain }}

    +
    + +
    +
    +

    + {% trans "CPU Usage of" %} {{ domain }} +

    +
    +
    + +
    +
    +
    +

    + {% trans "Memory Usage of" %} {{ domain }} +

    +
    +
    + +
    +
    +
    +

    + {% trans "Disk Usage of" %} {{ domain }} +

    +
    +
    + +
    +
    +
    + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/CLManager/tests.py b/CLManager/tests.py new file mode 100644 index 000000000..5982e6bcd --- /dev/null +++ b/CLManager/tests.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.test import TestCase + +# Create your tests here. diff --git a/CLManager/urls.py b/CLManager/urls.py new file mode 100644 index 000000000..d7a531c43 --- /dev/null +++ b/CLManager/urls.py @@ -0,0 +1,18 @@ +from django.conf.urls import url +import views + +urlpatterns = [ + url(r'^CageFS$', views.CageFS, name='CageFS'), + url(r'^submitCageFSInstall$', views.submitCageFSInstall, name='submitCageFSInstall'), + url(r'^submitWebsiteListing$', views.getFurtherAccounts, name='submitWebsiteListing'), + url(r'^enableOrDisable$', views.enableOrDisable, name='enableOrDisable'), + url(r'^CreatePackage$', views.CreatePackage, name='CreatePackageCL'), + url(r'^submitCreatePackage$', views.submitCreatePackage, name='submitCreatePackageCL'), + url(r'^listPackages$', views.listPackages, name='listPackagesCL'), + url(r'^fetchPackages$', views.fetchPackages, name='fetchPackagesCL'), + url(r'^deleteCLPackage$', views.deleteCLPackage, name='deleteCLPackage'), + url(r'^saveSettings$', views.saveSettings, name='saveSettings'), + url(r'^monitorUsage$', views.monitorUsage, name='monitorUsage'), + url(r'^manage/(?P(.*))$', views.websiteContainerLimit, name='websiteContainerLimitCL'), + url(r'^getUsageData$', views.getUsageData, name='getUsageData'), +] \ No newline at end of file diff --git a/CLManager/views.py b/CLManager/views.py new file mode 100644 index 000000000..e02a3a040 --- /dev/null +++ b/CLManager/views.py @@ -0,0 +1,358 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.shortcuts import redirect, HttpResponse +from loginSystem.views import loadLoginPage +from plogical.acl import ACLManager +from CLManagerMain import CLManagerMain +import json +from websiteFunctions.models import Websites +from plogical.processUtilities import ProcessUtilities +import os +from packages.models import Package +from .models import CLPackages +import subprocess +import multiprocessing +import pwd +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +# Create your views here. + +def CageFS(request): + try: + templateName = 'CLManager/listWebsites.html' + c = CLManagerMain(request, templateName) + return c.renderC() + except KeyError: + return redirect(loadLoginPage) + +def submitCageFSInstall(request): + try: + + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadErrorJson() + + c = CLManagerMain(request, None, 'submitCageFSInstall') + c.start() + + data_ret = {'status': 1, 'error_message': 'None'} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + except BaseException, msg: + data_ret = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + +def getFurtherAccounts(request): + try: + userID = request.session['userID'] + wm = CLManagerMain() + return wm.getFurtherAccounts(userID, json.loads(request.body)) + except KeyError: + return redirect(loadLoginPage) + +def enableOrDisable(request): + try: + + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadErrorJson() + + data = json.loads(request.body) + + if data['toggle'] == 1: + cageFSPath = '/home/cyberpanel/cagefs' + if os.path.exists(cageFSPath): + os.remove(cageFSPath) + else: + writeToFile = open(cageFSPath, 'w') + writeToFile.writelines('enable') + writeToFile.close() + + data_ret = {'status': 1, 'error_message': 'None', 'success': 'Default status successfully changed changed.'} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + if data['all'] == 0: + if data['mode'] == 1: + website = Websites.objects.get(domain=data['domain']) + command = '/usr/sbin/cagefsctl --enable %s' % (website.externalApp) + else: + website = Websites.objects.get(domain=data['domain']) + command = '/usr/sbin/cagefsctl --disable %s' % (website.externalApp) + + ProcessUtilities.executioner(command) + data_ret = {'status': 1, 'error_message': 'None', 'success': 'Changes successfully applied.'} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + else: + c = CLManagerMain(request, None, 'enableOrDisable', data) + c.start() + + data_ret = {'status': 1, 'error_message': 'None', 'success': 'Job started in background, refresh in few seconds to see the status.'} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + + + except BaseException, msg: + data_ret = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + +def CreatePackage(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + templateName = 'CLManager/createPackage.html' + packageList = ACLManager.loadPackages(userID, currentACL) + data = {} + data['packList'] = packageList + c = CLManagerMain(request, templateName, None, data) + return c.renderC() + except KeyError: + return redirect(loadLoginPage) + +def submitCreatePackage(request): + try: + + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadErrorJson() + + data = json.loads(request.body) + + selectedPackage = data['selectedPackage'] + + package = Package.objects.get(packageName=selectedPackage) + + if package.clpackages_set.all().count() == 1: + data_ret = {'status': 0, 'error_message': 'This package already have one associated CloudLinux Package.'} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + name = data['name'] + SPEED = data['SPEED'] + VMEM = data['VMEM'] + PMEM = data['PMEM'] + IO = data['IO'] + IOPS = data['IOPS'] + EP = data['EP'] + NPROC = data['NPROC'] + INODESsoft = data['INODESsoft'] + INODEShard = data['INODEShard'] + + clPackage = CLPackages(name=name, owner=package, speed=SPEED, vmem=VMEM, pmem=PMEM, io=IO, iops=IOPS, ep=EP, nproc=NPROC, inodessoft=INODESsoft, inodeshard=INODEShard) + clPackage.save() + + command = 'sudo lvectl package-set %s --speed=%s --pmem=%s --io=%s --nproc=%s --iops=%s --vmem=%s --ep=%s' % (name, SPEED, PMEM, IO, NPROC, IOPS, VMEM, EP) + ProcessUtilities.executioner(command) + + command = 'sudo lvectl apply all' + ProcessUtilities.popenExecutioner(command) + + data_ret = {'status': 1} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + + except BaseException, msg: + data_ret = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + +def listPackages(request): + try: + templateName = 'CLManager/listPackages.html' + c = CLManagerMain(request, templateName) + return c.renderC() + except KeyError: + return redirect(loadLoginPage) + +def fetchPackages(request): + try: + userID = request.session['userID'] + wm = CLManagerMain() + return wm.fetchPackages(ACLManager.loadedACL(userID)) + except KeyError: + return redirect(loadLoginPage) + +def deleteCLPackage(request): + try: + + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadErrorJson() + + data = json.loads(request.body) + + name = data['name'] + + clPackage = CLPackages.objects.get(name=name) + clPackage.delete() + + data_ret = {'status': 1} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + + except BaseException, msg: + data_ret = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + +def saveSettings(request): + try: + + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadErrorJson() + + data = json.loads(request.body) + + name = data['name'] + SPEED = data['SPEED'] + VMEM = data['VMEM'] + PMEM = data['PMEM'] + IO = data['IO'] + IOPS = data['IOPS'] + EP = data['EP'] + NPROC = data['NPROC'] + INODESsoft = data['INODESsoft'] + INODEShard = data['INODEShard'] + + clPackage = CLPackages.objects.get(name=name) + clPackage.speed = SPEED + clPackage.vmem = VMEM + clPackage.pmem = PMEM + clPackage.io = IO + clPackage.iops = IOPS + clPackage.ep = EP + clPackage.nproc = NPROC + clPackage.inodessoft = INODESsoft + clPackage.inodeshard = INODEShard + clPackage.save() + + command = 'sudo lvectl package-set %s --speed=%s --pmem=%s --io=%s --nproc=%s --iops=%s --vmem=%s --ep=%s' % ( + name, SPEED, PMEM, IO, NPROC, IOPS, VMEM, EP) + ProcessUtilities.executioner(command) + + command = 'sudo lvectl apply all' + ProcessUtilities.popenExecutioner(command) + + data_ret = {'status': 1} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + + except BaseException, msg: + data_ret = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + +def monitorUsage(request): + try: + templateName = 'CLManager/monitorUsage.html' + c = CLManagerMain(request, templateName) + return c.renderC() + except KeyError: + return redirect(loadLoginPage) + +def websiteContainerLimit(request, domain): + try: + templateName = 'CLManager/websiteContainerLimit.html' + data = {} + data['domain'] = domain + c = CLManagerMain(request, templateName, None, data) + return c.renderC() + except KeyError: + return redirect(loadLoginPage) + +def getUsageData(request): + try: + + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadErrorJson() + + data = json.loads(request.body) + domain = data['domain'] + website = Websites.objects.get(domain=domain) + uid = pwd.getpwnam(website.externalApp).pw_uid + + try: + type = data['type'] + finalData = {} + finalData['status'] = 1 + + try: + if type == 'memory': + + command = 'sudo lveps -o id:10,mem:10' + output = ProcessUtilities.outputExecutioner(command).splitlines() + for items in output: + if items.find(website.externalApp) > -1: + finalData['memory'] = int(items.split(' ')[-1]) + break + + elif type == 'io': + + finalData['readRate'] = 0 + finalData['writeRate'] = 0 + + command = 'sudo lveps -o id:10,iops:10' + output = ProcessUtilities.outputExecutioner(command).splitlines() + for items in output: + if items.find(website.externalApp) > -1: + finalData['readRate'] = int(items.split(' ')[-1]) + break + + except: + finalData['memory'] = '0' + finalData['readRate'] = 0 + finalData['writeRate'] = 0 + except: + + finalData = {} + finalData['status'] = 1 + + command = 'sudo lveps -o id:10,cpu:10 -d' + output = ProcessUtilities.outputExecutioner(command).splitlines() + + for items in output: + if items.find(website.externalApp) > -1: + finalData['cpu'] = int(items.split(' ')[-1].rstrip('%')) + break + + final_json = json.dumps(finalData) + return HttpResponse(final_json) + + except BaseException, msg: + data_ret = {'status': 0, 'error_message': str(msg), 'cpu': 0, 'memory':0} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) \ No newline at end of file diff --git a/CyberCP/secMiddleware.py b/CyberCP/secMiddleware.py index 62d13d283..3f4e8b61b 100644 --- a/CyberCP/secMiddleware.py +++ b/CyberCP/secMiddleware.py @@ -1,6 +1,6 @@ -from django.conf import settings -from django.shortcuts import HttpResponse from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +import json +from django.shortcuts import HttpResponse class secMiddleware: @@ -8,8 +8,80 @@ class secMiddleware: self.get_response = get_response def __call__(self, request): + try: + uID = request.session['userID'] + ipAddr = request.META.get('REMOTE_ADDR') + + if ipAddr.find('.') > -1: + if request.session['ipAddr'] == ipAddr: + pass + else: + del request.session['userID'] + del request.session['ipAddr'] + logging.writeToFile(request.META.get('REMOTE_ADDR')) + final_dic = {'error_message': "Session reuse detected, IPAddress logged.", + "errorMessage": "Session reuse detected, IPAddress logged."} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + else: + ipAddr = request.META.get('REMOTE_ADDR').split(':')[:3] + + if request.session['ipAddr'] == ipAddr: + pass + else: + del request.session['userID'] + del request.session['ipAddr'] + logging.writeToFile(request.META.get('REMOTE_ADDR')) + final_dic = {'error_message': "Session reuse detected, IPAddress logged.", + "errorMessage": "Session reuse detected, IPAddress logged."} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + except: + pass if request.method == 'POST': - if request.body.find(';') > -1 or request.body.find('&&') > -1 or request.body.find('|') > -1 or request.body.find('...') > -1: - logging.writeToFile('Bad Input on.') + try: + #logging.writeToFile(request.body) + data = json.loads(request.body) + for key, value in data.iteritems(): + if request.path.find('gitNotify') > -1: + break + + # if request.path.find('users') > -1 or request.path.find('firewall') > -1 or request.path.find('servicesAction') > -1 or request.path.find('sslForHostName') > -1: + # logging.writeToFile(request.body) + # final_dic = {'error_message': "Data supplied is not accepted.", + # "errorMessage": "Data supplied is not accepted."} + # final_json = json.dumps(final_dic) + # return HttpResponse(final_json) + + if type(value) == str or type(value) == unicode: + pass + else: + continue + + if request.build_absolute_uri().find('saveSpamAssassinConfigurations') > -1 or request.build_absolute_uri().find('docker') > -1 or request.build_absolute_uri().find('cloudAPI') > -1 or request.build_absolute_uri().find('filemanager') > -1 or request.build_absolute_uri().find('verifyLogin') > -1 or request.build_absolute_uri().find('submitUserCreation') > -1: + continue + if key == 'backupDestinations' or key == 'ports' or key == 'imageByPass' or key == 'passwordByPass' or key == 'cronCommand' or key == 'emailMessage' or key == 'configData' or key == 'rewriteRules' or key == 'modSecRules' or key == 'recordContentTXT' or key == 'SecAuditLogRelevantStatus' or key == 'fileContent': + continue + if value.find(';') > -1 or value.find('&&') > -1 or value.find('|') > -1 or value.find('...') > -1 \ + or value.find("`") > -1 or value.find("$") > -1 or value.find("(") > -1 or value.find(")") > -1 \ + or value.find("'") > -1 or value.find("[") > -1 or value.find("]") > -1 or value.find("{") > -1 or value.find("}") > -1\ + or value.find(":") > -1 or value.find("<") > -1 or value.find(">") > -1: + logging.writeToFile(request.body) + final_dic = {'error_message': "Data supplied is not accepted.", + "errorMessage": "Data supplied is not accepted."} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + if key.find(';') > -1 or key.find('&&') > -1 or key.find('|') > -1 or key.find('...') > -1 \ + or key.find("`") > -1 or key.find("$") > -1 or key.find("(") > -1 or key.find(")") > -1 \ + or key.find("'") > -1 or key.find("[") > -1 or key.find("]") > -1 or key.find("{") > -1 or key.find("}") > -1\ + or key.find(":") > -1 or key.find("<") > -1 or key.find(">") > -1: + logging.writeToFile(request.body) + final_dic = {'error_message': "Data supplied is not accepted.", "errorMessage": "Data supplied is not accepted."} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + except BaseException, msg: + logging.writeToFile(str(msg)) + response = self.get_response(request) + return response response = self.get_response(request) - return response \ No newline at end of file + return response diff --git a/CyberCP/settings.py b/CyberCP/settings.py index ba653da73..5962bfcd8 100644 --- a/CyberCP/settings.py +++ b/CyberCP/settings.py @@ -24,13 +24,10 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) SECRET_KEY = 'xr%j*p!*$0d%(-(e%@-*hyoz4$f%y77coq0u)6pwmjg4)q&19f' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = False +DEBUG = True ALLOWED_HOSTS = ['*'] - - - # Application definition INSTALLED_APPS = [ @@ -58,7 +55,17 @@ INSTALLED_APPS = [ 'manageSSL', 'api', 'filemanager', - 'emailPremium' + 'manageServices', + 'pluginHolder', + 'emailPremium', + 'emailMarketing', + 'cloudAPI', + 'highAvailability', + 's3Backups', + 'dockerManager', + 'containerization', + 'CLManager', + 'IncBackups' ] MIDDLEWARE = [ @@ -66,7 +73,7 @@ MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', - + 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', @@ -106,7 +113,7 @@ DATABASES = { 'USER': 'cyberpanel', 'PASSWORD': 'Bz9gF7Hr7X4RtD', 'HOST': '127.0.0.1', - 'PORT':'3307' + 'PORT':'3306' }, 'rootdb': { 'ENGINE': 'django.db.backends.mysql', @@ -153,7 +160,6 @@ USE_L10N = True USE_TZ = True - # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.11/howto/static-files/ @@ -176,4 +182,11 @@ LANGUAGES = ( ('ru', _('Russian')), ('tr', _('Turkish')), ('es', _('Spanish')), + ('fr', _('French')), + ('pl', _('Polish')), + ('vi', _('Vietnamese')), + ('it', _('Italian')), ) + +MEDIA_URL = '/home/cyberpanel/media/' +MEDIA_ROOT = MEDIA_URL diff --git a/CyberCP/urls.py b/CyberCP/urls.py index f69178e01..121b0b468 100644 --- a/CyberCP/urls.py +++ b/CyberCP/urls.py @@ -36,4 +36,12 @@ urlpatterns = [ url(r'^api/',include('api.urls')), url(r'^filemanager/',include('filemanager.urls')), url(r'^emailPremium/',include('emailPremium.urls')), + url(r'^manageservices/',include('manageServices.urls')), + url(r'^plugins/',include('pluginHolder.urls')), + url(r'^emailMarketing/', include('emailMarketing.urls')), + url(r'^cloudAPI/', include('cloudAPI.urls')), + url(r'^docker/', include('dockerManager.urls')), + url(r'^container/', include('containerization.urls')), + url(r'^CloudLinux/', include('CLManager.urls')), + url(r'^IncrementalBackups/', include('IncBackups.urls')), ] diff --git a/IncBackups/IncBackups.py b/IncBackups/IncBackups.py new file mode 100644 index 000000000..4278013b0 --- /dev/null +++ b/IncBackups/IncBackups.py @@ -0,0 +1,375 @@ +#!/usr/local/CyberCP/bin/python2 +import os,sys +sys.path.append('/usr/local/CyberCP') +import django +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") +django.setup() +import threading as multi +from plogical.processUtilities import ProcessUtilities +import time +from .models import IncJob, JobSnapshots +from websiteFunctions.models import Websites +import plogical.randomPassword as randomPassword +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +from xml.etree.ElementTree import Element, SubElement +from xml.etree import ElementTree +from xml.dom import minidom +from backup.models import DBUsers +import plogical.mysqlUtilities as mysqlUtilities +from plogical.backupUtilities import backupUtilities +from plogical.dnsUtilities import DNS +from mailServer.models import Domains as eDomains +from random import randint + + +class IncJobs(multi.Thread): + + def __init__(self, function, extraArgs): + multi.Thread.__init__(self) + self.function = function + self.extraArgs = extraArgs + self.repoPath = '' + self.passwordFile = '' + self.statusPath = '' + self.website = '' + self.backupDestinations = '' + self.jobid = 0 + + def run(self): + + if self.function == 'createBackup': + self.createBackup() + + def prepareBackupMeta(self): + try: + + ######### Generating meta + + ## XML Generation + + metaFileXML = Element('metaFile') + + child = SubElement(metaFileXML, 'masterDomain') + child.text = self.website.domain + + child = SubElement(metaFileXML, 'phpSelection') + child.text = self.website.phpSelection + + child = SubElement(metaFileXML, 'externalApp') + child.text = self.website.externalApp + + childDomains = self.website.childdomains_set.all() + + databases = self.website.databases_set.all() + + ## Child domains XML + + childDomainsXML = Element('ChildDomains') + + for items in childDomains: + childDomainXML = Element('domain') + + child = SubElement(childDomainXML, 'domain') + child.text = items.domain + child = SubElement(childDomainXML, 'phpSelection') + child.text = items.phpSelection + child = SubElement(childDomainXML, 'path') + child.text = items.path + + childDomainsXML.append(childDomainXML) + + metaFileXML.append(childDomainsXML) + + ## Databases XML + + databasesXML = Element('Databases') + + for items in databases: + try: + dbuser = DBUsers.objects.get(user=items.dbUser) + userToTry = items.dbUser + except: + dbusers = DBUsers.objects.all().filter(user=items.dbUser) + userToTry = items.dbUser + for it in dbusers: + dbuser = it + break + + userToTry = mysqlUtilities.mysqlUtilities.fetchuser(items.dbUser) + + try: + dbuser = DBUsers.objects.get(user=userToTry) + except: + dbusers = DBUsers.objects.all().filter(user=userToTry) + for it in dbusers: + dbuser = it + break + + databaseXML = Element('database') + + child = SubElement(databaseXML, 'dbName') + child.text = items.dbName + child = SubElement(databaseXML, 'dbUser') + child.text = userToTry + child = SubElement(databaseXML, 'password') + child.text = dbuser.password + + databasesXML.append(databaseXML) + + metaFileXML.append(databasesXML) + + ## Get Aliases + + aliasesXML = Element('Aliases') + + aliases = backupUtilities.getAliases(self.website.domain) + + for items in aliases: + child = SubElement(aliasesXML, 'alias') + child.text = items + + metaFileXML.append(aliasesXML) + + ## Finish Alias + + ## DNS Records XML + + try: + + dnsRecordsXML = Element("dnsrecords") + dnsRecords = DNS.getDNSRecords(self.website.domain) + + for items in dnsRecords: + dnsRecordXML = Element('dnsrecord') + + child = SubElement(dnsRecordXML, 'type') + child.text = items.type + child = SubElement(dnsRecordXML, 'name') + child.text = items.name + child = SubElement(dnsRecordXML, 'content') + child.text = items.content + child = SubElement(dnsRecordXML, 'priority') + child.text = str(items.prio) + + dnsRecordsXML.append(dnsRecordXML) + + metaFileXML.append(dnsRecordsXML) + + except BaseException, msg: + logging.statusWriter(self.statusPath, '%s. [158:prepMeta]' % (str(msg)), 1) + + ## Email accounts XML + + try: + emailRecordsXML = Element('emails') + eDomain = eDomains.objects.get(domain=self.website.domain) + emailAccounts = eDomain.eusers_set.all() + + for items in emailAccounts: + emailRecordXML = Element('emailAccount') + + child = SubElement(emailRecordXML, 'email') + child.text = items.email + child = SubElement(emailRecordXML, 'password') + child.text = items.password + + emailRecordsXML.append(emailRecordXML) + + metaFileXML.append(emailRecordsXML) + except BaseException, msg: + logging.writeToFile(self.statusPath, '%s. [warning:179:prepMeta]' % (str(msg)), 1) + + ## Email meta generated! + + def prettify(elem): + """Return a pretty-printed XML string for the Element. + """ + rough_string = ElementTree.tostring(elem, 'utf-8') + reparsed = minidom.parseString(rough_string) + return reparsed.toprettyxml(indent=" ") + + ## /home/example.com/backup/backup-example.com-02.13.2018_10-24-52/meta.xml -- metaPath + + metaPath = '/home/cyberpanel/%s' % (str(randint(1000, 9999))) + + xmlpretty = prettify(metaFileXML).encode('ascii', 'ignore') + metaFile = open(metaPath, 'w') + metaFile.write(xmlpretty) + metaFile.close() + os.chmod(metaPath, 0640) + + ## meta generated + + logging.statusWriter(self.statusPath, 'Meta data is ready..', 1) + + metaPathNew = '/home/%s/meta.xml' % (self.website.domain) + command = 'mv %s %s' % (metaPath, metaPathNew) + ProcessUtilities.executioner(command) + + command = 'chown %s:%s %s' % (self.website.externalApp, self.website.externalApp, metaPathNew) + ProcessUtilities.executioner(command) + + return 1 + + except BaseException, msg: + logging.statusWriter(self.statusPath, "%s [207][5009]" % (str(msg)), 1) + return 0 + + def backupData(self): + try: + logging.statusWriter(self.statusPath, 'Backing up data..', 1) + + if self.backupDestinations == 'local': + backupPath = '/home/%s' % (self.website.domain) + command = 'restic -r %s backup %s --password-file %s --exclude %s' % (self.repoPath, backupPath, self.passwordFile, self.repoPath) + snapShotid = ProcessUtilities.outputExecutioner(command).split(' ')[-2] + + newSnapshot = JobSnapshots(job=self.jobid, type='data:%s' % (backupPath), snapshotid=snapShotid, destination=self.backupDestinations) + newSnapshot.save() + + + elif self.backupDestinations[:4] == 'sftp': + remotePath = '/home/backup/%s' % (self.website.domain) + backupPath = '/home/%s' % (self.website.domain) + command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s backup %s --password-file %s --exclude %s' % (self.backupDestinations, remotePath, backupPath, self.passwordFile, self.repoPath) + snapShotid = ProcessUtilities.outputExecutioner(command).split(' ')[-2] + newSnapshot = JobSnapshots(job=self.jobid, type='data:%s' % (remotePath), snapshotid=snapShotid, + destination=self.backupDestinations) + newSnapshot.save() + + logging.statusWriter(self.statusPath, 'Data for %s backed to %s.' % (self.website.domain, self.backupDestinations), 1) + return 1 + except BaseException, msg: + logging.statusWriter(self.statusPath,'%s. [IncJobs.backupData.223][5009]' % str(msg), 1) + return 0 + + def backupDatabases(self): + try: + logging.statusWriter(self.statusPath, 'Backing up databases..', 1) + + databases = self.website.databases_set.all() + + for items in databases: + if mysqlUtilities.mysqlUtilities.createDatabaseBackup(items.dbName, '/home/cyberpanel') == 0: + return 0 + + dbPath = '/home/cyberpanel/%s.sql' % (items.dbName) + + if self.backupDestinations == 'local': + command = 'restic -r %s backup %s --password-file %s' % (self.repoPath, dbPath, self.passwordFile) + snapShotid = ProcessUtilities.outputExecutioner(command).split(' ')[-2] + + newSnapshot = JobSnapshots(job=self.jobid, type='database:%s' % (items.dbName), snapshotid=snapShotid, destination=self.backupDestinations) + newSnapshot.save() + + elif self.backupDestinations[:4] == 'sftp': + remotePath = '/home/backup/%s' % (self.website.domain) + command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s backup %s --password-file %s --exclude %s' % ( + self.backupDestinations, remotePath, dbPath, self.passwordFile, self.repoPath) + snapShotid = ProcessUtilities.outputExecutioner(command).split(' ')[-2] + newSnapshot = JobSnapshots(job=self.jobid, type='database:%s' % (items.dbName), snapshotid=snapShotid, + destination=self.backupDestinations) + newSnapshot.save() + return 1 + except BaseException, msg: + logging.statusWriter(self.statusPath,'%s. [IncJobs.backupDatabases.269][5009]' % str(msg), 1) + return 0 + + def emailBackup(self): + try: + logging.statusWriter(self.statusPath, 'Backing up emails..', 1) + + backupPath = '/home/vmail/%s' % (self.website.domain) + + if os.path.exists(backupPath): + if self.backupDestinations == 'local': + logging.statusWriter(self.statusPath, 'hello world', 1) + command = 'restic -r %s backup %s --password-file %s' % ( + self.repoPath, backupPath, self.passwordFile) + snapShotid = ProcessUtilities.outputExecutioner(command).split(' ')[-2] + + newSnapshot = JobSnapshots(job=self.jobid, type='email:%s' % (backupPath), snapshotid=snapShotid, + destination=self.backupDestinations) + newSnapshot.save() + logging.statusWriter(self.statusPath, 'hello world 2', 1) + + elif self.backupDestinations[:4] == 'sftp': + remotePath = '/home/backup/%s' % (self.website.domain) + command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s backup %s --password-file %s --exclude %s' % ( + self.backupDestinations, remotePath, backupPath, self.passwordFile, self.repoPath) + snapShotid = ProcessUtilities.outputExecutioner(command).split(' ')[-2] + newSnapshot = JobSnapshots(job=self.jobid, type='email:%s' % (backupPath), snapshotid=snapShotid, + destination=self.backupDestinations) + newSnapshot.save() + + logging.statusWriter(self.statusPath, 'Emails for %s backed to %s.' % (self.website.domain, self.backupDestinations), 1) + return 1 + except BaseException, msg: + logging.statusWriter(self.statusPath,'%s. [IncJobs.backupDatabases.269][5009]' % str(msg), 1) + return 0 + + def initiateRepo(self): + try: + logging.statusWriter(self.statusPath, 'Will first initiate backup repo..', 1) + + if self.backupDestinations == 'local': + command = 'restic init --repo %s --password-file %s' % (self.repoPath, self.passwordFile) + ProcessUtilities.executioner(command, self.website.externalApp) + + elif self.backupDestinations[:4] == 'sftp': + remotePath = '/home/backup/%s' % (self.website.domain) + command = 'export PATH=${PATH}:/usr/bin && restic init --repo %s:%s --password-file %s' % (self.backupDestinations, remotePath, self.passwordFile) + ProcessUtilities.executioner(command) + + logging.statusWriter(self.statusPath, 'Repo %s initiated for %s.' % (self.backupDestinations, self.website.domain), 1) + return 1 + except BaseException, msg: + logging.statusWriter(self.statusPath,'%s. [IncJobs.initiateRepo.47][5009]' % str(msg), 1) + return 0 + + def createBackup(self): + self.statusPath = self.extraArgs['tempPath'] + website = self.extraArgs['website'] + self.backupDestinations = self.extraArgs['backupDestinations'] + websiteData = self.extraArgs['websiteData'] + websiteEmails = self.extraArgs['websiteEmails'] + websiteSSLs = self.extraArgs['websiteSSLs'] + websiteDatabases = self.extraArgs['websiteDatabases'] + + self.website = Websites.objects.get(domain=website) + + newJob = IncJob(website=self.website) + newJob.save() + + self.jobid = newJob + + self.passwordFile = '/home/%s/%s' % (self.website.domain, self.website.domain) + password = randomPassword.generate_pass() + + self.repoPath = '/home/%s/incbackup' % (self.website.domain) + + if not os.path.exists(self.passwordFile): + command = 'echo "%s" > %s' % (password, self.passwordFile) + ProcessUtilities.executioner(command, self.website.externalApp) + + + if self.initiateRepo() == 0: + return + + if self.prepareBackupMeta() == 0: + return + + if websiteData: + if self.backupData() == 0: + return + + if websiteDatabases: + if self.backupDatabases() == 0: + return + + + if websiteEmails: + if self.emailBackup() == 0: + return + + logging.statusWriter(self.statusPath, 'Completed', 1) \ No newline at end of file diff --git a/IncBackups/IncBackupsControl.py b/IncBackups/IncBackupsControl.py new file mode 100644 index 000000000..52c0b653a --- /dev/null +++ b/IncBackups/IncBackupsControl.py @@ -0,0 +1,541 @@ +#!/usr/local/CyberCP/bin/python2 +import os +import os.path +import sys +sys.path.append('/usr/local/CyberCP') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") + +import django +try: + django.setup() +except: + pass +import threading as multi +from plogical.processUtilities import ProcessUtilities +from models import IncJob, JobSnapshots +from websiteFunctions.models import Websites +import plogical.randomPassword as randomPassword +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +from xml.etree.ElementTree import Element, SubElement +from xml.etree import ElementTree +from xml.dom import minidom +from backup.models import DBUsers +import plogical.mysqlUtilities as mysqlUtilities +from plogical.backupUtilities import backupUtilities +from plogical.dnsUtilities import DNS +from mailServer.models import Domains as eDomains +from random import randint +try: + from plogical.virtualHostUtilities import virtualHostUtilities + from plogical.mailUtilities import mailUtilities +except: + pass + +class IncJobs(multi.Thread): + + def __init__(self, function, extraArgs): + multi.Thread.__init__(self) + self.function = function + self.extraArgs = extraArgs + self.repoPath = '' + self.passwordFile = '' + self.statusPath = '' + self.website = '' + self.backupDestinations = '' + self.jobid = 0 + self.metaPath = '' + + def run(self): + + if self.function == 'createBackup': + self.createBackup() + elif self.function == 'restorePoint': + self.restorePoint() + + def restoreData(self): + try: + + if self.jobid.destination == 'local': + repoLocation = '/home/%s/incbackup' % (self.website) + command = 'restic -r %s restore %s --target / --password-file %s' % (repoLocation, self.jobid.snapshotid, self.passwordFile) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + elif self.jobid.destination[:4] == 'sftp': + repoLocation = '/home/backup/%s' % (self.website) + command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s restore %s --target / --password-file %s' % (self.jobid.destination, repoLocation, self.jobid.snapshotid, self.passwordFile) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + + except BaseException, msg: + logging.statusWriter(self.statusPath, "%s [46][5009]" % (str(msg)), 1) + return 0 + + def restoreDatabase(self): + try: + + if self.jobid.destination == 'local': + repoLocation = '/home/%s/incbackup' % (self.website) + command = 'restic -r %s restore %s --target / --password-file %s' % (repoLocation, self.jobid.snapshotid, self.passwordFile) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + elif self.jobid.destination[:4] == 'sftp': + repoLocation = '/home/backup/%s' % (self.website) + command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s restore %s --target / --password-file %s' % (self.jobid.destination, repoLocation, self.jobid.snapshotid, self.passwordFile) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + + if mysqlUtilities.mysqlUtilities.restoreDatabaseBackup(self.jobid.type.split(':')[1], '/home/cyberpanel', 'dummy', 'dummy') == 0: + raise BaseException + + try: + os.remove('/home/cyberpanel/%s' % (self.jobid.type.split(':')[1])) + except: + pass + + except BaseException, msg: + logging.statusWriter(self.statusPath, "%s [46][5009]" % (str(msg)), 1) + return 0 + + def restoreEmail(self): + try: + + if self.jobid.destination == 'local': + repoLocation = '/home/%s/incbackup' % (self.website) + command = 'restic -r %s restore %s --target / --password-file %s' % (repoLocation, self.jobid.snapshotid, self.passwordFile) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + elif self.jobid.destination[:4] == 'sftp': + repoLocation = '/home/backup/%s' % (self.website) + command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s restore %s --target / --password-file %s' % (self.jobid.destination, repoLocation, self.jobid.snapshotid, self.passwordFile) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + + except BaseException, msg: + logging.statusWriter(self.statusPath, "%s [46][5009]" % (str(msg)), 1) + return 0 + + def restorePoint(self): + try: + self.statusPath = self.extraArgs['tempPath'] + self.website = self.extraArgs['website'] + jobid = self.extraArgs['jobid'] + + self.jobid = JobSnapshots.objects.get(pk=jobid) + + message = 'Starting restore of %s for %s.' % (self.jobid.snapshotid, self.website) + logging.statusWriter(self.statusPath, message, 1) + self.passwordFile = '/home/%s/%s' % (self.website, self.website) + + + ## Restore Meta first + metaPathNew = '/home/%s/meta.xml' % (self.website) + if self.jobid.destination == 'local': + repoLocation = '/home/%s/incbackup' % (self.website) + command = 'restic -r %s restore latest --target / --password-file %s --include %s' % (repoLocation, self.passwordFile, metaPathNew) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + elif self.jobid.destination[:4] == 'sftp': + repoLocation = '/home/backup/%s' % (self.website) + command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s restore latest --target / --password-file %s --include %s' % (self.jobid.destination, repoLocation, self.passwordFile, metaPathNew) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + + ## Reconstruct configs configs + + if self.extraArgs['reconstruct']: + execPath = "nice -n 10 /usr/local/CyberCP/bin/python2 " + virtualHostUtilities.cyberPanel + "/IncBackups/restoreMeta.py" + execPath = execPath + " submitRestore --metaPath %s --statusFile %s" % (metaPathNew, self.statusPath) + ProcessUtilities.outputExecutioner(execPath) + + ## + + if self.jobid.type[:8] == 'database': + message = 'Restoring database..' + logging.statusWriter(self.statusPath, message, 1) + self.restoreDatabase() + message = 'Database restored.' + logging.statusWriter(self.statusPath, message, 1) + elif self.jobid.type[:4] == 'data': + self.restoreData() + elif self.jobid.type[:5] == 'email': + message = 'Restoring email..' + logging.statusWriter(self.statusPath, message, 1) + self.restoreEmail() + message = 'Emails restored.' + logging.statusWriter(self.statusPath, message, 1) + + logging.statusWriter(self.statusPath, 'Completed', 1) + except BaseException, msg: + logging.statusWriter(self.extraArgs['tempPath'], str(msg), 1) + + def prepareBackupMeta(self): + try: + + ######### Generating meta + + ## XML Generation + + metaFileXML = Element('metaFile') + + child = SubElement(metaFileXML, 'masterDomain') + child.text = self.website.domain + + child = SubElement(metaFileXML, 'phpSelection') + child.text = self.website.phpSelection + + child = SubElement(metaFileXML, 'externalApp') + child.text = self.website.externalApp + + childDomains = self.website.childdomains_set.all() + + databases = self.website.databases_set.all() + + ## Child domains XML + + childDomainsXML = Element('ChildDomains') + + for items in childDomains: + childDomainXML = Element('domain') + + child = SubElement(childDomainXML, 'domain') + child.text = items.domain + child = SubElement(childDomainXML, 'phpSelection') + child.text = items.phpSelection + child = SubElement(childDomainXML, 'path') + child.text = items.path + + childDomainsXML.append(childDomainXML) + + metaFileXML.append(childDomainsXML) + + ## Databases XML + + databasesXML = Element('Databases') + + for items in databases: + try: + dbuser = DBUsers.objects.get(user=items.dbUser) + userToTry = items.dbUser + except: + dbusers = DBUsers.objects.all().filter(user=items.dbUser) + userToTry = items.dbUser + for it in dbusers: + dbuser = it + break + + userToTry = mysqlUtilities.mysqlUtilities.fetchuser(items.dbUser) + + try: + dbuser = DBUsers.objects.get(user=userToTry) + except: + dbusers = DBUsers.objects.all().filter(user=userToTry) + for it in dbusers: + dbuser = it + break + + databaseXML = Element('database') + + child = SubElement(databaseXML, 'dbName') + child.text = items.dbName + child = SubElement(databaseXML, 'dbUser') + child.text = userToTry + child = SubElement(databaseXML, 'password') + child.text = dbuser.password + + databasesXML.append(databaseXML) + + metaFileXML.append(databasesXML) + + ## Get Aliases + + aliasesXML = Element('Aliases') + + aliases = backupUtilities.getAliases(self.website.domain) + + for items in aliases: + child = SubElement(aliasesXML, 'alias') + child.text = items + + metaFileXML.append(aliasesXML) + + ## Finish Alias + + ## DNS Records XML + + try: + + dnsRecordsXML = Element("dnsrecords") + dnsRecords = DNS.getDNSRecords(self.website.domain) + + for items in dnsRecords: + dnsRecordXML = Element('dnsrecord') + + child = SubElement(dnsRecordXML, 'type') + child.text = items.type + child = SubElement(dnsRecordXML, 'name') + child.text = items.name + child = SubElement(dnsRecordXML, 'content') + child.text = items.content + child = SubElement(dnsRecordXML, 'priority') + child.text = str(items.prio) + + dnsRecordsXML.append(dnsRecordXML) + + metaFileXML.append(dnsRecordsXML) + + except BaseException, msg: + logging.statusWriter(self.statusPath, '%s. [158:prepMeta]' % (str(msg)), 1) + + ## Email accounts XML + + try: + emailRecordsXML = Element('emails') + eDomain = eDomains.objects.get(domain=self.website.domain) + emailAccounts = eDomain.eusers_set.all() + + for items in emailAccounts: + emailRecordXML = Element('emailAccount') + + child = SubElement(emailRecordXML, 'email') + child.text = items.email + child = SubElement(emailRecordXML, 'password') + child.text = items.password + + emailRecordsXML.append(emailRecordXML) + + metaFileXML.append(emailRecordsXML) + except BaseException, msg: + logging.statusWriter(self.statusPath, '%s. [warning:179:prepMeta]' % (str(msg)), 1) + + ## Email meta generated! + + def prettify(elem): + """Return a pretty-printed XML string for the Element. + """ + rough_string = ElementTree.tostring(elem, 'utf-8') + reparsed = minidom.parseString(rough_string) + return reparsed.toprettyxml(indent=" ") + + ## /home/example.com/backup/backup-example.com-02.13.2018_10-24-52/meta.xml -- metaPath + + metaPath = '/home/cyberpanel/%s' % (str(randint(1000, 9999))) + + xmlpretty = prettify(metaFileXML).encode('ascii', 'ignore') + metaFile = open(metaPath, 'w') + metaFile.write(xmlpretty) + metaFile.close() + os.chmod(metaPath, 0640) + + ## meta generated + + logging.statusWriter(self.statusPath, 'Meta data is ready..', 1) + + metaPathNew = '/home/%s/meta.xml' % (self.website.domain) + command = 'mv %s %s' % (metaPath, metaPathNew) + ProcessUtilities.executioner(command) + + return 1 + + except BaseException, msg: + logging.statusWriter(self.statusPath, "%s [207][5009]" % (str(msg)), 1) + return 0 + + def backupData(self): + try: + logging.statusWriter(self.statusPath, 'Backing up data..', 1) + + if self.backupDestinations == 'local': + backupPath = '/home/%s' % (self.website.domain) + command = 'restic -r %s backup %s --password-file %s --exclude %s' % (self.repoPath, backupPath, self.passwordFile, self.repoPath) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + snapShotid = result.split(' ')[-2] + + newSnapshot = JobSnapshots(job=self.jobid, type='data:%s' % (backupPath), snapshotid=snapShotid, destination=self.backupDestinations) + newSnapshot.save() + + elif self.backupDestinations[:4] == 'sftp': + remotePath = '/home/backup/%s' % (self.website.domain) + backupPath = '/home/%s' % (self.website.domain) + command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s backup %s --password-file %s --exclude %s' % (self.backupDestinations, remotePath, backupPath, self.passwordFile, self.repoPath) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + snapShotid = result.split(' ')[-2] + newSnapshot = JobSnapshots(job=self.jobid, type='data:%s' % (remotePath), snapshotid=snapShotid, + destination=self.backupDestinations) + newSnapshot.save() + + logging.statusWriter(self.statusPath, 'Data for %s backed to %s.' % (self.website.domain, self.backupDestinations), 1) + return 1 + except BaseException, msg: + logging.statusWriter(self.statusPath,'%s. [IncJobs.backupData.223][5009]' % str(msg), 1) + return 0 + + def backupDatabases(self): + try: + logging.statusWriter(self.statusPath, 'Backing up databases..', 1) + + databases = self.website.databases_set.all() + + for items in databases: + if mysqlUtilities.mysqlUtilities.createDatabaseBackup(items.dbName, '/home/cyberpanel') == 0: + return 0 + + dbPath = '/home/cyberpanel/%s.sql' % (items.dbName) + + if self.backupDestinations == 'local': + command = 'restic -r %s backup %s --password-file %s' % (self.repoPath, dbPath, self.passwordFile) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + snapShotid = result.split(' ')[-2] + + newSnapshot = JobSnapshots(job=self.jobid, type='database:%s' % (items.dbName), snapshotid=snapShotid, destination=self.backupDestinations) + newSnapshot.save() + + elif self.backupDestinations[:4] == 'sftp': + remotePath = '/home/backup/%s' % (self.website.domain) + command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s backup %s --password-file %s --exclude %s' % ( + self.backupDestinations, remotePath, dbPath, self.passwordFile, self.repoPath) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + snapShotid = result.split(' ')[-2] + newSnapshot = JobSnapshots(job=self.jobid, type='database:%s' % (items.dbName), snapshotid=snapShotid, + destination=self.backupDestinations) + newSnapshot.save() + + try: + os.remove('/home/cyberpanel/%s' % (items.dbName)) + except: + pass + return 1 + except BaseException, msg: + logging.statusWriter(self.statusPath,'%s. [IncJobs.backupDatabases.269][5009]' % str(msg), 1) + return 0 + + def emailBackup(self): + try: + logging.statusWriter(self.statusPath, 'Backing up emails..', 1) + + backupPath = '/home/vmail/%s' % (self.website.domain) + + if self.backupDestinations == 'local': + command = 'restic -r %s backup %s --password-file %s' % ( + self.repoPath, backupPath, self.passwordFile) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + snapShotid = result.split(' ')[-2] + + newSnapshot = JobSnapshots(job=self.jobid, type='email:%s' % (backupPath), snapshotid=snapShotid, + destination=self.backupDestinations) + newSnapshot.save() + + elif self.backupDestinations[:4] == 'sftp': + remotePath = '/home/backup/%s' % (self.website.domain) + command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s backup %s --password-file %s --exclude %s' % ( + self.backupDestinations, remotePath, backupPath, self.passwordFile, self.repoPath) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + snapShotid = result.split(' ')[-2] + newSnapshot = JobSnapshots(job=self.jobid, type='email:%s' % (backupPath), snapshotid=snapShotid, + destination=self.backupDestinations) + newSnapshot.save() + + + logging.statusWriter(self.statusPath, 'Emails for %s backed to %s.' % (self.website.domain, self.backupDestinations), 1) + return 1 + except BaseException, msg: + logging.statusWriter(self.statusPath,'%s. [IncJobs.emailBackup.269][5009]' % str(msg), 1) + return 0 + + def initiateRepo(self): + try: + logging.statusWriter(self.statusPath, 'Will first initiate backup repo..', 1) + + if self.backupDestinations == 'local': + command = 'restic init --repo %s --password-file %s' % (self.repoPath, self.passwordFile) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + + elif self.backupDestinations[:4] == 'sftp': + remotePath = '/home/backup/%s' % (self.website.domain) + command = 'export PATH=${PATH}:/usr/bin && restic init --repo %s:%s --password-file %s' % (self.backupDestinations, remotePath, self.passwordFile) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + else: + logging.statusWriter(self.statusPath, 'AWS implementation is currently pending. [5009]', 1) + return 0 + + logging.statusWriter(self.statusPath, 'Repo %s initiated for %s.' % (self.backupDestinations, self.website.domain), 1) + return 1 + except BaseException, msg: + logging.statusWriter(self.statusPath,'%s. [IncJobs.initiateRepo.47][5009]' % str(msg), 1) + return 0 + + def createBackup(self): + self.statusPath = self.extraArgs['tempPath'] + website = self.extraArgs['website'] + self.backupDestinations = self.extraArgs['backupDestinations'] + websiteData = self.extraArgs['websiteData'] + websiteEmails = self.extraArgs['websiteEmails'] + websiteSSLs = self.extraArgs['websiteSSLs'] + websiteDatabases = self.extraArgs['websiteDatabases'] + + self.website = Websites.objects.get(domain=website) + + newJob = IncJob(website=self.website) + newJob.save() + + self.jobid = newJob + + self.passwordFile = '/home/%s/%s' % (self.website.domain, self.website.domain) + + self.repoPath = '/home/%s/incbackup' % (self.website.domain) + + if not os.path.exists(self.passwordFile): + password = randomPassword.generate_pass() + command = 'echo "%s" > %s' % (password, self.passwordFile) + ProcessUtilities.executioner(command, self.website.externalApp) + + + if self.initiateRepo() == 0: + return + + if self.prepareBackupMeta() == 0: + return + + if websiteData: + if self.backupData() == 0: + return + + if websiteDatabases: + if self.backupDatabases() == 0: + return + + if websiteEmails: + if self.emailBackup() == 0: + return + + ## meta generated + + logging.statusWriter(self.statusPath, 'Taking backup of meta file, this file can be used to reconstruct at later point..', 1) + + metaPathNew = '/home/%s/meta.xml' % (self.website.domain) + + if self.backupDestinations == 'local': + command = 'restic -r %s backup %s --password-file %s' % ( + self.repoPath, metaPathNew, self.passwordFile) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + elif self.backupDestinations[:4] == 'sftp': + remotePath = '/home/backup/%s' % (self.website.domain) + command = 'export PATH=${PATH}:/usr/bin && restic -r %s:%s backup %s --password-file %s --exclude %s' % ( + self.backupDestinations, remotePath, metaPathNew, self.passwordFile, self.repoPath) + result = ProcessUtilities.outputExecutioner(command) + logging.statusWriter(self.statusPath, result, 1) + + try: + os.remove(metaPathNew) + except: + pass + + logging.statusWriter(self.statusPath, 'Completed', 1) diff --git a/IncBackups/__init__.py b/IncBackups/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/IncBackups/admin.py b/IncBackups/admin.py new file mode 100644 index 000000000..13be29d96 --- /dev/null +++ b/IncBackups/admin.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib import admin + +# Register your models here. diff --git a/IncBackups/apps.py b/IncBackups/apps.py new file mode 100644 index 000000000..5511373f4 --- /dev/null +++ b/IncBackups/apps.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class IncbackupsConfig(AppConfig): + name = 'IncBackups' diff --git a/IncBackups/migrations/__init__.py b/IncBackups/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/IncBackups/models.py b/IncBackups/models.py new file mode 100644 index 000000000..877b97a56 --- /dev/null +++ b/IncBackups/models.py @@ -0,0 +1,15 @@ +from __future__ import unicode_literals + +from django.db import models +from websiteFunctions.models import Websites +from datetime import datetime + +class IncJob(models.Model): + website = models.ForeignKey(Websites) + date = models.DateTimeField(default=datetime.now, blank=True) + +class JobSnapshots(models.Model): + job = models.ForeignKey(IncJob) + type = models.CharField(max_length=300) + snapshotid = models.CharField(max_length=50) + destination = models.CharField(max_length=200, default='') \ No newline at end of file diff --git a/IncBackups/restoreMeta.py b/IncBackups/restoreMeta.py new file mode 100644 index 000000000..858fdfa24 --- /dev/null +++ b/IncBackups/restoreMeta.py @@ -0,0 +1,167 @@ +#!/usr/local/CyberCP/bin/python2 +import os +import os.path +import sys +sys.path.append('/usr/local/CyberCP') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") + +import django +try: + django.setup() +except: + pass +from websiteFunctions.models import Websites +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +from xml.etree import ElementTree +import plogical.mysqlUtilities as mysqlUtilities +from databases.models import Databases +import argparse +try: + from plogical.virtualHostUtilities import virtualHostUtilities + from plogical.mailUtilities import mailUtilities +except: + pass + +class restoreMeta(): + + @staticmethod + def startRestore(metaPath, statusPath): + try: + + ## extracting master domain for later use + backupMetaData = ElementTree.parse(metaPath) + masterDomain = backupMetaData.find('masterDomain').text + + ########### Creating child/sub/addon/parked domains + + logging.statusWriter(statusPath, "Creating Child Domains!", 1) + + ### Restoring Child Domains if any. + + childDomains = backupMetaData.findall('ChildDomains/domain') + + try: + for childDomain in childDomains: + + domain = childDomain.find('domain').text + phpSelection = childDomain.find('phpSelection').text + path = childDomain.find('path').text + + virtualHostUtilities.createDomain(masterDomain, domain, phpSelection, path, 0, 0, 0, + 'admin', 0) + except BaseException, msg: + logging.writeToFile(str(msg) + " [startRestore]") + return 0 + + ## Restore Aliases + + logging.statusWriter(statusPath, "Restoring Domain Aliases!", 1) + + aliases = backupMetaData.findall('Aliases/alias') + + for items in aliases: + virtualHostUtilities.createAlias(masterDomain, items.text, 0, "", "", "admin") + + ## Restoring email accounts + + logging.statusWriter(statusPath, "Restoring email accounts!", 1) + + emailAccounts = backupMetaData.findall('emails/emailAccount') + + try: + for emailAccount in emailAccounts: + + email = emailAccount.find('email').text + username = email.split("@")[0] + password = emailAccount.find('password').text + + result = mailUtilities.createEmailAccount(masterDomain, username, password) + if result[0] == 0: + logging.statusWriter(statusPath, 'Email existed, updating password according to last snapshot. %s' % (email)) + if mailUtilities.changeEmailPassword(email, password, 1)[0] == 0: + logging.statusWriter(statusPath, + 'Failed changing password for: %s' % ( + email)) + else: + logging.statusWriter(statusPath, + 'Password changed for: %s' % ( + email)) + + else: + logging.statusWriter(statusPath, + 'Email created: %s' % ( + email)) + + except BaseException, msg: + logging.writeToFile(str(msg) + " [startRestore]") + return 0 + + ## Emails restored + + ## restoring databases + + logging.statusWriter(statusPath, "Restoring Databases!", 1) + + ## Create databases + + databases = backupMetaData.findall('Databases/database') + website = Websites.objects.get(domain=masterDomain) + + for database in databases: + dbName = database.find('dbName').text + dbUser = database.find('dbUser').text + dbPassword = database.find('password').text + + try: + dbExist = Databases.objects.get(dbName=dbName) + logging.statusWriter(statusPath, 'Database exists, changing Database password.. %s' % (dbName)) + mysqlUtilities.mysqlUtilities.changePassword(dbUser, dbPassword, 1) + if mysqlUtilities.mysqlUtilities.changePassword(dbUser, dbPassword, 1) == 0: + logging.statusWriter(statusPath, 'Failed changing password for database: %s' % (dbName)) + else: + logging.statusWriter(statusPath, 'Password successfully changed for database: %s.' % (dbName)) + except: + logging.statusWriter(statusPath, 'Database did not exist, creating new.. %s' % (dbName)) + if mysqlUtilities.mysqlUtilities.createDatabase(dbName, dbUser, "cyberpanel") == 0: + logging.statusWriter(statusPath, 'Failed the creation of database: %s' % (dbName)) + else: + logging.statusWriter(statusPath, 'Database: %s successfully created.' % (dbName)) + + + try: + newDB = Databases(website=website, dbName=dbName, dbUser=dbUser) + newDB.save() + except: + pass + + + ## Databases restored + + try: + os.remove(metaPath) + except: + pass + + except BaseException, msg: + logging.writeToFile(str(msg) + " [startRestore]") + +def main(): + + parser = argparse.ArgumentParser(description='CyberPanel Installer') + parser.add_argument('function', help='Specific a function to call!') + parser.add_argument('--metaPath', help='') + parser.add_argument('--statusFile', help='!') + + ## backup restore arguments + + parser.add_argument('--backupFile', help='') + parser.add_argument('--dir', help='') + + + args = parser.parse_args() + + if args.function == "submitRestore": + restoreMeta.startRestore(args.metaPath,args.statusFile) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/IncBackups/static/IncBackups/IncBackups.js b/IncBackups/static/IncBackups/IncBackups.js new file mode 100644 index 000000000..36463bbb3 --- /dev/null +++ b/IncBackups/static/IncBackups/IncBackups.js @@ -0,0 +1,494 @@ +//*** Backup site ****// + +app.controller('createIncrementalBackups', function ($scope, $http, $timeout) { + + $scope.destination = true; + $scope.backupButton = true; + $scope.cyberpanelLoading = true; + $scope.runningBackup = true; + $scope.restoreSt = true; + + + $scope.fetchDetails = function () { + getBackupStatus(); + $scope.populateCurrentRecords(); + $scope.destination = false; + $scope.runningBackup = true; + }; + + function getBackupStatus() { + + $scope.cyberpanelLoadingBottom = false; + + url = "/IncrementalBackups/getBackupStatus"; + + var data = { + websiteToBeBacked: $scope.websiteToBeBacked, + tempPath: $scope.tempPath + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.backupStatus === 1) { + + if (response.data.abort === 1) { + $timeout.cancel(); + $scope.cyberpanelLoadingBottom = true; + $scope.destination = false; + $scope.runningBackup = false; + $scope.backupButton = false; + $scope.cyberpanelLoading = true; + $scope.fileName = response.data.fileName; + $scope.status = response.data.status; + $scope.populateCurrentRecords(); + return; + } else { + $scope.destination = true; + $scope.backupButton = true; + $scope.runningBackup = false; + + $scope.fileName = response.data.fileName; + $scope.status = response.data.status; + $timeout(getBackupStatus, 2000); + + } + } else { + $timeout.cancel(); + $scope.cyberpanelLoadingBottom = true; + $scope.cyberpanelLoading = true; + $scope.backupButton = false; + } + + } + + function cantLoadInitialDatas(response) { + } + + } + + $scope.destinationSelection = function () { + $scope.backupButton = false; + }; + + $scope.populateCurrentRecords = function () { + + url = "/IncrementalBackups/fetchCurrentBackups"; + + var data = { + websiteToBeBacked: $scope.websiteToBeBacked, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + if (response.data.status === 1) { + $scope.records = JSON.parse(response.data.data); + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + }; + + $scope.createBackup = function () { + + $scope.status = ''; + + $scope.cyberpanelLoading = false; + + + url = "/IncrementalBackups/submitBackupCreation"; + + var data = { + websiteToBeBacked: $scope.websiteToBeBacked, + backupDestinations: $scope.backupDestinations, + websiteData: $scope.websiteData, + websiteEmails: $scope.websiteEmails, + websiteSSLs: $scope.websiteSSLs, + websiteDatabases: $scope.websiteDatabases + + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.status === 1) { + $scope.tempPath = response.data.tempPath; + getBackupStatus(); + }else{ + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + } + + }; + + $scope.deleteBackup = function (id) { + + + url = "/IncrementalBackups/deleteBackup"; + + var data = { + backupID: id, + websiteToBeBacked: $scope.websiteToBeBacked + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.status === 1) { + + $scope.populateCurrentRecords(); + + }else{ + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + } + + + }; + + $scope.restore = function (id) { + + $scope.cyberpanelLoading = false; + + + url = "/IncrementalBackups/fetchRestorePoints"; + + var data = { + id: id, + websiteToBeBacked: $scope.websiteToBeBacked + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberpanelLoading = true; + if (response.data.status === 1) { + $scope.jobs = JSON.parse(response.data.data); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberpanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + }; + + $scope.restorePoint = function (id, reconstruct) { + + $scope.status = ''; + + $scope.cyberpanelLoading = false; + $scope.restoreSt = false; + + + url = "/IncrementalBackups/restorePoint"; + + var data = { + websiteToBeBacked: $scope.websiteToBeBacked, + jobid : id, + reconstruct: reconstruct + + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.status === 1) { + $scope.tempPath = response.data.tempPath; + getBackupStatus(); + } + + } + + function cantLoadInitialDatas(response) { + } + + }; + + +}); + +///** Backup site ends **/// + + +app.controller('incrementalDestinations', function ($scope, $http) { + $scope.cyberpanelLoading = true; + $scope.sftpHide = true; + $scope.awsHide = true; + + $scope.fetchDetails = function () { + + if ($scope.destinationType === 'SFTP') { + $scope.sftpHide = false; + $scope.populateCurrentRecords(); + } else { + $scope.sftpHide = true; + $scope.awsHide = false; + $scope.populateCurrentRecords(); + } + }; + + $scope.populateCurrentRecords = function () { + + $scope.cyberpanelLoading = false; + + + url = "/IncrementalBackups/populateCurrentRecords"; + + var type = 'SFTP'; + if ($scope.destinationType === 'SFTP') { + type = 'SFTP'; + } else { + type = 'AWS'; + } + + var data = { + type: type + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberpanelLoading = true; + if (response.data.status === 1) { + $scope.records = JSON.parse(response.data.data); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberpanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + }; + + $scope.addDestination = function (type) { + $scope.cyberpanelLoading = false; + + + url = "/IncrementalBackups/addDestination"; + + if (type === 'SFTP') { + var data = { + type: type, + IPAddress: $scope.IPAddress, + password: $scope.password, + backupSSHPort: $scope.backupSSHPort + }; + } else { + var data = { + type: type, + AWS_ACCESS_KEY_ID: $scope.AWS_ACCESS_KEY_ID, + AWS_SECRET_ACCESS_KEY: $scope.AWS_SECRET_ACCESS_KEY, + }; + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberpanelLoading = true; + $scope.populateCurrentRecords(); + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Destination successfully added.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberpanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + }; + + $scope.removeDestination = function (type, ipAddress) { + $scope.cyberpanelLoading = false; + + + url = "/IncrementalBackups/removeDestination"; + + var data = { + type: type, + IPAddress: ipAddress, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberpanelLoading = true; + $scope.populateCurrentRecords(); + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Destination successfully removed.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberpanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + }; + + +}); diff --git a/IncBackups/templates/IncBackups/createBackup.html b/IncBackups/templates/IncBackups/createBackup.html new file mode 100644 index 000000000..87b03f487 --- /dev/null +++ b/IncBackups/templates/IncBackups/createBackup.html @@ -0,0 +1,229 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "Create Incremental Backup" %}{% endblock %} +{% block content %} + + {% load static %} + + {% get_current_language as LANGUAGE_CODE %} + + +
    +
    +

    {% trans "Back up Website" %} - {% trans "Backup Docs" %} +

    +

    {% trans "This page can be used to create incremental backups for your websites." %}

    +
    + +
    +
    +

    + {% trans "Back up Website" %} +

    +
    + + +
    + + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + + + + +
    +
    +
    + +
    +
    +
    + + + + +
    + +
    + +
    +
    + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + +
    {% trans "ID" %}{% trans "Date" %}{% trans "Restore" %}{% trans "Delete" %}
    + Restore Points + +
    +
    +
    + + + + +
    + + +
    +
    +
    + + +
    + + +{% endblock %} \ No newline at end of file diff --git a/IncBackups/templates/IncBackups/incrementalDestinations.html b/IncBackups/templates/IncBackups/incrementalDestinations.html new file mode 100644 index 000000000..602cad196 --- /dev/null +++ b/IncBackups/templates/IncBackups/incrementalDestinations.html @@ -0,0 +1,186 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "Set up Back up Destinations" %}{% endblock %} +{% block content %} + + {% load static %} + + + {% get_current_language as LANGUAGE_CODE %} + + +
    +
    +

    {% trans "Set up Incremental Back up Destinations" %} - {% trans "Remote Backups" %} +

    +

    {% trans "On this page you can set up your Back up destinations. (SFTP and AWS)" %}

    +
    + +
    +
    +

    + {% trans "Set up Back up Destinations." %} +

    +
    + + +
    + +
    + +
    + +
    +
    + + + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + + +
    +
    + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + +
    {% trans "IP" %}{% trans "Port" %}{% trans "Delete" %}
    +
    +
    +
    + + + + + + + + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + + +
    +
    + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + +
    {% trans "AWS_ACCESS_KEY_ID" %}{% trans "Delete" %}
    +
    +
    +
    + + + + + + + +
    + + +
    +
    +
    + + +
    + + +{% endblock %} \ No newline at end of file diff --git a/IncBackups/tests.py b/IncBackups/tests.py new file mode 100644 index 000000000..5982e6bcd --- /dev/null +++ b/IncBackups/tests.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.test import TestCase + +# Create your tests here. diff --git a/IncBackups/urls.py b/IncBackups/urls.py new file mode 100644 index 000000000..6fd05681b --- /dev/null +++ b/IncBackups/urls.py @@ -0,0 +1,16 @@ +from django.conf.urls import url +import views + +urlpatterns = [ + url(r'^createBackup$', views.createBackup, name='createBackupInc'), + url(r'^backupDestinations$', views.backupDestinations, name='backupDestinationsInc'), + url(r'^addDestination$', views.addDestination, name='addDestinationInc'), + url(r'^populateCurrentRecords$', views.populateCurrentRecords, name='populateCurrentRecordsInc'), + url(r'^removeDestination$', views.removeDestination, name='removeDestinationInc'), + url(r'^fetchCurrentBackups$', views.fetchCurrentBackups, name='fetchCurrentBackupsInc'), + url(r'^submitBackupCreation$', views.submitBackupCreation, name='submitBackupCreationInc'), + url(r'^getBackupStatus$', views.getBackupStatus, name='getBackupStatusInc'), + url(r'^deleteBackup$', views.deleteBackup, name='deleteBackupInc'), + url(r'^fetchRestorePoints$', views.fetchRestorePoints, name='fetchRestorePointsInc'), + url(r'^restorePoint$', views.restorePoint, name='restorePointInc'), +] \ No newline at end of file diff --git a/IncBackups/views.py b/IncBackups/views.py new file mode 100644 index 000000000..edfe40d59 --- /dev/null +++ b/IncBackups/views.py @@ -0,0 +1,543 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.shortcuts import render +from plogical.acl import ACLManager +from django.shortcuts import HttpResponse +from plogical.processUtilities import ProcessUtilities +from plogical.virtualHostUtilities import virtualHostUtilities +import json +import os +from loginSystem.models import Administrator +from websiteFunctions.models import Websites +from .models import IncJob, JobSnapshots +from .IncBackupsControl import IncJobs +from random import randint +import time +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +# Create your views here. + + +def defRenderer(request, templateName, args): + return render(request, templateName, args) + +def createBackup(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'createBackup') == 0: + return ACLManager.loadError() + + websitesName = ACLManager.findAllSites(currentACL, userID) + + destinations = [] + destinations.append('local') + + path = '/home/cyberpanel/sftp' + + for items in os.listdir(path): + destinations.append('sftp:%s' % (items)) + + for items in os.listdir(path): + destinations.append('s3:s3.amazonaws.com/%s' % (items)) + + return defRenderer(request, 'IncBackups/createBackup.html', {'websiteList': websitesName, 'destinations': destinations}) + except BaseException, msg: + return HttpResponse(str(msg)) + +def backupDestinations(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: + return ACLManager.loadError() + + return defRenderer(request, 'IncBackups/incrementalDestinations.html', {}) + except BaseException, msg: + return HttpResponse(str(msg)) + +def addDestination(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: + return ACLManager.loadErrorJson('destStatus', 0) + + data = json.loads(request.body) + + if data['type'] == 'SFTP': + + ipAddress = data['IPAddress'] + password = data['password'] + + ipFile = '/home/cyberpanel/sftp/%s' % (ipAddress) + + try: + port = data['backupSSHPort'] + except: + port = "22" + + if os.path.exists(ipFile): + final_dic = {'status': 0, 'error_message': 'This destination already exists.'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + + try: + os.mkdir('/home/cyberpanel/sftp') + except: + pass + + + execPath = "/usr/local/CyberCP/bin/python2 " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" + execPath = execPath + " submitDestinationCreation --ipAddress " + ipAddress + " --password " \ + + password + " --port " + port + + output = ProcessUtilities.outputExecutioner(execPath) + + if output.find('1,') > -1: + + content = '%s\n%s' % (ipAddress, port) + writeToFile = open(ipFile, 'w') + writeToFile.write(content) + writeToFile.close() + + command = 'cat /root/.ssh/config' + currentConfig = ProcessUtilities.outputExecutioner(command) + + tmpFile = '/home/cyberpanel/sshconfig' + + writeToFile = open(tmpFile, 'w') + writeToFile.write(currentConfig) + + content = """Host %s + IdentityFile ~/.ssh/cyberpanel + Port %s + """ % (ipAddress, port) + writeToFile.write(content) + writeToFile.close() + + + command = 'mv %s /root/.ssh/config' % (tmpFile) + ProcessUtilities.executioner(command) + + command = 'chown root:root /root/.ssh/config' + ProcessUtilities.executioner(command) + + final_dic = {'status': 1, 'error_message': 'None'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + + else: + final_dic = {'status': 0, 'error_message': output} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + else: + aws = '/home/cyberpanel/aws' + + try: + os.mkdir(aws) + except: + pass + + AWS_ACCESS_KEY_ID = data['AWS_ACCESS_KEY_ID'] + AWS_SECRET_ACCESS_KEY = data['AWS_SECRET_ACCESS_KEY'] + + awsFile = '/home/cyberpanel/aws/%s' % (AWS_ACCESS_KEY_ID) + + writeToFile = open(awsFile, 'w') + writeToFile.write(AWS_SECRET_ACCESS_KEY) + writeToFile.close() + + final_dic = {'status': 1} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'status': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + +def populateCurrentRecords(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: + return ACLManager.loadErrorJson('fetchStatus', 0) + + data = json.loads(request.body) + + if data['type'] == 'SFTP': + + path = '/home/cyberpanel/sftp' + + if os.path.exists(path): + + json_data = "[" + checker = 0 + + for items in os.listdir(path): + fullPath = '/home/cyberpanel/sftp/%s' % (items) + + data = open(fullPath, 'r').readlines() + dic = { + 'ip': data[0].strip('\n'), + 'port': data[1], + } + + if checker == 0: + json_data = json_data + json.dumps(dic) + checker = 1 + else: + json_data = json_data + ',' + json.dumps(dic) + else: + final_json = json.dumps({'status': 1, 'error_message': "None", "data": ''}) + return HttpResponse(final_json) + else: + path = '/home/cyberpanel/aws' + + if os.path.exists(path): + + json_data = "[" + checker = 0 + + for items in os.listdir(path): + dic = { + 'AWS_ACCESS_KEY_ID': items + } + + if checker == 0: + json_data = json_data + json.dumps(dic) + checker = 1 + else: + json_data = json_data + ',' + json.dumps(dic) + else: + final_json = json.dumps({'status': 1, 'error_message': "None", "data": ''}) + return HttpResponse(final_json) + + json_data = json_data + ']' + final_json = json.dumps({'status': 1, 'error_message': "None", "data": json_data}) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'status': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + +def removeDestination(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: + return ACLManager.loadErrorJson('destStatus', 0) + + data = json.loads(request.body) + + ipAddress = data['IPAddress'] + + if data['type'] == 'SFTP': + ipFile = '/home/cyberpanel/sftp/%s' % (ipAddress) + else: + ipFile = '/home/cyberpanel/aws/%s' % (ipAddress) + + + os.remove(ipFile) + + final_dic = {'status': 1, 'error_message': 'None'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'destStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + +def fetchCurrentBackups(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + + data = json.loads(request.body) + backupDomain = data['websiteToBeBacked'] + + if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson('fetchStatus', 0) + + if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson() + + website = Websites.objects.get(domain=backupDomain) + + backups = website.incjob_set.all() + + json_data = "[" + checker = 0 + + for items in reversed(backups): + + includes = "" + + jobs = items.jobsnapshots_set.all() + + for job in jobs: + includes = '%s,%s:%s' % (includes, job.type, job.snapshotid) + + dic = {'id': items.id, + 'date': str(items.date), + 'includes': includes + } + + if checker == 0: + json_data = json_data + json.dumps(dic) + checker = 1 + else: + json_data = json_data + ',' + json.dumps(dic) + + json_data = json_data + ']' + final_json = json.dumps({'status': 1, 'error_message': "None", "data": json_data}) + return HttpResponse(final_json) + except BaseException, msg: + final_dic = {'status': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + +def submitBackupCreation(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + + data = json.loads(request.body) + backupDomain = data['websiteToBeBacked'] + backupDestinations = data['backupDestinations'] + + if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson('metaStatus', 0) + + tempPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + + try: + websiteData = data['websiteData'] + except: + websiteData = False + + try: + websiteEmails = data['websiteEmails'] + except: + websiteEmails = False + + try: + websiteSSLs = data['websiteSSLs'] + except: + websiteSSLs = False + + + try: + websiteDatabases = data['websiteDatabases'] + except: + websiteDatabases = False + + extraArgs = {} + extraArgs['website'] = backupDomain + extraArgs['tempPath'] = tempPath + extraArgs['backupDestinations'] = backupDestinations + extraArgs['websiteData'] = websiteData + extraArgs['websiteEmails'] = websiteEmails + extraArgs['websiteSSLs'] = websiteSSLs + extraArgs['websiteDatabases'] = websiteDatabases + + startJob = IncJobs('createBackup', extraArgs) + startJob.start() + + + time.sleep(2) + + final_json = json.dumps({'status': 1, 'error_message': "None", 'tempPath': tempPath}) + return HttpResponse(final_json) + + except BaseException, msg: + logging.writeToFile(str(msg)) + final_dic = {'status': 0, 'metaStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + +def getBackupStatus(request): + try: + data = json.loads(request.body) + + status = data['tempPath'] + backupDomain = data['websiteToBeBacked'] + + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + + if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson('fetchStatus', 0) + + ## file name read ends + + if os.path.exists(status): + command = "sudo cat " + status + result = ProcessUtilities.outputExecutioner(command, 'cyberpanel') + + if result.find("Completed") > -1: + + ### Removing Files + + os.remove(status) + + final_json = json.dumps( + {'backupStatus': 1, 'error_message': "None", "status": result, "abort": 1}) + return HttpResponse(final_json) + + elif result.find("[5009]") > -1: + ## removing status file, so that backup can re-run + try: + os.remove(status) + except: + pass + + final_json = json.dumps( + {'backupStatus': 1, 'error_message': "None", "status": result, + "abort": 1}) + return HttpResponse(final_json) + else: + final_json = json.dumps( + {'backupStatus': 1, 'error_message': "None", "status": result, + "abort": 0}) + return HttpResponse(final_json) + else: + final_json = json.dumps({'backupStatus': 1, 'error_message': "None", "status": 1, "abort": 0}) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'backupStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + logging.writeToFile(str(msg) + " [backupStatus]") + return HttpResponse(final_json) + +def deleteBackup(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + data = json.loads(request.body) + backupDomain = data['websiteToBeBacked'] + + if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson('fetchStatus', 0) + + id = data['backupID'] + + IncJob.objects.get(id=id).delete() + + final_dic = {'status': 1, 'error_message': 'None'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'destStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + +def fetchRestorePoints(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + data = json.loads(request.body) + backupDomain = data['websiteToBeBacked'] + + if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson('fetchStatus', 0) + + data = json.loads(request.body) + id = data['id'] + + incJob = IncJob.objects.get(id=id) + + backups = incJob.jobsnapshots_set.all() + + json_data = "[" + checker = 0 + + for items in backups: + + dic = {'id': items.id, + 'snapshotid': items.snapshotid, + 'type': items.type, + 'destination': items.destination, + } + + if checker == 0: + json_data = json_data + json.dumps(dic) + checker = 1 + else: + json_data = json_data + ',' + json.dumps(dic) + + json_data = json_data + ']' + final_json = json.dumps({'status': 1, 'error_message': "None", "data": json_data}) + return HttpResponse(final_json) + except BaseException, msg: + final_dic = {'status': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + +def restorePoint(request): + try: + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + + data = json.loads(request.body) + backupDomain = data['websiteToBeBacked'] + jobid = data['jobid'] + + if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson('metaStatus', 0) + + tempPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + + extraArgs = {} + extraArgs['website'] = backupDomain + extraArgs['jobid'] = jobid + extraArgs['tempPath'] = tempPath + extraArgs['reconstruct'] = data['reconstruct'] + + + startJob = IncJobs('restorePoint', extraArgs) + startJob.start() + + + time.sleep(2) + + final_json = json.dumps({'status': 1, 'error_message': "None", 'tempPath': tempPath}) + return HttpResponse(final_json) + + except BaseException, msg: + logging.writeToFile(str(msg)) + final_dic = {'status': 0, 'metaStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) \ No newline at end of file diff --git a/README.md b/README.md index ebe4719f7..11b3c2ecf 100644 --- a/README.md +++ b/README.md @@ -23,17 +23,13 @@ Webhosting control panel that uses OpenLiteSpeed as web server. * PHP 5.6 * PHP 7.0 * PHP 7.1 - +* PHP 7.2 # Installation Instructions ``` -wget http://cyberpanel.net/install.tar.gz -tar zxf install.tar.gz -cd install -chmod +x install.py -python install.py [IP Address] +sh <(curl https://cyberpanel.net/install.sh || wget -O - https://cyberpanel.net/install.sh) ``` # Resources diff --git a/api/urls.py b/api/urls.py index 6be18a12f..9c63dcb57 100644 --- a/api/urls.py +++ b/api/urls.py @@ -10,7 +10,9 @@ urlpatterns = [ url(r'^loginAPI', views.loginAPI, name='loginAPI'), + url(r'^getUserInfo$', views.getUserInfo, name='getUserInfo'), url(r'^changeUserPassAPI', views.changeUserPassAPI, name='changeUserPassAPI'), + url(r'^changePackageAPI', views.changePackageAPI, name='changePackageAPI'), url(r'^fetchSSHkey', views.fetchSSHkey, name='fetchSSHkey'), url(r'^remoteTransfer', views.remoteTransfer, name='remoteTransfer'), @@ -19,11 +21,7 @@ urlpatterns = [ url(r'^cancelRemoteTransfer', views.cancelRemoteTransfer, name='cancelRemoteTransfer'), - url(r'^cyberPanelVersion', views.cyberPanelVersion, name='cyberPanelVersion'), - url(r'^putSSHkey', views.putSSHkey, name='putSSHkey'), - - - url(r'^changeAdminPassword', views.changeAdminPassword, name='changeAdminPassword'), + url(r'^runAWSBackups$', views.runAWSBackups, name='runAWSBackups'), ] \ No newline at end of file diff --git a/api/views.py b/api/views.py index d167e8576..158d87da0 100644 --- a/api/views.py +++ b/api/views.py @@ -6,21 +6,21 @@ from django.http import HttpResponse from loginSystem.models import Administrator from plogical.virtualHostUtilities import virtualHostUtilities from plogical import hashPassword -from plogical.installUtilities import installUtilities from packages.models import Package from baseTemplate.views import renderBase from random import randint -from websiteFunctions.models import Websites,ChildDomains +from websiteFunctions.models import Websites import os from baseTemplate.models import version -import subprocess -import shlex -import re from plogical.mailUtilities import mailUtilities +from websiteFunctions.website import WebsiteManager +from s3Backups.s3Backups import S3Backups from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +from plogical.processUtilities import ProcessUtilities +from django.views.decorators.csrf import csrf_exempt # Create your views here. - +@csrf_exempt def verifyConn(request): try: if request.method == 'POST': @@ -31,6 +31,11 @@ def verifyConn(request): admin = Administrator.objects.get(userName=adminUser) + if admin.api == 0: + data_ret = {"verifyConn": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + if hashPassword.check_password(admin.password, adminPass): data_ret = {"verifyConn": 1} json_data = json.dumps(data_ret) @@ -45,7 +50,23 @@ def verifyConn(request): json_data = json.dumps(data_ret) return HttpResponse(json_data) +@csrf_exempt def createWebsite(request): + data = json.loads(request.body) + adminUser = data['adminUser'] + admin = Administrator.objects.get(userName=adminUser) + + if admin.api == 0: + data_ret = {"existsStatus": 0, 'createWebSiteStatus': 0, + 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + wm = WebsiteManager() + return wm.createWebsiteAPI(json.loads(request.body)) + +@csrf_exempt +def getUserInfo(request): try: if request.method == 'POST': @@ -53,74 +74,44 @@ def createWebsite(request): adminUser = data['adminUser'] adminPass = data['adminPass'] - domain = data['domainName'] - adminEmail = data['ownerEmail'] - packageName = data['packageName'] - websiteOwner = data['websiteOwner'] - ownerPassword = data['ownerPassword'] - externalApp = "".join(re.findall("[a-zA-Z]+", domain))[:7] - data['ssl'] = 0 - data['dkimCheck'] = 0 - data['openBasedir'] = 1 - - - phpSelection = "PHP 7.0" + username = data['username'] admin = Administrator.objects.get(userName=adminUser) + if admin.api == 0: + data_ret = {"status": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + if hashPassword.check_password(admin.password, adminPass): pass else: - data_ret = {"existsStatus": 0, 'createWebSiteStatus': 0, + data_ret = {"status": 0, 'error_message': "Could not authorize access to API"} json_data = json.dumps(data_ret) return HttpResponse(json_data) - if adminEmail is None: - adminEmail = "usman@cyberpersons.com" - try: - websiteOwn = Administrator(userName=websiteOwner, password=hashPassword.hash_password(ownerPassword), - email=adminEmail, type=3, owner=admin.pk, - initWebsitesLimit=1) - websiteOwn.save() - except BaseException,msg: - pass - - - ## Create Configurations - - numberOfWebsites = str(Websites.objects.count() + ChildDomains.objects.count()) - sslpath = "/home/" + domain + "/public_html" - - ## Create Configurations - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - - execPath = execPath + " createVirtualHost --virtualHostName " + domain + \ - " --administratorEmail " + adminEmail + " --phpVersion '" + phpSelection + \ - "' --virtualHostUser " + externalApp + " --numberOfSites " + numberOfWebsites + \ - " --ssl " + str(data['ssl']) + " --sslPath " + sslpath + " --dkimCheck " + str(data['dkimCheck']) \ - + " --openBasedir " + str(data['openBasedir']) + ' --websiteOwner ' + websiteOwner \ - + ' --package ' + packageName - - output = subprocess.check_output(shlex.split(execPath)) - - if output.find("1,None") > -1: - data_ret = {'createWebSiteStatus': 1, 'error_message': "None", "existsStatus": 0} + user = Administrator.objects.get(userName=username) + data_ret = {'status': 0, + 'firstName': user.firstName, + 'lastName': user.lastName, + 'email': user.email, + 'adminStatus': user.acl.adminStatus, + 'error_message': "None"} json_data = json.dumps(data_ret) return HttpResponse(json_data) - else: - data_ret = {'createWebSiteStatus': 0, 'error_message': output, "existsStatus": 0} + except: + data_ret = {'status': 0, 'error_message': "User does not exists."} json_data = json.dumps(data_ret) return HttpResponse(json_data) - except BaseException, msg: - data_ret = {'createWebSiteStatus': 0, 'error_message': str(msg), "existsStatus": 0} + data_ret = {'status': 0, 'error_message': str(msg)} json_data = json.dumps(data_ret) return HttpResponse(json_data) +@csrf_exempt def changeUserPassAPI(request): try: if request.method == 'POST': @@ -130,11 +121,17 @@ def changeUserPassAPI(request): websiteOwner = data['websiteOwner'] ownerPassword = data['ownerPassword'] + adminUser = data['adminUser'] adminPass = data['adminPass'] admin = Administrator.objects.get(userName=adminUser) + if admin.api == 0: + data_ret = {"changeStatus": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + if hashPassword.check_password(admin.password, adminPass): pass else: @@ -159,6 +156,7 @@ def changeUserPassAPI(request): json_data = json.dumps(data_ret) return HttpResponse(json_data) +@csrf_exempt def changePackageAPI(request): try: if request.method == 'POST': @@ -172,6 +170,11 @@ def changePackageAPI(request): admin = Administrator.objects.get(userName=adminUser) + if admin.api == 0: + data_ret = {"changePackage": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + if hashPassword.check_password(admin.password, adminPass): pass else: @@ -198,16 +201,24 @@ def changePackageAPI(request): json_data = json.dumps(data_ret) return HttpResponse(json_data) +@csrf_exempt def deleteWebsite(request): try: if request.method == 'POST': data = json.loads(request.body) - websiteName = data['domainName'] + adminUser = data['adminUser'] adminPass = data['adminPass'] admin = Administrator.objects.get(userName=adminUser) + if admin.api == 0: + data_ret = {"websiteDeleteStatus": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + data['websiteName'] = data['domainName'] + if hashPassword.check_password(admin.password, adminPass): pass else: @@ -216,44 +227,40 @@ def deleteWebsite(request): json_data = json.dumps(data_ret) return HttpResponse(json_data) - website = Websites.objects.get(domain=websiteName) + website = Websites.objects.get(domain=data['websiteName']) websiteOwner = website.admin - if admin.websites_set.all().count() == 0: - websiteOwner.delete() + try: + if admin.websites_set.all().count() == 0: + websiteOwner.delete() + except: + pass ## Deleting master domain - numberOfWebsites = str(Websites.objects.count() + ChildDomains.objects.count()) - - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - - execPath = execPath + " deleteVirtualHostConfigurations --virtualHostName " + websiteName + \ - " --numberOfSites " + numberOfWebsites - - subprocess.check_output(shlex.split(execPath)) - - data_ret = {'websiteDeleteStatus': 1, 'error_message': "None"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) + wm = WebsiteManager() + return wm.submitWebsiteDeletion(admin.pk, data) except BaseException, msg: data_ret = {'websiteDeleteStatus': 0, 'error_message': str(msg)} json_data = json.dumps(data_ret) return HttpResponse(json_data) +@csrf_exempt def submitWebsiteStatus(request): try: if request.method == 'POST': data = json.loads(request.body) - websiteName = data['websiteName'] - state = data['state'] adminUser = data['adminUser'] adminPass = data['adminPass'] admin = Administrator.objects.get(userName=adminUser) + if admin.api == 0: + data_ret = {"websiteStatus": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + if hashPassword.check_password(admin.password, adminPass): pass else: @@ -262,50 +269,39 @@ def submitWebsiteStatus(request): json_data = json.dumps(data_ret) return HttpResponse(json_data) - website = Websites.objects.get(domain=websiteName) - - if state == "Suspend": - virtualHostUtilities.suspendVirtualHost(websiteName) - installUtilities.reStartLiteSpeed() - website.state = 0 - else: - virtualHostUtilities.UnsuspendVirtualHost(websiteName) - installUtilities.reStartLiteSpeed() - website.state = 1 - - website.save() - - data_ret = {'websiteStatus': 1, 'error_message': "None"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) + wm = WebsiteManager() + return wm.submitWebsiteStatus(admin.pk, json.loads(request.body)) except BaseException, msg: data_ret = {'websiteStatus': 0, 'error_message': str(msg)} json_data = json.dumps(data_ret) return HttpResponse(json_data) +@csrf_exempt def loginAPI(request): try: - if request.method == "POST": + username = request.POST['username'] + password = request.POST['password'] - username = request.POST['username'] - password = request.POST['password'] + admin = Administrator.objects.get(userName=username) - admin = Administrator.objects.get(userName=username) - - if hashPassword.check_password(admin.password, password): - request.session['userID'] = admin.pk - return redirect(renderBase) - else: - return HttpResponse("Invalid Credentials.") + if admin.api == 0: + data_ret = {"userID": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + if hashPassword.check_password(admin.password, password): + request.session['userID'] = admin.pk + return redirect(renderBase) + else: + return HttpResponse("Invalid Credentials.") except BaseException, msg: data = {'userID': 0, 'loginStatus': 0, 'error_message': str(msg)} json_data = json.dumps(data) return HttpResponse(json_data) - +@csrf_exempt def fetchSSHkey(request): try: if request.method == "POST": @@ -315,13 +311,19 @@ def fetchSSHkey(request): admin = Administrator.objects.get(userName=username) + if admin.api == 0: + data_ret = {"status": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + if hashPassword.check_password(admin.password, password): pubKey = os.path.join("/root",".ssh",'cyberpanel.pub') - execPath = "sudo cat " + pubKey - data = subprocess.check_output(shlex.split(execPath)) + execPath = "cat " + pubKey + data = ProcessUtilities.outputExecutioner(execPath) data_ret = { + 'status': 1, 'pubKeyStatus': 1, 'error_message': "None", 'pubKey':data @@ -330,6 +332,7 @@ def fetchSSHkey(request): return HttpResponse(json_data) else: data_ret = { + 'status' : 0, 'pubKeyStatus': 0, 'error_message': "Could not authorize access to API." } @@ -337,10 +340,11 @@ def fetchSSHkey(request): return HttpResponse(json_data) except BaseException, msg: - data = {'pubKeyStatus': 0,'error_message': str(msg)} + data = {'status' : 0, 'pubKeyStatus': 0,'error_message': str(msg)} json_data = json.dumps(data) return HttpResponse(json_data) +@csrf_exempt def remoteTransfer(request): try: if request.method == "POST": @@ -348,11 +352,18 @@ def remoteTransfer(request): data = json.loads(request.body) username = data['username'] password = data['password'] - ipAddress = data['ipAddress'] - accountsToTransfer = data['accountsToTransfer'] + admin = Administrator.objects.get(userName=username) + if admin.api == 0: + data_ret = {"transferStatus": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + ipAddress = data['ipAddress'] + accountsToTransfer = data['accountsToTransfer'] + if hashPassword.check_password(admin.password, password): dir = str(randint(1000, 9999)) @@ -368,9 +379,9 @@ def remoteTransfer(request): ## Accounts to transfer is a path to file, containing accounts. - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/remoteTransferUtilities.py" + execPath = "/usr/local/CyberCP/bin/python2 " + virtualHostUtilities.cyberPanel + "/plogical/remoteTransferUtilities.py" execPath = execPath + " remoteTransfer --ipAddress " + ipAddress + " --dir " + dir + " --accountsToTransfer " + path - subprocess.Popen(shlex.split(execPath)) + ProcessUtilities.popenExecutioner(execPath) return HttpResponse(json.dumps({"transferStatus": 1, "dir": dir})) @@ -385,6 +396,7 @@ def remoteTransfer(request): json_data = json.dumps(data) return HttpResponse(json_data) +@csrf_exempt def fetchAccountsFromRemoteServer(request): try: if request.method == "POST": @@ -393,6 +405,12 @@ def fetchAccountsFromRemoteServer(request): password = data['password'] admin = Administrator.objects.get(userName=username) + + if admin.api == 0: + data_ret = {"fetchStatus": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + if hashPassword.check_password(admin.password, password): records = Websites.objects.all() @@ -428,7 +446,7 @@ def fetchAccountsFromRemoteServer(request): json_data = json.dumps(data) return HttpResponse(json_data) - +@csrf_exempt def FetchRemoteTransferStatus(request): try: if request.method == "POST": @@ -436,13 +454,20 @@ def FetchRemoteTransferStatus(request): username = data['username'] password = data['password'] + admin = Administrator.objects.get(userName=username) + + if admin.api == 0: + data_ret = {"fetchStatus": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + dir = "/home/backup/transfer-"+str(data['dir'])+"/backup_log" try: - command = "sudo cat "+ dir - status = subprocess.check_output(shlex.split(command)) + command = "cat "+ dir + status = ProcessUtilities.outputExecutioner(command) + - admin = Administrator.objects.get(userName=username) if hashPassword.check_password(admin.password, password): final_json = json.dumps({'fetchStatus': 1, 'error_message': "None", "status": status}) @@ -462,28 +487,37 @@ def FetchRemoteTransferStatus(request): json_data = json.dumps(data) return HttpResponse(json_data) +@csrf_exempt def cancelRemoteTransfer(request): try: if request.method == "POST": data = json.loads(request.body) username = data['username'] password = data['password'] - dir = "/home/backup/transfer-"+str(data['dir']) admin = Administrator.objects.get(userName=username) + if admin.api == 0: + data_ret = {"cancelStatus": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + dir = "/home/backup/transfer-"+str(data['dir']) + + + if hashPassword.check_password(admin.password, password): path = dir + "/pid" - command = "sudo cat " + path - pid = subprocess.check_output(shlex.split(command)) + command = "cat " + path + pid = ProcessUtilities.outputExecutioner(command) - command = "sudo kill -KILL " + pid - subprocess.call(shlex.split(command)) + command = "kill -KILL " + pid + ProcessUtilities.executioner(command) - command = "sudo rm -rf " + dir - subprocess.call(shlex.split(command)) + command = "rm -rf " + dir + ProcessUtilities.executioner(command) data = {'cancelStatus': 1, 'error_message': "None"} json_data = json.dumps(data) @@ -500,6 +534,7 @@ def cancelRemoteTransfer(request): json_data = json.dumps(data) return HttpResponse(json_data) +@csrf_exempt def cyberPanelVersion(request): try: if request.method == 'POST': @@ -512,6 +547,11 @@ def cyberPanelVersion(request): admin = Administrator.objects.get(userName=adminUser) + if admin.api == 0: + data_ret = {"getVersion": 0, 'error_message': "API Access Disabled."} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + if hashPassword.check_password(admin.password, adminPass): Version = version.objects.get(pk=1) @@ -541,105 +581,15 @@ def cyberPanelVersion(request): json_data = json.dumps(data_ret) return HttpResponse(json_data) -def putSSHkey(request): - try: - if request.method == 'POST': - - data = json.loads(request.body) - - adminUser = data['username'] - adminPass = data['password'] - pubKey = data['putSSHKey'] - - - admin = Administrator.objects.get(userName=adminUser) - - if hashPassword.check_password(admin.password, adminPass): - keyPath = "/home/cyberpanel/.ssh" - - if not os.path.exists(keyPath): - os.makedirs(keyPath) - - - ## writeKey - - authorized_keys = keyPath+"/authorized_keys" - presenseCheck = 0 - try: - data = open(authorized_keys, "r").readlines() - for items in data: - if items.find(pubKey) > -1: - presenseCheck = 1 - except: - pass - - if presenseCheck == 0: - writeToFile = open(authorized_keys, 'a') - writeToFile.writelines("#Added by CyberPanel\n") - writeToFile.writelines("\n") - writeToFile.writelines(pubKey) - writeToFile.writelines("\n") - writeToFile.close() - - ## - - command = "sudo chmod g-w /home/cyberpanel" - cmd = shlex.split(command) - res = subprocess.call(cmd) - - os.chmod(keyPath,0700) - os.chmod(authorized_keys, 0600) - - - data_ret = {"putSSHKey": 1, - 'error_message': "None",} - - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - else: - data_ret = {"putSSHKey": 0, - 'error_message': "Could not authorize access to API"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - except BaseException, msg: - data_ret = {"putSSHKey": 0, - 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - -def changeAdminPassword(request): +@csrf_exempt +def runAWSBackups(request): try: data = json.loads(request.body) - - adminPass = data['password'] randomFile = data['randomFile'] if os.path.exists(randomFile): - os.remove(randomFile) - admin = Administrator.objects.get(userName="admin") - admin.password = hashPassword.hash_password(adminPass) - admin.save() - data_ret = {"changed": 1, - 'error_message': "None"} - - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - else: - data_ret = {"changed": 0, - 'error_message': "Failed to authorize access to change password!"} - - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - - + s3 = S3Backups(request, None, 'runAWSBackups') + s3.start() except BaseException, msg: - data_ret = {"changed": 0, - 'error_message': "Failed to authorize access to change password!"} - - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - + logging.writeToFile(str(msg) + ' [API.runAWSBackups]') \ No newline at end of file diff --git a/backup/backupManager.py b/backup/backupManager.py new file mode 100644 index 000000000..e419c68dd --- /dev/null +++ b/backup/backupManager.py @@ -0,0 +1,1171 @@ +#!/usr/local/CyberCP/bin/python2 +import os +import os.path +import sys +import django +sys.path.append('/usr/local/CyberCP') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") +django.setup() +import json +from plogical.acl import ACLManager +import plogical.CyberCPLogFileWriter as logging +from websiteFunctions.models import Websites, Backups, dest, backupSchedules +from plogical.virtualHostUtilities import virtualHostUtilities +import subprocess +import shlex +from django.shortcuts import HttpResponse, render +from loginSystem.models import Administrator +from plogical.mailUtilities import mailUtilities +from random import randint +import time +import plogical.backupUtilities as backupUtil +import requests +from plogical.processUtilities import ProcessUtilities +from multiprocessing import Process + +class BackupManager: + localBackupPath = '/home/cyberpanel/localBackupPath' + def __init__(self, domain = None, childDomain = None): + self.domain = domain + self.childDomain = childDomain + + def loadBackupHome(self, request = None, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + return render(request, 'backup/index.html', currentACL) + except BaseException, msg: + return HttpResponse(str(msg)) + + def backupSite(self, request = None, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'createBackup') == 0: + return ACLManager.loadError() + + websitesName = ACLManager.findAllSites(currentACL, userID) + return render(request, 'backup/backup.html', {'websiteList': websitesName}) + except BaseException, msg: + return HttpResponse(str(msg)) + + def restoreSite(self, request = None, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'restoreBackup') == 0: + return ACLManager.loadError() + + path = os.path.join("/home", "backup") + + if not os.path.exists(path): + return render(request, 'backup/restore.html') + else: + all_files = [] + ext = ".tar.gz" + + command = 'sudo chown -R cyberpanel:cyberpanel ' + path + ACLManager.executeCall(command) + + files = os.listdir(path) + for filename in files: + if filename.endswith(ext): + all_files.append(filename) + + return render(request, 'backup/restore.html', {'backups': all_files}) + + except BaseException, msg: + return HttpResponse(str(msg)) + + def getCurrentBackups(self, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + backupDomain = data['websiteToBeBacked'] + + if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson('fetchStatus', 0) + + if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson() + + website = Websites.objects.get(domain=backupDomain) + + backups = website.backups_set.all() + + json_data = "[" + checker = 0 + + for items in backups: + if items.status == 0: + status = "Pending" + else: + status = "Completed" + dic = {'id': items.id, + 'file': items.fileName, + 'date': items.date, + 'size': items.size, + 'status': status + } + + if checker == 0: + json_data = json_data + json.dumps(dic) + checker = 1 + else: + json_data = json_data + ',' + json.dumps(dic) + + json_data = json_data + ']' + final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": json_data}) + return HttpResponse(final_json) + except BaseException, msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def submitBackupCreation(self, userID = None, data = None): + try: + + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + backupDomain = data['websiteToBeBacked'] + website = Websites.objects.get(domain=backupDomain) + + if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson('metaStatus', 0) + + ## defining paths + + ## /home/example.com/backup + backupPath = os.path.join("/home", backupDomain, "backup/") + backupDomainName = data['websiteToBeBacked'] + backupName = 'backup-' + backupDomainName + "-" + time.strftime("%m.%d.%Y_%H-%M-%S") + + ## /home/example.com/backup/backup-example.com-02.13.2018_10-24-52 + tempStoragePath = os.path.join(backupPath, backupName) + + + p = Process(target=backupUtil.submitBackupCreation, args=(tempStoragePath, backupName, backupPath,backupDomain)) + p.start() + + time.sleep(2) + + final_json = json.dumps({'status': 1, 'metaStatus': 1, 'error_message': "None", 'tempStorage': tempStoragePath}) + return HttpResponse(final_json) + + except BaseException, msg: + logging.CyberCPLogFileWriter.writeToFile(str(msg)) + final_dic = {'status': 0, 'metaStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def backupStatus(self, userID = None, data = None): + try: + + backupDomain = data['websiteToBeBacked'] + status = os.path.join("/home", backupDomain, "backup/status") + backupFileNamePath = os.path.join("/home", backupDomain, "backup/backupFileName") + pid = os.path.join("/home", backupDomain, "backup/pid") + + domain = Websites.objects.get(domain=backupDomain) + + ## read file name + + try: + command = "sudo cat " + backupFileNamePath + fileName = ProcessUtilities.outputExecutioner(command, domain.externalApp) + if fileName.find('No such file or directory') > -1: + final_json = json.dumps({'backupStatus': 0, 'error_message': "None", "status": 0, "abort": 0}) + return HttpResponse(final_json) + except: + fileName = "Fetching.." + + ## file name read ends + + if os.path.exists(status): + command = "sudo cat " + status + status = ProcessUtilities.outputExecutioner(command, domain.externalApp) + + if status.find("Completed") > -1: + + ### Removing Files + + command = 'sudo rm -f ' + status + ProcessUtilities.executioner(command, domain.externalApp) + + command = 'sudo rm -f ' + backupFileNamePath + ProcessUtilities.executioner(command, domain.externalApp) + + command = 'sudo rm -f ' + pid + ProcessUtilities.executioner(command, domain.externalApp) + + final_json = json.dumps( + {'backupStatus': 1, 'error_message': "None", "status": status, "abort": 1, + 'fileName': fileName, }) + return HttpResponse(final_json) + + elif status.find("[5009]") > -1: + ## removing status file, so that backup can re-run + try: + command = 'sudo rm -f ' + status + ProcessUtilities.executioner(command, domain.externalApp) + + command = 'sudo rm -f ' + backupFileNamePath + ProcessUtilities.executioner(command, domain.externalApp) + + command = 'sudo rm -f ' + pid + ProcessUtilities.executioner(command, domain.externalApp) + + backupObs = Backups.objects.filter(fileName=fileName) + for items in backupObs: + items.delete() + + except: + pass + + final_json = json.dumps( + {'backupStatus': 1, 'fileName': fileName, 'error_message': "None", "status": status, + "abort": 1}) + return HttpResponse(final_json) + else: + final_json = json.dumps( + {'backupStatus': 1, 'error_message': "None", 'fileName': fileName, "status": status, + "abort": 0}) + return HttpResponse(final_json) + else: + final_json = json.dumps({'backupStatus': 0, 'error_message': "None", "status": 0, "abort": 0}) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'backupStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [backupStatus]") + return HttpResponse(final_json) + + def cancelBackupCreation(self, userID = None, data = None): + try: + + backupCancellationDomain = data['backupCancellationDomain'] + fileName = data['fileName'] + + execPath = "/usr/local/CyberCP/bin/python2 " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" + execPath = execPath + " cancelBackupCreation --backupCancellationDomain " + backupCancellationDomain + " --fileName " + fileName + subprocess.call(shlex.split(execPath)) + + try: + backupOb = Backups.objects.get(fileName=fileName) + backupOb.delete() + except BaseException, msg: + logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [cancelBackupCreation]") + + final_json = json.dumps({'abortStatus': 1, 'error_message': "None", "status": 0}) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'abortStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def deleteBackup(self, userID = None, data = None): + try: + backupID = data['backupID'] + backup = Backups.objects.get(id=backupID) + + domainName = backup.website.domain + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + if ACLManager.checkOwnership(domainName, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson() + + path = "/home/" + domainName + "/backup/" + backup.fileName + ".tar.gz" + command = 'sudo rm -f ' + path + ProcessUtilities.executioner(command) + + backup.delete() + + final_json = json.dumps({'status': 1, 'deleteStatus': 1, 'error_message': "None"}) + return HttpResponse(final_json) + except BaseException, msg: + final_dic = {'status': 0, 'deleteStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + + return HttpResponse(final_json) + + def submitRestore(self, data = None, userID = None): + try: + backupFile = data['backupFile'] + originalFile = "/home/backup/" + backupFile + + if not os.path.exists(originalFile): + dir = data['dir'] + else: + dir = "CyberPanelRestore" + + currentACL = ACLManager.loadedACL(userID) + if currentACL['admin'] == 1: + pass + else: + return ACLManager.loadErrorJson() + + execPath = "sudo nice -n 10 /usr/local/CyberCP/bin/python2 " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" + execPath = execPath + " submitRestore --backupFile " + backupFile + " --dir " + dir + ProcessUtilities.popenExecutioner(execPath) + time.sleep(4) + + final_dic = {'restoreStatus': 1, 'error_message': "None"} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + except BaseException, msg: + final_dic = {'restoreStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def restoreStatus(self, data = None): + try: + backupFile = data['backupFile'].strip(".tar.gz") + + path = os.path.join("/home", "backup", data['backupFile']) + + if os.path.exists(path): + path = os.path.join("/home", "backup", backupFile) + elif os.path.exists(data['backupFile']): + path = data['backupFile'].strip(".tar.gz") + else: + dir = data['dir'] + path = "/home/backup/transfer-" + str(dir) + "/" + backupFile + + if os.path.exists(path): + try: + execPath = "sudo cat " + path + "/status" + status = ProcessUtilities.outputExecutioner(execPath) + + if status.find("Done") > -1: + + command = "sudo rm -rf " + path + ProcessUtilities.executioner(command) + + final_json = json.dumps( + {'restoreStatus': 1, 'error_message': "None", "status": status, 'abort': 1, + 'running': 'Completed'}) + return HttpResponse(final_json) + elif status.find("[5009]") > -1: + ## removing temporarily generated files while restoring + command = "sudo rm -rf " + path + ProcessUtilities.executioner(command) + final_json = json.dumps({'restoreStatus': 1, 'error_message': "None", + "status": status, 'abort': 1, 'alreadyRunning': 0, + 'running': 'Error'}) + return HttpResponse(final_json) + else: + final_json = json.dumps( + {'restoreStatus': 1, 'error_message': "None", "status": status, 'abort': 0, + 'running': 'Running..'}) + return HttpResponse(final_json) + + except BaseException, msg: + logging.CyberCPLogFileWriter.writeToFile(str(msg)) + status = "Just Started" + final_json = json.dumps( + {'restoreStatus': 1, 'error_message': "None", "status": status, 'abort': 0, + 'running': 'Running..'}) + return HttpResponse(final_json) + else: + final_json = json.dumps( + {'restoreStatus': 1, 'error_message': "None", "status": "OK To Run", 'running': 'Halted', + 'abort': 1}) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'restoreStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def backupDestinations(self, request = None, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: + return ACLManager.loadError() + + return render(request, 'backup/backupDestinations.html', {}) + + except BaseException, msg: + return HttpResponse(str(msg)) + + def submitDestinationCreation(self, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: + return ACLManager.loadErrorJson('destStatus', 0) + + destinations = backupUtil.backupUtilities.destinationsPath + + ipAddress = data['IPAddress'] + password = data['password'] + + if dest.objects.all().count() == 2: + final_dic = {'destStatus': 0, + 'error_message': "Currently only one remote destination is allowed."} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + try: + d = dest.objects.get(destLoc=ipAddress) + final_dic = {'destStatus': 0, 'error_message': "This destination already exists."} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + except: + + try: + port = data['backupSSHPort'] + except: + port = "22" + + execPath = "/usr/local/CyberCP/bin/python2 " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" + execPath = execPath + " submitDestinationCreation --ipAddress " + ipAddress + " --password " \ + + password + " --port " + port + + output = ProcessUtilities.outputExecutioner(execPath) + + if output.find('1,') > -1: + try: + writeToFile = open(destinations, "w") + writeToFile.writelines(ipAddress + "\n") + writeToFile.writelines(data['backupSSHPort'] + "\n") + writeToFile.close() + newDest = dest(destLoc=ipAddress) + newDest.save() + except: + writeToFile = open(destinations, "w") + writeToFile.writelines(ipAddress + "\n") + writeToFile.writelines("22" + "\n") + writeToFile.close() + newDest = dest(destLoc=ipAddress) + newDest.save() + + final_dic = {'destStatus': 1, 'error_message': "None"} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + else: + final_dic = {'destStatus': 0, 'error_message': output} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'destStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def getCurrentBackupDestinations(self, userID = None, data = None): + try: + + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: + return ACLManager.loadErrorJson('fetchStatus', 0) + + records = dest.objects.all() + + json_data = "[" + checker = 0 + + for items in records: + if items.destLoc == "Home": + continue + dic = {'id': items.id, + 'ip': items.destLoc, + } + + if checker == 0: + json_data = json_data + json.dumps(dic) + checker = 1 + else: + json_data = json_data + ',' + json.dumps(dic) + + json_data = json_data + ']' + final_json = json.dumps({'fetchStatus': 1, 'error_message': "None", "data": json_data}) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def getConnectionStatus(self, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: + return ACLManager.loadErrorJson('connStatus', 0) + + ipAddress = data['IPAddress'] + + execPath = "/usr/local/CyberCP/bin/python2 " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" + execPath = execPath + " getConnectionStatus --ipAddress " + ipAddress + + output = ProcessUtilities.executioner(execPath) + + if output.find('1,') > -1: + final_dic = {'connStatus': 1, 'error_message': "None"} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + else: + final_dic = {'connStatus': 0, 'error_message': output} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'connStatus': 1, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def deleteDestination(self, userID = None, data = None): + try: + + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: + return ACLManager.loadErrorJson('delStatus', 0) + + ipAddress = data['IPAddress'] + + delDest = dest.objects.get(destLoc=ipAddress) + delDest.delete() + + path = "/usr/local/CyberCP/backup/" + destinations = path + "destinations" + + data = open(destinations, 'r').readlines() + + writeToFile = open(destinations, 'r') + + for items in data: + if items.find(ipAddress) > -1: + continue + else: + writeToFile.writelines(items) + + writeToFile.close() + + ## Deleting Cron Tab Entries for this destination + + path = "/etc/crontab" + + data = open(path, 'r').readlines() + + writeToFile = open(path, 'w') + + for items in data: + if items.find("backupSchedule.py") > -1: + continue + else: + writeToFile.writelines(items) + + writeToFile.close() + + final_dic = {'delStatus': 1, 'error_message': "None"} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'delStatus': 1, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def scheduleBackup(self, request, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: + return ACLManager.loadError() + + if dest.objects.all().count() <= 1: + try: + homeDest = dest(destLoc="Home") + homeDest.save() + except: + pass + backups = dest.objects.all() + + destinations = [] + + for items in backups: + destinations.append(items.destLoc) + + return render(request, 'backup/backupSchedule.html', {'destinations': destinations}) + + except BaseException, msg: + return HttpResponse(str(msg)) + + def getCurrentBackupSchedules(self, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: + return ACLManager.loadErrorJson('fetchStatus', 0) + + records = backupSchedules.objects.all() + + json_data = "[" + checker = 0 + + for items in records: + dic = {'id': items.id, + 'destLoc': items.dest.destLoc, + 'frequency': items.frequency, + } + + if checker == 0: + json_data = json_data + json.dumps(dic) + checker = 1 + else: + json_data = json_data + ',' + json.dumps(dic) + + json_data = json_data + ']' + final_json = json.dumps({'fetchStatus': 1, 'error_message': "None", "data": json_data}) + return HttpResponse(final_json) + + except BaseException, msg: + final_dic = {'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def submitBackupSchedule(self, userID = None, data = None): + try: + backupDest = data['backupDest'] + backupFreq = data['backupFreq'] + + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: + return ACLManager.loadErrorJson('scheduleStatus', 0) + + path = "/etc/crontab" + + ## check if already exists + try: + schedule = backupSchedules.objects.get(frequency=backupFreq) + + if schedule.dest.destLoc == backupDest: + final_json = json.dumps( + {'scheduleStatus': 0, 'error_message': "This schedule already exists"}) + return HttpResponse(final_json) + else: + if backupDest == "Home" and backupFreq == "Daily": + cronJob = "0 3 * * * root /usr/local/CyberCP/bin/python2 /usr/local/CyberCP/plogical/backupScheduleLocal.py" + elif backupDest == "Home" and backupFreq == "Weekly": + cronJob = "0 0 * * 0 root /usr/local/CyberCP/bin/python2 /usr/local/CyberCP/plogical/backupScheduleLocal.py " + elif backupDest != "Home" and backupFreq == "Daily": + cronJob = "0 3 * * * root /usr/local/CyberCP/bin/python2 /usr/local/CyberCP/plogical/backupSchedule.py" + elif backupDest != "Home" and backupFreq == "Weekly": + cronJob = "0 0 * * 0 root /usr/local/CyberCP/bin/python2 /usr/local/CyberCP/plogical/backupSchedule.py " + + command = "cat " + path + output = ProcessUtilities.outputExecutioner(command) + + finalCronJob = output + cronJob + tempCronPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + + writeToFile = open(tempCronPath, 'a') + writeToFile.writelines(finalCronJob + "\n") + writeToFile.close() + + command = "mv " + tempCronPath + " " + path + ProcessUtilities.executioner(command) + + command = 'chown root:root %s' % (path) + ProcessUtilities.executioner(command) + + command = "systemctl restart crond" + ProcessUtilities.executioner(command) + + ## Set local path for backup + + if backupDest == "Home": + writeToFile = open(BackupManager.localBackupPath, 'w') + writeToFile.write(data['localPath']) + writeToFile.close() + + destination = dest.objects.get(destLoc=backupDest) + newSchedule = backupSchedules(dest=destination, frequency=backupFreq) + newSchedule.save() + + final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) + return HttpResponse(final_json) + except: + if backupDest == "Home" and backupFreq == "Daily": + cronJob = "0 3 * * * root /usr/local/CyberCP/bin/python2 /usr/local/CyberCP/plogical/backupScheduleLocal.py" + elif backupDest == "Home" and backupFreq == "Weekly": + cronJob = "0 0 * * 0 root /usr/local/CyberCP/bin/python2 /usr/local/CyberCP/plogical/backupScheduleLocal.py " + elif backupDest != "Home" and backupFreq == "Daily": + cronJob = "0 3 * * * root /usr/local/CyberCP/bin/python2 /usr/local/CyberCP/plogical/backupSchedule.py" + elif backupDest != "Home" and backupFreq == "Weekly": + cronJob = "0 0 * * 0 root /usr/local/CyberCP/bin/python2 /usr/local/CyberCP/plogical/backupSchedule.py " + + command = "cat " + path + output = ProcessUtilities.outputExecutioner(command) + + finalCronJob = output + cronJob + tempCronPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + + writeToFile = open(tempCronPath, 'a') + writeToFile.writelines(finalCronJob + "\n") + writeToFile.close() + + command = "sudo mv " + tempCronPath + " " + path + ProcessUtilities.executioner(command) + + command = 'chown root:root %s' % (path) + ProcessUtilities.executioner(command) + + command = "sudo systemctl restart crond" + ProcessUtilities.executioner(command) + + destination = dest.objects.get(destLoc=backupDest) + newSchedule = backupSchedules(dest=destination, frequency=backupFreq) + newSchedule.save() + + ## Set local path for backup + + if backupDest == "Home": + writeToFile = open(BackupManager.localBackupPath, 'w') + writeToFile.write(data['localPath']) + writeToFile.close() + + final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) + return HttpResponse(final_json) + + except BaseException, msg: + final_json = json.dumps({'scheduleStatus': 0, 'error_message': str(msg)}) + return HttpResponse(final_json) + + def scheduleDelete(self, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: + return ACLManager.loadErrorJson('scheduleStatus', 0) + + backupDest = data['destLoc'] + backupFreq = data['frequency'] + findTxt = "" + + if backupDest == "Home" and backupFreq == "Daily": + findTxt = "0-6" + elif backupDest == "Home" and backupFreq == "Weekly": + findTxt = "* 3" + elif backupDest != "Home" and backupFreq == "Daily": + findTxt = "0-6" + elif backupDest != "Home" and backupFreq == "Weekly": + findTxt = "* 3" + + ### + + path = "/etc/crontab" + + command = "cat " + path + output = ProcessUtilities.outputExecutioner(command).split('\n') + tempCronPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + + writeToFile = open(tempCronPath, 'w') + + for items in output: + if items.find(findTxt) > -1 and items.find("backupScheduleLocal.py") > -1: + continue + else: + writeToFile.writelines(items + '\n') + + writeToFile.close() + + command = "sudo mv " + tempCronPath + " " + path + ProcessUtilities.executioner(command) + + command = 'chown root:root %s' % (path) + ProcessUtilities.executioner(command) + + command = "sudo systemctl restart crond" + ProcessUtilities.executioner(command) + + destination = dest.objects.get(destLoc=backupDest) + newSchedule = backupSchedules.objects.get(dest=destination, frequency=backupFreq) + newSchedule.delete() + + final_json = json.dumps({'delStatus': 1, 'error_message': "None"}) + return HttpResponse(final_json) + + except BaseException, msg: + final_json = json.dumps({'delStatus': 0, 'error_message': str(msg)}) + return HttpResponse(final_json) + + def remoteBackups(self, request, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: + return ACLManager.loadError() + + return render(request, 'backup/remoteBackups.html') + + except BaseException, msg: + return HttpResponse(str(msg)) + + def submitRemoteBackups(self, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: + return ACLManager.loadErrorJson() + + ipAddress = data['ipAddress'] + password = data['password'] + + ## Ask for Remote version of CyberPanel + + try: + finalData = json.dumps({'username': "admin", "password": password}) + + url = "https://" + ipAddress + ":8090/api/cyberPanelVersion" + + r = requests.post(url, data=finalData, verify=False) + + data = json.loads(r.text) + + if data['getVersion'] == 1: + + if float(data['currentVersion']) >= 1.6 and data['build'] >= 0: + pass + else: + data_ret = {'status': 0, + 'error_message': "Your version does not match with version of remote server.", + "dir": "Null"} + data_ret = json.dumps(data_ret) + return HttpResponse(data_ret) + else: + data_ret = {'status': 0, + 'error_message': "Not able to fetch version of remote server. Error Message: " + + data[ + 'error_message'], "dir": "Null"} + data_ret = json.dumps(data_ret) + return HttpResponse(data_ret) + + + except BaseException, msg: + data_ret = {'status': 0, + 'error_message': "Not able to fetch version of remote server. Error Message: " + str( + msg), + "dir": "Null"} + data_ret = json.dumps(data_ret) + return HttpResponse(data_ret) + + ## Fetch public key of remote server! + + finalData = json.dumps({'username': "admin", "password": password}) + + url = "https://" + ipAddress + ":8090/api/fetchSSHkey" + r = requests.post(url, data=finalData, verify=False) + data = json.loads(r.text) + + if data['pubKeyStatus'] == 1: + pubKey = data["pubKey"].strip("\n") + else: + final_json = json.dumps({'status': 0, + 'error_message': "I am sorry, I could not fetch key from remote server. Error Message: " + + data['error_message'] + }) + return HttpResponse(final_json) + + ## write key + + ## Writing key to a temporary location, to be read later by backup process. + + mailUtilities.checkHome() + + pathToKey = "/home/cyberpanel/" + str(randint(1000, 9999)) + + vhost = open(pathToKey, "w") + vhost.write(pubKey) + vhost.close() + + ## + + execPath = "/usr/local/CyberCP/bin/python2 " + virtualHostUtilities.cyberPanel + "/plogical/remoteTransferUtilities.py" + execPath = execPath + " writeAuthKey --pathToKey " + pathToKey + output = ProcessUtilities.outputExecutioner(execPath) + + if output.find("1,None") > -1: + pass + else: + final_json = json.dumps({'status': 0, 'error_message': output}) + return HttpResponse(final_json) + + ## + + try: + finalData = json.dumps({'username': "admin", "password": password}) + + url = "https://" + ipAddress + ":8090/api/fetchAccountsFromRemoteServer" + + r = requests.post(url, data=finalData, verify=False) + + data = json.loads(r.text) + + if data['fetchStatus'] == 1: + json_data = data['data'] + data_ret = {'status': 1, 'error_message': "None", + "dir": "Null", 'data': json_data} + data_ret = json.dumps(data_ret) + return HttpResponse(data_ret) + else: + data_ret = {'status': 0, + 'error_message': "Not able to fetch accounts from remote server. Error Message: " + + data['error_message'], "dir": "Null"} + data_ret = json.dumps(data_ret) + return HttpResponse(data_ret) + except BaseException, msg: + data_ret = {'status': 0, + 'error_message': "Not able to fetch accounts from remote server. Error Message: " + str( + msg), "dir": "Null"} + data_ret = json.dumps(data_ret) + return HttpResponse(data_ret) + + except BaseException, msg: + final_json = json.dumps({'status': 0, 'error_message': str(msg)}) + return HttpResponse(final_json) + + def starRemoteTransfer(self, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: + return ACLManager.loadErrorJson('remoteTransferStatus', 0) + + ipAddress = data['ipAddress'] + password = data['password'] + accountsToTransfer = data['accountsToTransfer'] + + try: + + ipFile = os.path.join("/etc", "cyberpanel", "machineIP") + f = open(ipFile) + ownIP = f.read() + + finalData = json.dumps({'username': "admin", "password": password, "ipAddress": ownIP, + "accountsToTransfer": accountsToTransfer}) + + url = "https://" + ipAddress + ":8090/api/remoteTransfer" + + r = requests.post(url, data=finalData, verify=False) + + data = json.loads(r.text) + + if data['transferStatus'] == 1: + + ## Create local backup dir + + localBackupDir = os.path.join("/home", "backup") + + if not os.path.exists(localBackupDir): + command = "sudo mkdir " + localBackupDir + ProcessUtilities.executioner(command) + + ## create local directory that will host backups + + localStoragePath = "/home/backup/transfer-" + str(data['dir']) + + ## making local storage directory for backups + + command = "sudo mkdir " + localStoragePath + ProcessUtilities.executioner(command) + + final_json = json.dumps( + {'remoteTransferStatus': 1, 'error_message': "None", "dir": data['dir']}) + return HttpResponse(final_json) + else: + final_json = json.dumps({'remoteTransferStatus': 0, + 'error_message': "Can not initiate remote transfer. Error message: " + + data['error_message']}) + return HttpResponse(final_json) + + except BaseException, msg: + final_json = json.dumps({'remoteTransferStatus': 0, + 'error_message': "Can not initiate remote transfer. Error message: " + + str(msg)}) + return HttpResponse(final_json) + + except BaseException, msg: + final_json = json.dumps({'remoteTransferStatus': 0, 'error_message': str(msg)}) + return HttpResponse(final_json) + + def getRemoteTransferStatus(self, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: + return ACLManager.loadErrorJson('remoteTransferStatus', 0) + + ipAddress = data['ipAddress'] + password = data['password'] + dir = data['dir'] + username = "admin" + + finalData = json.dumps({'dir': dir, "username": username, "password": password}) + r = requests.post("https://" + ipAddress + ":8090/api/FetchRemoteTransferStatus", data=finalData, + verify=False) + + data = json.loads(r.text) + + if data['fetchStatus'] == 1: + if data['status'].find("Backups are successfully generated and received on") > -1: + + data = {'remoteTransferStatus': 1, 'error_message': "None", "status": data['status'], + 'backupsSent': 1} + json_data = json.dumps(data) + return HttpResponse(json_data) + elif data['status'].find("[5010]") > -1: + data = {'remoteTransferStatus': 0, 'error_message': data['status'], + 'backupsSent': 0} + json_data = json.dumps(data) + return HttpResponse(json_data) + else: + data = {'remoteTransferStatus': 1, 'error_message': "None", "status": data['status'], + 'backupsSent': 0} + json_data = json.dumps(data) + return HttpResponse(json_data) + else: + data = {'remoteTransferStatus': 0, 'error_message': data['error_message'], + 'backupsSent': 0} + json_data = json.dumps(data) + return HttpResponse(json_data) + except BaseException, msg: + data = {'remoteTransferStatus': 0, 'error_message': str(msg), 'backupsSent': 0} + json_data = json.dumps(data) + return HttpResponse(json_data) + + def remoteBackupRestore(self, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: + return ACLManager.loadErrorJson('remoteTransferStatus', 0) + + backupDir = data['backupDir'] + + backupDirComplete = "/home/backup/transfer-" + str(backupDir) + # adminEmail = admin.email + + ## + + execPath = "/usr/local/CyberCP/bin/python2 " + virtualHostUtilities.cyberPanel + "/plogical/remoteTransferUtilities.py" + execPath = execPath + " remoteBackupRestore --backupDirComplete " + backupDirComplete + " --backupDir " + str( + backupDir) + + ProcessUtilities.popenExecutioner(execPath) + + time.sleep(3) + + data = {'remoteRestoreStatus': 1, 'error_message': 'None'} + json_data = json.dumps(data) + return HttpResponse(json_data) + + except BaseException, msg: + data = {'remoteRestoreStatus': 0, 'error_message': str(msg)} + json_data = json.dumps(data) + return HttpResponse(json_data) + + def localRestoreStatus(self, userID = None, data = None): + try: + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: + return ACLManager.loadErrorJson('remoteTransferStatus', 0) + + backupDir = data['backupDir'] + + # admin = Administrator.objects.get(userName=username) + backupLogPath = "/home/backup/transfer-" + backupDir + "/" + "backup_log" + + removalPath = "/home/backup/transfer-" + str(backupDir) + + time.sleep(3) + + if os.path.isfile(backupLogPath): + command = "sudo cat " + backupLogPath + status = ProcessUtilities.outputExecutioner(command) + + if status.find("completed[success]") > -1: + command = "rm -rf " + removalPath + ProcessUtilities.executioner(command) + data_ret = {'remoteTransferStatus': 1, 'error_message': "None", "status": status, "complete": 1} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + elif status.find("[5010]") > -1: + command = "sudo rm -rf " + removalPath + ProcessUtilities.executioner(command) + data = {'remoteTransferStatus': 0, 'error_message': status, + "status": "None", "complete": 0} + json_data = json.dumps(data) + return HttpResponse(json_data) + else: + data_ret = {'remoteTransferStatus': 1, 'error_message': "None", "status": status, "complete": 0} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + else: + data_ret = {'remoteTransferStatus': 0, 'error_message': "No such log found", "status": "None", + "complete": 0} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + except BaseException, msg: + data = {'remoteTransferStatus': 0, 'error_message': str(msg), "status": "None", "complete": 0} + json_data = json.dumps(data) + return HttpResponse(json_data) + + def cancelRemoteBackup(self, userID = None, data = None): + try: + + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: + return ACLManager.loadErrorJson('cancelStatus', 0) + + ipAddress = data['ipAddress'] + password = data['password'] + dir = data['dir'] + username = "admin" + + finalData = json.dumps({'dir': dir, "username": username, "password": password}) + r = requests.post("https://" + ipAddress + ":8090/api/cancelRemoteTransfer", data=finalData, + verify=False) + + data = json.loads(r.text) + + if data['cancelStatus'] == 1: + pass + else: + logging.CyberCPLogFileWriter.writeToFile( + "Some error cancelling at remote server, see the log file for remote server.") + + path = "/home/backup/transfer-" + str(dir) + pathpid = path + "/pid" + + command = "sudo cat " + pathpid + pid = ProcessUtilities.outputExecutioner(command) + + command = "sudo kill -KILL " + pid + ProcessUtilities.executioner(command) + + command = "sudo rm -rf " + path + ProcessUtilities.executioner(command) + + data = {'cancelStatus': 1, 'error_message': "None"} + json_data = json.dumps(data) + return HttpResponse(json_data) + + except BaseException, msg: + data = {'cancelStatus': 0, 'error_message': str(msg)} + json_data = json.dumps(data) + return HttpResponse(json_data) diff --git a/backup/pluginManager.py b/backup/pluginManager.py new file mode 100644 index 000000000..95373eacb --- /dev/null +++ b/backup/pluginManager.py @@ -0,0 +1,104 @@ +from signals import * +from plogical.pluginManagerGlobal import pluginManagerGlobal + +class pluginManager: + + @staticmethod + def preBackupSite(request): + return pluginManagerGlobal.globalPlug(request, preBackupSite) + + @staticmethod + def postBackupSite(request, response): + return pluginManagerGlobal.globalPlug(request, postBackupSite, response) + + @staticmethod + def preRestoreSite(request): + return pluginManagerGlobal.globalPlug(request, preRestoreSite) + + @staticmethod + def postRestoreSite(request, response): + return pluginManagerGlobal.globalPlug(request, postRestoreSite, response) + + @staticmethod + def preSubmitBackupCreation(request): + return pluginManagerGlobal.globalPlug(request, preSubmitBackupCreation) + + @staticmethod + def preBackupStatus(request): + return pluginManagerGlobal.globalPlug(request, preBackupStatus) + + @staticmethod + def postBackupStatus(request, response): + return pluginManagerGlobal.globalPlug(request, postBackupStatus, response) + + @staticmethod + def preDeleteBackup(request): + return pluginManagerGlobal.globalPlug(request, preDeleteBackup) + + @staticmethod + def postDeleteBackup(request, response): + return pluginManagerGlobal.globalPlug(request, postDeleteBackup, response) + + @staticmethod + def preSubmitRestore(request): + return pluginManagerGlobal.globalPlug(request, preSubmitRestore) + + @staticmethod + def preSubmitDestinationCreation(request): + return pluginManagerGlobal.globalPlug(request, preSubmitDestinationCreation) + + @staticmethod + def postSubmitDestinationCreation(request, response): + return pluginManagerGlobal.globalPlug(request, postSubmitDestinationCreation, response) + + @staticmethod + def preDeleteDestination(request): + return pluginManagerGlobal.globalPlug(request, preDeleteDestination) + + @staticmethod + def postDeleteDestination(request, response): + return pluginManagerGlobal.globalPlug(request, postDeleteDestination, response) + + @staticmethod + def preSubmitBackupSchedule(request): + return pluginManagerGlobal.globalPlug(request, preSubmitBackupSchedule) + + @staticmethod + def postSubmitBackupSchedule(request, response): + return pluginManagerGlobal.globalPlug(request, postSubmitBackupSchedule, response) + + @staticmethod + def preScheduleDelete(request): + return pluginManagerGlobal.globalPlug(request, preScheduleDelete) + + @staticmethod + def postScheduleDelete(request, response): + return pluginManagerGlobal.globalPlug(request, postScheduleDelete, response) + + @staticmethod + def preSubmitRemoteBackups(request): + return pluginManagerGlobal.globalPlug(request, preSubmitRemoteBackups) + + @staticmethod + def postSubmitRemoteBackups(request, response): + return pluginManagerGlobal.globalPlug(request, postSubmitRemoteBackups, response) + + @staticmethod + def preStarRemoteTransfer(request): + return pluginManagerGlobal.globalPlug(request, preStarRemoteTransfer) + + @staticmethod + def postStarRemoteTransfer(request, response): + return pluginManagerGlobal.globalPlug(request, postStarRemoteTransfer, response) + + @staticmethod + def preRemoteBackupRestore(request): + return pluginManagerGlobal.globalPlug(request, preRemoteBackupRestore) + + @staticmethod + def postRemoteBackupRestore(request, response): + return pluginManagerGlobal.globalPlug(request, postRemoteBackupRestore, response) + + @staticmethod + def postDeleteBackup(request, response): + return pluginManagerGlobal.globalPlug(request, postRemoteBackupRestore, response) diff --git a/backup/signals.py b/backup/signals.py new file mode 100644 index 000000000..848ecad17 --- /dev/null +++ b/backup/signals.py @@ -0,0 +1,75 @@ +# The world is a prison for the believer. + +from django.dispatch import Signal + +## This event is fired before CyberPanel core load template for create backup page. +preBackupSite = Signal(providing_args=["request"]) + +## This event is fired after CyberPanel core load template for create backup page. +postBackupSite = Signal(providing_args=["request", "response"]) + +## This event is fired before CyberPanel core load template for restore backup page. +preRestoreSite = Signal(providing_args=["request"]) + +## This event is fired after CyberPanel core load template for restore backup page. +postRestoreSite = Signal(providing_args=["request", "response"]) + +## This event is fired before CyberPanel core start creating backup of a website +preSubmitBackupCreation = Signal(providing_args=["request"]) + +## This event is fired before CyberPanel core starts to load status of backup started earlier througb submitBackupCreation +preBackupStatus = Signal(providing_args=["request"]) + +## This event is fired after CyberPanel core has loaded backup status +postBackupStatus = Signal(providing_args=["request", "response"]) + +## This event is fired before CyberPanel core start deletion of a backup +preDeleteBackup = Signal(providing_args=["request"]) + +## This event is fired after CyberPanel core finished the backup deletion +postDeleteBackup = Signal(providing_args=["request", "response"]) + +## This event is fired before CyberPanel core start restoring a backup. +preSubmitRestore = Signal(providing_args=["request"]) + +## This event is fired before CyberPanel core starts to add a remote backup destination +preSubmitDestinationCreation = Signal(providing_args=["request"]) + +## This event is fired after CyberPanel core is finished adding remote backup destination +postSubmitDestinationCreation = Signal(providing_args=["request", "response"]) + +## This event is fired before CyberPanel core starts to delete a backup destination +preDeleteDestination = Signal(providing_args=["request"]) + +## This event is fired after CyberPanel core finished deleting a backup destination +postDeleteDestination = Signal(providing_args=["request", "response"]) + +## This event is fired before CyberPanel core start adding a backup schedule +preSubmitBackupSchedule = Signal(providing_args=["request"]) + +## This event is fired after CyberPanel core finished adding a backup schedule +postSubmitBackupSchedule = Signal(providing_args=["request", "response"]) + +## This event is fired before CyberPanel core start the deletion of backup schedule +preScheduleDelete = Signal(providing_args=["request"]) + +## This event is fired after CyberPanel core finished the deletion of backup schedule +postScheduleDelete = Signal(providing_args=["request", "response"]) + +## This event is fired before CyberPanel core star the remote backup process +preSubmitRemoteBackups = Signal(providing_args=["request"]) + +## This event is fired after CyberPanel core finished remote backup process +postSubmitRemoteBackups = Signal(providing_args=["request", "response"]) + +## This event is fired before CyberPanel core star the remote backup process +preStarRemoteTransfer = Signal(providing_args=["request"]) + +## This event is fired after CyberPanel core finished remote backup process +postStarRemoteTransfer = Signal(providing_args=["request", "response"]) + +## This event is fired before CyberPanel core start restore of remote backups +preRemoteBackupRestore = Signal(providing_args=["request"]) + +## This event is fired after CyberPanel core finished restoring remote backups in local server +postRemoteBackupRestore = Signal(providing_args=["request", "response"]) diff --git a/backup/static/backup/backup.js b/backup/static/backup/backup.js index b83f9bcce..9c158422b 100644 --- a/backup/static/backup/backup.js +++ b/backup/static/backup/backup.js @@ -4,235 +4,233 @@ //*** Backup site ****// -app.controller('backupWebsiteControl', function($scope,$http,$timeout) { +app.controller('backupWebsiteControl', function ($scope, $http, $timeout) { - $scope.destination = true; - $scope.backupButton = true; + $scope.destination = true; + $scope.backupButton = true; + $scope.backupLoading = true; + $scope.runningBackup = true; + $scope.cancelButton = true; + + populateCurrentRecords(); + + $scope.cancelBackup = function () { + + var backupCancellationDomain = $scope.websiteToBeBacked; + + url = "/backup/cancelBackupCreation"; + + var data = { + backupCancellationDomain: backupCancellationDomain, + fileName: $scope.fileName, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + }; + + $scope.fetchDetails = function () { + getBackupStatus(); + populateCurrentRecords(); + $scope.destination = false; + $scope.runningBackup = true; + + }; + + + function getBackupStatus() { + + $scope.backupLoadingBottom = false; + + var websiteToBeBacked = $scope.websiteToBeBacked; + + url = "/backup/backupStatus"; + + var data = { + websiteToBeBacked: websiteToBeBacked, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.backupStatus === 1) { + + if (response.data.abort === 1) { + $timeout.cancel(); + $scope.backupLoadingBottom = true; + $scope.destination = false; + $scope.runningBackup = false; + $scope.cancelButton = true; + $scope.backupButton = false; + $scope.backupLoading = true; + $scope.fileName = response.data.fileName; + $scope.status = response.data.status; + populateCurrentRecords(); + return; + } + else { + $scope.destination = true; + $scope.backupButton = true; + $scope.runningBackup = false; + $scope.cancelButton = false; + + $scope.fileName = response.data.fileName; + $scope.status = response.data.status; + $timeout(getBackupStatus, 2000); + + } + } + else { + $timeout.cancel(); + $scope.backupLoadingBottom = true; $scope.backupLoading = true; - $scope.runningBackup = true; $scope.cancelButton = true; + $scope.backupButton = false; + } + + } + + function cantLoadInitialDatas(response) { + } + + }; + + + $scope.destinationSelection = function () { + $scope.backupButton = false; + }; + + + function populateCurrentRecords() { + + var websiteToBeBacked = $scope.websiteToBeBacked; + + url = "/backup/getCurrentBackups"; + + var data = { + websiteToBeBacked: websiteToBeBacked, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.fetchStatus == 1) { + $scope.records = JSON.parse(response.data.data); + } + + + } + + function cantLoadInitialDatas(response) { + } + + }; + + + $scope.createBackup = function () { + + var websiteToBeBacked = $scope.websiteToBeBacked; + $scope.backupLoading = false; + + + url = "/backup/submitBackupCreation"; + + var data = { + websiteToBeBacked: websiteToBeBacked, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.metaStatus === 1) { + getBackupStatus(); + } + + } + + function cantLoadInitialDatas(response) { + } + + }; + + + $scope.deleteBackup = function (id) { + + + url = "/backup/deleteBackup"; + + var data = { + backupID: id, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.deleteStatus == 1) { populateCurrentRecords(); - $scope.cancelBackup = function () { - var backupCancellationDomain = $scope.websiteToBeBacked; + } + else { - url = "/backup/cancelBackupCreation"; + } - var data = { - backupCancellationDomain:backupCancellationDomain, - fileName:$scope.fileName, - }; + } - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + function cantLoadInitialDatas(response) { - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); - }; - - $scope.fetchDetails = function () { - getBackupStatus(); - populateCurrentRecords(); - $scope.destination = false; - $scope.runningBackup = true; - - }; - - - function getBackupStatus(){ - - $scope.backupLoadingBottom = false; - - var websiteToBeBacked = $scope.websiteToBeBacked; - - url = "/backup/backupStatus"; - - var data = { - websiteToBeBacked:websiteToBeBacked, - }; - - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - - - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); - - - function ListInitialDatas(response) { - - - if(response.data.backupStatus === 1){ - - if(response.data.abort === 1){ - $timeout.cancel(); - $scope.backupLoadingBottom = true; - $scope.destination = false; - $scope.runningBackup = false; - $scope.cancelButton = true; - $scope.backupButton = false; - $scope.backupLoading = true; - $scope.fileName = response.data.fileName; - $scope.status = response.data.status; - populateCurrentRecords(); - return; - } - else{ - $scope.destination = true; - $scope.backupButton = true; - $scope.runningBackup = false; - $scope.cancelButton = false; - - $scope.fileName = response.data.fileName; - $scope.status = response.data.status; - $timeout(getBackupStatus, 2000); - - } - } - else{ - $timeout.cancel(); - $scope.backupLoadingBottom = true; - $scope.backupLoading = true; - $scope.cancelButton = true; - $scope.backupButton = false; - } - - } - function cantLoadInitialDatas(response) {} - - }; - - - $scope.destinationSelection = function () { - $scope.backupButton = false; - }; - - - function populateCurrentRecords(){ - - var websiteToBeBacked = $scope.websiteToBeBacked; - - url = "/backup/getCurrentBackups"; - - var data = { - websiteToBeBacked:websiteToBeBacked, - }; - - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - - - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); - - - function ListInitialDatas(response) { - - - if(response.data.fetchStatus == 1){ - $scope.records = JSON.parse(response.data.data); - } - - - } - function cantLoadInitialDatas(response) {} - - }; - - - - $scope.createBackup = function(){ - - var websiteToBeBacked = $scope.websiteToBeBacked; - $scope.backupLoading = false; - - - - url = "/backup/submitBackupCreation"; - - var data = { - websiteToBeBacked:websiteToBeBacked, - }; - - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - - - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); - - - function ListInitialDatas(response) { - - - if(response.data.metaStatus === 1){ - getBackupStatus(); - } - - } - function cantLoadInitialDatas(response) {} - - }; - - - $scope.deleteBackup = function (id) { - - - url = "/backup/deleteBackup"; - - var data = { - backupID:id, - }; - - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - - - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); - - - function ListInitialDatas(response) { - - - if(response.data.deleteStatus == 1){ - - populateCurrentRecords(); - - - } - else{ - - } - - } - function cantLoadInitialDatas(response) { - - - } - - - - }; + } + }; }); @@ -240,15 +238,14 @@ app.controller('backupWebsiteControl', function($scope,$http,$timeout) { ///** Backup site ends **/// - ///** Restore site ***// -app.controller('restoreWebsiteControl', function($scope,$http,$timeout) { +app.controller('restoreWebsiteControl', function ($scope, $http, $timeout) { $scope.restoreLoading = true; $scope.runningRestore = true; - $scope.restoreButton=true; + $scope.restoreButton = true; $scope.restoreFinished = false; $scope.couldNotConnect = true; $scope.backupError = true; @@ -260,164 +257,161 @@ app.controller('restoreWebsiteControl', function($scope,$http,$timeout) { $scope.fetchDetails = function () { - $scope.restoreLoading = false; - getRestoreStatus(); - }; + $scope.restoreLoading = false; + getRestoreStatus(); + }; - function getRestoreStatus(){ + function getRestoreStatus() { - var backupFile = $scope.backupFile; - - url = "/backup/restoreStatus"; - - var data = { - backupFile:backupFile, - }; - - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - - - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); - - - function ListInitialDatas(response) { - - - if(response.data.restoreStatus === 1){ - - if(response.data.abort === 1){ - $scope.running = response.data.running; - $scope.fileName = $scope.backupFile; - $scope.restoreLoading = true; - $scope.status = response.data.status; - $scope.runningRestore = false; - $scope.restoreButton=false; - $scope.restoreFinished = true; - $timeout.cancel(); - return; - } - else{ - $scope.running = response.data.running; - $scope.fileName = $scope.backupFile; - $scope.restoreLoading = false; - $scope.status = response.data.status; - $scope.runningRestore = false; - $scope.restoreButton = true; - $timeout(getRestoreStatus, 2000); - } - } - - } - function cantLoadInitialDatas(response) { - $scope.couldNotConnect = false; - - - } - - }; - - - $scope.restoreBackup = function(){ var backupFile = $scope.backupFile; - $scope.running = "Lets start.." - url = "/backup/submitRestore"; + url = "/backup/restoreStatus"; - var data = { - backupFile:backupFile, - }; + var data = { + backupFile: backupFile, + }; - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { + function ListInitialDatas(response) { + + if (response.data.restoreStatus === 1) { + + if (response.data.abort === 1) { + $scope.running = response.data.running; + $scope.fileName = $scope.backupFile; $scope.restoreLoading = true; - if(response.data.restoreStatus == 1){ - $scope.runningRestore = false; - $scope.running = "Running"; - $scope.fileName = $scope.backupFile; - $scope.status = "Just Started.."; - - getRestoreStatus(); - } - else{ - $scope.backupError = false; - $scope.errorMessage = response.data.error_message; - } - + $scope.status = response.data.status; + $scope.runningRestore = false; + $scope.restoreButton = false; + $scope.restoreFinished = true; + $timeout.cancel(); + return; } - function cantLoadInitialDatas(response) { - $scope.couldNotConnect = false; - + else { + $scope.running = response.data.running; + $scope.fileName = $scope.backupFile; + $scope.restoreLoading = false; + $scope.status = response.data.status; + $scope.runningRestore = false; + $scope.restoreButton = true; + $timeout(getRestoreStatus, 2000); } + } - }; - - - function createWebsite(){ - - var backupFile = $scope.backupFile; - - url = "/websites/CreateWebsiteFromBackup"; - - var data = { - backupFile:backupFile, - }; - - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); - - - function ListInitialDatas(response) { - - if(response.data.createWebSiteStatus == 1){ - getRestoreStatus(); - } - else if(response.data.existsStatus == 1){ - $scope.backupError = false; - $scope.errorMessage = response.data.error_message; - $scope.restoreButton = true; - $scope.runningRestore = true; - } - else{ - $scope.websiteDomain = domainName; - $scope.backupError = false; - $scope.errorMessage = response.data.error_message; - } - - - } - function cantLoadInitialDatas(response) { - $scope.couldNotConnect = false; - } - - + } + + function cantLoadInitialDatas(response) { + $scope.couldNotConnect = false; + } }; + $scope.restoreBackup = function () { + var backupFile = $scope.backupFile; + $scope.running = "Lets start.." + + url = "/backup/submitRestore"; + + var data = { + backupFile: backupFile, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + $scope.restoreLoading = true; + if (response.data.restoreStatus == 1) { + $scope.runningRestore = false; + $scope.running = "Running"; + $scope.fileName = $scope.backupFile; + $scope.status = "Just Started.."; + + getRestoreStatus(); + } + else { + $scope.backupError = false; + $scope.errorMessage = response.data.error_message; + } + + } + + function cantLoadInitialDatas(response) { + $scope.couldNotConnect = false; + + } + + }; + + + function createWebsite() { + + var backupFile = $scope.backupFile; + + url = "/websites/CreateWebsiteFromBackup"; + + var data = { + backupFile: backupFile, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.createWebSiteStatus == 1) { + getRestoreStatus(); + } + else if (response.data.existsStatus == 1) { + $scope.backupError = false; + $scope.errorMessage = response.data.error_message; + $scope.restoreButton = true; + $scope.runningRestore = true; + } + else { + $scope.websiteDomain = domainName; + $scope.backupError = false; + $scope.errorMessage = response.data.error_message; + } + + + } + + function cantLoadInitialDatas(response) { + $scope.couldNotConnect = false; + } + + + }; + }); @@ -425,11 +419,10 @@ app.controller('restoreWebsiteControl', function($scope,$http,$timeout) { //*** Resotre site ends here ***/// - ///** Backup Destination ***// -app.controller('backupDestinations', function($scope,$http,$timeout) { +app.controller('backupDestinations', function ($scope, $http, $timeout) { $scope.destinationLoading = true; $scope.connectionFailed = true; @@ -452,59 +445,59 @@ app.controller('backupDestinations', function($scope,$http,$timeout) { url = "/backup/submitDestinationCreation"; - var data = { - IPAddress : $scope.IPAddress, - password : $scope.password, - backupSSHPort:$scope.backupSSHPort, - }; + var data = { + IPAddress: $scope.IPAddress, + password: $scope.password, + backupSSHPort: $scope.backupSSHPort, + }; - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { + function ListInitialDatas(response) { - if(response.data.destStatus == 1){ + if (response.data.destStatus == 1) { - $scope.destinationLoading = true; - $scope.connectionFailed = true; - $scope.connectionSuccess = true; - $scope.canNotAddDestination = true; - $scope.destinationAdded = false; - $scope.couldNotConnect = true; + $scope.destinationLoading = true; + $scope.connectionFailed = true; + $scope.connectionSuccess = true; + $scope.canNotAddDestination = true; + $scope.destinationAdded = false; + $scope.couldNotConnect = true; - populateCurrentRecords(); + populateCurrentRecords(); - } - else { - $scope.destinationLoading = true; - $scope.connectionFailed = true; - $scope.connectionSuccess = true; - $scope.canNotAddDestination = false; - $scope.destinationAdded = true; - $scope.couldNotConnect = true; + } + else { + $scope.destinationLoading = true; + $scope.connectionFailed = true; + $scope.connectionSuccess = true; + $scope.canNotAddDestination = false; + $scope.destinationAdded = true; + $scope.couldNotConnect = true; - $scope.errorMessage = response.data.error_message; - } - } - function cantLoadInitialDatas(response) { - $scope.destinationLoading = true; - $scope.connectionFailed = true; - $scope.connectionSuccess = true; - $scope.canNotAddDestination = true; - $scope.destinationAdded = true; - $scope.couldNotConnect = false; - } + $scope.errorMessage = response.data.error_message; + } + } - }; + function cantLoadInitialDatas(response) { + $scope.destinationLoading = true; + $scope.connectionFailed = true; + $scope.connectionSuccess = true; + $scope.canNotAddDestination = true; + $scope.destinationAdded = true; + $scope.couldNotConnect = false; + } + + }; $scope.checkConn = function (ip) { @@ -518,58 +511,58 @@ app.controller('backupDestinations', function($scope,$http,$timeout) { url = "/backup/getConnectionStatus"; - var data = { - IPAddress : ip, - }; + var data = { + IPAddress: ip, + }; - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { + function ListInitialDatas(response) { - if(response.data.connStatus == 1){ + if (response.data.connStatus == 1) { - $scope.destinationLoading = true; - $scope.connectionFailed = true; - $scope.connectionSuccess = false; - $scope.canNotAddDestination = true; - $scope.destinationAdded = true; - $scope.couldNotConnect = true; + $scope.destinationLoading = true; + $scope.connectionFailed = true; + $scope.connectionSuccess = false; + $scope.canNotAddDestination = true; + $scope.destinationAdded = true; + $scope.couldNotConnect = true; - $scope.IPAddress = ip; + $scope.IPAddress = ip; - } - else { - $scope.destinationLoading = true; - $scope.connectionFailed = false; - $scope.connectionSuccess = true; - $scope.canNotAddDestination = true; - $scope.destinationAdded = true; - $scope.couldNotConnect = true; + } + else { + $scope.destinationLoading = true; + $scope.connectionFailed = false; + $scope.connectionSuccess = true; + $scope.canNotAddDestination = true; + $scope.destinationAdded = true; + $scope.couldNotConnect = true; - $scope.errorMessage = response.data.error_message; - $scope.IPAddress = ip; - } - } - function cantLoadInitialDatas(response) { - $scope.destinationLoading = true; - $scope.connectionFailed = true; - $scope.connectionSuccess = true; - $scope.canNotAddDestination = true; - $scope.destinationAdded = true; - $scope.couldNotConnect = false; - } + $scope.errorMessage = response.data.error_message; + $scope.IPAddress = ip; + } + } - }; + function cantLoadInitialDatas(response) { + $scope.destinationLoading = true; + $scope.connectionFailed = true; + $scope.connectionSuccess = true; + $scope.canNotAddDestination = true; + $scope.destinationAdded = true; + $scope.couldNotConnect = false; + } + + }; $scope.delDest = function (ip) { @@ -583,94 +576,92 @@ app.controller('backupDestinations', function($scope,$http,$timeout) { url = "/backup/deleteDestination"; - var data = { - IPAddress : ip, - }; + var data = { + IPAddress: ip, + }; - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { + function ListInitialDatas(response) { - if(response.data.delStatus == 1){ + if (response.data.delStatus == 1) { - $scope.destinationLoading = true; - $scope.connectionFailed = true; - $scope.connectionSuccess = true; - $scope.canNotAddDestination = true; - $scope.destinationAdded = true; - $scope.couldNotConnect = true; - populateCurrentRecords(); + $scope.destinationLoading = true; + $scope.connectionFailed = true; + $scope.connectionSuccess = true; + $scope.canNotAddDestination = true; + $scope.destinationAdded = true; + $scope.couldNotConnect = true; + populateCurrentRecords(); - $scope.IPAddress = ip; + $scope.IPAddress = ip; - } - else { - $scope.destinationLoading = true; - $scope.connectionFailed = true; - $scope.connectionSuccess = true; - $scope.canNotAddDestination = true; - $scope.destinationAdded = true; - $scope.couldNotConnect = true; + } + else { + $scope.destinationLoading = true; + $scope.connectionFailed = true; + $scope.connectionSuccess = true; + $scope.canNotAddDestination = true; + $scope.destinationAdded = true; + $scope.couldNotConnect = true; - $scope.errorMessage = response.data.error_message; - $scope.IPAddress = ip; - } - } - function cantLoadInitialDatas(response) { - $scope.destinationLoading = true; - $scope.connectionFailed = true; - $scope.connectionSuccess = true; - $scope.canNotAddDestination = true; - $scope.destinationAdded = true; - $scope.couldNotConnect = false; - } + $scope.errorMessage = response.data.error_message; + $scope.IPAddress = ip; + } + } - }; + function cantLoadInitialDatas(response) { + $scope.destinationLoading = true; + $scope.connectionFailed = true; + $scope.connectionSuccess = true; + $scope.canNotAddDestination = true; + $scope.destinationAdded = true; + $scope.couldNotConnect = false; + } + + }; + function populateCurrentRecords() { - function populateCurrentRecords(){ + url = "/backup/getCurrentBackupDestinations"; - url = "/backup/getCurrentBackupDestinations"; + var data = {}; - var data = { - }; - - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { + function ListInitialDatas(response) { - if(response.data.fetchStatus == 1){ + if (response.data.fetchStatus == 1) { - $scope.records = JSON.parse(response.data.data); + $scope.records = JSON.parse(response.data.data); - } - } - function cantLoadInitialDatas(response) { - $scope.couldNotConnect = false; - } + } + } - }; + function cantLoadInitialDatas(response) { + $scope.couldNotConnect = false; + } + + }; }); @@ -681,7 +672,7 @@ app.controller('backupDestinations', function($scope,$http,$timeout) { ///** Schedule Backup ***// -app.controller('scheduleBackup', function($scope,$http,$timeout) { +app.controller('scheduleBackup', function ($scope, $http, $timeout) { $scope.scheduleBackupLoading = true; $scope.canNotAddSchedule = true; @@ -689,6 +680,7 @@ app.controller('scheduleBackup', function($scope,$http,$timeout) { $scope.couldNotConnect = true; $scope.scheduleFreq = true; $scope.scheduleBtn = true; + $scope.localPath = true; populateCurrentRecords(); @@ -700,6 +692,12 @@ app.controller('scheduleBackup', function($scope,$http,$timeout) { $scope.scheduleFreq = false; $scope.scheduleBtn = true; + if($scope.backupDest === 'Home'){ + $scope.localPath = false; + }else{ + $scope.localPath = true; + } + }; $scope.scheduleBtnView = function () { @@ -722,67 +720,66 @@ app.controller('scheduleBackup', function($scope,$http,$timeout) { $scope.scheduleBtn = false; - url = "/backup/submitBackupSchedule"; - var data = { - backupDest : $scope.backupDest, - backupFreq : $scope.backupFreq, - }; + var data = { + backupDest: $scope.backupDest, + backupFreq: $scope.backupFreq, + localPath: $scope.localPathValue + }; - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { + function ListInitialDatas(response) { - if(response.data.scheduleStatus == 1){ + if (response.data.scheduleStatus == 1) { - $scope.scheduleBackupLoading = true; - $scope.canNotAddSchedule = true; - $scope.scheduleAdded = false; - $scope.couldNotConnect = true; - $scope.scheduleFreq = true; - $scope.scheduleBtn = true; + $scope.scheduleBackupLoading = true; + $scope.canNotAddSchedule = true; + $scope.scheduleAdded = false; + $scope.couldNotConnect = true; + $scope.scheduleFreq = true; + $scope.scheduleBtn = true; + populateCurrentRecords(); - populateCurrentRecords(); + } + else { - } - else { + $scope.scheduleBackupLoading = true; + $scope.canNotAddSchedule = false; + $scope.scheduleAdded = true; + $scope.couldNotConnect = true; + $scope.scheduleFreq = false; + $scope.scheduleBtn = false; - $scope.scheduleBackupLoading = true; - $scope.canNotAddSchedule = false; - $scope.scheduleAdded = true; - $scope.couldNotConnect = true; - $scope.scheduleFreq = false; - $scope.scheduleBtn = false; + $scope.errorMessage = response.data.error_message; + } + } - $scope.errorMessage = response.data.error_message; - } - } - function cantLoadInitialDatas(response) { + function cantLoadInitialDatas(response) { - $scope.scheduleBackupLoading = true; - $scope.canNotAddSchedule = true; - $scope.scheduleAdded = true; - $scope.couldNotConnect = false; - $scope.scheduleFreq = false; - $scope.scheduleBtn = false; + $scope.scheduleBackupLoading = true; + $scope.canNotAddSchedule = true; + $scope.scheduleAdded = true; + $scope.couldNotConnect = false; + $scope.scheduleFreq = false; + $scope.scheduleBtn = false; - } + } - }; + }; $scope.checkConn = function (ip) { @@ -796,60 +793,60 @@ app.controller('scheduleBackup', function($scope,$http,$timeout) { url = "/backup/getConnectionStatus"; - var data = { - IPAddress : ip, - }; + var data = { + IPAddress: ip, + }; - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { + function ListInitialDatas(response) { - if(response.data.connStatus == 1){ + if (response.data.connStatus == 1) { - $scope.destinationLoading = true; - $scope.connectionFailed = true; - $scope.connectionSuccess = false; - $scope.canNotAddDestination = true; - $scope.destinationAdded = true; - $scope.couldNotConnect = true; + $scope.destinationLoading = true; + $scope.connectionFailed = true; + $scope.connectionSuccess = false; + $scope.canNotAddDestination = true; + $scope.destinationAdded = true; + $scope.couldNotConnect = true; - $scope.IPAddress = ip; + $scope.IPAddress = ip; - } - else { - $scope.destinationLoading = true; - $scope.connectionFailed = false; - $scope.connectionSuccess = true; - $scope.canNotAddDestination = true; - $scope.destinationAdded = true; - $scope.couldNotConnect = true; + } + else { + $scope.destinationLoading = true; + $scope.connectionFailed = false; + $scope.connectionSuccess = true; + $scope.canNotAddDestination = true; + $scope.destinationAdded = true; + $scope.couldNotConnect = true; - $scope.errorMessage = response.data.error_message; - $scope.IPAddress = ip; - } - } - function cantLoadInitialDatas(response) { - $scope.destinationLoading = true; - $scope.connectionFailed = true; - $scope.connectionSuccess = true; - $scope.canNotAddDestination = true; - $scope.destinationAdded = true; - $scope.couldNotConnect = false; - } + $scope.errorMessage = response.data.error_message; + $scope.IPAddress = ip; + } + } - }; + function cantLoadInitialDatas(response) { + $scope.destinationLoading = true; + $scope.connectionFailed = true; + $scope.connectionSuccess = true; + $scope.canNotAddDestination = true; + $scope.destinationAdded = true; + $scope.couldNotConnect = false; + } - $scope.delSchedule = function (destLoc,frequency) { + }; + + $scope.delSchedule = function (destLoc, frequency) { $scope.scheduleBackupLoading = false; $scope.canNotAddSchedule = true; @@ -862,96 +859,94 @@ app.controller('scheduleBackup', function($scope,$http,$timeout) { url = "/backup/scheduleDelete"; - var data = { - destLoc : destLoc, - frequency: frequency, - }; + var data = { + destLoc: destLoc, + frequency: frequency, + }; - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { + function ListInitialDatas(response) { - if(response.data.delStatus == 1){ + if (response.data.delStatus == 1) { - $scope.scheduleBackupLoading = true; - $scope.canNotAddSchedule = true; - $scope.scheduleAdded = true; - $scope.couldNotConnect = true; - $scope.scheduleFreq = true; - $scope.scheduleBtn = true; + $scope.scheduleBackupLoading = true; + $scope.canNotAddSchedule = true; + $scope.scheduleAdded = true; + $scope.couldNotConnect = true; + $scope.scheduleFreq = true; + $scope.scheduleBtn = true; - populateCurrentRecords(); + populateCurrentRecords(); - } - else { + } + else { - $scope.scheduleBackupLoading = true; - $scope.canNotAddSchedule = true; - $scope.scheduleAdded = true; - $scope.couldNotConnect = true; - $scope.scheduleFreq = true; - $scope.scheduleBtn = true; - $scope.errorMessage = response.data.error_message; - } - } - function cantLoadInitialDatas(response) { + $scope.scheduleBackupLoading = true; + $scope.canNotAddSchedule = true; + $scope.scheduleAdded = true; + $scope.couldNotConnect = true; + $scope.scheduleFreq = true; + $scope.scheduleBtn = true; + $scope.errorMessage = response.data.error_message; + } + } - $scope.scheduleBackupLoading = true; - $scope.canNotAddSchedule = true; - $scope.scheduleAdded = true; - $scope.couldNotConnect = false; - $scope.scheduleFreq = true; - $scope.scheduleBtn = true; - } + function cantLoadInitialDatas(response) { - }; + $scope.scheduleBackupLoading = true; + $scope.canNotAddSchedule = true; + $scope.scheduleAdded = true; + $scope.couldNotConnect = false; + $scope.scheduleFreq = true; + $scope.scheduleBtn = true; + } + + }; + function populateCurrentRecords() { - function populateCurrentRecords(){ + url = "/backup/getCurrentBackupSchedules"; - url = "/backup/getCurrentBackupSchedules"; + var data = {}; - var data = { - }; - - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { + function ListInitialDatas(response) { - if(response.data.fetchStatus == 1){ + if (response.data.fetchStatus == 1) { - $scope.records = JSON.parse(response.data.data); + $scope.records = JSON.parse(response.data.data); - } - } - function cantLoadInitialDatas(response) { - $scope.couldNotConnect = false; - } + } + } - }; + function cantLoadInitialDatas(response) { + $scope.couldNotConnect = false; + } + + }; }); @@ -960,7 +955,7 @@ app.controller('scheduleBackup', function($scope,$http,$timeout) { //*** Remote Backup site ****// -app.controller('remoteBackupControl', function($scope, $http, $timeout) { +app.controller('remoteBackupControl', function ($scope, $http, $timeout) { $scope.backupButton = true; $scope.backupLoading = true; @@ -993,49 +988,46 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { var index = 0; var tempTransferDir = ""; - $scope.passwordEnter = function() { + $scope.passwordEnter = function () { $scope.backupButton = false; }; - $scope.addRemoveWebsite = function (website,websiteStatus) { + $scope.addRemoveWebsite = function (website, websiteStatus) { - if(websiteStatus==true) - { + if (websiteStatus === true) { var check = 1; - for(var j = 0; j < websitesToBeBacked.length; j++){ - if (websitesToBeBacked[j] == website){ - check = 0; - break; - } + for (var j = 0; j < websitesToBeBacked.length; j++) { + if (websitesToBeBacked[j] == website) { + check = 0; + break; } - if(check == 1) { + } + if (check == 1) { websitesToBeBacked.push(website); } } - else{ + else { var tempArray = []; - for(var j = 0; j < websitesToBeBacked.length; j++){ - if (websitesToBeBacked[j] != website){ - tempArray.push(websitesToBeBacked[j]); - } + for (var j = 0; j < websitesToBeBacked.length; j++) { + if (websitesToBeBacked[j] != website) { + tempArray.push(websitesToBeBacked[j]); } + } websitesToBeBacked = tempArray; } }; $scope.allChecked = function (webSiteStatus) { - - - if(webSiteStatus==true) { + if (webSiteStatus === true) { websitesToBeBacked = websitesToBeBackedTemp; $scope.webSiteStatus = true; } - else{ + else { websitesToBeBacked = []; $scope.webSiteStatus = false; } @@ -1078,7 +1070,7 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { $scope.records = JSON.parse(response.data.data); var parsed = JSON.parse(response.data.data); - for(var j = 0; j < parsed.length; j++){ + for (var j = 0; j < parsed.length; j++) { websitesToBeBackedTemp.push(parsed[j].website); } @@ -1140,9 +1132,8 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { $scope.backupCancelled = true; - - if(websitesToBeBacked.length === 0){ - alert("No websites selected for transfer.") + if (websitesToBeBacked.length === 0) { + alert("No websites selected for transfer."); return; } @@ -1159,7 +1150,7 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { var data = { ipAddress: IPAddress, password: password, - accountsToTransfer:websitesToBeBacked, + accountsToTransfer: websitesToBeBacked, }; var config = { @@ -1174,28 +1165,28 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { function ListInitialDatas(response) { if (response.data.remoteTransferStatus === 1) { - tempTransferDir = response.data.dir; - $scope.accountsInRemoteServerTable = true; + tempTransferDir = response.data.dir; + $scope.accountsInRemoteServerTable = true; - // notifications boxes - $scope.notificationsBox = false; - $scope.errorMessage = true; - $scope.couldNotConnect = true; - $scope.accountsFetched = true; - $scope.backupProcessStarted = false; - $scope.backupCancelled = true; + // notifications boxes + $scope.notificationsBox = false; + $scope.errorMessage = true; + $scope.couldNotConnect = true; + $scope.accountsFetched = true; + $scope.backupProcessStarted = false; + $scope.backupCancelled = true; - // disable transfer button + // disable transfer button - $scope.startTransferbtn = true; + $scope.startTransferbtn = true; - // enable cancel button + // enable cancel button - $scope.stopTransferbtn = false; + $scope.stopTransferbtn = false; - getBackupStatus(); + getBackupStatus(); } @@ -1220,15 +1211,15 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { function cantLoadInitialDatas(response) { - // Notifications box settings + // Notifications box settings - // notifications boxes - $scope.notificationsBox = false; - $scope.errorMessage = true; - $scope.couldNotConnect = false; - $scope.accountsFetched = true; - $scope.backupProcessStarted = true; - $scope.backupCancelled = true; + // notifications boxes + $scope.notificationsBox = false; + $scope.errorMessage = true; + $scope.couldNotConnect = false; + $scope.accountsFetched = true; + $scope.backupProcessStarted = true; + $scope.backupCancelled = true; } @@ -1239,7 +1230,7 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { url = "/backup/getRemoteTransferStatus"; var data = { - password : $scope.password, + password: $scope.password, ipAddress: $scope.IPAddress, dir: tempTransferDir }; @@ -1257,12 +1248,12 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { if (response.data.remoteTransferStatus === 1) { - if(response.data.backupsSent === 0){ + if (response.data.backupsSent === 0) { $scope.backupStatus = false; $scope.requestData = response.data.status; $timeout(getBackupStatus, 2000); } - else{ + else { $scope.requestData = response.data.status; $timeout.cancel(); @@ -1271,7 +1262,7 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { remoteBackupRestore(); } } - else{ + else { $scope.error_message = response.data.error_message; $scope.backupLoading = true; @@ -1290,16 +1281,16 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { } function cantLoadInitialDatas(response) { - // Notifications box settings + // Notifications box settings - $scope.couldNotConnect = false; - $scope.errorMessage = true; - $scope.accountsFetched = true; - $scope.notificationsBox = false; + $scope.couldNotConnect = false; + $scope.errorMessage = true; + $scope.accountsFetched = true; + $scope.notificationsBox = false; } }; - function remoteBackupRestore(){ + function remoteBackupRestore() { url = "/backup/remoteBackupRestore"; var data = { @@ -1318,18 +1309,18 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { function ListInitialDatas(response) { if (response.data.remoteRestoreStatus === 1) { - localRestoreStatus(); + localRestoreStatus(); } } function cantLoadInitialDatas(response) { - // Notifications box settings + // Notifications box settings - $scope.couldNotConnect = false; - $scope.errorMessage = true; - $scope.accountsFetched = true; - $scope.notificationsBox = false; - $scope.backupLoading = true; + $scope.couldNotConnect = false; + $scope.errorMessage = true; + $scope.accountsFetched = true; + $scope.notificationsBox = false; + $scope.backupLoading = true; } /////////////// @@ -1339,7 +1330,6 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { function localRestoreStatus(password) { - url = "/backup/localRestoreStatus"; var data = { @@ -1359,19 +1349,19 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { if (response.data.remoteTransferStatus === 1) { - if(response.data.complete === 0){ + if (response.data.complete === 0) { $scope.backupStatus = false; $scope.restoreData = response.data.status; $timeout(localRestoreStatus, 2000); } - else{ + else { $scope.restoreData = response.data.status; $timeout.cancel(); $scope.backupLoading = true; $scope.startTransferbtn = false; } } - else{ + else { $scope.error_message = response.data.error_message; $scope.backupLoading = true; @@ -1389,12 +1379,12 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { } function cantLoadInitialDatas(response) { - // Notifications box settings + // Notifications box settings - $scope.couldNotConnect = false; - $scope.errorMessage = true; - $scope.accountsFetched = true; - $scope.notificationsBox = false; + $scope.couldNotConnect = false; + $scope.errorMessage = true; + $scope.accountsFetched = true; + $scope.notificationsBox = false; } }; @@ -1404,7 +1394,7 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { url = "/backup/getRemoteTransferStatus"; var data = { - password : $scope.password, + password: $scope.password, ipAddress: $scope.IPAddress, dir: tempTransferDir, }; @@ -1422,12 +1412,12 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { if (response.data.remoteTransferStatus == 1) { - if(response.data.backupsSent == 0){ + if (response.data.backupsSent == 0) { $scope.backupStatus = false; $scope.requestData = response.data.status; $timeout(getBackupStatus, 2000); } - else{ + else { $timeout.cancel(); } } @@ -1435,12 +1425,12 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { } function cantLoadInitialDatas(response) { - // Notifications box settings + // Notifications box settings - $scope.couldNotConnect = false; - $scope.errorMessage = true; - $scope.accountsFetched = true; - $scope.notificationsBox = false; + $scope.couldNotConnect = false; + $scope.errorMessage = true; + $scope.accountsFetched = true; + $scope.notificationsBox = false; } }; @@ -1465,7 +1455,7 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { var data = { ipAddress: IPAddress, password: password, - dir:tempTransferDir, + dir: tempTransferDir, }; var config = { @@ -1480,35 +1470,35 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { function ListInitialDatas(response) { if (response.data.cancelStatus == 1) { - $scope.backupLoading = true; + $scope.backupLoading = true; - // notifications boxes - $scope.notificationsBox = false; - $scope.errorMessage = true; - $scope.couldNotConnect = true; - $scope.accountsFetched = true; - $scope.backupProcessStarted = true; - $scope.backupCancelled = false; + // notifications boxes + $scope.notificationsBox = false; + $scope.errorMessage = true; + $scope.couldNotConnect = true; + $scope.accountsFetched = true; + $scope.backupProcessStarted = true; + $scope.backupCancelled = false; - // enable transfer button + // enable transfer button - $scope.startTransferbtn = false; + $scope.startTransferbtn = false; - //disable cancel button + //disable cancel button - $scope.stopTransferbtn = true; + $scope.stopTransferbtn = true; - // hide status box + // hide status box - $scope.backupStatus = true; + $scope.backupStatus = true; - // bring back websites table + // bring back websites table - $scope.accountsInRemoteServerTable = false; + $scope.accountsInRemoteServerTable = false; - // enable fetch button + // enable fetch button - $scope.fetchAccountsBtn = false; + $scope.fetchAccountsBtn = false; } @@ -1527,21 +1517,20 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { $scope.backupCancelled = true; - } } function cantLoadInitialDatas(response) { - // notifications boxes + // notifications boxes - $scope.notificationsBox = false; - $scope.errorMessage = true; - $scope.couldNotConnect = false; - $scope.accountsFetched = true; - $scope.backupProcessStarted = true; - $scope.backupCancelled = true; + $scope.notificationsBox = false; + $scope.errorMessage = true; + $scope.couldNotConnect = false; + $scope.accountsFetched = true; + $scope.backupProcessStarted = true; + $scope.backupCancelled = true; } diff --git a/backup/templates/backup/backupDestinations.html b/backup/templates/backup/backupDestinations.html index f7fa6171f..06a97e21b 100644 --- a/backup/templates/backup/backupDestinations.html +++ b/backup/templates/backup/backupDestinations.html @@ -63,8 +63,7 @@
    - -
    +

    {% trans "Connection to" %} {$ IPAddress $} {% trans "failed. Please delete and re-add. " %} {$ errorMessage $}

    diff --git a/backup/templates/backup/backupSchedule.html b/backup/templates/backup/backupSchedule.html index 2a2b35b81..69de37618 100644 --- a/backup/templates/backup/backupSchedule.html +++ b/backup/templates/backup/backupSchedule.html @@ -3,121 +3,134 @@ {% block title %}{% trans "Schedule Back up - CyberPanel" %} {% endblock %} {% block content %} -{% load static %} - -{% get_current_language as LANGUAGE_CODE %} - - -
    -
    -

    {% trans "Schedule Back up" %} - {% trans "Remote Backups" %}

    -

    {% trans "On this page you can schedule Back ups to localhost or remote server (If you have added one)." %}

    -
    - -
    -
    -

    - {% trans "Schedule Back up" %} -

    -
    - - -
    - - -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - - - -
    - -
    - - -
    -
    - - - - - -
    - - -
    - -
    -

    {% trans "Cannot add schedule. Error message:" %} {$ errorMessage $}

    -
    - -
    -

    {% trans "Schedule Added" %}

    -
    - -
    -

    {% trans "Could not connect to server. Please refresh this page." %}

    -
    -
    -
    - -
    - -
    - - - - - - - - - - - - - - - - - - - -
    {% trans "ID" %}{% trans "Destination" %}{% trans "Frequency" %}{% trans "Delete" %}
    -
    -
    - - - - -
    - + {% load static %} + {% get_current_language as LANGUAGE_CODE %} + +
    +
    +

    {% trans "Schedule Back up" %} - {% trans "Remote Backups" %}

    +

    {% trans "On this page you can schedule Back ups to localhost or remote server (If you have added one)." %}

    + +
    +
    +

    + {% trans "Schedule Back up" %} +

    +
    + + +
    + + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + + +
    + +
    + + +
    +
    + + + + + +
    + + +
    + +
    +

    {% trans "Cannot add schedule. Error message:" %} {$ errorMessage $}

    +
    + +
    +

    {% trans "Schedule Added" %}

    +
    + +
    +

    {% trans "Could not connect to server. Please refresh this page." %}

    +
    +
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + +
    {% trans "ID" %}{% trans "Destination" %}{% trans "Frequency" %}{% trans "Delete" %}
    +
    +
    + + + + +
    + + +
    +
    +
    + +
    -
    - - -
    {% endblock %} \ No newline at end of file diff --git a/backup/templates/backup/index.html b/backup/templates/backup/index.html index 571e6d842..f0cd19819 100644 --- a/backup/templates/backup/index.html +++ b/backup/templates/backup/index.html @@ -13,60 +13,94 @@

    {% trans "Back up" %}

    {% trans "Back up and restore sites." %}

    -
    +
    -

    +

    {% trans "Available Functions" %}

    - {% if viewStatus == 0 %} +
    -
    - + {% if createBackup or admin %} -
    + - {% else %} + {% endif %} -
    - + {% if restoreBackup or admin %} - + + + {% endif %} + + + {% if addDeleteDestinations or admin %} + + + + {% endif %} + + {% if scheDuleBackups or admin %} + + + + {% endif %} + + {% if remoteBackups or admin %} + + + + {% endif %}
    - - {% endif %} -
    @@ -74,4 +108,4 @@
    -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/backup/urls.py b/backup/urls.py index df1efd2c8..47d79639b 100644 --- a/backup/urls.py +++ b/backup/urls.py @@ -46,6 +46,8 @@ urlpatterns = [ url(r'^cancelRemoteBackup', views.cancelRemoteBackup, name='cancelRemoteBackup'), + url(r'^localInitiate$', views.localInitiate, name='localInitiate'), + diff --git a/backup/views.py b/backup/views.py index 0487c3382..e237e1094 100644 --- a/backup/views.py +++ b/backup/views.py @@ -1,1514 +1,341 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.shortcuts import render,redirect -from django.http import HttpResponse # Create your views here. -from .models import DBUsers -from loginSystem.models import Administrator import json -from websiteFunctions.models import Websites,Backups,dest,backupSchedules -import plogical.CyberCPLogFileWriter as logging + +from django.shortcuts import redirect + +from backup.backupManager import BackupManager +from backup.pluginManager import pluginManager from loginSystem.views import loadLoginPage import os -import time -import plogical.backupUtilities as backupUtil -import shlex -import subprocess -import requests -from baseTemplate.models import version -from plogical.virtualHostUtilities import virtualHostUtilities -from random import randint -from plogical.mailUtilities import mailUtilities - - +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +from django.shortcuts import HttpResponse +from django.views.decorators.csrf import csrf_exempt def loadBackupHome(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - viewStatus = 1 - if admin.type == 3: - viewStatus = 0 - - return render(request,'backup/index.html',{"viewStatus":viewStatus}) - except KeyError: - return redirect(loadLoginPage) - -def restoreSite(request): - try: - val = request.session['userID'] - try: - admin = Administrator.objects.get(pk=request.session['userID']) - - if admin.type == 1: - - path = os.path.join("/home","backup") - - if not os.path.exists(path): - return render(request, 'backup/restore.html') - else: - all_files = [] - ext = ".tar.gz" - - command = 'sudo chown -R cyberpanel:cyberpanel '+ path - - cmd = shlex.split(command) - - res = subprocess.call(cmd) - - files = os.listdir(path) - for filename in files: - if filename.endswith(ext): - all_files.append(filename) - - return render(request, 'backup/restore.html',{'backups':all_files}) - - else: - return HttpResponse("You should be admin to perform restores.") - - except BaseException, msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return HttpResponse(str(msg)) + userID = request.session['userID'] + bm = BackupManager() + return bm.loadBackupHome(request, userID) except KeyError: return redirect(loadLoginPage) def backupSite(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - try: - - if admin.type == 1: - websites = Websites.objects.all() - websitesName = [] - - for items in websites: - websitesName.append(items.domain) - else: - if admin.type == 2: - websites = admin.websites_set.all() - admins = Administrator.objects.filter(owner=admin.pk) - websitesName = [] - - for items in websites: - websitesName.append(items.domain) - - for items in admins: - webs = items.websites_set.all() - - for web in webs: - websitesName.append(web.domain) - else: - websitesName = [] - websites = Websites.objects.filter(admin=admin) - for items in websites: - websitesName.append(items.domain) - - return render(request, 'backup/backup.html', {'websiteList':websitesName}) - except BaseException, msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return HttpResponse(str(msg)) + userID = request.session['userID'] + bm = BackupManager() + return bm.backupSite(request, userID) except KeyError: return redirect(loadLoginPage) + +def restoreSite(request): + try: + userID = request.session['userID'] + bm = BackupManager() + return bm.restoreSite(request, userID) + except KeyError: + return redirect(loadLoginPage) + + def getCurrentBackups(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - try: - if request.method == 'POST': - - - data = json.loads(request.body) - backupDomain = data['websiteToBeBacked'] - website = Websites.objects.get(domain=backupDomain) - - if admin.type != 1: - if website.admin != admin: - dic = {'fetchStatus': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - backups = website.backups_set.all() - - - json_data = "[" - checker = 0 - - for items in backups: - if items.status == 0: - status="Pending" - else: - status="Completed" - dic = {'id': items.id, - 'file': items.fileName, - 'date': items.date, - 'size': items.size, - 'status': status - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - - json_data = json_data + ']' - final_json = json.dumps({'fetchStatus': 1, 'error_message': "None","data":json_data}) - return HttpResponse(final_json) - - except BaseException,msg: - final_dic = {'fetchStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - - return HttpResponse(final_json) + userID = request.session['userID'] + wm = BackupManager() + return wm.getCurrentBackups(userID, json.loads(request.body)) except KeyError: - final_dic = {'fetchStatus': 0, 'error_message': "Not Logged In, please refresh the page or login again."} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) + return redirect(loadLoginPage) def submitBackupCreation(request): try: - if request.method == 'POST': + userID = request.session['userID'] - data = json.loads(request.body) + result = pluginManager.preSubmitBackupCreation(request) + if result != 200: + return result - backupDomain = data['websiteToBeBacked'] - website = Websites.objects.get(domain=backupDomain) + wm = BackupManager() + coreResult = wm.submitBackupCreation(userID, json.loads(request.body)) - ## defining paths - - ## /home/example.com/backup - backupPath = os.path.join("/home",backupDomain,"backup/") - domainUser = website.externalApp - backupName = 'backup-' + domainUser + "-" + time.strftime("%I-%M-%S-%a-%b-%Y") - - ## /home/example.com/backup/backup-example-06-50-03-Thu-Feb-2018 - tempStoragePath = os.path.join(backupPath,backupName) - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - execPath = execPath + " submitBackupCreation --tempStoragePath " + tempStoragePath + " --backupName " \ - + backupName + " --backupPath " + backupPath + ' --backupDomain ' + backupDomain - - subprocess.Popen(shlex.split(execPath)) - - time.sleep(2) - - final_json = json.dumps({'metaStatus': 1, 'error_message': "None", 'tempStorage': tempStoragePath}) - return HttpResponse(final_json) + return coreResult except BaseException, msg: - final_dic = {'metaStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) + logging.writeToFile(str(msg)) - return HttpResponse(final_json) def backupStatus(request): try: - try: - if request.method == 'POST': - - data = json.loads(request.body) - backupDomain = data['websiteToBeBacked'] - - status = os.path.join("/home",backupDomain,"backup/status") - - ## read file name - - try: - backupFileNamePath = os.path.join("/home",backupDomain,"backup/backupFileName") - command = "sudo cat " + backupFileNamePath - fileName = subprocess.check_output(shlex.split(command)) - except: - fileName = "Fetching.." - - ## file name read ends - - if os.path.exists(status): - command = "sudo cat " + status - status = subprocess.check_output(shlex.split(command)) - - if status.find("Completed")> -1: - - command = 'sudo rm -f ' + status - subprocess.call(shlex.split(command)) - - backupOb = Backups.objects.get(fileName=fileName) - backupOb.status = 1 - - ## adding backup data to database. - try: - backupOb.size = str(int(float(os.path.getsize("/home/"+backupDomain+"/backup/"+fileName+".tar.gz"))/(1024.0 * 1024.0)))+"MB" - backupOb.save() - except: - backupOb.size = str(int(os.path.getsize("/home/"+backupDomain+"/backup/"+fileName+".tar.gz"))) - backupOb.save() - - final_json = json.dumps({'backupStatus': 1, 'error_message': "None", "status": status,"abort": 1,'fileName': fileName,}) - return HttpResponse(final_json) - - elif status.find("[5009]")> -1: - ## removing status file, so that backup can re-run - try: - command = 'sudo rm -f ' + status - cmd = shlex.split(command) - res = subprocess.call(cmd) - - backupOb = Backups.objects.get(fileName=fileName) - backupOb.delete() - except BaseException,msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [backupStatus]") - - final_json = json.dumps({'backupStatus': 1,'fileName': fileName, 'error_message': "None", "status": status, "abort": 1}) - return HttpResponse(final_json) - else: - final_json = json.dumps( - {'backupStatus': 1, 'error_message': "None", 'fileName': fileName, "status": status,"abort": 0}) - return HttpResponse(final_json) - else: - final_json = json.dumps({'backupStatus': 0, 'error_message': "None", "status": 0,"abort": 0}) - return HttpResponse(final_json) - - - except BaseException,msg: - final_dic = {'backupStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [backupStatus]") - - return HttpResponse(final_json) + userID = 1 + wm = BackupManager() + return wm.backupStatus(userID, json.loads(request.body)) except KeyError: - final_dic = {'backupStatus': 0, 'error_message': "Not Logged In, please refresh the page or login again."} - final_json = json.dumps(final_dic) - logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [backupStatus]") - return HttpResponse(final_json) + return redirect(loadLoginPage) + def cancelBackupCreation(request): try: - val = request.session['userID'] - try: - if request.method == 'POST': - - - data = json.loads(request.body) - backupCancellationDomain = data['backupCancellationDomain'] - fileName = data['fileName'] - - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - - execPath = execPath + " cancelBackupCreation --backupCancellationDomain " + backupCancellationDomain + " --fileName " + fileName - - subprocess.call(shlex.split(execPath)) - - try: - backupOb = Backups.objects.get(fileName=fileName) - backupOb.delete() - except BaseException, msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [cancelBackupCreation]") - - final_json = json.dumps({'abortStatus': 1, 'error_message': "None", "status": 0}) - return HttpResponse(final_json) - except BaseException,msg: - final_dic = {'abortStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - - return HttpResponse(final_json) + userID = request.session['userID'] + wm = BackupManager() + return wm.cancelBackupCreation(userID, json.loads(request.body)) except KeyError: - final_dic = {'abortStatus': 0, 'error_message': "Not Logged In, please refresh the page or login again."} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) + return redirect(loadLoginPage) def deleteBackup(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - try: - if request.method == 'POST': + userID = request.session['userID'] - data = json.loads(request.body) - backupID = data['backupID'] - backup = Backups.objects.get(id=backupID) + result = pluginManager.preDeleteBackup(request) + if result != 200: + return result - if admin.type != 1: - if backup.website.admin != admin: - dic = {'deleteStatus': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) + wm = BackupManager() + coreResult = wm.deleteBackup(userID, json.loads(request.body)) - domainName = backup.website.domain + result = pluginManager.postDeleteBackup(request, coreResult) + if result != 200: + return result - path = "/home/"+domainName+"/backup/"+backup.fileName+".tar.gz" + return coreResult - command = 'sudo rm -f ' + path - cmd = shlex.split(command) - res = subprocess.call(cmd) - - backup.delete() - - - final_json = json.dumps({'deleteStatus': 1, 'error_message': "None", "status": 0}) - return HttpResponse(final_json) - - - except BaseException,msg: - final_dic = {'deleteStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - - return HttpResponse(final_json) except KeyError: - final_dic = {'deleteStatus': 0, 'error_message': "Not Logged In, please refresh the page or login again."} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) + return redirect(loadLoginPage) + def submitRestore(request): try: - if request.method == 'POST': + userID = request.session['userID'] + result = pluginManager.preSubmitRestore(request) + if result != 200: + return result - data = json.loads(request.body) - backupFile = data['backupFile'] + wm = BackupManager() + coreResult = wm.submitRestore(json.loads(request.body), userID) - originalFile = "/home/backup/" + backupFile - - if not os.path.exists(originalFile): - dir = data['dir'] - else: - dir = "CyberPanelRestore" - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - - execPath = execPath + " submitRestore --backupFile " + backupFile + " --dir " + dir - - subprocess.Popen(shlex.split(execPath)) - - time.sleep(4) - - final_dic = {'restoreStatus': 1, 'error_message': "None"} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - except BaseException, msg: - final_dic = {'restoreStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) + return coreResult + except KeyError: + return redirect(loadLoginPage) def restoreStatus(request): try: - if request.method == 'POST': + wm = BackupManager() + return wm.restoreStatus(json.loads(request.body)) + except KeyError: + return redirect(loadLoginPage) - data = json.loads(request.body) - backupFile = data['backupFile'].strip(".tar.gz") - - path = os.path.join("/home","backup",data['backupFile']) - - if os.path.exists(path): - path = os.path.join("/home","backup",backupFile) - elif os.path.exists(data['backupFile']): - path = data['backupFile'].strip(".tar.gz") - else: - dir = data['dir'] - path = "/home/backup/transfer-" + str(dir) + "/" + backupFile - - if os.path.exists(path): - try: - execPath = "sudo cat " + path + "/status" - - status = subprocess.check_output(shlex.split(execPath)) - - if status.find("Done") > -1: - - command = "sudo rm -rf " + path - subprocess.call(shlex.split(command)) - - final_json = json.dumps( - {'restoreStatus': 1, 'error_message': "None", "status": status, 'abort': 1,'running': 'Completed'}) - return HttpResponse(final_json) - elif status.find("[5009]") > -1: - ## removing temporarily generated files while restoring - command = "sudo rm -rf " + path - subprocess.call(shlex.split(command)) - final_json = json.dumps({'restoreStatus': 1, 'error_message': "None", - "status": status, 'abort': 1,'alreadyRunning': 0,'running': 'Error'}) - return HttpResponse(final_json) - else: - final_json = json.dumps({'restoreStatus': 1, 'error_message': "None", "status": status, 'abort': 0,'running': 'Running..'}) - return HttpResponse(final_json) - - except BaseException,msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - status = "Just Started" - final_json = json.dumps({'restoreStatus': 1, 'error_message': "None", "status": status, 'abort': 0,'running': 'Running..'}) - return HttpResponse(final_json) - else: - final_json = json.dumps({'restoreStatus': 1, 'error_message': "None", "status": "OK To Run",'running': 'Halted','abort': 1}) - return HttpResponse(final_json) - - - except BaseException, msg: - final_dic = {'restoreStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) def backupDestinations(request): try: - val = request.session['userID'] - - admin = Administrator.objects.get(pk=val) - - if admin.type == 1: - return render(request, 'backup/backupDestinations.html', {}) - else: - return HttpResponse("You should be admin to add backup destinations.") + userID = request.session['userID'] + bm = BackupManager() + return bm.backupDestinations(request, userID) except KeyError: return redirect(loadLoginPage) + def submitDestinationCreation(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - try: - if request.method == 'POST': + userID = request.session['userID'] - if admin.type != 1: - dic = {'destStatus': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) + result = pluginManager.preSubmitDestinationCreation(request) + if result != 200: + return result + wm = BackupManager() + coreResult = wm.submitDestinationCreation(userID, json.loads(request.body)) - destinations = backupUtil.backupUtilities.destinationsPath + result = pluginManager.postSubmitDestinationCreation(request, coreResult) + if result != 200: + return result - data = json.loads(request.body) - ipAddress = data['IPAddress'] - password = data['password'] - port = "22" - - try: - port = data['backupSSHPort'] - except: - pass - - if dest.objects.all().count() == 2: - final_dic = {'destStatus': 0, 'error_message': "Currently only one remote destination is allowed."} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - try: - d = dest.objects.get(destLoc=ipAddress) - final_dic = {'destStatus': 0, 'error_message': "This destination already exists."} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - except: - setupKeys = backupUtil.backupUtilities.setupSSHKeys(ipAddress, password, port) - - if setupKeys[0] == 1: - backupUtil.backupUtilities.createBackupDir(ipAddress,port) - try: - writeToFile = open(destinations, "w") - writeToFile.writelines(ipAddress + "\n") - writeToFile.writelines(data['backupSSHPort'] + "\n") - writeToFile.close() - newDest = dest(destLoc=ipAddress) - newDest.save() - except: - writeToFile = open(destinations, "w") - writeToFile.writelines(ipAddress + "\n") - writeToFile.writelines("22"+"\n") - writeToFile.close() - newDest = dest(destLoc=ipAddress) - newDest.save() - - final_dic = {'destStatus': 1, 'error_message': "None"} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - else: - final_dic = {'destStatus': 0, 'error_message': setupKeys[1]} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - except BaseException,msg: - final_dic = {'destStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - except KeyError: - final_dic = {'destStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - -def getCurrentBackupDestinations(request): - try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - try: - if request.method == 'POST': - - if admin.type != 1: - dic = {'fetchStatus': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - records = dest.objects.all() - - json_data = "[" - checker = 0 - - for items in records: - if items.destLoc == "Home": - continue - dic = {'id': items.id, - 'ip': items.destLoc, - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - - json_data = json_data + ']' - final_json = json.dumps({'fetchStatus': 1, 'error_message': "None","data":json_data}) - return HttpResponse(final_json) - - except BaseException,msg: - final_dic = {'fetchStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - - return HttpResponse(final_json) - except KeyError: - final_dic = {'fetchStatus': 0, 'error_message': "Not Logged In, please refresh the page or login again."} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - -def getConnectionStatus(request): - try: - try: - if request.method == 'POST': - - data = json.loads(request.body) - ipAddress = data['IPAddress'] - - checkCon = backupUtil.backupUtilities.checkConnection(ipAddress) - - if checkCon[0]==1: - final_dic = {'connStatus': 1, 'error_message': "None"} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - else: - final_dic = {'connStatus': 0, 'error_message': checkCon[1]} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - - except BaseException,msg: - final_dic = {'connStatus': 1, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - except KeyError: - final_dic = {'connStatus': 1, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - -def deleteDestination(request): - try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - try: - if request.method == 'POST': - - if admin.type != 1: - dic = {'delStatus': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - - data = json.loads(request.body) - ipAddress = data['IPAddress'] - - delDest = dest.objects.get(destLoc=ipAddress) - delDest.delete() - - path = "/usr/local/CyberCP/backup/" - destinations = path + "destinations" - - data = open(destinations,'r').readlines() - - writeToFile = open(destinations,'r') - - for items in data: - if items.find(ipAddress) > -1: - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - ## Deleting Cron Tab Entries for this destination - - path = "/etc/crontab" - - data = open(path, 'r').readlines() - - writeToFile = open(path, 'w') - - for items in data: - if items.find("backupSchedule.py") > -1: - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - - final_dic = {'delStatus': 1, 'error_message': "None"} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - except BaseException,msg: - final_dic = {'delStatus': 1, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - except KeyError: - final_dic = {'delStatus': 1, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - -def scheduleBackup(request): - try: - val = request.session['userID'] - - admin = Administrator.objects.get(pk=val) - - if admin.type == 1: - - if dest.objects.all().count() <= 1: - try: - homeDest = dest(destLoc="Home") - homeDest.save() - except: - pass - backups = dest.objects.all() - - destinations = [] - - for items in backups: - destinations.append(items.destLoc) - - return render(request,'backup/backupSchedule.html',{'destinations':destinations}) - else: - return HttpResponse("You should be admin to schedule backups.") + return coreResult except KeyError: return redirect(loadLoginPage) +def getCurrentBackupDestinations(request): + try: + userID = request.session['userID'] + bm = BackupManager() + return bm.getCurrentBackupDestinations(userID, json.loads(request.body)) + except KeyError: + return redirect(loadLoginPage) + +def getConnectionStatus(request): + try: + userID = request.session['userID'] + bm = BackupManager() + return bm.getConnectionStatus(userID, json.loads(request.body)) + except KeyError: + return redirect(loadLoginPage) + +def deleteDestination(request): + try: + userID = request.session['userID'] + result = pluginManager.preDeleteDestination(request) + if result != 200: + return result + + wm = BackupManager() + coreResult = wm.deleteDestination(userID, json.loads(request.body)) + + result = pluginManager.postDeleteDestination(request, coreResult) + if result != 200: + return result + + return coreResult + except KeyError: + return redirect(loadLoginPage) + +def scheduleBackup(request): + try: + userID = request.session['userID'] + bm = BackupManager() + return bm.scheduleBackup(request, userID) + except KeyError: + return redirect(loadLoginPage) def getCurrentBackupSchedules(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - try: - if request.method == 'POST': - - if admin.type != 1: - dic = {'fetchStatus': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - records = backupSchedules.objects.all() - - json_data = "[" - checker = 0 - - for items in records: - dic = {'id': items.id, - 'destLoc': items.dest.destLoc, - 'frequency':items.frequency, - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - - json_data = json_data + ']' - final_json = json.dumps({'fetchStatus': 1, 'error_message': "None","data":json_data}) - return HttpResponse(final_json) - - except BaseException,msg: - final_dic = {'fetchStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - - return HttpResponse(final_json) + userID = request.session['userID'] + wm = BackupManager() + return wm.getCurrentBackupSchedules(userID, json.loads(request.body)) except KeyError: - final_dic = {'fetchStatus': 0, 'error_message': "Not Logged In, please refresh the page or login again."} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) + return redirect(loadLoginPage) def submitBackupSchedule(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - try: - if request.method == 'POST': - data = json.loads(request.body) - backupDest = data['backupDest'] - backupFreq = data['backupFreq'] + userID = request.session['userID'] + result = pluginManager.preSubmitBackupSchedule(request) + if result != 200: + return result - if admin.type != 1: - dic = {'scheduleStatus': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) + wm = BackupManager() + coreResult = wm.submitBackupSchedule(userID, json.loads(request.body)) - path = "/etc/crontab" + result = pluginManager.postSubmitBackupSchedule(request, coreResult) + if result != 200: + return result - ## check if already exists - try: - schedule = backupSchedules.objects.get(frequency=backupFreq) - if schedule.dest.destLoc == backupDest: - final_json = json.dumps({'scheduleStatus': 0, 'error_message': "This schedule already exists"}) - return HttpResponse(final_json) - else: - if backupDest == "Home" and backupFreq == "Daily": - cronJob = "0 3 * * 0-6 root python /usr/local/CyberCP/plogical/backupScheduleLocal.py" - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path,'a') - writeToFile.writelines(cronJob+"\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest == "Home" and backupFreq == "Weekly": - cronJob = "0 3 * * 3 root python /usr/local/CyberCP/plogical/backupScheduleLocal.py " - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest != "Home" and backupFreq == "Daily": - cronJob = "0 3 * * 0-6 root python /usr/local/CyberCP/plogical/backupSchedule.py" - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest != "Home" and backupFreq == "Weekly": - cronJob = "0 3 * * 3 root python /usr/local/CyberCP/plogical/backupSchedule.py " - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination,frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - except: - if backupDest == "Home" and backupFreq == "Daily": - cronJob = "0 3 * * 0-6 root python /usr/local/CyberCP/plogical/backupScheduleLocal.py" - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest == "Home" and backupFreq == "Weekly": - cronJob = "0 3 * * 3 root python /usr/local/CyberCP/plogical/backupScheduleLocal.py " - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest != "Home" and backupFreq == "Daily": - cronJob = "0 3 * * 0-6 root python /usr/local/CyberCP/plogical/backupSchedule.py" - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest != "Home" and backupFreq == "Weekly": - cronJob = "0 3 * * 3 root python /usr/local/CyberCP/plogical/backupSchedule.py " - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - - - except BaseException,msg: - final_json = json.dumps({'scheduleStatus': 0, 'error_message': str(msg)}) - return HttpResponse(final_json) + return coreResult except KeyError: - final_json = json.dumps({'scheduleStatus': 0, 'error_message': str(msg)}) - return HttpResponse(final_json) - + return redirect(loadLoginPage) def scheduleDelete(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - try: - if request.method == 'POST': + userID = request.session['userID'] + result = pluginManager.preScheduleDelete(request) + if result != 200: + return result - if admin.type != 1: - dic = {'delStatus': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) + wm = BackupManager() + coreResult = wm.scheduleDelete(userID, json.loads(request.body)) - data = json.loads(request.body) - backupDest = data['destLoc'] - backupFreq = data['frequency'] + result = pluginManager.postScheduleDelete(request, coreResult) + if result != 200: + return result - - path = "/etc/crontab" - - - if backupDest == "Home" and backupFreq == "Daily": - - virtualHostUtilities.permissionControl(path) - - data = open(path, "r").readlines() - writeToFile = open(path, 'w') - - for items in data: - if items.find("0-6") > -1 and items.find("backupScheduleLocal.py") > -1: - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules.objects.get(dest=destination, frequency=backupFreq) - newSchedule.delete() - - final_json = json.dumps({'delStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest == "Home" and backupFreq == "Weekly": - - virtualHostUtilities.permissionControl(path) - - data = open(path, "r").readlines() - writeToFile = open(path, 'w') - - for items in data: - if items.find("* 3") > -1 and items.find("backupScheduleLocal.py") > -1: - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules.objects.get(dest=destination, frequency=backupFreq) - newSchedule.delete() - - final_json = json.dumps({'delStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest != "Home" and backupFreq == "Daily": - - virtualHostUtilities.permissionControl(path) - - data = open(path, "r").readlines() - writeToFile = open(path, 'w') - - for items in data: - if items.find("0-6") > -1 and items.find("backupSchedule.py") > -1: - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules.objects.get(dest=destination, frequency=backupFreq) - newSchedule.delete() - - final_json = json.dumps({'delStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest != "Home" and backupFreq == "Weekly": - - virtualHostUtilities.permissionControl(path) - - data = open(path, "r").readlines() - writeToFile = open(path, 'w') - - for items in data: - if items.find("* 3") > -1 and items.find("backupSchedule.py") > -1: - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules.objects.get(dest=destination, frequency=backupFreq) - newSchedule.delete() - - final_json = json.dumps({'delStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - - - except BaseException,msg: - final_json = json.dumps({'delStatus': 0, 'error_message': str(msg)}) - return HttpResponse(final_json) + return coreResult except KeyError: - final_json = json.dumps({'delStatus': 0, 'error_message': str(msg)}) - return HttpResponse(final_json) + return redirect(loadLoginPage) def remoteBackups(request): try: userID = request.session['userID'] - - admin = Administrator.objects.get(pk=userID) - - if admin.type == 3: - return HttpResponse("You don't have enough priviliges to access this page.") - - return render(request,'backup/remoteBackups.html') + bm = BackupManager() + return bm.remoteBackups(request, userID) except KeyError: return redirect(loadLoginPage) def submitRemoteBackups(request): try: userID = request.session['userID'] - admin = Administrator.objects.get(pk=userID) - if request.method == 'POST': + result = pluginManager.preSubmitRemoteBackups(request) + if result != 200: + return result - if admin.type != 1: - dic = {'status': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) + wm = BackupManager() + coreResult = wm.submitRemoteBackups(userID, json.loads(request.body)) - data = json.loads(request.body) - ipAddress = data['ipAddress'] - password = data['password'] + result = pluginManager.postSubmitRemoteBackups(request, coreResult) + if result != 200: + return result - ## Ask for Remote version of CyberPanel - - try: - finalData = json.dumps({'username': "admin", "password": password}) - - url = "https://" + ipAddress + ":8090/api/cyberPanelVersion" - - r = requests.post(url, data=finalData, verify=False) - - data = json.loads(r.text) - - if data['getVersion'] == 1: - - if float(data['currentVersion']) >= 1.6 and data['build'] >= 0: - pass - else: - data_ret = {'status': 0, - 'error_message': "Your version does not match with version of remote server.", - "dir": "Null"} - data_ret = json.dumps(data_ret) - return HttpResponse(data_ret) - else: - data_ret = {'status': 0, - 'error_message': "Not able to fetch version of remote server. Error Message: " + data[ - 'error_message'], "dir": "Null"} - data_ret = json.dumps(data_ret) - return HttpResponse(data_ret) - - - except BaseException, msg: - data_ret = {'status': 0, - 'error_message': "Not able to fetch version of remote server. Error Message: " + str(msg), - "dir": "Null"} - data_ret = json.dumps(data_ret) - return HttpResponse(data_ret) - - - ## Fetch public key of remote server! - - finalData = json.dumps({'username': "admin", "password": password}) - - url = "https://" + ipAddress + ":8090/api/fetchSSHkey" - r = requests.post(url, data=finalData, verify=False) - data = json.loads(r.text) - - if data['pubKeyStatus'] == 1: - pubKey = data["pubKey"].strip("\n") - else: - final_json = json.dumps({'status': 0, - 'error_message': "I am sorry, I could not fetch key from remote server. Error Message: " + data['error_message'] - }) - return HttpResponse(final_json) - - ## write key - - ## Writing key to a temporary location, to be read later by backup process. - - mailUtilities.checkHome() - - pathToKey = "/home/cyberpanel/" + str(randint(1000, 9999)) - - vhost = open(pathToKey, "w") - vhost.write(pubKey) - vhost.close() - - ## - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/remoteTransferUtilities.py" - execPath = execPath + " writeAuthKey --pathToKey " + pathToKey - output = subprocess.check_output(shlex.split(execPath)) - - if output.find("1,None") > -1: - pass - else: - final_json = json.dumps({'status': 0, 'error_message': output}) - return HttpResponse(final_json) - - ## - - try: - finalData = json.dumps({'username': "admin", "password": password}) - - url = "https://" + ipAddress + ":8090/api/fetchAccountsFromRemoteServer" - - r = requests.post(url, data=finalData, verify=False) - - data = json.loads(r.text) - - if data['fetchStatus'] == 1: - json_data = data['data'] - data_ret = {'status': 1, 'error_message': "None", - "dir": "Null", 'data': json_data} - data_ret = json.dumps(data_ret) - return HttpResponse(data_ret) - else: - data_ret = {'status': 0, - 'error_message': "Not able to fetch accounts from remote server. Error Message: " + - data['error_message'], "dir": "Null"} - data_ret = json.dumps(data_ret) - return HttpResponse(data_ret) - except BaseException, msg: - data_ret = {'status': 0, - 'error_message': "Not able to fetch accounts from remote server. Error Message: " + str( - msg), "dir": "Null"} - data_ret = json.dumps(data_ret) - return HttpResponse(data_ret) - else: - return HttpResponse("This URL only accepts POST requests") - - except BaseException, msg: - final_json = json.dumps({'status': 0, 'error_message': str(msg)}) - return HttpResponse(final_json) + return coreResult + except KeyError: + return redirect(loadLoginPage) def starRemoteTransfer(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - try: - if request.method == 'POST': - data = json.loads(request.body) + userID = request.session['userID'] + result = pluginManager.preStarRemoteTransfer(request) + if result != 200: + return result - if admin.type != 1: - dic = {'remoteTransferStatus': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) + wm = BackupManager() + coreResult = wm.starRemoteTransfer(userID, json.loads(request.body)) - ipAddress = data['ipAddress'] - password = data['password'] - accountsToTransfer = data['accountsToTransfer'] + result = pluginManager.postStarRemoteTransfer(request, coreResult) + if result != 200: + return result - try: - - ipFile = os.path.join("/etc","cyberpanel","machineIP") - f = open(ipFile) - ownIP = f.read() - - finalData = json.dumps({'username': "admin", "password": password,"ipAddress": ownIP,"accountsToTransfer":accountsToTransfer}) - - url = "https://" + ipAddress + ":8090/api/remoteTransfer" - - r = requests.post(url, data=finalData, verify=False) - - data = json.loads(r.text) - - - if data['transferStatus'] == 1: - - ## Create local backup dir - - localBackupDir = os.path.join("/home","backup") - - if not os.path.exists(localBackupDir): - command = "sudo mkdir " + localBackupDir - subprocess.call(shlex.split(command)) - - ## create local directory that will host backups - - localStoragePath = "/home/backup/transfer-" + str(data['dir']) - - ## making local storage directory for backups - - command = "sudo mkdir " + localStoragePath - subprocess.call(shlex.split(command)) - - final_json = json.dumps({'remoteTransferStatus': 1, 'error_message': "None","dir":data['dir']}) - return HttpResponse(final_json) - else: - final_json = json.dumps({'remoteTransferStatus': 0, 'error_message':"Can not initiate remote transfer. Error message: "+ data['error_message']}) - return HttpResponse(final_json) - - except BaseException,msg: - final_json = json.dumps({'remoteTransferStatus': 0, - 'error_message': "Can not initiate remote transfer. Error message: " + - str(msg)}) - return HttpResponse(final_json) - - - - except BaseException,msg: - final_json = json.dumps({'remoteTransferStatus': 0, 'error_message': str(msg)}) - return HttpResponse(final_json) + return coreResult except KeyError: - final_json = json.dumps({'remoteTransferStatus': 0, 'error_message': str(msg)}) - return HttpResponse(final_json) + return redirect(loadLoginPage) def getRemoteTransferStatus(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - - if request.method == "POST": - - if admin.type != 1: - dic = {'remoteTransferStatus': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - data = json.loads(request.body) - ipAddress = data['ipAddress'] - password = data['password'] - dir = data['dir'] - username = "admin" - - finalData = json.dumps({'dir': dir, "username":username,"password":password}) - r = requests.post("https://"+ipAddress+":8090/api/FetchRemoteTransferStatus", data=finalData,verify=False) - - data = json.loads(r.text) - - if data['fetchStatus'] == 1: - if data['status'].find("Backups are successfully generated and received on") > -1: - - data = {'remoteTransferStatus': 1, 'error_message': "None", "status": data['status'],'backupsSent': 1} - json_data = json.dumps(data) - return HttpResponse(json_data) - elif data['status'].find("[5010]") > -1: - data = {'remoteTransferStatus': 0, 'error_message': data['status'], - 'backupsSent': 0} - json_data = json.dumps(data) - return HttpResponse(json_data) - else: - data = {'remoteTransferStatus': 1, 'error_message': "None", "status": data['status'], - 'backupsSent': 0} - json_data = json.dumps(data) - return HttpResponse(json_data) - else: - data = {'remoteTransferStatus': 0, 'error_message': data['error_message'], - 'backupsSent': 0} - json_data = json.dumps(data) - return HttpResponse(json_data) - - - except BaseException, msg: - data = {'remoteTransferStatus': 0, 'error_message': str(msg),'backupsSent': 0} - json_data = json.dumps(data) - return HttpResponse(json_data) - + userID = request.session['userID'] + wm = BackupManager() + return wm.getRemoteTransferStatus(userID, json.loads(request.body)) + except KeyError: + return redirect(loadLoginPage) def remoteBackupRestore(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - try: - if request.method == "POST": + userID = request.session['userID'] + result = pluginManager.preRemoteBackupRestore(request) + if result != 200: + return result - if admin.type != 1: - dic = {'remoteRestoreStatus': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) + wm = BackupManager() + coreResult = wm.remoteBackupRestore(userID, json.loads(request.body)) - data = json.loads(request.body) - backupDir = data['backupDir'] - - backupDirComplete = "/home/backup/transfer-"+str(backupDir) - #adminEmail = admin.email - - ## - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/remoteTransferUtilities.py" - - execPath = execPath + " remoteBackupRestore --backupDirComplete " + backupDirComplete + " --backupDir " + str(backupDir) - - subprocess.Popen(shlex.split(execPath)) - - time.sleep(3) - - data = {'remoteRestoreStatus': 1, 'error_message': 'None'} - json_data = json.dumps(data) - return HttpResponse(json_data) - - ## - - - except BaseException, msg: - data = {'remoteRestoreStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data) - return HttpResponse(json_data) + result = pluginManager.postRemoteBackupRestore(request, coreResult) + if result != 200: + return result + return coreResult except KeyError: - data_ret = {'remoteRestoreStatus': 0, 'error_message': "not logged in as admin", "existsStatus": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) + return redirect(loadLoginPage) def localRestoreStatus(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - if request.method == "POST": - - if admin.type != 1: - data_ret = {'remoteTransferStatus': 0, 'error_message': "No such log found", "status": "None", - "complete": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - data = json.loads(request.body) - backupDir = data['backupDir'] - - #admin = Administrator.objects.get(userName=username) - backupLogPath = "/home/backup/transfer-"+ backupDir +"/" + "backup_log" - - removalPath = "/home/backup/transfer-"+ str(backupDir) - - time.sleep(3) - - if os.path.isfile(backupLogPath): - command = "sudo cat " + backupLogPath - status = subprocess.check_output(shlex.split(command)) - - if status.find("completed[success]")>-1: - command = "sudo rm -rf " + removalPath - #subprocess.call(shlex.split(command)) - data_ret = {'remoteTransferStatus': 1, 'error_message': "None", "status": status, "complete": 1} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - elif status.find("[5010]") > -1: - command = "sudo rm -rf " + removalPath - #subprocess.call(shlex.split(command)) - data = {'remoteTransferStatus': 0, 'error_message': status, - "status":"None","complete":0} - json_data = json.dumps(data) - return HttpResponse(json_data) - else: - data_ret = {'remoteTransferStatus': 1, 'error_message': "None", "status": status, "complete": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - else: - data_ret = {'remoteTransferStatus': 0, 'error_message': "No such log found","status":"None","complete":0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - - except BaseException, msg: - data = {'remoteTransferStatus': 0,'error_message': str(msg),"status":"None","complete":0} - json_data = json.dumps(data) - return HttpResponse(json_data) + userID = request.session['userID'] + wm = BackupManager() + return wm.localRestoreStatus(userID, json.loads(request.body)) + except KeyError: + return redirect(loadLoginPage) def cancelRemoteBackup(request): try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - - if admin.type != 1: - dic = {'cancelStatus': 0, 'error_message': "Only administrator can view this page."} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - if request.method == "POST": - - data = json.loads(request.body) - ipAddress = data['ipAddress'] - password = data['password'] - dir = data['dir'] - username = "admin" + userID = request.session['userID'] + wm = BackupManager() + return wm.cancelRemoteBackup(userID, json.loads(request.body)) + except KeyError: + return redirect(loadLoginPage) - finalData = json.dumps({'dir': dir, "username":username,"password":password}) - r = requests.post("https://"+ipAddress+":8090/api/cancelRemoteTransfer", data=finalData,verify=False) - - data = json.loads(r.text) - - if data['cancelStatus'] == 1: - pass - else: - logging.CyberCPLogFileWriter.writeToFile("Some error cancelling at remote server, see the log file for remote server.") - - path = "/home/backup/transfer-" + str(dir) - pathpid = path + "/pid" - - command = "sudo cat " + pathpid - pid = subprocess.check_output(shlex.split(command)) - - command = "sudo kill -KILL " + pid - subprocess.call(shlex.split(command)) - - command = "sudo rm -rf " + path - subprocess.call(shlex.split(command)) - - data = {'cancelStatus': 1, 'error_message': "None"} - json_data = json.dumps(data) - return HttpResponse(json_data) - +@csrf_exempt +def localInitiate(request): + try: + data = json.loads(request.body) + randomFile = data['randomFile'] + if os.path.exists(randomFile): + wm = BackupManager() + return wm.submitBackupCreation(1, json.loads(request.body)) except BaseException, msg: - data = {'cancelStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data) - return HttpResponse(json_data) + logging.writeToFile(str(msg)) diff --git a/baseTemplate/static/baseTemplate/assets/applications/mailbox.css b/baseTemplate/static/baseTemplate/assets/applications/mailbox.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap-theme.css b/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap-theme.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap-theme.css.map b/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap-theme.css.map old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap-theme.min.css b/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap-theme.min.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap-theme.min.css.map b/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap-theme.min.css.map old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap.css b/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap.css.map b/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap.css.map old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap.min.css b/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap.min.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap.min.css.map b/baseTemplate/static/baseTemplate/assets/bootstrap/css/bootstrap.min.css.map old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/fonts/glyphicons-halflings-regular.eot b/baseTemplate/static/baseTemplate/assets/bootstrap/fonts/glyphicons-halflings-regular.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/fonts/glyphicons-halflings-regular.svg b/baseTemplate/static/baseTemplate/assets/bootstrap/fonts/glyphicons-halflings-regular.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/fonts/glyphicons-halflings-regular.ttf b/baseTemplate/static/baseTemplate/assets/bootstrap/fonts/glyphicons-halflings-regular.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/fonts/glyphicons-halflings-regular.woff b/baseTemplate/static/baseTemplate/assets/bootstrap/fonts/glyphicons-halflings-regular.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/baseTemplate/static/baseTemplate/assets/bootstrap/fonts/glyphicons-halflings-regular.woff2 old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/js/bootstrap.js b/baseTemplate/static/baseTemplate/assets/bootstrap/js/bootstrap.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/js/bootstrap.min.js b/baseTemplate/static/baseTemplate/assets/bootstrap/js/bootstrap.min.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/bootstrap/js/npm.js b/baseTemplate/static/baseTemplate/assets/bootstrap/js/npm.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/badges.css b/baseTemplate/static/baseTemplate/assets/elements/badges.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/buttons.css b/baseTemplate/static/baseTemplate/assets/elements/buttons.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/content-box.css b/baseTemplate/static/baseTemplate/assets/elements/content-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/dashboard-box.css b/baseTemplate/static/baseTemplate/assets/elements/dashboard-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/forms.css b/baseTemplate/static/baseTemplate/assets/elements/forms.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/images.css b/baseTemplate/static/baseTemplate/assets/elements/images.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/info-box.css b/baseTemplate/static/baseTemplate/assets/elements/info-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/invoice.css b/baseTemplate/static/baseTemplate/assets/elements/invoice.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/loading-indicators.css b/baseTemplate/static/baseTemplate/assets/elements/loading-indicators.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/menus.css b/baseTemplate/static/baseTemplate/assets/elements/menus.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/panel-box.css b/baseTemplate/static/baseTemplate/assets/elements/panel-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/response-messages.css b/baseTemplate/static/baseTemplate/assets/elements/response-messages.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/responsive-tables.css b/baseTemplate/static/baseTemplate/assets/elements/responsive-tables.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/ribbon.css b/baseTemplate/static/baseTemplate/assets/elements/ribbon.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/social-box.css b/baseTemplate/static/baseTemplate/assets/elements/social-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/tables.css b/baseTemplate/static/baseTemplate/assets/elements/tables.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/tile-box.css b/baseTemplate/static/baseTemplate/assets/elements/tile-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/elements/timeline.css b/baseTemplate/static/baseTemplate/assets/elements/timeline.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/FontAwesome.otf b/baseTemplate/static/baseTemplate/assets/finalBase/FontAwesome.otf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/fontawesome-webfont.eot b/baseTemplate/static/baseTemplate/assets/finalBase/fontawesome-webfont.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/fontawesome-webfont.svg b/baseTemplate/static/baseTemplate/assets/finalBase/fontawesome-webfont.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/fontawesome-webfont.ttf b/baseTemplate/static/baseTemplate/assets/finalBase/fontawesome-webfont.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/fontawesome-webfont.woff b/baseTemplate/static/baseTemplate/assets/finalBase/fontawesome-webfont.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/linecons.eot b/baseTemplate/static/baseTemplate/assets/finalBase/linecons.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/linecons.svg b/baseTemplate/static/baseTemplate/assets/finalBase/linecons.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/linecons.ttf b/baseTemplate/static/baseTemplate/assets/finalBase/linecons.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/linecons.woff b/baseTemplate/static/baseTemplate/assets/finalBase/linecons.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/spinnericon.eot b/baseTemplate/static/baseTemplate/assets/finalBase/spinnericon.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/spinnericon.svg b/baseTemplate/static/baseTemplate/assets/finalBase/spinnericon.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/spinnericon.ttf b/baseTemplate/static/baseTemplate/assets/finalBase/spinnericon.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalBase/spinnericon.woff b/baseTemplate/static/baseTemplate/assets/finalBase/spinnericon.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/FontAwesome.otf b/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/FontAwesome.otf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/fontawesome-webfont.eot b/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/fontawesome-webfont.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/fontawesome-webfont.svg b/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/fontawesome-webfont.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/fontawesome-webfont.ttf b/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/fontawesome-webfont.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/fontawesome-webfont.woff b/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/fontawesome-webfont.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/frontend-elements/blog.css b/baseTemplate/static/baseTemplate/assets/frontend-elements/blog.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/frontend-elements/cta-box.css b/baseTemplate/static/baseTemplate/assets/frontend-elements/cta-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/frontend-elements/feature-box.css b/baseTemplate/static/baseTemplate/assets/frontend-elements/feature-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/frontend-elements/footer.css b/baseTemplate/static/baseTemplate/assets/frontend-elements/footer.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/frontend-elements/hero-box.css b/baseTemplate/static/baseTemplate/assets/frontend-elements/hero-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/frontend-elements/icon-box.css b/baseTemplate/static/baseTemplate/assets/frontend-elements/icon-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/frontend-elements/portfolio-navigation.css b/baseTemplate/static/baseTemplate/assets/frontend-elements/portfolio-navigation.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/frontend-elements/pricing-table.css b/baseTemplate/static/baseTemplate/assets/frontend-elements/pricing-table.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/frontend-elements/sliders.css b/baseTemplate/static/baseTemplate/assets/frontend-elements/sliders.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/frontend-elements/testimonial-box.css b/baseTemplate/static/baseTemplate/assets/frontend-elements/testimonial-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/admin-responsive.css b/baseTemplate/static/baseTemplate/assets/helpers/admin-responsive.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/animate.css b/baseTemplate/static/baseTemplate/assets/helpers/animate.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/backgrounds.css b/baseTemplate/static/baseTemplate/assets/helpers/backgrounds.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/boilerplate.css b/baseTemplate/static/baseTemplate/assets/helpers/boilerplate.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/border-radius.css b/baseTemplate/static/baseTemplate/assets/helpers/border-radius.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/colors.css b/baseTemplate/static/baseTemplate/assets/helpers/colors.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/frontend-responsive.css b/baseTemplate/static/baseTemplate/assets/helpers/frontend-responsive.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/grid.css b/baseTemplate/static/baseTemplate/assets/helpers/grid.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/page-transitions.css b/baseTemplate/static/baseTemplate/assets/helpers/page-transitions.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/responsive-elements.css b/baseTemplate/static/baseTemplate/assets/helpers/responsive-elements.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/spacing.css b/baseTemplate/static/baseTemplate/assets/helpers/spacing.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/typography.css b/baseTemplate/static/baseTemplate/assets/helpers/typography.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/helpers/utils.css b/baseTemplate/static/baseTemplate/assets/helpers/utils.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/FontAwesome.otf b/baseTemplate/static/baseTemplate/assets/icons/FontAwesome.otf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/elusive/elusive.css b/baseTemplate/static/baseTemplate/assets/icons/elusive/elusive.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/elusive/elusive.eot b/baseTemplate/static/baseTemplate/assets/icons/elusive/elusive.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/elusive/elusive.svg b/baseTemplate/static/baseTemplate/assets/icons/elusive/elusive.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/elusive/elusive.ttf b/baseTemplate/static/baseTemplate/assets/icons/elusive/elusive.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/elusive/elusive.woff b/baseTemplate/static/baseTemplate/assets/icons/elusive/elusive.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/fontawesome-webfont.eot b/baseTemplate/static/baseTemplate/assets/icons/fontawesome-webfont.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/fontawesome-webfont.svg b/baseTemplate/static/baseTemplate/assets/icons/fontawesome-webfont.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/fontawesome-webfont.ttf b/baseTemplate/static/baseTemplate/assets/icons/fontawesome-webfont.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/fontawesome-webfont.woff b/baseTemplate/static/baseTemplate/assets/icons/fontawesome-webfont.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/fontawesome.css b/baseTemplate/static/baseTemplate/assets/icons/fontawesome.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/fontawesome/FontAwesome.otf b/baseTemplate/static/baseTemplate/assets/icons/fontawesome/FontAwesome.otf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/fontawesome/fontawesome-webfont.eot b/baseTemplate/static/baseTemplate/assets/icons/fontawesome/fontawesome-webfont.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/fontawesome/fontawesome-webfont.svg b/baseTemplate/static/baseTemplate/assets/icons/fontawesome/fontawesome-webfont.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/fontawesome/fontawesome-webfont.ttf b/baseTemplate/static/baseTemplate/assets/icons/fontawesome/fontawesome-webfont.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/fontawesome/fontawesome-webfont.woff b/baseTemplate/static/baseTemplate/assets/icons/fontawesome/fontawesome-webfont.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/fontawesome/fontawesome.css b/baseTemplate/static/baseTemplate/assets/icons/fontawesome/fontawesome.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/iconic/iconic.css b/baseTemplate/static/baseTemplate/assets/icons/iconic/iconic.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/iconic/iconic.eot b/baseTemplate/static/baseTemplate/assets/icons/iconic/iconic.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/iconic/iconic.svg b/baseTemplate/static/baseTemplate/assets/icons/iconic/iconic.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/iconic/iconic.ttf b/baseTemplate/static/baseTemplate/assets/icons/iconic/iconic.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/iconic/iconic.woff b/baseTemplate/static/baseTemplate/assets/icons/iconic/iconic.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/linecons.eot b/baseTemplate/static/baseTemplate/assets/icons/linecons.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/linecons.svg b/baseTemplate/static/baseTemplate/assets/icons/linecons.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/linecons.ttf b/baseTemplate/static/baseTemplate/assets/icons/linecons.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/linecons.woff b/baseTemplate/static/baseTemplate/assets/icons/linecons.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/linecons/linecons.css b/baseTemplate/static/baseTemplate/assets/icons/linecons/linecons.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/linecons/linecons.eot b/baseTemplate/static/baseTemplate/assets/icons/linecons/linecons.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/linecons/linecons.svg b/baseTemplate/static/baseTemplate/assets/icons/linecons/linecons.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/linecons/linecons.ttf b/baseTemplate/static/baseTemplate/assets/icons/linecons/linecons.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/linecons/linecons.woff b/baseTemplate/static/baseTemplate/assets/icons/linecons/linecons.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/meteocons/meteocons.css b/baseTemplate/static/baseTemplate/assets/icons/meteocons/meteocons.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/meteocons/meteocons.eot b/baseTemplate/static/baseTemplate/assets/icons/meteocons/meteocons.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/meteocons/meteocons.svg b/baseTemplate/static/baseTemplate/assets/icons/meteocons/meteocons.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/meteocons/meteocons.ttf b/baseTemplate/static/baseTemplate/assets/icons/meteocons/meteocons.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/meteocons/meteocons.woff b/baseTemplate/static/baseTemplate/assets/icons/meteocons/meteocons.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/spinnericon.eot b/baseTemplate/static/baseTemplate/assets/icons/spinnericon.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/spinnericon.svg b/baseTemplate/static/baseTemplate/assets/icons/spinnericon.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/spinnericon.ttf b/baseTemplate/static/baseTemplate/assets/icons/spinnericon.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/spinnericon.woff b/baseTemplate/static/baseTemplate/assets/icons/spinnericon.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/spinnericon/spinnericon.css b/baseTemplate/static/baseTemplate/assets/icons/spinnericon/spinnericon.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/spinnericon/spinnericon.eot b/baseTemplate/static/baseTemplate/assets/icons/spinnericon/spinnericon.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/spinnericon/spinnericon.svg b/baseTemplate/static/baseTemplate/assets/icons/spinnericon/spinnericon.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/spinnericon/spinnericon.ttf b/baseTemplate/static/baseTemplate/assets/icons/spinnericon/spinnericon.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/spinnericon/spinnericon.woff b/baseTemplate/static/baseTemplate/assets/icons/spinnericon/spinnericon.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/typicons/typicons.css b/baseTemplate/static/baseTemplate/assets/icons/typicons/typicons.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/typicons/typicons.eot b/baseTemplate/static/baseTemplate/assets/icons/typicons/typicons.eot old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/typicons/typicons.svg b/baseTemplate/static/baseTemplate/assets/icons/typicons/typicons.svg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/typicons/typicons.ttf b/baseTemplate/static/baseTemplate/assets/icons/typicons/typicons.ttf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/icons/typicons/typicons.woff b/baseTemplate/static/baseTemplate/assets/icons/typicons/typicons.woff old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/ada.png b/baseTemplate/static/baseTemplate/assets/image-resources/ada.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-1.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-1.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-10.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-10.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-11.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-11.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-12.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-12.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-13.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-13.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-14.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-14.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-15.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-15.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-16.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-16.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-2.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-2.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-3.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-3.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-4.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-4.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-5.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-5.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-6.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-6.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-7.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-7.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-8.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-8.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-9.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-bg/blurred-bg-9.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-img/blurred-img-1.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-img/blurred-img-1.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-img/blurred-img-2.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-img/blurred-img-2.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-img/blurred-img-3.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-img/blurred-img-3.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-img/blurred-img-4.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-img/blurred-img-4.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/blurred-img/blurred-img-5.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/blurred-img/blurred-img-5.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-1.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-1.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-10.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-10.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-11.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-11.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-12.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-12.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-13.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-13.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-14.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-14.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-2.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-2.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-3.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-3.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-4.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-4.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-5.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-5.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-6.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-6.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-7.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-7.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-8.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-8.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-9.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/full-bg/full-bg-9.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/logo-admin.png b/baseTemplate/static/baseTemplate/assets/image-resources/logo-admin.png index 80ca74a3c..03deb86e9 100644 Binary files a/baseTemplate/static/baseTemplate/assets/image-resources/logo-admin.png and b/baseTemplate/static/baseTemplate/assets/image-resources/logo-admin.png differ diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/logo-alt.png b/baseTemplate/static/baseTemplate/assets/image-resources/logo-alt.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/objects/based-on-bootstrap.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/objects/based-on-bootstrap.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/objects/browser-1.png b/baseTemplate/static/baseTemplate/assets/image-resources/objects/browser-1.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/objects/browser-2.png b/baseTemplate/static/baseTemplate/assets/image-resources/objects/browser-2.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/objects/browser-3.png b/baseTemplate/static/baseTemplate/assets/image-resources/objects/browser-3.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/objects/easy-to-customize.png b/baseTemplate/static/baseTemplate/assets/image-resources/objects/easy-to-customize.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/objects/extensive-documentation.png b/baseTemplate/static/baseTemplate/assets/image-resources/objects/extensive-documentation.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/objects/ipad_horizontal.png b/baseTemplate/static/baseTemplate/assets/image-resources/objects/ipad_horizontal.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/objects/iphone-screen.png b/baseTemplate/static/baseTemplate/assets/image-resources/objects/iphone-screen.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/objects/iphone_hand.png b/baseTemplate/static/baseTemplate/assets/image-resources/objects/iphone_hand.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/objects/phone-1.png b/baseTemplate/static/baseTemplate/assets/image-resources/objects/phone-1.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-1.png b/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-1.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-10.png b/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-10.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-2.png b/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-2.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-3.png b/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-3.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-4.png b/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-4.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-5.png b/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-5.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-6.png b/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-6.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-7.png b/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-7.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-8.png b/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-8.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-9.png b/baseTemplate/static/baseTemplate/assets/image-resources/pattern-bg/pattern-bg-9.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial1.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial1.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial2.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial2.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial3.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial3.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial4.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial4.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial5.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial5.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial6.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial6.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial7.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial7.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial8.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/people/testimonial8.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-1.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-1.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-10.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-10.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-2.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-2.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-3.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-3.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-4.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-4.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-5.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-5.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-6.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-6.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-7.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-7.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-8.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-8.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-9.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/poly-bg/poly-bg-9.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/slides-bg/slide-1.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/slides-bg/slide-1.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/slides-bg/slide-2.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/slides-bg/slide-2.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/slides-bg/slide-3.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/slides-bg/slide-3.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/slides-bg/slide-4.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/slides-bg/slide-4.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/slides-bg/slide-5.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/slides-bg/slide-5.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-1.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-1.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-10.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-10.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-11.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-11.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-12.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-12.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-13.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-13.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-14.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-14.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-15.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-15.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-16.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-16.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-17.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-17.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-18.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-18.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-19.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-19.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-2.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-2.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-20.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-20.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-21.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-21.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-22.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-22.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-23.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-23.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-24.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-24.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-25.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-25.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-26.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-26.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-27.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-27.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-28.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-28.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-29.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-29.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-3.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-3.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-30.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-30.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-31.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-31.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-32.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-32.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-33.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-33.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-34.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-34.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-35.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-35.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-36.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-36.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-37.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-37.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-38.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-38.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-39.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-39.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-4.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-4.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-40.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-40.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-41.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-41.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-42.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-42.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-43.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-43.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-44.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-44.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-5.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-5.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-6.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-6.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-7.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-7.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-8.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-8.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-9.jpg b/baseTemplate/static/baseTemplate/assets/image-resources/stock-images/img-9.jpg old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/animated-overlay.gif b/baseTemplate/static/baseTemplate/assets/images/animated-overlay.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/blank.gif b/baseTemplate/static/baseTemplate/assets/images/blank.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/colorpicker.png b/baseTemplate/static/baseTemplate/assets/images/colorpicker.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/grabbing.png b/baseTemplate/static/baseTemplate/assets/images/grabbing.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/icons/apple-touch-icon-114-precomposed.png b/baseTemplate/static/baseTemplate/assets/images/icons/apple-touch-icon-114-precomposed.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/icons/apple-touch-icon-144-precomposed.png b/baseTemplate/static/baseTemplate/assets/images/icons/apple-touch-icon-144-precomposed.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/icons/apple-touch-icon-57-precomposed.png b/baseTemplate/static/baseTemplate/assets/images/icons/apple-touch-icon-57-precomposed.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/icons/apple-touch-icon-72-precomposed.png b/baseTemplate/static/baseTemplate/assets/images/icons/apple-touch-icon-72-precomposed.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/icons/favicon.png b/baseTemplate/static/baseTemplate/assets/images/icons/favicon.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/icons/icons.psd b/baseTemplate/static/baseTemplate/assets/images/icons/icons.psd old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/jcrop.gif b/baseTemplate/static/baseTemplate/assets/images/jcrop.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/login-bg.png b/baseTemplate/static/baseTemplate/assets/images/login-bg.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/spinner/loader-dark.gif b/baseTemplate/static/baseTemplate/assets/images/spinner/loader-dark.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/images/spinner/loader-light.gif b/baseTemplate/static/baseTemplate/assets/images/spinner/loader-light.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-core/d3.js b/baseTemplate/static/baseTemplate/assets/js-core/d3.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-core/greensock.js b/baseTemplate/static/baseTemplate/assets/js-core/greensock.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-core/jquery-cookie.js b/baseTemplate/static/baseTemplate/assets/js-core/jquery-cookie.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-core/jquery-core.js b/baseTemplate/static/baseTemplate/assets/js-core/jquery-core.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-core/jquery-ui-core.js b/baseTemplate/static/baseTemplate/assets/js-core/jquery-ui-core.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-core/jquery-ui-mouse.js b/baseTemplate/static/baseTemplate/assets/js-core/jquery-ui-mouse.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-core/jquery-ui-position.js b/baseTemplate/static/baseTemplate/assets/js-core/jquery-ui-position.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-core/jquery-ui-touch-punch.js b/baseTemplate/static/baseTemplate/assets/js-core/jquery-ui-touch-punch.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-core/jquery-ui-widget.js b/baseTemplate/static/baseTemplate/assets/js-core/jquery-ui-widget.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-core/modernizr.js b/baseTemplate/static/baseTemplate/assets/js-core/modernizr.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-core/raphael.js b/baseTemplate/static/baseTemplate/assets/js-core/raphael.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-core/transition.js b/baseTemplate/static/baseTemplate/assets/js-core/transition.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-init/frontend-init.js b/baseTemplate/static/baseTemplate/assets/js-init/frontend-init.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/js-init/widgets-init.js b/baseTemplate/static/baseTemplate/assets/js-init/widgets-init.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/snippets/chat.css b/baseTemplate/static/baseTemplate/assets/snippets/chat.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/snippets/files-box.css b/baseTemplate/static/baseTemplate/assets/snippets/files-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/snippets/login-box.css b/baseTemplate/static/baseTemplate/assets/snippets/login-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/snippets/mobile-navigation.css b/baseTemplate/static/baseTemplate/assets/snippets/mobile-navigation.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/snippets/notification-box.css b/baseTemplate/static/baseTemplate/assets/snippets/notification-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/snippets/progress-box.css b/baseTemplate/static/baseTemplate/assets/snippets/progress-box.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/snippets/todo.css b/baseTemplate/static/baseTemplate/assets/snippets/todo.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/snippets/user-profile.css b/baseTemplate/static/baseTemplate/assets/snippets/user-profile.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/themes/admin/color-schemes/default.css b/baseTemplate/static/baseTemplate/assets/themes/admin/color-schemes/default.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/themes/admin/layout.css b/baseTemplate/static/baseTemplate/assets/themes/admin/layout.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/themes/admin/layout.js b/baseTemplate/static/baseTemplate/assets/themes/admin/layout.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/themes/components/border-radius.css b/baseTemplate/static/baseTemplate/assets/themes/components/border-radius.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/themes/components/default.css b/baseTemplate/static/baseTemplate/assets/themes/components/default.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/themes/frontend/color-schemes/default.css b/baseTemplate/static/baseTemplate/assets/themes/frontend/color-schemes/default.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/themes/frontend/layout.css b/baseTemplate/static/baseTemplate/assets/themes/frontend/layout.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/themes/frontend/layout.js b/baseTemplate/static/baseTemplate/assets/themes/frontend/layout.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/accordion-ui/accordion.css b/baseTemplate/static/baseTemplate/assets/widgets/accordion-ui/accordion.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/accordion-ui/accordion.js b/baseTemplate/static/baseTemplate/assets/widgets/accordion-ui/accordion.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/animation/animation.js b/baseTemplate/static/baseTemplate/assets/widgets/animation/animation.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/autocomplete/autocomplete-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/autocomplete/autocomplete-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/autocomplete/autocomplete.js b/baseTemplate/static/baseTemplate/assets/widgets/autocomplete/autocomplete.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/autocomplete/menu.js b/baseTemplate/static/baseTemplate/assets/widgets/autocomplete/menu.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/button-ui/button.js b/baseTemplate/static/baseTemplate/assets/widgets/button-ui/button.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/button/button.js b/baseTemplate/static/baseTemplate/assets/widgets/button/button.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/calendar/calendar-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/calendar/calendar-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/calendar/calendar.css b/baseTemplate/static/baseTemplate/assets/widgets/calendar/calendar.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/calendar/calendar.js b/baseTemplate/static/baseTemplate/assets/widgets/calendar/calendar.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/carousel/carousel.css b/baseTemplate/static/baseTemplate/assets/widgets/carousel/carousel.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/carousel/carousel.js b/baseTemplate/static/baseTemplate/assets/widgets/carousel/carousel.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-bar.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-bar.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-core.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-core.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-doughnut.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-doughnut.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-line.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-line.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-polar.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-polar.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-radar.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/chart-js/chart-radar.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot-demo-1.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot-demo-1.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot-pie.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot-pie.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot-resize.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot-resize.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot-stack.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot-stack.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot-tooltip.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot-tooltip.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/flot/flot.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/justgage/justgage-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/justgage/justgage-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/justgage/justgage.css b/baseTemplate/static/baseTemplate/assets/widgets/charts/justgage/justgage.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/justgage/justgage.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/justgage/justgage.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/morris/morris-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/morris/morris-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/morris/morris.css b/baseTemplate/static/baseTemplate/assets/widgets/charts/morris/morris.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/morris/morris.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/morris/morris.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/piegage/piegage-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/piegage/piegage-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/piegage/piegage.css b/baseTemplate/static/baseTemplate/assets/widgets/charts/piegage/piegage.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/piegage/piegage.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/piegage/piegage.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/sparklines/sparklines-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/sparklines/sparklines-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/sparklines/sparklines.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/sparklines/sparklines.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/xcharts/xcharts-demo-1.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/xcharts/xcharts-demo-1.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/xcharts/xcharts-demo-2.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/xcharts/xcharts-demo-2.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/xcharts/xcharts-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/xcharts/xcharts-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/xcharts/xcharts.css b/baseTemplate/static/baseTemplate/assets/widgets/charts/xcharts/xcharts.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/charts/xcharts/xcharts.js b/baseTemplate/static/baseTemplate/assets/widgets/charts/xcharts/xcharts.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/chosen/chosen-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/chosen/chosen-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/chosen/chosen.css b/baseTemplate/static/baseTemplate/assets/widgets/chosen/chosen.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/chosen/chosen.js b/baseTemplate/static/baseTemplate/assets/widgets/chosen/chosen.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/ckeditor.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/ckeditor.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/config.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/config.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/contents.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/contents.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/lang/en.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/lang/en.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/da.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/da.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/de.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/de.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/el.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/el.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/en-gb.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/en-gb.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/en.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/en.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/es.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/es.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/et.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/et.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/he.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/he.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/id.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/id.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/it.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/it.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/km.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/km.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/no.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/no.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/si.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/si.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/th.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/th.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/tt.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/tt.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/about/dialogs/about.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/about/dialogs/about.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/about/dialogs/logo_ckeditor.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/about/dialogs/logo_ckeditor.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/clipboard/dialogs/paste.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/clipboard/dialogs/paste.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/dialog/dialogDefinition.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/dialog/dialogDefinition.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/icons.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/icons.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/icons_hidpi.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/icons_hidpi.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/image/dialogs/image.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/image/dialogs/image.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/image/images/noimage.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/image/images/noimage.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/link/dialogs/anchor.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/link/dialogs/anchor.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/link/dialogs/link.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/link/dialogs/link.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/link/images/anchor.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/link/images/anchor.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/link/images/hidpi/anchor.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/link/images/hidpi/anchor.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/magicline/images/hidpi/icon.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/magicline/images/hidpi/icon.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/magicline/images/icon-rtl.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/magicline/images/icon-rtl.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/magicline/images/icon.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/magicline/images/icon.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/pastefromword/filter/default.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/pastefromword/filter/default.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/scayt/LICENSE.md b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/scayt/LICENSE.md old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/scayt/README.md b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/scayt/README.md old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/scayt/dialogs/options.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/scayt/dialogs/options.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/scayt/dialogs/toolbar.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/scayt/dialogs/toolbar.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/ar.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/ar.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/bg.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/bg.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/ca.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/ca.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/cs.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/cs.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/cy.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/cy.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/de.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/de.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/el.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/el.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/en.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/en.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/eo.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/eo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/es.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/es.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/et.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/et.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/fa.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/fa.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/fi.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/fi.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/fr.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/fr.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/gl.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/gl.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/he.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/he.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/hr.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/hr.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/hu.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/hu.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/id.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/id.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/it.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/it.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/ja.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/ja.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/km.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/km.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/ku.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/ku.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/lv.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/lv.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/nb.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/nb.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/nl.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/nl.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/no.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/no.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/pl.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/pl.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/pt.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/pt.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/ru.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/ru.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/si.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/si.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/sk.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/sk.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/sl.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/sl.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/sq.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/sq.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/sv.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/sv.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/th.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/th.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/tr.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/tr.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/tt.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/tt.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/ug.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/ug.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/uk.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/uk.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/vi.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/vi.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/zh.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/lang/zh.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/specialchar.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/specialchar/dialogs/specialchar.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/table/dialogs/table.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/table/dialogs/table.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/tabletools/dialogs/tableCell.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/tabletools/dialogs/tableCell.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/LICENSE.md b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/LICENSE.md old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/README.md b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/README.md old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/dialogs/ciframe.html b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/dialogs/ciframe.html old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/dialogs/tmpFrameset.html b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/dialogs/tmpFrameset.html old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/dialogs/wsc.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/dialogs/wsc.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/dialogs/wsc.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/dialogs/wsc.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/dialogs/wsc_ie.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/plugins/wsc/dialogs/wsc_ie.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/dialog.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/dialog.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/dialog_ie.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/dialog_ie.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/dialog_ie7.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/dialog_ie7.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/dialog_ie8.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/dialog_ie8.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/dialog_iequirks.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/dialog_iequirks.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/dialog_opera.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/dialog_opera.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/editor.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/editor.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/editor_gecko.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/editor_gecko.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/editor_ie.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/editor_ie.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/editor_ie7.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/editor_ie7.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/editor_ie8.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/editor_ie8.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/editor_iequirks.css b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/editor_iequirks.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/icons.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/icons.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/icons_hidpi.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/icons_hidpi.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/arrow.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/arrow.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/close.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/close.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/hidpi/close.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/hidpi/close.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/hidpi/lock-open.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/hidpi/lock-open.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/hidpi/lock.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/hidpi/lock.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/hidpi/refresh.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/hidpi/refresh.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/lock-open.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/lock-open.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/lock.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/lock.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/refresh.png b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/images/refresh.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/readme.md b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/skins/bootstrapck/readme.md old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/styles.js b/baseTemplate/static/baseTemplate/assets/widgets/ckeditor/styles.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/collapse/collapse.js b/baseTemplate/static/baseTemplate/assets/widgets/collapse/collapse.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/colorpicker/colorpicker-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/colorpicker/colorpicker-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/colorpicker/colorpicker.css b/baseTemplate/static/baseTemplate/assets/widgets/colorpicker/colorpicker.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/colorpicker/colorpicker.js b/baseTemplate/static/baseTemplate/assets/widgets/colorpicker/colorpicker.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/content-box/contentbox.js b/baseTemplate/static/baseTemplate/assets/widgets/content-box/contentbox.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable-bootstrap.js b/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable-bootstrap.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable-fixedcolumns.js b/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable-fixedcolumns.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable-fixedheader.js b/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable-fixedheader.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable-reorder.js b/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable-reorder.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable-responsive.js b/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable-responsive.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable-tabletools.js b/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable-tabletools.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable.css b/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable.js b/baseTemplate/static/baseTemplate/assets/widgets/datatable/datatable.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datatable/swf/copy_csv_xls.swf b/baseTemplate/static/baseTemplate/assets/widgets/datatable/swf/copy_csv_xls.swf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datatable/swf/copy_csv_xls_pdf.swf b/baseTemplate/static/baseTemplate/assets/widgets/datatable/swf/copy_csv_xls_pdf.swf old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datepicker-ui/datepicker-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/datepicker-ui/datepicker-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datepicker-ui/datepicker.css b/baseTemplate/static/baseTemplate/assets/widgets/datepicker-ui/datepicker.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datepicker-ui/datepicker.js b/baseTemplate/static/baseTemplate/assets/widgets/datepicker-ui/datepicker.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datepicker/datepicker.css b/baseTemplate/static/baseTemplate/assets/widgets/datepicker/datepicker.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/datepicker/datepicker.js b/baseTemplate/static/baseTemplate/assets/widgets/datepicker/datepicker.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/daterangepicker/daterangepicker-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/daterangepicker/daterangepicker-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/daterangepicker/daterangepicker.css b/baseTemplate/static/baseTemplate/assets/widgets/daterangepicker/daterangepicker.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/daterangepicker/daterangepicker.js b/baseTemplate/static/baseTemplate/assets/widgets/daterangepicker/daterangepicker.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/daterangepicker/moment.js b/baseTemplate/static/baseTemplate/assets/widgets/daterangepicker/moment.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/dialog/dialog-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/dialog/dialog-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/dialog/dialog.css b/baseTemplate/static/baseTemplate/assets/widgets/dialog/dialog.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/dialog/dialog.js b/baseTemplate/static/baseTemplate/assets/widgets/dialog/dialog.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/dropdown/dropdown.css b/baseTemplate/static/baseTemplate/assets/widgets/dropdown/dropdown.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/dropdown/dropdown.js b/baseTemplate/static/baseTemplate/assets/widgets/dropdown/dropdown.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/dropzone/dropzone.css b/baseTemplate/static/baseTemplate/assets/widgets/dropzone/dropzone.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/dropzone/dropzone.js b/baseTemplate/static/baseTemplate/assets/widgets/dropzone/dropzone.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/file-input/file-input-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/file-input/file-input-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/file-input/file-input.js b/baseTemplate/static/baseTemplate/assets/widgets/file-input/file-input.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/file-input/fileinput.css b/baseTemplate/static/baseTemplate/assets/widgets/file-input/fileinput.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/fullpage/fullpage.css b/baseTemplate/static/baseTemplate/assets/widgets/fullpage/fullpage.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/fullpage/fullpage.js b/baseTemplate/static/baseTemplate/assets/widgets/fullpage/fullpage.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/input-mask/inputmask.js b/baseTemplate/static/baseTemplate/assets/widgets/input-mask/inputmask.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/input-switch/inputswitch-alt.css b/baseTemplate/static/baseTemplate/assets/widgets/input-switch/inputswitch-alt.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/input-switch/inputswitch-alt.js b/baseTemplate/static/baseTemplate/assets/widgets/input-switch/inputswitch-alt.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/input-switch/inputswitch.css b/baseTemplate/static/baseTemplate/assets/widgets/input-switch/inputswitch.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/input-switch/inputswitch.js b/baseTemplate/static/baseTemplate/assets/widgets/input-switch/inputswitch.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/interactions-ui/draggable.js b/baseTemplate/static/baseTemplate/assets/widgets/interactions-ui/draggable.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/interactions-ui/droppable.js b/baseTemplate/static/baseTemplate/assets/widgets/interactions-ui/droppable.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/interactions-ui/resizable.js b/baseTemplate/static/baseTemplate/assets/widgets/interactions-ui/resizable.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/interactions-ui/selectable.js b/baseTemplate/static/baseTemplate/assets/widgets/interactions-ui/selectable.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/interactions-ui/sortable.js b/baseTemplate/static/baseTemplate/assets/widgets/interactions-ui/sortable.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ionrangeslider/ionrangeslider-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/ionrangeslider/ionrangeslider-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ionrangeslider/ionrangeslider.css b/baseTemplate/static/baseTemplate/assets/widgets/ionrangeslider/ionrangeslider.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/ionrangeslider/ionrangeslider.js b/baseTemplate/static/baseTemplate/assets/widgets/ionrangeslider/ionrangeslider.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/jcrop/jcrop-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/jcrop/jcrop-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/jcrop/jcrop.css b/baseTemplate/static/baseTemplate/assets/widgets/jcrop/jcrop.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/jcrop/jcrop.js b/baseTemplate/static/baseTemplate/assets/widgets/jcrop/jcrop.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/jgrowl-notifications/jgrowl-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/jgrowl-notifications/jgrowl-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/jgrowl-notifications/jgrowl.css b/baseTemplate/static/baseTemplate/assets/widgets/jgrowl-notifications/jgrowl.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/jgrowl-notifications/jgrowl.js b/baseTemplate/static/baseTemplate/assets/widgets/jgrowl-notifications/jgrowl.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/knobs/knob.js b/baseTemplate/static/baseTemplate/assets/widgets/knobs/knob.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/layerslider-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/layerslider-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/layerslider-transitions.js b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/layerslider-transitions.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/layerslider.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/layerslider.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/layerslider.js b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/layerslider.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark/shadow.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark/shadow.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark3d/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark3d/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark3d/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark3d/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark3d/shadow.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark3d/shadow.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark3d/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark3d/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark3d/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlessdark3d/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight/shadow.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight/shadow.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight3d/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight3d/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight3d/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight3d/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight3d/shadow.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight3d/shadow.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight3d/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight3d/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight3d/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/borderlesslight3d/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/carousel/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/carousel/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/carousel/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/carousel/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/carousel/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/carousel/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/carousel/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/carousel/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/darkskin/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/darkskin/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/darkskin/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/darkskin/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/darkskin/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/darkskin/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/darkskin/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/darkskin/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/defaultskin/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/defaultskin/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/defaultskin/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/defaultskin/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/defaultskin/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/defaultskin/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/defaultskin/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/defaultskin/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidth/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidth/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidth/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidth/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidth/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidth/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidth/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidth/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidthdark/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidthdark/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidthdark/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidthdark/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidthdark/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidthdark/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidthdark/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/fullwidthdark/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/glass/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/glass/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/glass/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/glass/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/glass/shadow.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/glass/shadow.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/glass/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/glass/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/glass/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/glass/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/lightskin/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/lightskin/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/lightskin/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/lightskin/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/lightskin/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/lightskin/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/lightskin/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/lightskin/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/minimal/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/minimal/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/minimal/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/minimal/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/minimal/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/minimal/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/minimal/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/minimal/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/noskin/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/noskin/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/noskin/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/noskin/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/noskin/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/noskin/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/noskin/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/noskin/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/v5/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/v5/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/v5/nothumb.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/v5/nothumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/v5/skin.css b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/v5/skin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/v5/skin.png b/baseTemplate/static/baseTemplate/assets/widgets/layerslider/skins/v5/skin.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/lazyload/lazyload.js b/baseTemplate/static/baseTemplate/assets/widgets/lazyload/lazyload.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/loading-bar/loadingbar-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/loading-bar/loadingbar-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/loading-bar/loadingbar.css b/baseTemplate/static/baseTemplate/assets/widgets/loading-bar/loadingbar.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/loading-bar/loadingbar.js b/baseTemplate/static/baseTemplate/assets/widgets/loading-bar/loadingbar.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/loading-indicator/loader-dark.gif b/baseTemplate/static/baseTemplate/assets/widgets/loading-indicator/loader-dark.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/loading-indicator/loader-light.gif b/baseTemplate/static/baseTemplate/assets/widgets/loading-indicator/loader-light.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/gmaps/gmaps-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/maps/gmaps/gmaps-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/gmaps/gmaps.js b/baseTemplate/static/baseTemplate/assets/widgets/maps/gmaps/gmaps.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/mapael/mapael-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/maps/mapael/mapael-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/mapael/mapael.js b/baseTemplate/static/baseTemplate/assets/widgets/maps/mapael/mapael.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/mapael/maps/france_departments.js b/baseTemplate/static/baseTemplate/assets/widgets/maps/mapael/maps/france_departments.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/mapael/maps/usa_states.js b/baseTemplate/static/baseTemplate/assets/widgets/maps/mapael/maps/usa_states.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/mapael/maps/world_countries.js b/baseTemplate/static/baseTemplate/assets/widgets/maps/mapael/maps/world_countries.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/vector-maps/de_merc_en.js b/baseTemplate/static/baseTemplate/assets/widgets/maps/vector-maps/de_merc_en.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/vector-maps/mall_map.js b/baseTemplate/static/baseTemplate/assets/widgets/maps/vector-maps/mall_map.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/vector-maps/vectormaps-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/maps/vector-maps/vectormaps-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/vector-maps/vectormaps.css b/baseTemplate/static/baseTemplate/assets/widgets/maps/vector-maps/vectormaps.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/vector-maps/vectormaps.js b/baseTemplate/static/baseTemplate/assets/widgets/maps/vector-maps/vectormaps.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/maps/vector-maps/world_map.js b/baseTemplate/static/baseTemplate/assets/widgets/maps/vector-maps/world_map.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/markdown/markdown.css b/baseTemplate/static/baseTemplate/assets/widgets/markdown/markdown.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/markdown/markdown.js b/baseTemplate/static/baseTemplate/assets/widgets/markdown/markdown.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/mixitup/images-loaded.js b/baseTemplate/static/baseTemplate/assets/widgets/mixitup/images-loaded.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/mixitup/isotope.js b/baseTemplate/static/baseTemplate/assets/widgets/mixitup/isotope.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/mixitup/mixitup.js b/baseTemplate/static/baseTemplate/assets/widgets/mixitup/mixitup.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/mixitup/portfolio-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/mixitup/portfolio-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/modal/modal.css b/baseTemplate/static/baseTemplate/assets/widgets/modal/modal.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/modal/modal.js b/baseTemplate/static/baseTemplate/assets/widgets/modal/modal.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-select/multiselect.css b/baseTemplate/static/baseTemplate/assets/widgets/multi-select/multiselect.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-select/multiselect.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-select/multiselect.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/app.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/app.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/cors/jquery.postmessage-transport.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/cors/jquery.postmessage-transport.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/cors/jquery.xdr-transport.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/cors/jquery.xdr-transport.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/fileupload.css b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/fileupload.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-angular.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-angular.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-audio.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-audio.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-image.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-image.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-jquery-ui.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-jquery-ui.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-process.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-process.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-ui.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-ui.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-validate.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-validate.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-video.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload-video.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.fileupload.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.iframe-transport.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/jquery.iframe-transport.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/main.js b/baseTemplate/static/baseTemplate/assets/widgets/multi-upload/main.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/nestable/nestable-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/nestable/nestable-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/nestable/nestable.css b/baseTemplate/static/baseTemplate/assets/widgets/nestable/nestable.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/nestable/nestable.js b/baseTemplate/static/baseTemplate/assets/widgets/nestable/nestable.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/nicescroll/nicescroll-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/nicescroll/nicescroll-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/nicescroll/nicescroll.js b/baseTemplate/static/baseTemplate/assets/widgets/nicescroll/nicescroll.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/noty-notifications/noty-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/noty-notifications/noty-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/noty-notifications/noty.css b/baseTemplate/static/baseTemplate/assets/widgets/noty-notifications/noty.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/noty-notifications/noty.js b/baseTemplate/static/baseTemplate/assets/widgets/noty-notifications/noty.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/overlay/overlay.js b/baseTemplate/static/baseTemplate/assets/widgets/overlay/overlay.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/owlcarousel/owlcarousel-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/owlcarousel/owlcarousel-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/owlcarousel/owlcarousel.css b/baseTemplate/static/baseTemplate/assets/widgets/owlcarousel/owlcarousel.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/owlcarousel/owlcarousel.js b/baseTemplate/static/baseTemplate/assets/widgets/owlcarousel/owlcarousel.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/parsley/parsley.js b/baseTemplate/static/baseTemplate/assets/widgets/parsley/parsley.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/popover/popover.css b/baseTemplate/static/baseTemplate/assets/widgets/popover/popover.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/popover/popover.js b/baseTemplate/static/baseTemplate/assets/widgets/popover/popover.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/default_thumb.png b/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/default_thumb.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/loader.gif b/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/loader.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/sprite.png b/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/sprite.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/sprite_next.png b/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/sprite_next.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/sprite_prev.png b/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/sprite_prev.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/sprite_x.png b/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/sprite_x.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/sprite_y.png b/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/images/default/sprite_y.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/prettyphoto.css b/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/prettyphoto.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/prettyphoto.js b/baseTemplate/static/baseTemplate/assets/widgets/pretty-photo/prettyphoto.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/progressbar/progressbar.css b/baseTemplate/static/baseTemplate/assets/widgets/progressbar/progressbar.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/progressbar/progressbar.js b/baseTemplate/static/baseTemplate/assets/widgets/progressbar/progressbar.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/range-slider/rangeslider-core.js b/baseTemplate/static/baseTemplate/assets/widgets/range-slider/rangeslider-core.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/range-slider/rangeslider-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/range-slider/rangeslider-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/range-slider/rangeslider.css b/baseTemplate/static/baseTemplate/assets/widgets/range-slider/rangeslider.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/screenfull/screenfull.js b/baseTemplate/static/baseTemplate/assets/widgets/screenfull/screenfull.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/skrollr/skrollr.js b/baseTemplate/static/baseTemplate/assets/widgets/skrollr/skrollr.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/skycons/skycons.js b/baseTemplate/static/baseTemplate/assets/widgets/skycons/skycons.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/slidebars/slidebars-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/slidebars/slidebars-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/slidebars/slidebars.css b/baseTemplate/static/baseTemplate/assets/widgets/slidebars/slidebars.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/slidebars/slidebars.js b/baseTemplate/static/baseTemplate/assets/widgets/slidebars/slidebars.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/slider-ui/slider-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/slider-ui/slider-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/slider-ui/slider.css b/baseTemplate/static/baseTemplate/assets/widgets/slider-ui/slider.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/slider-ui/slider.js b/baseTemplate/static/baseTemplate/assets/widgets/slider-ui/slider.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/slimscroll/slimscroll.js b/baseTemplate/static/baseTemplate/assets/widgets/slimscroll/slimscroll.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/spinner/spinner.js b/baseTemplate/static/baseTemplate/assets/widgets/spinner/spinner.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/sticky/sticky.js b/baseTemplate/static/baseTemplate/assets/widgets/sticky/sticky.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/summernote-wysiwyg/summernote-wysiwyg.css b/baseTemplate/static/baseTemplate/assets/widgets/summernote-wysiwyg/summernote-wysiwyg.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/summernote-wysiwyg/summernote-wysiwyg.js b/baseTemplate/static/baseTemplate/assets/widgets/summernote-wysiwyg/summernote-wysiwyg.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/superclick/superclick.js b/baseTemplate/static/baseTemplate/assets/widgets/superclick/superclick.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/superfish/superfish.js b/baseTemplate/static/baseTemplate/assets/widgets/superfish/superfish.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shAutoloader.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shAutoloader.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushAS3.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushAS3.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushAppleScript.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushAppleScript.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushBash.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushBash.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushCSharp.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushCSharp.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushColdFusion.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushColdFusion.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushCpp.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushCpp.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushCss.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushCss.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushDelphi.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushDelphi.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushDiff.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushDiff.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushErlang.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushErlang.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushGroovy.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushGroovy.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushJScript.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushJScript.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushJava.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushJava.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushJavaFX.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushJavaFX.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushPerl.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushPerl.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushPhp.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushPhp.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushPlain.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushPlain.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushPowerShell.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushPowerShell.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushPython.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushPython.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushRuby.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushRuby.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushSass.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushSass.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushScala.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushScala.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushSql.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushSql.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushVb.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushVb.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushXml.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shBrushXml.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shCore.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shCore.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shLegacy.js b/baseTemplate/static/baseTemplate/assets/widgets/syntax/scripts/shLegacy.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCore.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCore.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreDefault.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreDefault.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreDjango.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreDjango.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreEclipse.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreEclipse.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreEmacs.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreEmacs.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreFadeToGrey.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreFadeToGrey.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreMDUltra.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreMDUltra.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreMidnight.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreMidnight.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreRDark.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shCoreRDark.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeDefault.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeDefault.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeDjango.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeDjango.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeEclipse.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeEclipse.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeEmacs.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeEmacs.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeFadeToGrey.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeFadeToGrey.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeMDUltra.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeMDUltra.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeMidnight.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeMidnight.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeRDark.css b/baseTemplate/static/baseTemplate/assets/widgets/syntax/styles/shThemeRDark.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/tabs-ui/tabs.css b/baseTemplate/static/baseTemplate/assets/widgets/tabs-ui/tabs.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/tabs-ui/tabs.js b/baseTemplate/static/baseTemplate/assets/widgets/tabs-ui/tabs.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/tabs/tabs-responsive.js b/baseTemplate/static/baseTemplate/assets/widgets/tabs/tabs-responsive.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/tabs/tabs.js b/baseTemplate/static/baseTemplate/assets/widgets/tabs/tabs.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/textarea/textarea.js b/baseTemplate/static/baseTemplate/assets/widgets/textarea/textarea.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/theme-switcher/themeswitcher.css b/baseTemplate/static/baseTemplate/assets/widgets/theme-switcher/themeswitcher.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/theme-switcher/themeswitcher.js b/baseTemplate/static/baseTemplate/assets/widgets/theme-switcher/themeswitcher.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/timepicker/timepicker.css b/baseTemplate/static/baseTemplate/assets/widgets/timepicker/timepicker.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/timepicker/timepicker.js b/baseTemplate/static/baseTemplate/assets/widgets/timepicker/timepicker.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/tocify/tocify.css b/baseTemplate/static/baseTemplate/assets/widgets/tocify/tocify.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/tocify/tocify.js b/baseTemplate/static/baseTemplate/assets/widgets/tocify/tocify.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/tooltip/tooltip.css b/baseTemplate/static/baseTemplate/assets/widgets/tooltip/tooltip.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/tooltip/tooltip.js b/baseTemplate/static/baseTemplate/assets/widgets/tooltip/tooltip.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/touchspin/touchspin-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/touchspin/touchspin-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/touchspin/touchspin.css b/baseTemplate/static/baseTemplate/assets/widgets/touchspin/touchspin.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/touchspin/touchspin.js b/baseTemplate/static/baseTemplate/assets/widgets/touchspin/touchspin.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/uniform/uniform-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/uniform/uniform-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/uniform/uniform.css b/baseTemplate/static/baseTemplate/assets/widgets/uniform/uniform.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/uniform/uniform.js b/baseTemplate/static/baseTemplate/assets/widgets/uniform/uniform.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/videobg/videobg-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/videobg/videobg-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/videobg/videobg.js b/baseTemplate/static/baseTemplate/assets/widgets/videobg/videobg.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/wizard/wizard-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/wizard/wizard-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/wizard/wizard.css b/baseTemplate/static/baseTemplate/assets/widgets/wizard/wizard.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/wizard/wizard.js b/baseTemplate/static/baseTemplate/assets/widgets/wizard/wizard.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/wow/wow.js b/baseTemplate/static/baseTemplate/assets/widgets/wow/wow.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/xeditable/images/clear.png b/baseTemplate/static/baseTemplate/assets/widgets/xeditable/images/clear.png old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/xeditable/images/loading.gif b/baseTemplate/static/baseTemplate/assets/widgets/xeditable/images/loading.gif old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/xeditable/xeditable-demo.js b/baseTemplate/static/baseTemplate/assets/widgets/xeditable/xeditable-demo.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/xeditable/xeditable.css b/baseTemplate/static/baseTemplate/assets/widgets/xeditable/xeditable.css old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/assets/widgets/xeditable/xeditable.js b/baseTemplate/static/baseTemplate/assets/widgets/xeditable/xeditable.js old mode 100755 new mode 100644 diff --git a/baseTemplate/static/baseTemplate/custom-js/pnotify.custom.min.css b/baseTemplate/static/baseTemplate/custom-js/pnotify.custom.min.css new file mode 100644 index 000000000..e42b91a66 --- /dev/null +++ b/baseTemplate/static/baseTemplate/custom-js/pnotify.custom.min.css @@ -0,0 +1,10 @@ +/*! +Author : Hunter Perrin +Version : 3.2.0 +Link : http://sciactive.com/pnotify/ +*/.ui-pnotify{top:36px;right:36px;position:absolute;height:auto;z-index:2}body>.ui-pnotify{position:fixed;z-index:100040}.ui-pnotify-modal-overlay{background-color:rgba(0,0,0,.4);top:0;left:0;position:absolute;height:100%;width:100%;z-index:1}body>.ui-pnotify-modal-overlay{position:fixed;z-index:100039}.ui-pnotify.ui-pnotify-in{display:block!important}.ui-pnotify.ui-pnotify-move{transition:left .5s ease,top .5s ease,right .5s ease,bottom .5s ease}.ui-pnotify.ui-pnotify-fade-slow{transition:opacity .4s linear;opacity:0}.ui-pnotify.ui-pnotify-fade-slow.ui-pnotify.ui-pnotify-move{transition:opacity .4s linear,left .5s ease,top .5s ease,right .5s ease,bottom .5s ease}.ui-pnotify.ui-pnotify-fade-normal{transition:opacity .25s linear;opacity:0}.ui-pnotify.ui-pnotify-fade-normal.ui-pnotify.ui-pnotify-move{transition:opacity .25s linear,left .5s ease,top .5s ease,right .5s ease,bottom .5s ease}.ui-pnotify.ui-pnotify-fade-fast{transition:opacity .1s linear;opacity:0}.ui-pnotify.ui-pnotify-fade-fast.ui-pnotify.ui-pnotify-move{transition:opacity .1s linear,left .5s ease,top .5s ease,right .5s ease,bottom .5s ease}.ui-pnotify.ui-pnotify-fade-in{opacity:1}.ui-pnotify .ui-pnotify-shadow{-webkit-box-shadow:0 6px 28px 0 rgba(0,0,0,.1);-moz-box-shadow:0 6px 28px 0 rgba(0,0,0,.1);box-shadow:0 6px 28px 0 rgba(0,0,0,.1)}.ui-pnotify-container{background-position:0 0;padding:.8em;height:100%;margin:0}.ui-pnotify-container:after{content:" ";visibility:hidden;display:block;height:0;clear:both}.ui-pnotify-container.ui-pnotify-sharp{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.ui-pnotify-title{display:block;margin-bottom:.4em;margin-top:0}.ui-pnotify-text{display:block}.ui-pnotify-icon,.ui-pnotify-icon span{display:block;float:left;margin-right:.2em}.ui-pnotify.stack-bottomleft,.ui-pnotify.stack-topleft{left:25px;right:auto}.ui-pnotify.stack-bottomleft,.ui-pnotify.stack-bottomright{bottom:25px;top:auto}.ui-pnotify.stack-modal{left:50%;right:auto;margin-left:-150px} +.brighttheme{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.brighttheme.ui-pnotify-container{padding:18px}.brighttheme .ui-pnotify-title{margin-bottom:12px}.brighttheme-notice{background-color:#ffffa2;border:0 solid #ff0;color:#4f4f00}.brighttheme-info{background-color:#8fcedd;border:0 solid #0286a5;color:#012831}.brighttheme-success{background-color:#aff29a;border:0 solid #35db00;color:#104300}.brighttheme-error{background-color:#ffaba2;background-image:repeating-linear-gradient(135deg,transparent,transparent 35px,rgba(255,255,255,.3) 35px,rgba(255,255,255,.3) 70px);border:0 solid #ff1800;color:#4f0800}.brighttheme-icon-closer,.brighttheme-icon-info,.brighttheme-icon-notice,.brighttheme-icon-sticker,.brighttheme-icon-success{position:relative;width:16px;height:16px;font-size:12px;font-weight:700;line-height:16px;font-family:"Courier New",Courier,monospace;border-radius:50%}.brighttheme-icon-closer:after,.brighttheme-icon-info:after,.brighttheme-icon-notice:after,.brighttheme-icon-sticker:after,.brighttheme-icon-success:after{position:absolute;top:0;left:4px}.brighttheme-icon-notice{background-color:#2e2e00;color:#ffffa2;margin-top:2px}.brighttheme-icon-notice:after{content:"!"}.brighttheme-icon-info{background-color:#012831;color:#8fcedd;margin-top:2px}.brighttheme-icon-info:after{content:"i"}.brighttheme-icon-success{background-color:#104300;color:#aff29a;margin-top:2px}.brighttheme-icon-success:after{content:"\002713"}.brighttheme-icon-error{position:relative;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:16px solid #2e0400;font-size:0;line-height:0;color:#ffaba2;margin-top:1px}.brighttheme-icon-error:after{position:absolute;top:1px;left:-4px;font-size:12px;font-weight:700;line-height:16px;font-family:"Courier New",Courier,monospace;content:"!"}.brighttheme-icon-closer,.brighttheme-icon-sticker{display:inline-block}.brighttheme-icon-closer:after{top:-4px;content:"\002715"}.brighttheme-icon-sticker:after{top:-5px;content:"\01D1BC";-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.brighttheme-icon-sticker.brighttheme-icon-stuck:after{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.brighttheme .ui-pnotify-action-bar{padding-top:12px}.brighttheme .ui-pnotify-action-bar input,.brighttheme .ui-pnotify-action-bar textarea{display:block;width:100%;margin-bottom:12px!important}.brighttheme .ui-pnotify-action-button{text-transform:uppercase;font-weight:700;padding:4px 8px;border:none;background:0 0}.brighttheme .ui-pnotify-action-button.btn-primary{border:none;border-radius:0}.brighttheme-notice .ui-pnotify-action-button.btn-primary{background-color:#ff0;color:#4f4f00}.brighttheme-info .ui-pnotify-action-button.btn-primary{background-color:#0286a5;color:#012831}.brighttheme-success .ui-pnotify-action-button.btn-primary{background-color:#35db00;color:#104300}.brighttheme-error .ui-pnotify-action-button.btn-primary{background-color:#ff1800;color:#4f0800} +.ui-pnotify-closer,.ui-pnotify-sticker{float:right;margin-left:.2em} +.ui-pnotify-history-container{position:absolute;top:0;right:18px;width:70px;border-top:none;padding:0;-webkit-border-top-left-radius:0;-moz-border-top-left-radius:0;border-top-left-radius:0;-webkit-border-top-right-radius:0;-moz-border-top-right-radius:0;border-top-right-radius:0;z-index:10000}.ui-pnotify-history-container.ui-pnotify-history-fixed{position:fixed}.ui-pnotify-history-container .ui-pnotify-history-header{padding:2px;text-align:center}.ui-pnotify-history-container button{cursor:pointer;display:block;width:100%}.ui-pnotify-history-container .ui-pnotify-history-pulldown{display:block;margin:0 auto}.ui-pnotify-history-brighttheme{background-color:#8fcedd;border:0 solid #0286a5;color:#012831}.ui-pnotify-history-brighttheme button{text-transform:uppercase;font-weight:700;padding:4px 8px;border:none;background:0 0}.ui-pnotify-history-brighttheme .ui-pnotify-history-pulldown::after{display:block;font-size:16px;line-height:14px;padding-bottom:4px;content:"⌄";text-align:center;font-weight:700;font-family:Arial,sans-serif} +.ui-pnotify-container{position:relative;left:0}@media (max-width:480px){.ui-pnotify-mobile-able.ui-pnotify{position:fixed;top:0;right:0;left:0;width:auto!important;font-size:1.2em;-webkit-font-smoothing:antialiased;-moz-font-smoothing:antialiased;-ms-font-smoothing:antialiased;font-smoothing:antialiased}.ui-pnotify-mobile-able.ui-pnotify .ui-pnotify-shadow{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-bottom-width:5px}.ui-pnotify-mobile-able .ui-pnotify-container{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.ui-pnotify-mobile-able.ui-pnotify.stack-bottomleft,.ui-pnotify-mobile-able.ui-pnotify.stack-topleft{left:0;right:0}.ui-pnotify-mobile-able.ui-pnotify.stack-bottomleft,.ui-pnotify-mobile-able.ui-pnotify.stack-bottomright{left:0;right:0;bottom:0;top:auto}.ui-pnotify-mobile-able.ui-pnotify.stack-bottomleft .ui-pnotify-shadow,.ui-pnotify-mobile-able.ui-pnotify.stack-bottomright .ui-pnotify-shadow{border-top-width:5px;border-bottom-width:1px}} +.ui-pnotify.ui-pnotify-nonblock-fade{opacity:.2}.ui-pnotify.ui-pnotify-nonblock-hide{display:none!important} \ No newline at end of file diff --git a/baseTemplate/static/baseTemplate/custom-js/pnotify.custom.min.js b/baseTemplate/static/baseTemplate/custom-js/pnotify.custom.min.js new file mode 100644 index 000000000..cac2934ec --- /dev/null +++ b/baseTemplate/static/baseTemplate/custom-js/pnotify.custom.min.js @@ -0,0 +1,31 @@ +/* +PNotify 3.2.0 sciactive.com/pnotify/ +(C) 2015 Hunter Perrin; Google, Inc. +license Apache-2.0 +*/ +!function(t,i){"function"==typeof define&&define.amd?define("pnotify",["jquery"],function(s){return i(s,t)}):"object"==typeof exports&&"undefined"!=typeof module?module.exports=i(require("jquery"),global||t):t.PNotify=i(t.jQuery,t)}("undefined"!=typeof window?window:this,function(t,i){var s=function(i){var e,o,n={dir1:"down",dir2:"left",push:"bottom",spacing1:36,spacing2:36,context:t("body"),modal:!1},a=t(i),r=function(){o=t("body"),c.prototype.options.stack.context=o,a=t(i),a.bind("resize",function(){e&&clearTimeout(e),e=setTimeout(function(){c.positionAll(!0)},10)})},h=function(i){var s=t("
    ",{class:"ui-pnotify-modal-overlay"});return s.prependTo(i.context),i.overlay_close&&s.click(function(){c.removeStack(i)}),s},c=function(t){this.state="initializing",this.timer=null,this.animTimer=null,this.styles=null,this.elem=null,this.container=null,this.title_container=null,this.text_container=null,this.animating=!1,this.timerHide=!1,this.parseOptions(t),this.init()};return t.extend(c.prototype,{version:"3.2.0",options:{title:!1,title_escape:!1,text:!1,text_escape:!1,styling:"brighttheme",addclass:"",cornerclass:"",auto_display:!0,width:"300px",min_height:"16px",type:"notice",icon:!0,animation:"fade",animate_speed:"normal",shadow:!0,hide:!0,delay:8e3,mouse_reset:!0,remove:!0,insert_brs:!0,destroy:!0,stack:n},modules:{},runModules:function(t,i){var s;for(var e in this.modules)s="object"==typeof i&&e in i?i[e]:i,"function"==typeof this.modules[e][t]&&(this.modules[e].notice=this,this.modules[e].options="object"==typeof this.options[e]?this.options[e]:{},this.modules[e][t](this,"object"==typeof this.options[e]?this.options[e]:{},s))},init:function(){var i=this;return this.modules={},t.extend(!0,this.modules,c.prototype.modules),"object"==typeof this.options.styling?this.styles=this.options.styling:this.styles=c.styling[this.options.styling],this.elem=t("
    ",{class:"ui-pnotify "+this.options.addclass,css:{display:"none"},"aria-live":"assertive","aria-role":"alertdialog",mouseenter:function(t){if(i.options.mouse_reset&&"out"===i.animating){if(!i.timerHide)return;i.cancelRemove()}i.options.hide&&i.options.mouse_reset&&i.cancelRemove()},mouseleave:function(t){i.options.hide&&i.options.mouse_reset&&"out"!==i.animating&&i.queueRemove(),c.positionAll()}}),"fade"===this.options.animation&&this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed),this.container=t("
    ",{class:this.styles.container+" ui-pnotify-container "+("error"===this.options.type?this.styles.error:"info"===this.options.type?this.styles.info:"success"===this.options.type?this.styles.success:this.styles.notice),role:"alert"}).appendTo(this.elem),""!==this.options.cornerclass&&this.container.removeClass("ui-corner-all").addClass(this.options.cornerclass),this.options.shadow&&this.container.addClass("ui-pnotify-shadow"),!1!==this.options.icon&&t("
    ",{class:"ui-pnotify-icon"}).append(t("",{class:!0===this.options.icon?"error"===this.options.type?this.styles.error_icon:"info"===this.options.type?this.styles.info_icon:"success"===this.options.type?this.styles.success_icon:this.styles.notice_icon:this.options.icon})).prependTo(this.container),this.title_container=t("

    ",{class:"ui-pnotify-title"}).appendTo(this.container),!1===this.options.title?this.title_container.hide():this.options.title_escape?this.title_container.text(this.options.title):this.title_container.html(this.options.title),this.text_container=t("
    ",{class:"ui-pnotify-text","aria-role":"alert"}).appendTo(this.container),!1===this.options.text?this.text_container.hide():this.options.text_escape?this.text_container.text(this.options.text):this.text_container.html(this.options.insert_brs?String(this.options.text).replace(/\n/g,"
    "):this.options.text),"string"==typeof this.options.width&&this.elem.css("width",this.options.width),"string"==typeof this.options.min_height&&this.container.css("min-height",this.options.min_height),"top"===this.options.stack.push?c.notices=t.merge([this],c.notices):c.notices=t.merge(c.notices,[this]),"top"===this.options.stack.push&&this.queuePosition(!1,1),this.options.stack.animation=!1,this.runModules("init"),this.state="closed",this.options.auto_display&&this.open(),this},update:function(i){var s=this.options;return this.parseOptions(s,i),this.elem.removeClass("ui-pnotify-fade-slow ui-pnotify-fade-normal ui-pnotify-fade-fast"),"fade"===this.options.animation&&this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed),this.options.cornerclass!==s.cornerclass&&this.container.removeClass("ui-corner-all "+s.cornerclass).addClass(this.options.cornerclass),this.options.shadow!==s.shadow&&(this.options.shadow?this.container.addClass("ui-pnotify-shadow"):this.container.removeClass("ui-pnotify-shadow")),!1===this.options.addclass?this.elem.removeClass(s.addclass):this.options.addclass!==s.addclass&&this.elem.removeClass(s.addclass).addClass(this.options.addclass),!1===this.options.title?this.title_container.slideUp("fast"):this.options.title!==s.title&&(this.options.title_escape?this.title_container.text(this.options.title):this.title_container.html(this.options.title),!1===s.title&&this.title_container.slideDown(200)),!1===this.options.text?this.text_container.slideUp("fast"):this.options.text!==s.text&&(this.options.text_escape?this.text_container.text(this.options.text):this.text_container.html(this.options.insert_brs?String(this.options.text).replace(/\n/g,"
    "):this.options.text),!1===s.text&&this.text_container.slideDown(200)),this.options.type!==s.type&&this.container.removeClass(this.styles.error+" "+this.styles.notice+" "+this.styles.success+" "+this.styles.info).addClass("error"===this.options.type?this.styles.error:"info"===this.options.type?this.styles.info:"success"===this.options.type?this.styles.success:this.styles.notice),(this.options.icon!==s.icon||!0===this.options.icon&&this.options.type!==s.type)&&(this.container.find("div.ui-pnotify-icon").remove(),!1!==this.options.icon&&t("
    ",{class:"ui-pnotify-icon"}).append(t("",{class:!0===this.options.icon?"error"===this.options.type?this.styles.error_icon:"info"===this.options.type?this.styles.info_icon:"success"===this.options.type?this.styles.success_icon:this.styles.notice_icon:this.options.icon})).prependTo(this.container)),this.options.width!==s.width&&this.elem.animate({width:this.options.width}),this.options.min_height!==s.min_height&&this.container.animate({minHeight:this.options.min_height}),this.options.hide?s.hide||this.queueRemove():this.cancelRemove(),this.queuePosition(!0),this.runModules("update",s),this},open:function(){this.state="opening",this.runModules("beforeOpen");var t=this;return this.elem.parent().length||this.elem.appendTo(this.options.stack.context?this.options.stack.context:o),"top"!==this.options.stack.push&&this.position(!0),this.animateIn(function(){t.queuePosition(!0),t.options.hide&&t.queueRemove(),t.state="open",t.runModules("afterOpen")}),this},remove:function(s){this.state="closing",this.timerHide=!!s,this.runModules("beforeClose");var e=this;return this.timer&&(i.clearTimeout(this.timer),this.timer=null),this.animateOut(function(){if(e.state="closed",e.runModules("afterClose"),e.queuePosition(!0),e.options.remove&&e.elem.detach(),e.runModules("beforeDestroy"),e.options.destroy&&null!==c.notices){var i=t.inArray(e,c.notices);-1!==i&&c.notices.splice(i,1)}e.runModules("afterDestroy")}),this},get:function(){return this.elem},parseOptions:function(i,s){this.options=t.extend(!0,{},c.prototype.options),this.options.stack=c.prototype.options.stack;for(var e,o=[i,s],n=0;n(i.context.is(o)?a.height():i.context.prop("scrollHeight"))||"up"===i.dir1&&i.nextpos1+s.height()>(i.context.is(o)?a.height():i.context.prop("scrollHeight"))||"left"===i.dir1&&i.nextpos1+s.width()>(i.context.is(o)?a.width():i.context.prop("scrollWidth"))||"right"===i.dir1&&i.nextpos1+s.width()>(i.context.is(o)?a.width():i.context.prop("scrollWidth")))&&(i.nextpos1=i.firstpos1,i.nextpos2+=i.addpos2+(void 0===i.spacing2?25:i.spacing2),i.addpos2=0),"number"==typeof i.nextpos2&&(i.animation?s.css(p,i.nextpos2+"px"):(s.removeClass("ui-pnotify-move"),s.css(p,i.nextpos2+"px"),s.css(p),s.addClass("ui-pnotify-move"))),i.dir2){case"down":case"up":s.outerHeight(!0)>i.addpos2&&(i.addpos2=s.height());break;case"left":case"right":s.outerWidth(!0)>i.addpos2&&(i.addpos2=s.width())}switch("number"==typeof i.nextpos1&&(i.animation?s.css(c,i.nextpos1+"px"):(s.removeClass("ui-pnotify-move"),s.css(c,i.nextpos1+"px"),s.css(c),s.addClass("ui-pnotify-move"))),i.dir1){case"down":case"up":i.nextpos1+=s.height()+(void 0===i.spacing1?25:i.spacing1);break;case"left":case"right":i.nextpos1+=s.width()+(void 0===i.spacing1?25:i.spacing1)}}return this}},queuePosition:function(t,i){return e&&clearTimeout(e),i||(i=10),e=setTimeout(function(){c.positionAll(t)},i),this},cancelRemove:function(){return this.timer&&i.clearTimeout(this.timer),this.animTimer&&i.clearTimeout(this.animTimer),"closing"===this.state&&(this.state="open",this.animating=!1,this.elem.addClass("ui-pnotify-in"),"fade"===this.options.animation&&this.elem.addClass("ui-pnotify-fade-in")),this},queueRemove:function(){var t=this;return this.cancelRemove(),this.timer=i.setTimeout(function(){t.remove(!0)},isNaN(this.options.delay)?0:this.options.delay),this}}),t.extend(c,{notices:[],reload:s,removeAll:function(){t.each(c.notices,function(t,i){i.remove&&i.remove(!1)})},removeStack:function(i){t.each(c.notices,function(t,s){s.remove&&s.options.stack===i&&s.remove(!1)})},positionAll:function(i){if(e&&clearTimeout(e),e=null,c.notices&&c.notices.length)t.each(c.notices,function(t,s){var e=s.options.stack;e&&(e.overlay&&e.overlay.hide(),e.nextpos1=e.firstpos1,e.nextpos2=e.firstpos2,e.addpos2=0,e.animation=i)}),t.each(c.notices,function(t,i){i.position()});else{var s=c.prototype.options.stack;s&&(delete s.nextpos1,delete s.nextpos2)}},styling:{brighttheme:{container:"brighttheme",notice:"brighttheme-notice",notice_icon:"brighttheme-icon-notice",info:"brighttheme-info",info_icon:"brighttheme-icon-info",success:"brighttheme-success",success_icon:"brighttheme-icon-success",error:"brighttheme-error",error_icon:"brighttheme-icon-error"},bootstrap3:{container:"alert",notice:"alert-warning",notice_icon:"glyphicon glyphicon-exclamation-sign",info:"alert-info",info_icon:"glyphicon glyphicon-info-sign",success:"alert-success",success_icon:"glyphicon glyphicon-ok-sign",error:"alert-danger",error_icon:"glyphicon glyphicon-warning-sign"}}}),c.styling.fontawesome=t.extend({},c.styling.bootstrap3),t.extend(c.styling.fontawesome,{notice_icon:"fa fa-exclamation-circle",info_icon:"fa fa-info",success_icon:"fa fa-check",error_icon:"fa fa-warning"}),i.document.body?r():t(r),c};return s(i)}); +//# sourceMappingURL=pnotify.js.map +// Animate +!function(n,i){"function"==typeof define&&define.amd?define("pnotify.animate",["jquery","pnotify"],i):"object"==typeof exports&&"undefined"!=typeof module?module.exports=i(require("jquery"),require("./pnotify")):i(n.jQuery,n.PNotify)}("undefined"!=typeof window?window:this,function(n,i){return i.prototype.options.animate={animate:!1,in_class:"",out_class:""},i.prototype.modules.animate={init:function(n,i){this.setUpAnimations(n,i),n.attention=function(i,t){n.elem.one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){n.elem.removeClass(i),t&&t.call(n)}).addClass("animated "+i)}},update:function(n,i,t){i.animate!=t.animate&&this.setUpAnimations(n,i)},setUpAnimations:function(n,i){if(i.animate){n.options.animation="none",n.elem.removeClass("ui-pnotify-fade-slow ui-pnotify-fade-normal ui-pnotify-fade-fast"),n._animateIn||(n._animateIn=n.animateIn),n._animateOut||(n._animateOut=n.animateOut),n.animateIn=this.animateIn.bind(this),n.animateOut=this.animateOut.bind(this);var t=400;"slow"===n.options.animate_speed?t=600:"fast"===n.options.animate_speed?t=200:n.options.animate_speed>0&&(t=n.options.animate_speed),t/=1e3,n.elem.addClass("animated").css({"-webkit-animation-duration":t+"s","-moz-animation-duration":t+"s","animation-duration":t+"s"})}else n._animateIn&&n._animateOut&&(n.animateIn=n._animateIn,delete n._animateIn,n.animateOut=n._animateOut,delete n._animateOut,n.elem.addClass("animated"))},animateIn:function(n){this.notice.animating="in";var i=this;n=function(){i.notice.elem.removeClass(i.options.in_class),this&&this.call(),i.notice.animating=!1}.bind(n),this.notice.elem.show().one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",n).removeClass(this.options.out_class).addClass("ui-pnotify-in").addClass(this.options.in_class)},animateOut:function(n){this.notice.animating="out";var i=this;n=function(){i.notice.elem.removeClass("ui-pnotify-in "+i.options.out_class),this&&this.call(),i.notice.animating=!1}.bind(n),this.notice.elem.one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",n).removeClass(this.options.in_class).addClass(this.options.out_class)}},i}); +//# sourceMappingURL=pnotify.animate.js.map +// Buttons +!function(o,s){"function"==typeof define&&define.amd?define("pnotify.buttons",["jquery","pnotify"],s):"object"==typeof exports&&"undefined"!=typeof module?module.exports=s(require("jquery"),require("./pnotify")):s(o.jQuery,o.PNotify)}("undefined"!=typeof window?window:this,function(o,s){return s.prototype.options.buttons={closer:!0,closer_hover:!0,sticker:!0,sticker_hover:!0,show_on_nonblock:!1,labels:{close:"Close",stick:"Stick",unstick:"Unstick"},classes:{closer:null,pin_up:null,pin_down:null}},s.prototype.modules.buttons={init:function(s,i){var n=this;s.elem.on({mouseenter:function(o){!n.options.sticker||s.options.nonblock&&s.options.nonblock.nonblock&&!n.options.show_on_nonblock||n.sticker.trigger("pnotify:buttons:toggleStick").css("visibility","visible"),!n.options.closer||s.options.nonblock&&s.options.nonblock.nonblock&&!n.options.show_on_nonblock||n.closer.css("visibility","visible")},mouseleave:function(o){n.options.sticker_hover&&n.sticker.css("visibility","hidden"),n.options.closer_hover&&n.closer.css("visibility","hidden")}}),this.sticker=o("
    ",{class:"ui-pnotify-sticker","aria-role":"button","aria-pressed":s.options.hide?"false":"true",tabindex:"0",title:s.options.hide?i.labels.stick:i.labels.unstick,css:{cursor:"pointer",visibility:i.sticker_hover?"hidden":"visible"},click:function(){s.options.hide=!s.options.hide,s.options.hide?s.queueRemove():s.cancelRemove(),o(this).trigger("pnotify:buttons:toggleStick")}}).bind("pnotify:buttons:toggleStick",function(){var i=null===n.options.classes.pin_up?s.styles.pin_up:n.options.classes.pin_up,e=null===n.options.classes.pin_down?s.styles.pin_down:n.options.classes.pin_down;o(this).attr("title",s.options.hide?n.options.labels.stick:n.options.labels.unstick).children().attr("class","").addClass(s.options.hide?i:e).attr("aria-pressed",s.options.hide?"false":"true")}).append("").trigger("pnotify:buttons:toggleStick").prependTo(s.container),(!i.sticker||s.options.nonblock&&s.options.nonblock.nonblock&&!i.show_on_nonblock)&&this.sticker.css("display","none"),this.closer=o("
    ",{class:"ui-pnotify-closer","aria-role":"button",tabindex:"0",title:i.labels.close,css:{cursor:"pointer",visibility:i.closer_hover?"hidden":"visible"},click:function(){s.remove(!1),n.sticker.css("visibility","hidden"),n.closer.css("visibility","hidden")}}).append(o("",{class:null===i.classes.closer?s.styles.closer:i.classes.closer})).prependTo(s.container),(!i.closer||s.options.nonblock&&s.options.nonblock.nonblock&&!i.show_on_nonblock)&&this.closer.css("display","none")},update:function(o,s){!s.closer||o.options.nonblock&&o.options.nonblock.nonblock&&!s.show_on_nonblock?this.closer.css("display","none"):s.closer&&this.closer.css("display","block"),!s.sticker||o.options.nonblock&&o.options.nonblock.nonblock&&!s.show_on_nonblock?this.sticker.css("display","none"):s.sticker&&this.sticker.css("display","block"),this.sticker.trigger("pnotify:buttons:toggleStick"),this.closer.find("span").attr("class","").addClass(null===s.classes.closer?o.styles.closer:s.classes.closer),s.sticker_hover?this.sticker.css("visibility","hidden"):o.options.nonblock&&o.options.nonblock.nonblock&&!s.show_on_nonblock||this.sticker.css("visibility","visible"),s.closer_hover?this.closer.css("visibility","hidden"):o.options.nonblock&&o.options.nonblock.nonblock&&!s.show_on_nonblock||this.closer.css("visibility","visible")}},o.extend(s.styling.brighttheme,{closer:"brighttheme-icon-closer",pin_up:"brighttheme-icon-sticker",pin_down:"brighttheme-icon-sticker brighttheme-icon-stuck"}),o.extend(s.styling.bootstrap3,{closer:"glyphicon glyphicon-remove",pin_up:"glyphicon glyphicon-pause",pin_down:"glyphicon glyphicon-play"}),o.extend(s.styling.fontawesome,{closer:"fa fa-times",pin_up:"fa fa-pause",pin_down:"fa fa-play"}),s}); +//# sourceMappingURL=pnotify.buttons.js.map +// Callbacks +!function(o,t){"function"==typeof define&&define.amd?define("pnotify.callbacks",["jquery","pnotify"],t):"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("jquery"),require("./pnotify")):t(o.jQuery,o.PNotify)}("undefined"!=typeof window?window:this,function(o,t){var i=t.prototype.init,e=t.prototype.open,n=t.prototype.remove;return t.prototype.init=function(){this.options.before_init&&this.options.before_init(this.options),i.apply(this,arguments),this.options.after_init&&this.options.after_init(this)},t.prototype.open=function(){var o;this.options.before_open&&(o=this.options.before_open(this)),!1!==o&&(e.apply(this,arguments),this.options.after_open&&this.options.after_open(this))},t.prototype.remove=function(o){var t;this.options.before_close&&(t=this.options.before_close(this,o)),!1!==t&&(n.apply(this,arguments),this.options.after_close&&this.options.after_close(this,o))},t}); +//# sourceMappingURL=pnotify.callbacks.js.map +// Confirm +!function(t,n){"function"==typeof define&&define.amd?define("pnotify.confirm",["jquery","pnotify"],n):"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("jquery"),require("./pnotify")):n(t.jQuery,t.PNotify)}("undefined"!=typeof window?window:this,function(t,n){return n.prototype.options.confirm={confirm:!1,prompt:!1,prompt_class:"",prompt_default:"",prompt_multi_line:!1,align:"right",buttons:[{text:"Ok",addClass:"",promptTrigger:!0,click:function(t,n){t.remove(),t.get().trigger("pnotify.confirm",[t,n])}},{text:"Cancel",addClass:"",click:function(t){t.remove(),t.get().trigger("pnotify.cancel",t)}}]},n.prototype.modules.confirm={init:function(n,o){this.container=t('
    ').css("text-align",o.align).appendTo(n.container),o.confirm||o.prompt?this.makeDialog(n,o):this.container.hide()},update:function(t,n){n.confirm?(this.makeDialog(t,n),this.container.show()):this.container.hide().empty()},afterOpen:function(t,n){n.prompt&&this.prompt.focus()},makeDialog:function(o,e){var i,s,r=!1,p=this;this.container.empty(),e.prompt&&(this.prompt=t("<"+(e.prompt_multi_line?'textarea rows="5"':'input type="text"')+' style="margin-bottom:5px;clear:both;" />').addClass((void 0===o.styles.input?"":o.styles.input)+" "+(void 0===e.prompt_class?"":e.prompt_class)).val(e.prompt_default).appendTo(this.container));for(var u=e.buttons[0]&&e.buttons[0]!==n.prototype.options.confirm.buttons[0],c=0;c').addClass((void 0===o.styles.btn?"":o.styles.btn)+" "+(void 0===i.addClass?"":i.addClass)).text(i.text).appendTo(this.container).on("click",function(t){return function(){"function"==typeof t.click&&t.click(o,e.prompt?p.prompt.val():null)}}(i)),e.prompt&&!e.prompt_multi_line&&i.promptTrigger&&this.prompt.keypress(function(t){return function(n){13==n.keyCode&&t.click()}}(s)),o.styles.text&&s.wrapInner(''),o.styles.btnhover&&s.hover(function(t){return function(){t.addClass(o.styles.btnhover)}}(s),function(t){return function(){t.removeClass(o.styles.btnhover)}}(s)),o.styles.btnactive&&s.on("mousedown",function(t){return function(){t.addClass(o.styles.btnactive)}}(s)).on("mouseup",function(t){return function(){t.removeClass(o.styles.btnactive)}}(s)),o.styles.btnfocus&&s.on("focus",function(t){return function(){t.addClass(o.styles.btnfocus)}}(s)).on("blur",function(t){return function(){t.removeClass(o.styles.btnfocus)}}(s)))}},t.extend(n.styling.bootstrap3,{btn:"btn btn-default",input:"form-control"}),t.extend(n.styling.fontawesome,{btn:"btn btn-default",input:"form-control"}),n}); +//# sourceMappingURL=pnotify.confirm.js.map +// Desktop +!function(i,t){"function"==typeof define&&define.amd?define("pnotify.desktop",["jquery","pnotify"],t):"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("jquery"),require("./pnotify")):t(i.jQuery,i.PNotify)}("undefined"!=typeof window?window:this,function(i,t){var o,n=function(i,t){return(n="Notification"in window?function(i,t){return new Notification(i,t)}:"mozNotification"in navigator?function(i,t){return navigator.mozNotification.createNotification(i,t.body,t.icon).show()}:"webkitNotifications"in window?function(i,t){return window.webkitNotifications.createNotification(t.icon,i,t.body)}:function(i,t){return null})(i,t)};return t.prototype.options.desktop={desktop:!1,fallback:!0,icon:null,tag:null,title:null,text:null},t.prototype.modules.desktop={genNotice:function(i,t){null===t.icon?this.icon="http://sciactive.com/pnotify/includes/desktop/"+i.options.type+".png":!1===t.icon?this.icon=null:this.icon=t.icon,null!==this.tag&&null===t.tag||(this.tag=null===t.tag?"PNotify-"+Math.round(1e6*Math.random()):t.tag),i.desktop=n(t.title||i.options.title,{icon:this.icon,body:t.text||i.options.text,tag:this.tag}),!("close"in i.desktop)&&"cancel"in i.desktop&&(i.desktop.close=function(){i.desktop.cancel()}),i.desktop.onclick=function(){i.elem.trigger("click")},i.desktop.onclose=function(){"closing"!==i.state&&"closed"!==i.state&&i.remove()}},init:function(i,n){if(n.desktop){if(0!==(o=t.desktop.checkPermission()))return void(n.fallback||(i.options.auto_display=!1));this.genNotice(i,n)}},update:function(i,t,n){0!==o&&t.fallback||!t.desktop||this.genNotice(i,t)},beforeOpen:function(i,t){0!==o&&t.fallback||!t.desktop||i.elem.css({left:"-10000px"}).removeClass("ui-pnotify-in")},afterOpen:function(i,t){0!==o&&t.fallback||!t.desktop||(i.elem.css({left:"-10000px"}).removeClass("ui-pnotify-in"),"show"in i.desktop&&i.desktop.show())},beforeClose:function(i,t){0!==o&&t.fallback||!t.desktop||i.elem.css({left:"-10000px"}).removeClass("ui-pnotify-in")},afterClose:function(i,t){0!==o&&t.fallback||!t.desktop||(i.elem.css({left:"-10000px"}).removeClass("ui-pnotify-in"),"close"in i.desktop&&i.desktop.close())}},t.desktop={permission:function(){"undefined"!=typeof Notification&&"requestPermission"in Notification?Notification.requestPermission():"webkitNotifications"in window&&window.webkitNotifications.requestPermission()},checkPermission:function(){return"undefined"!=typeof Notification&&"permission"in Notification?"granted"===Notification.permission?0:1:"webkitNotifications"in window&&0==window.webkitNotifications.checkPermission()?0:1}},o=t.desktop.checkPermission(),t}); +//# sourceMappingURL=pnotify.desktop.js.map +// History +!function(t,i){"function"==typeof define&&define.amd?define("pnotify.history",["jquery","pnotify"],i):"object"==typeof exports&&"undefined"!=typeof module?module.exports=i(require("jquery"),require("./pnotify")):i(t.jQuery,t.PNotify)}("undefined"!=typeof window?window:this,function(t,i){var e,o;return t(function(){t("body").on("pnotify.history-all",function(){t.each(i.notices,function(){this.modules.history.inHistory&&(this.elem.is(":visible")?this.options.hide&&this.queueRemove():this.open&&this.open())})}).on("pnotify.history-last",function(){var t,e="top"===i.prototype.options.stack.push,o=e?0:-1;do{if(t=-1===o?i.notices.slice(o):i.notices.slice(o,o+1),!t[0])return!1;o=e?o+1:o-1}while(!t[0].modules.history.inHistory||t[0].elem.is(":visible"));t[0].open&&t[0].open()})}),i.prototype.options.history={history:!0,menu:!1,fixed:!0,maxonscreen:1/0,labels:{redisplay:"Redisplay",all:"All",last:"Last"}},i.prototype.modules.history={init:function(i,n){if(i.options.destroy=!1,this.inHistory=n.history,n.menu&&void 0===e){e=t("
    ",{class:"ui-pnotify-history-container "+i.styles.hi_menu,mouseleave:function(){e.css("top","-"+o+"px")}}).append(t("
    ",{class:"ui-pnotify-history-header",text:n.labels.redisplay})).append(t(" - -
    - -
    -