diff --git a/Installation.md b/Installation.md old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/Unixconfig/autodeploy b/Unixconfig/autodeploy old mode 100644 new mode 100755 diff --git a/YAML.md b/YAML.md old mode 100644 new mode 100755 diff --git a/autodeploy-jira/__init__.py b/autodeploy-jira/__init__.py old mode 100644 new mode 100755 diff --git a/autodeploy-jira/jira-client.py b/autodeploy-jira/jira-client.py old mode 100644 new mode 100755 index f37a000..acfab49 --- a/autodeploy-jira/jira-client.py +++ b/autodeploy-jira/jira-client.py @@ -26,4 +26,4 @@ def getProjectKeys(self): if __name__=="__main__": c=jiraClient("http://shgp.kfshrc.edu.sa/jira",'mkalioby','wanted85') - print c.getProjectKeys() \ No newline at end of file + print(c.getProjectKeys()) \ No newline at end of file diff --git a/client/__init__.py b/client/__init__.py old mode 100644 new mode 100755 diff --git a/client/autodeploy_client/.svn/all-wcprops b/client/autodeploy_client/.svn/all-wcprops old mode 100644 new mode 100755 diff --git a/client/autodeploy_client/.svn/entries b/client/autodeploy_client/.svn/entries old mode 100644 new mode 100755 diff --git a/client/autodeploy_client/.svn/text-base/Client.py.svn-base b/client/autodeploy_client/.svn/text-base/Client.py.svn-base old mode 100644 new mode 100755 diff --git a/client/autodeploy_client/.svn/text-base/ClientJob.py.svn-base b/client/autodeploy_client/.svn/text-base/ClientJob.py.svn-base old mode 100644 new mode 100755 diff --git a/client/autodeploy_client/.svn/text-base/Common.py.svn-base b/client/autodeploy_client/.svn/text-base/Common.py.svn-base old mode 100644 new mode 100755 diff --git a/client/autodeploy_client/.svn/text-base/Config.py.svn-base b/client/autodeploy_client/.svn/text-base/Config.py.svn-base old mode 100644 new mode 100755 diff --git a/client/autodeploy_client/.svn/text-base/Connect.py.svn-base b/client/autodeploy_client/.svn/text-base/Connect.py.svn-base old mode 100644 new mode 100755 diff --git a/client/autodeploy_client/.svn/text-base/README.svn-base b/client/autodeploy_client/.svn/text-base/README.svn-base old mode 100644 new mode 100755 diff --git a/client/autodeploy_client/.svn/text-base/__init__.py.svn-base b/client/autodeploy_client/.svn/text-base/__init__.py.svn-base old mode 100644 new mode 100755 diff --git a/client/autodeploy_client/.svn/text-base/config.cfg.svn-base b/client/autodeploy_client/.svn/text-base/config.cfg.svn-base old mode 100644 new mode 100755 diff --git a/client/autodeploy_client/Client.py b/client/autodeploy_client/Client.py old mode 100644 new mode 100755 index 3bed9a1..7e43530 --- a/client/autodeploy_client/Client.py +++ b/client/autodeploy_client/Client.py @@ -1,6 +1,6 @@ -import Config -import ClientJob as Job -import Connect +from . import Config +from . import ClientJob as Job +from . import Connect import simplejson import xml.dom.minidom from operator import itemgetter @@ -82,6 +82,14 @@ def Deploy(self, workdir, configFile, owner=''): result = self._send(msg) return result + def Integrate(self, workdir, configFile, owner=''): + global msg + if owner == '': + owner = Config.Owner + msg = Job.createIntegrateMessage(workdir=workdir, configFile=configFile, scm=self.scm, owner=owner) + result = self._send(msg) + return result + def CheckUp(self): return Connect.connect(self.server, self.port, 5) @@ -95,18 +103,11 @@ def ListCommits(self, workdir, page=0, rpp=10, owner='',options=None): for line in res.split("\n"): if line=="": continue info = line.split(",,") - # print line - # if HEAD: - # info[0] = "HEAD" - # HEAD = False try: - d = {"Hash": info[0], "Short": info[1], "Author": info[2], "Committed": info[3], "Message": info[4]} result.append(d) - except: - print "Error while parsing line (%s)"%line - #print result + print("Error while parsing line (%s)"%line) return result def SwitchCommit(self, workdir, commit, owner=''): diff --git a/client/autodeploy_client/ClientJob.py b/client/autodeploy_client/ClientJob.py old mode 100644 new mode 100755 index fa6d7ac..401ad73 --- a/client/autodeploy_client/ClientJob.py +++ b/client/autodeploy_client/ClientJob.py @@ -12,15 +12,20 @@ def importKey(): #print "KEY Opened" , key return key +def sign(owner,scm,msg): + b = (owner + scm + msg).encode('utf-8') + key = (importKey().encrypt(b, "")[0]) + return base64.encodebytes(key).decode("utf8") + def createGetBranchs(workdir, scm, owner,options=None): - sec = base64.encodestring(importKey().encrypt(owner + scm + "LIST-BRNACHS", "")[0]) + sec= sign(owner,scm,"LIST-BRNACHS") f = '\n' % (owner, "LIST-BRNACHS", sec, scm) f += '%s' % workdir if options: f += '' - for option in options.keys(): + for option in list(options.keys()): f += "" % (option, options[option]) f += "" @@ -31,14 +36,14 @@ def createGetBranchs(workdir, scm, owner,options=None): # Provide id, owner and command as string # inputsFiles as List of file path def createCloneMessage(owner, repo, workdir, key, scm, options=None): - sec=base64.encodestring(importKey().encrypt(owner+scm+"CLONE","")[0]) + sec = sign(owner, scm, "CLONE") f = '\n'%( owner,"CLONE",sec,scm) f += '%s'%workdir f += '%s'%repo f += '%s'%key if options: f += '' - for option in options.keys(): + for option in list(options.keys()): f += "" % (option, options[option]) f += "" @@ -49,14 +54,14 @@ def createCloneMessage(owner, repo, workdir, key, scm, options=None): def createPullMessage(owner,workdir,key, scm, options=None): - sec=base64.encodestring(importKey().encrypt(owner+scm+"PULL","")[0]) + sec = sign(owner, scm, "PULL") f = '\n'%( owner,"PULL",sec,scm) f += '%s'%workdir #f += '%s'%repo f += '%s'%key if options: f += '' - for option in options.keys(): + for option in list(options.keys()): f += "" % (option, options[option]) f += "" @@ -64,14 +69,14 @@ def createPullMessage(owner,workdir,key, scm, options=None): return f def createListTagsMessage(owner, workdir,key, scm, options=None): - sec=base64.encodestring(importKey().encrypt(owner+scm+"LIST-TAGS","")[0]) + sec = sign(owner, scm, "LIST-TAGS") f = '\n'%( owner,"LIST-TAGS",sec,scm) f += '%s'%workdir f += '%s'%key if options: f += '' - for option in options.keys(): + for option in list(options.keys()): f += "" % (option, options[option]) f += "" @@ -79,14 +84,14 @@ def createListTagsMessage(owner, workdir,key, scm, options=None): return f def createSwitchTagMessage(owner, workdir, scm, tag, options=None): - sec=base64.encodestring(importKey().encrypt(owner+scm+"SWITCH-TAG","")[0]) + sec = sign(owner, scm, "SWITCH-TAG") f = '\n'%( owner,"SWITCH-TAG",sec,scm) f += '%s'%workdir f += '%s'%tag if options: f += '' - for option in options.keys(): + for option in list(options.keys()): f += "" % (option, options[option]) f += "" @@ -94,17 +99,35 @@ def createSwitchTagMessage(owner, workdir, scm, tag, options=None): return f def createDeployMessage(owner, workdir, scm, configFile, options=None): - sec=base64.encodestring(importKey().encrypt(owner+scm+"DEPLOY","")[0]) + sec = sign(owner, scm, "DEPLOY") f = '\n'%( owner,"DEPLOY",sec,scm) f += '%s'%workdir f += '%s'%configFile - print configFile + print(configFile) + conf=open(str(configFile)).read() + f += '%s'%(base64.encodestring(conf)) + + if options: + f += '' + for option in list(options.keys()): + f += "" % (option, options[option]) + + f += "" + f += '' + return f + +def createIntegrateMessage(owner, workdir, scm, configFile, options=None): + sec = sign(owner, scm, "INTEGRATE") + f = '\n'%(owner,"INTEGRATE",sec,scm) + f += '%s'%workdir + f += '%s'%configFile + print(configFile) conf=open(str(configFile)).read() f += '%s'%(base64.encodestring(conf)) if options: f += '' - for option in options.keys(): + for option in list(options.keys()): f += "" % (option, options[option]) f += "" @@ -112,14 +135,14 @@ def createDeployMessage(owner, workdir, scm, configFile, options=None): return f def createListCommitsMessage(owner, workdir, key, scm, options=None): - sec=base64.encodestring(importKey().encrypt(owner+scm+"LIST-COMMITS","")[0]) + sec = sign(owner, scm, "LIST-COMMITS") f = '\n'%( owner,"LIST-COMMITS",sec,scm) f += '%s'%workdir f += '%s'%key if options: f += '' - for option in options.keys(): + for option in list(options.keys()): f += "" % (option, options[option]) f += "" @@ -128,14 +151,14 @@ def createListCommitsMessage(owner, workdir, key, scm, options=None): def createSwitchCommitMessage(owner, workdir, commit,scm, options=None): - sec=base64.encodestring(importKey().encrypt(owner+scm+"SWITCH-COMMIT","")[0]) + sec = sign(owner, scm, "SWITCH-COMMIT") f = '\n'%( owner,"SWITCH-COMMIT",sec,scm) f += '%s'%workdir f += '%s'%commit if options: f += '' - for option in options.keys(): + for option in list(options.keys()): f += "" % (option, options[option]) f += "" @@ -143,8 +166,8 @@ def createSwitchCommitMessage(owner, workdir, commit,scm, options=None): return f def creategetCommitsDiffMessage(owner, workdir, commit, scm,options=None): - print owner,workdir,commit,scm - sec=base64.encodestring(importKey().encrypt(owner+str(scm)+"DIFF-COMMIT","")[0]) + print(owner,workdir,commit,scm) + sec = sign(owner, scm, "DIFF-COMMIT") #sec=base64.encodestring(importKey().encrypt(owner+scm+"DIFF-COMMIT","")[0]) f = '\n'%( owner,"DIFF-COMMIT",sec,scm) f += '%s'%workdir @@ -152,7 +175,7 @@ def creategetCommitsDiffMessage(owner, workdir, commit, scm,options=None): if options: f += '' - for option in options.keys(): + for option in list(options.keys()): f += "" % (option, options[option]) f += "" @@ -160,12 +183,12 @@ def creategetCommitsDiffMessage(owner, workdir, commit, scm,options=None): return f def createGetChangeLog(owner,workdir,scm,options=None): - sec = base64.encodestring(importKey().encrypt(owner + scm + "LIST-CHANGES", "")[0]) + sec = sign(owner, scm, "LIST-CHANGES") f = '\n' % (owner, "LIST-CHANGES", sec, scm) f += '%s' % workdir if options: f += '' - for option in options.keys(): + for option in list(options.keys()): f += "" % (option, options[option]) f += "" diff --git a/client/autodeploy_client/Common.py b/client/autodeploy_client/Common.py old mode 100644 new mode 100755 index c34c24a..b6e2028 --- a/client/autodeploy_client/Common.py +++ b/client/autodeploy_client/Common.py @@ -1,2 +1 @@ EOM="\n\n###" - diff --git a/client/autodeploy_client/Config.py b/client/autodeploy_client/Config.py old mode 100644 new mode 100755 index cefafea..b0198d9 --- a/client/autodeploy_client/Config.py +++ b/client/autodeploy_client/Config.py @@ -1,4 +1,4 @@ -import ConfigParser +import configparser import os diff --git a/client/autodeploy_client/Connect.py b/client/autodeploy_client/Connect.py old mode 100644 new mode 100755 index 9c564d1..3221750 --- a/client/autodeploy_client/Connect.py +++ b/client/autodeploy_client/Connect.py @@ -1,6 +1,4 @@ -import socket, base64, time, sys, subprocess -import Config - +import socket, time EOM = "\n\n###" @@ -8,12 +6,16 @@ def Send(message,server,port): if waitTillAlive(server, port): client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((server, port)) - client.send(message + EOM) + output = str(message) + str(EOM) + client.sendall(output.encode('utf-8')) chunks = [] while True: - buf = client.recv(10000) + buf = (client.recv(10000)).decode("utf-8") if len(buf) < 5: - chunks[-1] += buf + if len(chunks) == 0: + chunks.append(buf) + else: + chunks[-1] += buf else: chunks.append(str(buf)) if EOM in chunks[-1]: @@ -27,7 +29,8 @@ def connect(domain,port,timeout=10): client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.settimeout(timeout) client.connect((domain, port)) - client.send("TEST: HELLO\n\n###") + output = 'TEST: HELLO\n\n###' + client.sendall(output.encode('utf-8')) client.close() return True except IOError: @@ -38,11 +41,10 @@ def waitTillAlive(domain, port): secondTime = False while (1): if connect(domain,port): - if secondTime: print "Connected To:",domain + if secondTime: print("Connected To:",domain) break else: time.sleep(5) secondTime = True - print "Trying again...." + print("Trying again....") return True - diff --git a/client/autodeploy_client/README b/client/autodeploy_client/README old mode 100644 new mode 100755 diff --git a/client/autodeploy_client/__init__.py b/client/autodeploy_client/__init__.py old mode 100644 new mode 100755 index 3806f70..c1ed68d --- a/client/autodeploy_client/__init__.py +++ b/client/autodeploy_client/__init__.py @@ -1,3 +1,3 @@ -#! /usr/bin/env python +#! /usr/bin/env python3.7 -from Client import * +from .Client import * diff --git a/client/autodeploy_client/my b/client/autodeploy_client/my old mode 100644 new mode 100755 diff --git a/client/config/.svn/all-wcprops b/client/config/.svn/all-wcprops old mode 100644 new mode 100755 diff --git a/client/config/.svn/entries b/client/config/.svn/entries old mode 100644 new mode 100755 diff --git a/client/config/.svn/text-base/config.cfg.svn-base b/client/config/.svn/text-base/config.cfg.svn-base old mode 100644 new mode 100755 diff --git a/client/config/config.cfg b/client/config/config.cfg old mode 100644 new mode 100755 diff --git a/client/setup.py b/client/setup.py old mode 100644 new mode 100755 diff --git a/deploy-scripts/start-server.sh b/deploy-scripts/start-server.sh old mode 100644 new mode 100755 diff --git a/exampleConfig/EventsHandler/delDir.sh b/exampleConfig/EventsHandler/delDir.sh old mode 100644 new mode 100755 diff --git a/exampleConfig/EventsHandler/startApache.sh b/exampleConfig/EventsHandler/startApache.sh old mode 100644 new mode 100755 diff --git a/exampleConfig/EventsHandler/stopApache.sh b/exampleConfig/EventsHandler/stopApache.sh old mode 100644 new mode 100755 diff --git a/exampleConfig/autodeploy.yaml b/exampleConfig/autodeploy.yaml old mode 100644 new mode 100755 diff --git a/exampleConfig/registry.yaml b/exampleConfig/registry.yaml old mode 100644 new mode 100755 diff --git a/exampleConfig/sample.yaml b/exampleConfig/sample.yaml old mode 100644 new mode 100755 diff --git a/requirments.txt b/requirments.txt old mode 100644 new mode 100755 index acaa261..42f4065 --- a/requirments.txt +++ b/requirments.txt @@ -1,8 +1,8 @@ -pycrypto -django==1.8 -jsonfield==2.0.2 -django-tables2==1.0.4 -django-tables2-reports==0.1.3 +pycryptodome +django==2.2 +jsonfield +django-tables2 +django-tables2-reports jira django-mfa2 pyyaml diff --git a/server/Common.py b/server/Common.py index a6a8af7..226b888 100755 --- a/server/Common.py +++ b/server/Common.py @@ -18,7 +18,7 @@ def run(executer, id=None): f.flush() f.close() - if len(stderr) > 0 and "fatal" in stderr: - return "ERR:"+stderr + if len(stderr) > 0 and b"fatal" in stderr: + return b"ERR:"+stderr if stdout=="": return "Done" return stdout diff --git a/server/Config.cfg b/server/Config.cfg index e8e19dc..4b3cd22 100755 --- a/server/Config.cfg +++ b/server/Config.cfg @@ -1,6 +1,6 @@ [Server] port: 4567 -publicKey: /home/shgpuser/dev/AutoDeploy/server/client.pub +publicKey: /home/mahmood/Work/autodeploy/home/AutoDeploy/server/client.pub [MISC] log_limit: 30 \ No newline at end of file diff --git a/server/Request.py b/server/Request.py index a115d9c..eadcef2 100755 --- a/server/Request.py +++ b/server/Request.py @@ -37,7 +37,7 @@ def parseCloneJob(message): name = option.getAttribute("name") optionsDict[name] = option.firstChild.nodeValue """ - print 'Recieved New Job from ' + owner + '.....' + print('Recieved New Job from ' + owner + '.....') params = {"repo":repo, "key": key,"workdir": workdir,"owner": owner, "requestType": requestType, "scm":scm,"options": optionsDict} return params @@ -61,7 +61,7 @@ def parseListTagsJob(message): name = option.getAttribute("name") optionsDict[name] = option.firstChild.nodeValue """ - print 'Recieved New Job from ' + owner + '.....' + print('Recieved New Job from ' + owner + '.....') params = {"workdir": workdir,"owner": owner, "requestType": requestType,"key":key, "scm":scm,"options": optionsDict} return params @@ -82,7 +82,7 @@ def parseListBranchsJob(message): name = option.getAttribute("name") optionsDict[name] = option.firstChild.nodeValue """ - print 'Recieved New Job from ' + owner + '.....' + print('Recieved New Job from ' + owner + '.....') params = {"workdir": workdir,"owner": owner, "requestType": requestType,"scm":scm,"options": optionsDict} return params @@ -102,7 +102,7 @@ def parseSwitchTagJob(message): name = option.getAttribute("name") optionsDict[name] = option.firstChild.nodeValue """ - print 'Recieved New Job from ' + owner + '.....' + print('Recieved New Job from ' + owner + '.....') params = {"workdir": workdir,"owner": owner, "requestType": requestType,"tag":tag, "scm":scm,"options": optionsDict} return params @@ -128,7 +128,26 @@ def parseDeployJob(message): name = option.getAttribute("name") optionsDict[name] = option.firstChild.nodeValue """ - print 'Recieved New Job from ' + owner + '.....' + print('Recieved New Job from ' + owner + '.....') + params = {"workdir": workdir,"owner": owner, "requestType": requestType,"configFile":configFile, + "scm":scm,"options": optionsDict} + return params + +def parseIntegrateJob(message): + params = {} + optionsDict = {} + doc = xml.dom.minidom.parseString(message) + Job = doc.getElementsByTagName('job')[0] + scm=Job.getAttribute("scm") + workdir= getValue(Job, 'workdir') + configFile=getValue(Job,"configFile") + requestType = Job.getAttribute('type') + owner = Job.getAttribute('owner') + fileBase64=getValue(Job,"file") + if not os.path.exists(os.path.dirname(configFile)): + os.makedirs(os.path.dirname(configFile)) + open(configFile,"w").write(base64.decodestring(fileBase64)) + print('Recieved New Job from ' + owner + '.....') params = {"workdir": workdir,"owner": owner, "requestType": requestType,"configFile":configFile, "scm":scm,"options": optionsDict} return params @@ -166,7 +185,7 @@ def parseSwitchCommitJob(message): name = option.getAttribute("name") optionsDict[name] = option.firstChild.nodeValue """ - print 'Recieved New Job from ' + owner + '.....' + print('Recieved New Job from ' + owner + '.....') params = {"workdir": workdir,"owner": owner, "requestType": requestType,"commit":commit, "scm":scm,"options": optionsDict} return params @@ -190,7 +209,7 @@ def parseGetChangeLog(message): name = option.getAttribute("name") optionsDict[name] = option.firstChild.nodeValue - print 'Recieved New Job from ' + owner + '.....' + print('Recieved New Job from ' + owner + '.....') params = {"workdir": workdir, "owner": owner, "requestType": requestType, "scm": scm, "options": optionsDict} return params \ No newline at end of file diff --git a/server/Response.py b/server/Response.py index c52a0d0..aeb77b5 100755 --- a/server/Response.py +++ b/server/Response.py @@ -4,7 +4,9 @@ def sendData(clientsock,message): global EOM # print message+EOM - clientsock.send(message+EOM) + if type(message) == type('a'): + message = message.encode("utf8") + clientsock.send(message+EOM.encode("utf8")) def sendResult(clientsock): folder='result/' @@ -17,7 +19,7 @@ def sendResult(clientsock): base64.encode(open(path),open(path+'64','w')) f=open(path+'64','rb') e = f.read() - print "'" + e + "'" + print("'" + e + "'") # print base64.decodestring(e) clientsock.send(e) f.close() diff --git a/server/__init__.py b/server/__init__.py old mode 100644 new mode 100755 diff --git a/server/autodeploy-server.py b/server/autodeploy-server.py index e2420a3..7032a52 100755 --- a/server/autodeploy-server.py +++ b/server/autodeploy-server.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3.7 from Crypto.PublicKey import RSA import socket import threading @@ -7,9 +7,10 @@ import Response import Request import Common -import scm.Git as git +from scm import Git as git from deployer import autodeployer -import traceback +from integrator import autointegrator +import traceback import yaml JOBS = {} EOM = Common.EOM @@ -21,7 +22,7 @@ def startServer(): s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('', port)) s.listen(5) - print "Server started at " + str(port) + print("Server started at " + str(port)) return s @@ -34,7 +35,9 @@ def importKey(): def validReq(req): key = importKey() - decrypted = key.decrypt(base64.decodestring(req["sec"])) + x=base64.decodebytes(req["sec"].encode('utf-8')) + decrypted = (key.decrypt(x)).decode('utf-8') + print(decrypted) if (req["Owner"]+req["scm"]+req["requestType"] == decrypted): return True else: @@ -44,19 +47,19 @@ def validReq(req): def HandleClient(clientsock): import config name = threading.currentThread().getName() - print name, ' Started.............' + print(name, ' Started.............') global EOM chunks = [] cmd="" while 1: buf = clientsock.recv(2048) if len(buf)<6: - chunks[-1]+=buf + chunks[-1]+=(buf).decode("utf-8") else: - chunks.append(str(buf)) + chunks.append((buf).decode("utf-8")) if (EOM in chunks[-1]): msg = "".join(chunks)[:-5] - if debug: print msg + if debug: print(msg) if (msg == "TEST: HELLO"): Response.sendData(clientsock,"Hello") clientsock.close() @@ -64,7 +67,7 @@ def HandleClient(clientsock): req = Request.parseRequest(msg) if (not validReq(req)): Response.sendData(clientsock, "Invalid Request") - print "invalid request" + print("invalid request") clientsock.close() return if (req["requestType"]=="CLONE"): @@ -113,10 +116,10 @@ def HandleClient(clientsock): cmd = gclient.get_list_branches() result = [] res = Common.run(cmd) - if "ERR:" in res: + if b"ERR:" in res: Response.sendData(clientsock, res) else: - for line in res.split("\n"): + for line in res.split(b"\n"): try: if line!="": result.append(line.replace("*","").strip()) @@ -154,8 +157,8 @@ def HandleClient(clientsock): cmd = gclient.get_changelog(since=job["options"]["since"], to=job["options"]["to"]) result = [] res = Common.run(cmd) - print res - if "ERR:" in res: + print(res) + if b"ERR:" in res: Response.sendData(clientsock, res) else: for line in res.split("\n"): @@ -164,10 +167,10 @@ def HandleClient(clientsock): result.append(line.replace("*", "").strip()) except: pass - print result + print(result) Response.sendData(clientsock, "\n".join(result)) elif req["requestType"]=="DEPLOY": - print msg + print(msg) job = Request.parseDeployJob(msg) try: config=yaml.safe_load(open(job["configFile"])) @@ -175,21 +178,30 @@ def HandleClient(clientsock): res="Done" except Exception as e: res="ERR:"+traceback.format_exc() + elif req["requestType"]=="INTEGRATE": + print(msg) + job = Request.parseIntegrateJob(msg) + try: + config=yaml.safe_load(open(job["configFile"])) + autointegrator.runTest(config,job["workdir"]) + res="Done" + except Exception as e: + res="ERR:"+traceback.format_exc() if cmd!="": - print cmd + print(cmd) res=Common.run(cmd) Response.sendData(clientsock,res) if debug: - print "Ended,",res + print("Ended,",res) else: - print "Ended" + print("Ended") clientsock.close() break import os if not os.geteuid()==0: - print "The user should be a root." + print("The user should be a root.") exit(-6) f=open('/var/run/autodeploy-server', "w") f.write(str(os.getpid())) @@ -201,7 +213,7 @@ def HandleClient(clientsock): while 1: clientsock, clientaddr = s.accept() i += 1 - print 'Got connection from ', clientsock.getpeername() + print('Got connection from ', clientsock.getpeername()) t = threading.Thread(target=HandleClient, args=[clientsock], name="Thread #" + str(i)) t.start() diff --git a/server/config.py b/server/config.py index 88c78ac..93e1d4f 100755 --- a/server/config.py +++ b/server/config.py @@ -1,12 +1,12 @@ -#! /usr/bin/env python +#! /usr/bin/env python3.7 -import ConfigParser +import configparser import os mainPath=os.path.dirname(os.path.abspath( __file__ )) -config = ConfigParser.RawConfigParser() +config = configparser.RawConfigParser() config.read(os.path.join(mainPath , 'Config.cfg')) publicKey=config.get('Server', 'publicKey') diff --git a/server/deployer/Common.py b/server/deployer/Common.py index 986cda3..4908dd1 100755 --- a/server/deployer/Common.py +++ b/server/deployer/Common.py @@ -21,7 +21,7 @@ def run(executer,raiseError=True,id=None,wait=True): if len(stderr) > 0: if raiseError: - raise StandardError(stderr[5:]) + raise Exception(stderr[5:]) return "ERR:"+stderr return stdout else: diff --git a/server/deployer/__init__.py b/server/deployer/__init__.py old mode 100644 new mode 100755 diff --git a/server/deployer/autodeployer.py b/server/deployer/autodeployer.py old mode 100644 new mode 100755 index a665c59..5da3b8a --- a/server/deployer/autodeployer.py +++ b/server/deployer/autodeployer.py @@ -4,7 +4,7 @@ import os import yaml -import Common +from . import Common debug=False @@ -12,27 +12,27 @@ def printNotication(message): if slient: return - print message - print "="*len(message) + print(message) + print("="*len(message)) def runEvents(config,workdir,event,raiseErrorOnStdErr=True): - if event in config["events"].keys(): + if event in list(config["events"].keys()): for script in config["events"][event]: wait=True if not script["location"].startswith("/"): cmd=workdir+script["location"] else: cmd=script["location"] - if "interpreter" in script.keys(): + if "interpreter" in list(script.keys()): cmd="%s %s"%(script["interpreter"],cmd) - if "run-as" in script.keys(): + if "run-as" in list(script.keys()): if not script["run-as"]=="root": cmd="su %s -c %s"%(script["run-as"],cmd) - if not slient: print "Running:", cmd - if "wait" in script.keys(): + if not slient: print("Running:", cmd) + if "wait" in list(script.keys()): wait=script["wait"] - if "ignore-stderr" in script.keys(): + if "ignore-stderr" in list(script.keys()): if script["ignore-stderr"] in ("yes","True","true","y","True",True): raiseErrorOnStdErr=False Common.run(cmd,raiseErrorOnStdErr,wait=wait) @@ -44,23 +44,23 @@ def handleFiles(files,workdir): os.makedirs(file["destination"]) #if file["source"].endswith("/"): rsyn_cmd="sudo rsync -rz --delete --exclude='.git' %s %s"%(workdir+file["source"],file["destination"]) - print " %s"%rsyn_cmd + print(" %s"%rsyn_cmd) Common.run(rsyn_cmd) def handlePermissions(permissions,raiseErrorOnStdErr): for permission in permissions: - if "owner" in permission.keys(): + if "owner" in list(permission.keys()): cmd="sudo chown %s:%s %s"%(permission["owner"],permission["group"],permission["object"]) if "dir" in permission["type"].lower(): cmd += " -R" if debug: - print " ", cmd + print(" ", cmd) Common.run(cmd,raiseErrorOnStdErr) - if "mode" in permission.keys(): + if "mode" in list(permission.keys()): cmd="sudo chmod %s %s"%(permission["mode"],permission["object"]) if "dir" in permission["type"].lower(): cmd += " -R" - if debug: print " ",cmd + if debug: print(" ",cmd) Common.run(cmd,raiseErrorOnStdErr) def deploy(config,workdir=".",raiseErrorOnStdErr=True): @@ -70,18 +70,18 @@ def deploy(config,workdir=".",raiseErrorOnStdErr=True): printNotication("Starting Deployment") - if not "files" in config.keys(): - if not slient: print " No files to copy...skipping" + if not "files" in list(config.keys()): + if not slient: print(" No files to copy...skipping") else: - if not slient: print " Copying Files" + if not slient: print(" Copying Files") handleFiles(config["files"],workdir) - if not slient: print " Copying done" - if not "permissions" in config.keys(): - if not slient: print " No permission to set...skipping" + if not slient: print(" Copying done") + if not "permissions" in list(config.keys()): + if not slient: print(" No permission to set...skipping") else: - if not slient: print " Setting Permissions" + if not slient: print(" Setting Permissions") handlePermissions(config["permissions"],raiseErrorOnStdErr) - if not slient: print " Permissions Done" + if not slient: print(" Permissions Done") printNotication("Deployment Done.......") @@ -96,7 +96,7 @@ def deploy(config,workdir=".",raiseErrorOnStdErr=True): if "--config" in arg: yamlFile=arg.split("=")[1] config=yaml.safe_load(open(yamlFile)) - print config + print(config) elif "--workdir" in arg: workdir=arg.split("=")[1] elif "--no-stderr" in arg: @@ -106,7 +106,7 @@ def deploy(config,workdir=".",raiseErrorOnStdErr=True): elif "--debug" in arg: debug=True if not config or not workdir: - print "--config and --workdir should be set" + print("--config and --workdir should be set") exit() deploy(config,workdir,stdErr) diff --git a/server/integrator/autointegrator.py b/server/integrator/autointegrator.py new file mode 100644 index 0000000..0836c2f --- /dev/null +++ b/server/integrator/autointegrator.py @@ -0,0 +1,115 @@ +__author__ = 'mohamed' + +import sys +import os +import yaml +import subprocess + + +EOM = "\n\n###" +debug = False +slient = False + + +def run(executer, raiseError=True,exitcode=False, id=None, wait=True): + PIPE = subprocess.PIPE + p = subprocess.Popen(executer, stdout=PIPE, stderr=PIPE, shell=True) + (stdout, stderr) = p.communicate() + st = stderr + if id: + f = open("/tmp/" + id + ".err", 'w') + f.write(st) + f.flush() + f.close() + f = open("/tmp/" + id + ".out", 'w') + f.write(stdout) + f.flush() + f.close() + + if len(stderr) > 0 and "fatal" in str(stderr): + return "ERR:" + str(stderr) + if stdout == "": return "Done" + if exitcode: + return p.returncode + return stdout + + +def printNotication(message): + if slient: return + print(message) + print("=" * len(message)) + + +def runEvents(config, workdir, event, raiseErrorOnStdErr=True): + if event in config["events"].keys(): + for script in config["events"][event]: + wait = True + if not script["location"].startswith("/"): + cmd = workdir + script["location"] + else: + cmd = script["location"] + if "interpreter" in script.keys(): + cmd = "%s %s" % (script["interpreter"], cmd) + if "run-as" in script.keys(): + if not script["run-as"] == "root": + cmd = "su %s -c %s" % (script["run-as"], cmd) + if not slient: print("Running:", cmd) + if "wait" in script.keys(): + wait = script["wait"] + if "ignore-stderr" in script.keys(): + if script["ignore-stderr"] in ("yes", "True", "true", "y", "True", True): + raiseErrorOnStdErr = False + run(cmd, raiseErrorOnStdErr, wait=wait) + + +def handleRuns(tasks, workdir): + for task in tasks: + cmd = "%s %s" % (task['interpreter'], task["location"]) + task_reult = run(cmd,exitcode=True) + if task_reult not in [0,'0']: + print("Task Failed") + break + else: + print("Task Success") + + +def runTest(config, workdir=".", raiseErrorOnStdErr=True): + printNotication("Running Before Run scripts:") + runEvents(config, workdir, "beforeRun", raiseErrorOnStdErr) + + printNotication("Starting Test Scripts") + + if not "tasks" in config.keys(): + if not slient: print(" No tasks to run ... skipping") + else: + if not slient: print(" Running tasks") + handleRuns(config['tasks'], workdir) + if not slient: print(" Tasks done") + printNotication("Test Scripts Done.......") + + printNotication("Starting After Install Scripts") + runEvents(config, workdir, "afterRun", raiseErrorOnStdErr) + return "Done" + + +if __name__ == "__main__": + config = None + workdir = None + stdErr = True + for arg in sys.argv[1:]: + if "--config" in arg: + yamlFile = arg.split("=")[1] + config = yaml.safe_load(open(yamlFile)) + print(config) + elif "--workdir" in arg: + workdir = arg.split("=")[1] + elif "--no-stderr" in arg: + stdErr = False + elif "--slient" in arg: + slient = True + elif "--debug" in arg: + debug = True + if not config: + print("--config should be set") + exit() + runTest(config, workdir, stdErr) \ No newline at end of file diff --git a/server/scm/BaseSCM.py b/server/scm/BaseSCM.py old mode 100644 new mode 100755 diff --git a/server/scm/Git.py b/server/scm/Git.py old mode 100644 new mode 100755 index b31028f..fa1503e --- a/server/scm/Git.py +++ b/server/scm/Git.py @@ -1,5 +1,5 @@ __author__ = 'mohamed' -from BaseSCM import BaseSCM +from .BaseSCM import BaseSCM import Common class GIT(BaseSCM): diff --git a/server/scm/__init__.py b/server/scm/__init__.py old mode 100644 new mode 100755 diff --git a/webapp/__init__.py b/webapp/__init__.py deleted file mode 100644 index 91ba68b..0000000 --- a/webapp/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'mohamed' diff --git a/webapp/autoDeploy/__init__.py b/webapp/autoDeploy/__init__.py deleted file mode 100644 index 91ba68b..0000000 --- a/webapp/autoDeploy/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'mohamed' diff --git a/webapp/autoDeploy/accounts/__init__.py b/webapp/autoDeploy/accounts/__init__.py old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/accounts/admin.py b/webapp/autoDeploy/accounts/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/webapp/autoDeploy/accounts/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/webapp/autoDeploy/accounts/apps.py b/webapp/autoDeploy/accounts/apps.py new file mode 100644 index 0000000..9b3fc5a --- /dev/null +++ b/webapp/autoDeploy/accounts/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AccountsConfig(AppConfig): + name = 'accounts' diff --git a/webapp/autoDeploy/accounts/migrations/__init__.py b/webapp/autoDeploy/accounts/migrations/__init__.py old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/accounts/models.py b/webapp/autoDeploy/accounts/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/webapp/autoDeploy/accounts/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/webapp/autoDeploy/accounts/templates/login.html b/webapp/autoDeploy/accounts/templates/login.html old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/accounts/templates/logout.html b/webapp/autoDeploy/accounts/templates/logout.html old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/accounts/templates/mfa_auth_base.html b/webapp/autoDeploy/accounts/templates/mfa_auth_base.html old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/autodeploy/tests.py b/webapp/autoDeploy/accounts/tests.py similarity index 100% rename from webapp/autoDeploy/autodeploy/tests.py rename to webapp/autoDeploy/accounts/tests.py diff --git a/webapp/autoDeploy/accounts/urls.py b/webapp/autoDeploy/accounts/urls.py old mode 100644 new mode 100755 index beef5b0..73e8e98 --- a/webapp/autoDeploy/accounts/urls.py +++ b/webapp/autoDeploy/accounts/urls.py @@ -1,27 +1,11 @@ __author__ = 'mohamed' - -"""autoDeploy URL Configuration - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/1.8/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') -Including another URLconf - 1. Add an import: from blog import urls as blog_urls - 2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) -""" -from django.conf.urls import include, url -from django.contrib import admin +from django.conf.urls import url +from . import views urlpatterns = [ - url(r'login','accounts.views.check'), - url(r'logout','accounts.views.signOut'), + url(r'login',views.check,name='login'), + url(r'logout',views.signOut,name='logout'), ] diff --git a/webapp/autoDeploy/accounts/views.py b/webapp/autoDeploy/accounts/views.py old mode 100644 new mode 100755 index f79068e..817a142 --- a/webapp/autoDeploy/accounts/views.py +++ b/webapp/autoDeploy/accounts/views.py @@ -1,9 +1,5 @@ -from django.shortcuts import render - -# Create your views here. -from django.shortcuts import render, render_to_response,redirect +from django.shortcuts import render,redirect from django.contrib.auth import authenticate, login,logout -from django.template import RequestContext from django.conf import settings def log_user_in(request,username): @@ -19,7 +15,7 @@ def log_user_in(request,username): def check(request): if request.method=="POST": - print "In Check" + print("In Check") username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) @@ -35,11 +31,11 @@ def check(request): err="This user is NOT activated yet." else: err="The username or the password is wrong." - print "Error:", err - return render_to_response("login.html",{"err":err},context_instance=RequestContext(request)) + print("Error:", err) + return render(request,"login.html",{"err":err}) else: - return render_to_response("login.html",context_instance=RequestContext(request)) + return render(request,"login.html") def signOut(request): logout(request) - return render_to_response("logout.html",context_instance=RequestContext(request)) \ No newline at end of file + return render(request,"logout.html") \ No newline at end of file diff --git a/webapp/autoDeploy/autodeploy/Common.py b/webapp/autoDeploy/autoDeploy/Common.py similarity index 94% rename from webapp/autoDeploy/autodeploy/Common.py rename to webapp/autoDeploy/autoDeploy/Common.py index 2cdb82b..0b552c3 100644 --- a/webapp/autoDeploy/autodeploy/Common.py +++ b/webapp/autoDeploy/autoDeploy/Common.py @@ -14,4 +14,4 @@ def send(to,subject,body,fromUser=None,cc="",bcc="",): From, to, cc=cc, bcc=bcc) email.content_subtype = "html" - return email.send(True) + return email.send(True) \ No newline at end of file diff --git a/webapp/autoDeploy/autoDeploy/__init__.py b/webapp/autoDeploy/autoDeploy/__init__.py old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/autoDeploy/api.py b/webapp/autoDeploy/autoDeploy/api.py new file mode 100644 index 0000000..9829ad5 --- /dev/null +++ b/webapp/autoDeploy/autoDeploy/api.py @@ -0,0 +1,205 @@ +__author__ = 'mohamed' + +import deployment.models as CDModels +import integration.models as CIModels +import simplejson +import sys +sys.path.append("../../../client") +from autodeploy_client.Client import Client +from django.http import HttpResponse +from django.views.decorators.csrf import csrf_protect +from django.utils import timezone + + +def checkServers(request): + res = {} + for server in CDModels.Server.objects.all(): + c = Client("git", server.ip, server.port) + state = c.CheckUp() + if state: + res[server.name] = "UP" + else: + res[server.name] = "DOWN" + return HttpResponse(simplejson.dumps(res)) + + +@csrf_protect +def cloneCD(request): + scm = str(request.GET["scm"]) + ip = str(request.GET["ip"]) + port = int(request.GET["port"]) + project = CDModels.Project.objects.get(name=request.GET["project_name"]) + c = Client(scm, ip, port, project.sshKey.key) + res = c.Clone(project.repo, project.working_dir) + return HttpResponse(res) + +@csrf_protect +def cloneCI(request): + scm = str(request.GET["scm"]) + ip = str(request.GET["ip"]) + port = int(request.GET["port"]) + project = CIModels.CIProject.objects.get(name=request.GET["project_name"]) + c = Client(scm, ip, port, project.sshKey.key) + res = c.Clone(project.repo, project.working_dir) + return HttpResponse(res) + + +@csrf_protect +def deploy(request): + from webapp.autoDeploy.autoDeploy import Common + server = CDModels.Server.objects.get(name=request.session["deploy_server"]) + project = CDModels.Project.objects.get(name=request.session["deploy_project"]) + last_Deployment = None + try: + last_Deployment = CDModels.Deployment_Server.objects.filter(server=server, project=project).latest() + except: + pass + D = CDModels.Deployment_Server() + c = Client(str(project.repo_type), server.ip, server.port) + D.project = project + D.server = server + if "tag" in request.GET: + res = c.SwitchTag(project.working_dir, request.GET["tag"]) + D.update_type = "tag" + D.update_version = request.GET["tag"] + project.lastTag = request.GET["tag"] + elif "commit" in request.GET: + if request.GET["commit"] != "HEAD": + res = c.SwitchCommit(project.working_dir, request.GET["commit"]) + D.update_type = "commit" + D.update_version = request.GET["commit"] + project.lastCommit = request.GET["commit"] + res = c.Deploy(project.working_dir, project.configFile) + if not "ERR:" in res: + D.datetime = timezone.now() + D.has_new_version = False + D.save() + project.lastUpdate = timezone.now() + project.newVersion = False + project.save() + print(project.deployment_link) + if not "http://" in project.deployment_link: + print("in if") + link = "http://" + server.DNS + project.deployment_link + print(link) + if project.emailUsers != "" or project.emailUsers != " " and last_Deployment != None: + changes = c.getChangeLog(project.working_dir, since=last_Deployment.update_version, + to=request.GET["commit"]) + changes_text = "

Changes

    " + found = False + for change in changes: + if change.endswith(":"): continue + changes_text += "
  • %s
  • " % change + found = True + if found: + changes_text += "
" + else: + changes_text = "" + Common.send(project.emailUsers.replace(",", ";"), "New version of %s deployed" % project.name, + "Dear User,
This is an automated notification that a new version of %s has been deployed at: %s
%s" % ( + project.name, link, changes_text), fromUser=None, cc="", bcc="", ) + + return HttpResponse(res + ",," + link) + else: + print("in else") + link = project.deployment_link + if project.emailUsers != "" or project.emailUsers != " ": + changes = c.getChangeLog(project.working_dir, since=last_Deployment.update_version, + to=request.GET["commit"]) + changes_text = "

Changes

    " + found = False + for change in changes: + if change.endswith(":"): continue + changes_text += "
  • %s
  • " % change + found = True + if found: + changes_text += "
" + else: + changes_text = "" + + Common.send(project.emailUsers.replace(",", ";"), "New version of %s deployed" % project.name, + "Dear User,
This is an automated notification that a new version of %s has been deployed at: %s.
%s" % ( + project.name, link, changes_text), fromUser=None, cc="", bcc="", ) + return HttpResponse(res + ",," + link) + else: + return HttpResponse(res) + +@csrf_protect +def integrate(request): + from webapp.autoDeploy.autoDeploy import Common + server = CDModels.Server.objects.get(name=request.session["integrate_server"]) + project = CIModels.CIProject.objects.get(name=request.session["integrate_project"]) + last_Integration = None + try: + last_Integration = CIModels.Integration_server.objects.filter(server=server, project=project).latest() + except: + pass + D = CIModels.Integration_server() + c = Client(str(project.repo_type), server.ip, server.port) + D.project = project + D.server = server + if "tag" in request.GET: + res = c.SwitchTag(project.working_dir, request.GET["tag"]) + D.update_type = "tag" + D.update_version = request.GET["tag"] + project.lastTag = request.GET["tag"] + elif "commit" in request.GET: + if request.GET["commit"] != "HEAD": + res = c.SwitchCommit(project.working_dir, request.GET["commit"]) + D.update_type = "commit" + D.update_version = request.GET["commit"] + project.lastCommit = request.GET["commit"] + res = c.Integrate(project.working_dir, project.configFile) + if not "ERR:" in res: + D.datetime = timezone.now() + D.has_new_version = False + D.save() + project.lastUpdate = timezone.now() + project.newVersion = False + project.save() + print(project.integration_link) + if not "http://" in project.integration_link: + print("in if") + link = "http://" + server.DNS + project.integration_link + print(link) + if project.emailUsers != "" or project.emailUsers != " " and last_Integration != None: + changes = c.getChangeLog(project.working_dir, since=last_Integration.update_version, + to=request.GET["commit"]) + changes_text = "

Changes

    " + found = False + for change in changes: + if change.endswith(":"): continue + changes_text += "
  • %s
  • " % change + found = True + if found: + changes_text += "
" + else: + changes_text = "" + Common.send(project.emailUsers.replace(",", ";"), "New version of %s integrated" % project.name, + "Dear User,
This is an automated notification that a new version of %s has been integrated at: %s
%s" % ( + project.name, link, changes_text), fromUser=None, cc="", bcc="", ) + + return HttpResponse(res + ",," + link) + else: + print("in else") + link = project.integration_link + if project.emailUsers != "" or project.emailUsers != " ": + changes = c.getChangeLog(project.working_dir, since=last_Integration.update_version, + to=request.GET["commit"]) + changes_text = "

Changes

    " + found = False + for change in changes: + if change.endswith(":"): continue + changes_text += "
  • %s
  • " % change + found = True + if found: + changes_text += "
" + else: + changes_text = "" + + Common.send(project.emailUsers.replace(",", ";"), "New version of %s integrated" % project.name, + "Dear User,
This is an automated notification that a new version of %s has been integrated at: %s.
%s" % ( + project.name, link, changes_text), fromUser=None, cc="", bcc="", ) + return HttpResponse(res + ",," + link) + else: + return HttpResponse(res) \ No newline at end of file diff --git a/webapp/autoDeploy/autoDeploy/processor.py b/webapp/autoDeploy/autoDeploy/processor.py old mode 100644 new mode 100755 index b780ede..351b901 --- a/webapp/autoDeploy/autoDeploy/processor.py +++ b/webapp/autoDeploy/autoDeploy/processor.py @@ -4,8 +4,9 @@ def global_settings(request): # return any necessary values - print settings.BASE_URL + # print settings.BASE_URL return { + 'STATIC_URL': settings.STATIC_URL, 'BASE_URL': settings.BASE_URL, 'TITLE': settings.TITLE } \ No newline at end of file diff --git a/webapp/autoDeploy/autoDeploy/settings.py b/webapp/autoDeploy/autoDeploy/settings.py old mode 100644 new mode 100755 index f81835d..0e85e7f --- a/webapp/autoDeploy/autoDeploy/settings.py +++ b/webapp/autoDeploy/autoDeploy/settings.py @@ -1,73 +1,77 @@ """ Django settings for autoDeploy project. -Generated by 'django-admin startproject' using Django 1.8.1. +Generated by 'django-admin startproject' using Django 2.2. For more information on this file, see -https://docs.djangoproject.com/en/1.8/topics/settings/ +https://docs.djangoproject.com/en/2.2/topics/settings/ For the full list of settings and their values, see -https://docs.djangoproject.com/en/1.8/ref/settings/ +https://docs.djangoproject.com/en/2.2/ref/settings/ """ -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) import os +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - # Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ +# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = '-=l&hq_%0x8hh#y=qxcn@^11)8)bswxf!=o$27ltfyud-7k51&' +SECRET_KEY = 'o+=n$-ko25kx^30b(rm#_xwoz9&#r9_$p8p=qza79ida8etb)#' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] - # Application definition -INSTALLED_APPS = ( +INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'autodeploy', + 'django_tables2', 'django_tables2_reports', + 'accounts', 'mfa', -) + 'deployment', + 'integration', +] -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.middleware.security.SecurityMiddleware', -) +] ROOT_URLCONF = 'autoDeploy.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR, "templates")], + 'DIRS': [ + os.path.join(BASE_DIR, "templates"), + os.path.join(BASE_DIR, "accounts/templates"), + os.path.join(BASE_DIR, "deployment/templates"), + os.path.join(BASE_DIR, "integration/templates"), + ], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', - 'django.core.context_processors.static', 'django.contrib.messages.context_processors.messages', 'autoDeploy.processor.global_settings' ], @@ -75,26 +79,42 @@ }, ] -STATIC_ROOT=BASE_DIR+'/static/' WSGI_APPLICATION = 'autoDeploy.wsgi.application' -STATICFILES_DIRS = ('my_static',) # Database -# https://docs.djangoproject.com/en/1.8/ref/settings/#databases +# https://docs.djangoproject.com/en/2.2/ref/settings/#databases + DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'autodeploy', 'USER': 'root', 'PASSWORD': 'password', - 'HOST':'127.0.0.1', #127.0.0.1 - 'port':'3306', - } - } + 'HOST': '127.0.0.1', # 127.0.0.1 + 'port': '3306', + } +} +# Password validation +# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] # Internationalization -# https://docs.djangoproject.com/en/1.8/topics/i18n/ +# https://docs.djangoproject.com/en/2.2/topics/i18n/ LANGUAGE_CODE = 'en-us' @@ -106,12 +126,19 @@ USE_TZ = True -TITLE="autoDeploy" -BASE_URL="/" +TITLE = "autoDeploy" + +BASE_URL = "/" + # Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/1.8/howto/static-files/ +# https://docs.djangoproject.com/en/2.2/howto/static-files/ STATIC_URL = BASE_URL+ 'static/' +STATICFILES_DIRS = ( + os.path.join(BASE_DIR, "my_static"), +) +STATIC_ROOT=BASE_DIR+'/static/' + PROJECTS_DIR='/opt/autodeploy/projects/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') @@ -140,6 +167,6 @@ TOKEN_ISSUER_NAME="Auto Deploy" #TOTP Issuer name U2F_APPID="https://localhost" #URL For U2F -FIDO_SERVER_ID=u"localhost" # Server rp id for FIDO2 -FIDO_SERVER_NAME=u"Autodeploy" -FIDO_LOGIN_URL=BASE_URL +FIDO_SERVER_ID="localhost" # Server rp id for FIDO2 +FIDO_SERVER_NAME="Autodeploy" +FIDO_LOGIN_URL=BASE_URL \ No newline at end of file diff --git a/webapp/autoDeploy/autoDeploy/urls.py b/webapp/autoDeploy/autoDeploy/urls.py old mode 100644 new mode 100755 index bca8735..cf67942 --- a/webapp/autoDeploy/autoDeploy/urls.py +++ b/webapp/autoDeploy/autoDeploy/urls.py @@ -13,42 +13,35 @@ 1. Add an import: from blog import urls as blog_urls 2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) """ -from django.conf.urls import include, url +from django.urls import path as url,include from django.contrib import admin -import accounts.urls -import mfa +from . import views,api import mfa.TrustedDevice urlpatterns = [ - url(r'^admin/', include(admin.site.urls)), - url(r'^mfa/', include('mfa.urls')), - url(r'devices/add$', mfa.TrustedDevice.add,name="mfa_add_new_trusted_device"), - url(r'^accounts/', include(accounts.urls)), - url(r'^$','autodeploy.views.projects'), - url(r'add_project','autodeploy.views.add_project'), - url(r'add_server','autodeploy.views.add_server'), - url(r'add_sshkey','autodeploy.views.add_ssh_key'), - url(r'manage_sshkey','autodeploy.views.manage_ssh_keys', name='mange_sshkeys'), - url(r'edit_sshkey/(\w+)','autodeploy.views.edit_ssh_key'), - url(r'delete_sshkey/(\w+)','autodeploy.views.delete_ssh_keys'), - url(r'confirm_delete','autodeploy.views.confirm_delete'), - url(r'manage_sshkey','autodeploy.views.manage_ssh_keys', name='mange_sshkeys'), - url(r'clone/','autodeploy.views.clone'), - url(r'getDeploymentHistory/','autodeploy.views.getProjectDepHistory'), - url(r'deploy/','autodeploy.views.deploy'), - url(r'deploy2/','autodeploy.views.deploy2'), - url(r'deploy3/','autodeploy.views.deploy3'), - url(r'checkServers/','autodeploy.views.checkServersStatus'), - url(r'listCommits/','autodeploy.views.listCommits'), - url(r'manage_servers','autodeploy.views.manage_servers', name='mange_sshkeys'), - url(r'edit_server/(\w+)','autodeploy.views.edit_server'), - url(r'delete_server/(\w+)','autodeploy.views.delete_server'), - url(r'edit_server/(\w+)','autodeploy.views.edit_server'), - url(r'edit_project/(\w+)','autodeploy.views.edit_project'), - url(r'delete_project/(\w+)','autodeploy.views.delete_project'), + url(r'admin/', admin.site.urls), + url(r'mfa/', include(('mfa.urls'))), + url(r'devices/add', mfa.TrustedDevice.add,name="mfa_add_new_trusted_device"), + url(r'accounts/', include(('accounts.urls'))), + url(r'', views.index, name="index"), + url(r'deployment/', include(('deployment.urls'))), + url(r'integration/', include(('integration.urls'))), + url(r'add_server', views.add_server,name='add_server'), + url(r'add_sshkey', views.add_ssh_key,name='add_sshkey'), + url(r'manage_sshkey', views.manage_ssh_keys, name='manage_sshkey'), + url(r'edit_sshkey/', views.edit_ssh_key,name='edit_sshkey'), + url(r'delete_sshkey/', views.delete_ssh_keys,name='delete_sshkey'), + url(r'confirm_delete', views.confirm_delete,name='confirm_delete'), + url(r'manage_sshkey', views.manage_ssh_keys, name='manage_sshkey'), + url(r'checkServers/', views.checkServersStatus,name='checkServers'), + url(r'manage_servers', views.manage_servers, name='manage_servers'), + url(r'edit_server/', views.edit_server,name='edit_server'), + url(r'delete_server/', views.delete_server,name='delete_server'), + url(r'edit_server/', views.edit_server,name='edit_server'), + url(r'api/checkServers', api.checkServers, name='api_check_servers'), + url(r'api/cloneCD', api.cloneCD, name='api_clone_cd'), + url(r'api/cloneCI', api.cloneCI, name='api_clone_ci'), + url(r'api/deploy', api.deploy, name='api_deploy'), + url(r'api/integrate', api.integrate, name='api_integrate'), - url(r'api/checkServers','autodeploy.api.checkServers'), - url(r'api/clone','autodeploy.api.clone'), - url(r'api/deploy','autodeploy.api.deploy'), - -] +] \ No newline at end of file diff --git a/webapp/autoDeploy/autoDeploy/views.py b/webapp/autoDeploy/autoDeploy/views.py new file mode 100644 index 0000000..01e9ca6 --- /dev/null +++ b/webapp/autoDeploy/autoDeploy/views.py @@ -0,0 +1,153 @@ +from deployment.forms import * +from deployment.tables import * +from django.views.decorators.csrf import csrf_protect +from django_tables2.export.export import TableExport +from django_tables2.config import RequestConfig +from django.contrib.auth.decorators import login_required +from deployment.views import projects +from deployment.models import * +from integration.models import * +from django.shortcuts import render + +@login_required(redirect_field_name="redirect") +def index(request): + if request.method == "GET": + return render(request, 'index.html') + + +@csrf_protect +@login_required(redirect_field_name="redirect") +def add_server(request): + if request.method == "GET": + return render(request,"add_server.html", {"form": ServerForm}) + else: + form = ServerForm(request.POST) + print(request.POST["edit"]) + if request.POST["edit"] == "True": + server = Server.objects.get(name=request.POST["name"]) + server.DNS = request.POST["DNS"] + server.ip = request.POST["ip"] + server.port = request.POST["port"] + server.save() + else: + if form.is_valid(): + form.save() + else: + return render(request,"add_server.html", {"form": form, "error": True}) + return render(request,"add_server.html", {"form": form, "done": True}) + + +@csrf_protect +@login_required(redirect_field_name="redirect") +def add_ssh_key(request): + if request.method == "GET": + return render(request,"add_sshkey.html", {"form": SSHKeyForm()}) + else: + form = SSHKeyForm(request.POST) + if request.POST["edit"] == "True": + key = SSHKey.objects.get(name=request.POST["name"]) + key.key = request.POST["key"] + key.save() + else: + if form.is_valid(): + form.save() + else: + return render(request,"add_sshkey.html", {"form": form, "error": True}) + return render(request,"add_sshkey.html", {"form": form, "done": True}) + + +@login_required(redirect_field_name="redirect") +def edit_ssh_key(request, sshKey): + if request.method == "GET": + key = SSHKey.objects.get(name=sshKey) + form = SSHKeyForm(instance=key) + return render(request,"add_sshkey.html", {"form": form, "edit": True}) + + +@login_required(redirect_field_name="redirect") +def edit_server(request, server): + if request.method == "GET": + server = Server.objects.get(name=server) + form = ServerForm(instance=server) + return render(request,"add_server.html", {"form": form, "edit": True}) + + +@login_required(redirect_field_name="redirect") +def manage_ssh_keys(request): + name = "SSH Keys" + xlstable = SSHKeysReport(SSHKey.objects.all()) + RequestConfig(request, paginate={"per_page": 15}).configure(xlstable) + export_format = request.GET.get('_export', None) + if TableExport.is_valid_format(export_format): + exporter = TableExport(export_format, xlstable) + return exporter.response('table.{}'.format(export_format)) + # table_to_report = RequestConfigReport(request, paginate={"per_page": 15}).configure(xlstable) + # if table_to_report: + # return create_report_http_response(table_to_report, request) + return render(request,"modify.html", {"name": name, "table": xlstable}) + + +@login_required(redirect_field_name="redirect") +def manage_servers(request): + name = "Servers" + xlstable = ServersReport(Server.objects.all()) + RequestConfig(request, paginate={"per_page": 15}).configure(xlstable) + export_format = request.GET.get('_export', None) + if TableExport.is_valid_format(export_format): + exporter = TableExport(export_format, xlstable) + return exporter.response('table.{}'.format(export_format)) + # table_to_report = RequestConfigReport(request, paginate={"per_page": 15}).configure(xlstable) + # if table_to_report: + # return create_report_http_response(table_to_report, request) + return render(request,"modify.html", {"name": name, "table": xlstable}) + + +@csrf_protect +@login_required(redirect_field_name="redirect") +def delete_ssh_keys(request, name): + if request.method == "GET": + return render(request,"confirm.html", {"form": "../confirm_delete", "name": name, "type": "SSH Key", + "back_url": "./manage_sshkeys"}) + + +@csrf_protect +@login_required(redirect_field_name="redirect") +def delete_server(request, name): + if request.method == "GET": + return render(request,"confirm.html", {"form": "../confirm_delete", "name": name, "type": "Server", + "back_url": "./manage_servers"}) + + +@login_required(redirect_field_name="redirect") +def confirm_delete(request): + if request.method == "POST": + n = request.POST["name"] + if request.POST["type"] == "SSH Key": + if Project.objects.filter(sshKey__name=n).count() > 0: + return render(request,"base.html", {"class": "alert alert-danger", + "text": n + " can NOT be delete as it is linked to another projects."}) + key = SSHKey.objects.get(name=n) + key.delete() + return manage_ssh_keys(request) + elif request.POST["type"] == "Server": + server = Server.objects.get(name=n) + server.delete() + return manage_servers(request) + + elif request.POST["type"] == "CD Project": + project = Project.objects.get(name=n) + project.delete() + return projects(request) + + elif request.POST["type"] == "CI Project": + project = CIProject.objects.get(name=n) + project.delete() + return projects(request) + + +@login_required(redirect_field_name="redirect") +def checkServersStatus(request): + # print res + return render(request,"base.html", + {"title": "Servers Health", "function": "checkServers", "dataType": "JSON", "data": "", + "ajax": True}) diff --git a/webapp/autoDeploy/autoDeploy/wsgi.py b/webapp/autoDeploy/autoDeploy/wsgi.py old mode 100644 new mode 100755 index 3b136b6..7774d68 --- a/webapp/autoDeploy/autoDeploy/wsgi.py +++ b/webapp/autoDeploy/autoDeploy/wsgi.py @@ -4,13 +4,13 @@ It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see -https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ +https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/ """ import os from django.core.wsgi import get_wsgi_application -os.environ["DJANGO_SETTINGS_MODULE"]= "autoDeploy.settings" +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'autoDeploy.settings') application = get_wsgi_application() diff --git a/webapp/autoDeploy/autodeploy/api.py b/webapp/autoDeploy/autodeploy/api.py deleted file mode 100644 index 55dc637..0000000 --- a/webapp/autoDeploy/autodeploy/api.py +++ /dev/null @@ -1,100 +0,0 @@ -__author__ = 'mohamed' -from models import * -import simplejson -from autodeploy_client.Client import Client -from django.http import HttpResponse -from django.views.decorators.csrf import csrf_protect -from django.utils import timezone -def checkServers(request): - res = {} - for server in Server.objects.all(): - c = Client("git", server.ip, server.port) - state = c.CheckUp() - if state: - res[server.name] = "UP" - else: - res[server.name] = "DOWN" - return HttpResponse(simplejson.dumps(res)) - -@csrf_protect -def clone(request): - scm = str(request.GET["scm"]) - ip = str(request.GET["ip"]) - port = int(request.GET["port"]) - project=Project.objects.get(name=request.GET["project_name"]) - c = Client(scm,ip,port,project.sshKey.key) - res = c.Clone(project.repo, project.working_dir) - return HttpResponse(res) - -@csrf_protect -def deploy(request): - import Common - server = Server.objects.get(name=request.session["deploy_server"]) - project = Project.objects.get(name=request.session["deploy_project"]) - last_Deployment=None - try: - last_Deployment=Deployment_Server.objects.filter(server=server,project=project).latest() - except: - pass - D= Deployment_Server() - c = Client(str(project.repo_type), server.ip, server.port) - D.project = project - D.server = server - if "tag" in request.GET: - res = c.SwitchTag(project.working_dir, request.GET["tag"]) - D.update_type="tag" - D.update_version=request.GET["tag"] - project.lastTag=request.GET["tag"] - elif "commit" in request.GET: - if request.GET["commit"] != "HEAD": - res=c.SwitchCommit(project.working_dir,request.GET["commit"]) - D.update_type="commit" - D.update_version = request.GET["commit"] - project.lastCommit=request.GET["commit"] - res = c.Deploy(project.working_dir, project.configFile) - if not "ERR:" in res: - D.datetime=timezone.now() - D.has_new_version=False - D.save() - project.lastUpdate=timezone.now() - project.newVersion=False - project.save() - print project.deployment_link - if not "http://" in project.deployment_link: - print "in if" - link="http://"+server.DNS+project.deployment_link - print link - if project.emailUsers!="" or project.emailUsers!=" " and last_Deployment!=None: - changes=c.getChangeLog(project.working_dir,since=last_Deployment.update_version,to=request.GET["commit"]) - changes_text="

Changes

    " - found=False - for change in changes: - if change.endswith(":"): continue - changes_text+="
  • %s
  • "%change - found=True - if found: - changes_text+="
" - else: - changes_text="" - Common.send(project.emailUsers.replace(",",";"),"New version of %s deployed"%project.name,"Dear User,
This is an automated notification that a new version of %s has been deployed at: %s
%s"%(project.name,link,changes_text),fromUser=None,cc="",bcc="",) - - return HttpResponse(res+",,"+link) - else: - print "in else" - link=project.deployment_link - if project.emailUsers!="" or project.emailUsers!=" ": - changes=c.getChangeLog(project.working_dir,since=last_Deployment.update_version,to=request.GET["commit"]) - changes_text="

Changes

    " - found=False - for change in changes: - if change.endswith(":"): continue - changes_text+="
  • %s
  • "%change - found=True - if found: - changes_text += "
" - else: - changes_text = "" - - Common.send(project.emailUsers.replace(",",";"),"New version of %s deployed"%project.name,"Dear User,
This is an automated notification that a new version of %s has been deployed at: %s.
%s"%(project.name,link,changes_text),fromUser=None,cc="",bcc="",) - return HttpResponse(res+",,"+link) - else: return HttpResponse(res) diff --git a/webapp/autoDeploy/autodeploy/forms.py b/webapp/autoDeploy/autodeploy/forms.py deleted file mode 100644 index c9144d9..0000000 --- a/webapp/autoDeploy/autodeploy/forms.py +++ /dev/null @@ -1,90 +0,0 @@ -__author__ = 'mohamed' -from django import forms -import models -import os -import autoDeploy.settings as settings -repo_type=[('git','git')] -update_style=[('commit',"commits"),("tag","tags")] -def saveFile(file,project_name): - if file=='': - print "No File to save." - return '' - if not os.path.exists(settings.MEDIA_ROOT+"/"+project_name): - os.makedirs(settings.MEDIA_ROOT+"/"+project_name) - fpath=settings.MEDIA_ROOT+"/"+project_name+"/"+file.name - with open(fpath, 'wb+') as destination: - for chunk in file.chunks(): - destination.write(chunk) - return fpath - -class ProjectsForm(forms.ModelForm): - working_dir=forms.CharField(label="Working Directory",widget=forms.TextInput(attrs={'class':'form-control','size':30})) - repo_type=forms.ChoiceField(choices=repo_type,label="Repo Type",widget=forms.Select(attrs={"class":"form-control"})) - update_style=forms.ChoiceField(choices=update_style,label="Update Style",widget=forms.Select(attrs={"class":"form-control"})) - cfile=forms.FileField(label="Config File") - name = forms.CharField(label='Project Name',widget=forms.TextInput(attrs={'class':'form-control','size':30})) - repo_link= forms.CharField(label='Repo Link',widget=forms.TextInput(attrs={'class':'form-control','size':30})) - repo= forms.CharField(label='Repo',widget=forms.TextInput(attrs={'class':'form-control','size':30})) - deployment_link= forms.CharField(label='Deployment Link',widget=forms.TextInput(attrs={'class':'form-control','size':30})) - emailUsers=forms.CharField(required=False,label='Users emails',help_text="comma seprated list of emails of users to notify when new version deployed",widget=forms.TextInput(attrs={'class':'form-control','size':30})) - default_server=forms.ModelChoiceField(queryset=models.Server.objects.all(),empty_label="Select",widget=forms.Select(attrs={"class":"form-control"}),label="Default Server") - sshKey = forms.ModelChoiceField(queryset=models.SSHKey.objects.all(), empty_label="Select",label="SSH Key",widget=forms.Select(attrs={"class": "form-control"})) - default_branch = forms.CharField(label='Default Branch', widget=forms.TextInput(attrs={'class': 'form-control', 'size': 30})) - - def __init__(self, *args, **kwargs): - super(ProjectsForm, self).__init__(*args, **kwargs) - instance = getattr(self, 'instance', None) - if instance and instance.pk: - self.fields['name'].widget.attrs['readonly'] = True - def save(self,files,name): - P= models.Project() - P.name=self.cleaned_data["name"] - P.deployment_link=self.cleaned_data["deployment_link"] - P.repo=self.cleaned_data["repo"] - P.repo_link=self.cleaned_data["repo_link"] - P.repo_type=self.cleaned_data["repo_type"] - P.working_dir=self.cleaned_data["working_dir"] - P.sshKey=self.cleaned_data["sshKey"] - P.default_server=self.cleaned_data["default_server"] - P.update_style=self.cleaned_data["update_style"] - P.emailUsers=self.cleaned_data["emailUsers"] - P.default_branch=self.cleaned_data["default_branch"] - - print "Files is ",files - f=files.get('cfile','') - if f!="": - P.configFile = saveFile(files.get('cfile',''),name) - P.save() - class Meta: - model= models.Project - fields=("name","repo","repo_link","working_dir","update_style","default_branch","default_server","repo_type","sshKey","deployment_link","cfile","emailUsers") - -class ServerForm(forms.ModelForm): - ip=forms.CharField(widget=forms.TextInput(attrs={'class':'form-control','size':30}),label="Hostname/IP") - def __init__(self, *args, **kwargs): - super(ServerForm, self).__init__(*args, **kwargs) - instance = getattr(self, 'instance', None) - if instance and instance.pk: - self.fields['name'].widget.attrs['readonly'] = True - class Meta: - model=models.Server - widgets={"name":forms.TextInput(attrs={'class':'form-control','size':30}), - "DNS":forms.TextInput(attrs={'class':'form-control','size':5}) - } - fields=('name','ip','port','DNS') -class SSHKeyForm(forms.ModelForm): - def __init__(self, *args, **kwargs): - super(SSHKeyForm, self).__init__(*args, **kwargs) - instance = getattr(self, 'instance', None) - if instance and instance.pk: - self.fields['name'].widget.attrs['readonly'] = True - class Meta: - model=models.SSHKey - widgets={'name':forms.TextInput(attrs={'class':'form-control','size':30}), - 'key':forms.Textarea(attrs={'class':'form-control'})} - fields=('name','key') - -class CloneForm(forms.Form): - server=forms.ModelChoiceField(queryset=models.Server.objects.all(),label="Server",required=True,widget=forms.Select(attrs={"class":"form-control"})) - - diff --git a/webapp/autoDeploy/autodeploy/migrations/0001_initial.py b/webapp/autoDeploy/autodeploy/migrations/0001_initial.py deleted file mode 100644 index 69b74f2..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0001_initial.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Project', - fields=[ - ('id', models.IntegerField(serialize=False, auto_created=True, primary_key=True)), - ('name', models.CharField(max_length=50)), - ('repo', models.CharField(max_length=255, blank=True)), - ('lastCommit', models.CharField(max_length=32)), - ('lastCommitDate', models.DateTimeField()), - ], - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0002_auto_20150508_1941.py b/webapp/autoDeploy/autodeploy/migrations/0002_auto_20150508_1941.py deleted file mode 100644 index 59df805..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0002_auto_20150508_1941.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import datetime -from django.utils.timezone import utc - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='project', - name='lastTag', - field=models.CharField(max_length=255, blank=True), - ), - migrations.AddField( - model_name='project', - name='lastUpdate', - field=models.DateTimeField(default=datetime.datetime(2015, 5, 8, 19, 41, 23, 906454, tzinfo=utc), blank=True), - preserve_default=False, - ), - migrations.AddField( - model_name='project', - name='working_dir', - field=models.FileField(upload_to=b'', blank=True), - ), - migrations.AlterField( - model_name='project', - name='lastCommit', - field=models.CharField(max_length=32, blank=True), - ), - migrations.AlterField( - model_name='project', - name='lastCommitDate', - field=models.DateTimeField(blank=True), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0003_auto_20150508_2006.py b/webapp/autoDeploy/autodeploy/migrations/0003_auto_20150508_2006.py deleted file mode 100644 index 9daab48..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0003_auto_20150508_2006.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0002_auto_20150508_1941'), - ] - - operations = [ - migrations.AddField( - model_name='project', - name='configFile', - field=models.FileField(upload_to=b'', blank=True), - ), - migrations.AddField( - model_name='project', - name='repo_type', - field=models.CharField(max_length=10, blank=True), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0004_auto_20150509_0522.py b/webapp/autoDeploy/autodeploy/migrations/0004_auto_20150509_0522.py deleted file mode 100644 index bd76ea8..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0004_auto_20150509_0522.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0003_auto_20150508_2006'), - ] - - operations = [ - migrations.CreateModel( - name='Server', - fields=[ - ('name', models.CharField(max_length=50, serialize=False, primary_key=True)), - ('dns', models.CharField(max_length=50)), - ('port', models.IntegerField(default=4567)), - ], - ), - migrations.RemoveField( - model_name='project', - name='id', - ), - migrations.AlterField( - model_name='project', - name='name', - field=models.CharField(max_length=50, serialize=False, primary_key=True), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0005_auto_20150509_0744.py b/webapp/autoDeploy/autodeploy/migrations/0005_auto_20150509_0744.py deleted file mode 100644 index 0e9b880..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0005_auto_20150509_0744.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0004_auto_20150509_0522'), - ] - - operations = [ - migrations.CreateModel( - name='sshKey', - fields=[ - ('name', models.CharField(max_length=50, serialize=False, primary_key=True)), - ('key', models.TextField()), - ], - ), - migrations.AddField( - model_name='project', - name='sshKey', - field=models.ForeignKey(default='NULL', to='autodeploy.sshKey'), - preserve_default=False, - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0006_auto_20150510_1427.py b/webapp/autoDeploy/autodeploy/migrations/0006_auto_20150510_1427.py deleted file mode 100644 index 8b17c27..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0006_auto_20150510_1427.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import datetime - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0005_auto_20150509_0744'), - ] - - operations = [ - migrations.CreateModel( - name='working_directory', - fields=[ - ('name', models.CharField(max_length=50, serialize=False, primary_key=True)), - ('path', models.CharField(max_length=1000)), - ], - ), - migrations.AddField( - model_name='project', - name='deployment_link', - field=models.URLField(blank=True), - ), - migrations.AddField( - model_name='project', - name='repo_link', - field=models.URLField(blank=True), - ), - migrations.AlterField( - model_name='project', - name='lastCommitDate', - field=models.DateTimeField(default=b'1970-01-01', blank=True), - ), - migrations.AlterField( - model_name='project', - name='lastUpdate', - field=models.DateTimeField(default=datetime.datetime(2015, 5, 10, 14, 27, 1, 48900), blank=True), - ), - migrations.AlterField( - model_name='project', - name='sshKey', - field=models.ForeignKey(verbose_name=b'SSH Key', to='autodeploy.sshKey'), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0007_auto_20150510_1427.py b/webapp/autoDeploy/autodeploy/migrations/0007_auto_20150510_1427.py deleted file mode 100644 index 8f0d42e..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0007_auto_20150510_1427.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import datetime - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0006_auto_20150510_1427'), - ] - - operations = [ - migrations.AlterField( - model_name='project', - name='lastUpdate', - field=models.DateTimeField(default=datetime.datetime(2015, 5, 10, 14, 27, 14, 363617), blank=True), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0008_auto_20150511_1637.py b/webapp/autoDeploy/autodeploy/migrations/0008_auto_20150511_1637.py deleted file mode 100644 index 3bb648e..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0008_auto_20150511_1637.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import datetime - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0007_auto_20150510_1427'), - ] - - operations = [ - migrations.RenameField( - model_name='server', - old_name='dns', - new_name='ip', - ), - migrations.AddField( - model_name='server', - name='DNS', - field=models.CharField(max_length=50, blank=True), - ), - migrations.AlterField( - model_name='project', - name='lastUpdate', - field=models.DateTimeField(default=datetime.datetime(2015, 5, 11, 16, 37, 3, 358918), blank=True), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0009_auto_20150517_1508.py b/webapp/autoDeploy/autodeploy/migrations/0009_auto_20150517_1508.py deleted file mode 100644 index 23ed4f3..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0009_auto_20150517_1508.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import datetime - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0008_auto_20150511_1637'), - ] - - operations = [ - migrations.CreateModel( - name='Deployment_Server', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('datetime', models.DateTimeField(auto_now_add=True)), - ('update_type', models.CharField(max_length=6)), - ('update_version', models.CharField(max_length=255)), - ('has_new_version', models.BooleanField(default=False)), - ], - ), - migrations.AlterField( - model_name='project', - name='deployment_link', - field=models.CharField(max_length=200, blank=True), - ), - migrations.AlterField( - model_name='project', - name='lastUpdate', - field=models.DateTimeField(default=datetime.datetime(2015, 5, 17, 15, 8, 51, 406788), blank=True), - ), - migrations.AlterField( - model_name='project', - name='sshKey', - field=models.ForeignKey(verbose_name=b'SSH Key', to='autodeploy.SSHKey'), - ), - migrations.AddField( - model_name='deployment_server', - name='project', - field=models.ForeignKey(to='autodeploy.Project'), - ), - migrations.AddField( - model_name='deployment_server', - name='server', - field=models.ForeignKey(to='autodeploy.Server'), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0010_auto_20150519_1806.py b/webapp/autoDeploy/autodeploy/migrations/0010_auto_20150519_1806.py deleted file mode 100644 index 511ac80..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0010_auto_20150519_1806.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import datetime - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0009_auto_20150517_1508'), - ] - - operations = [ - migrations.AddField( - model_name='project', - name='default_server', - field=models.ForeignKey(default='localhost', blank=True, to='autodeploy.Server'), - preserve_default=False, - ), - migrations.AlterField( - model_name='deployment_server', - name='datetime', - field=models.DateTimeField(), - ), - migrations.AlterField( - model_name='deployment_server', - name='has_new_version', - field=models.IntegerField(verbose_name=b'Updates Behind'), - ), - migrations.AlterField( - model_name='project', - name='lastUpdate', - field=models.DateTimeField(default=datetime.datetime(2015, 5, 19, 18, 5, 58, 418921), blank=True), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0011_auto_20150519_1811.py b/webapp/autoDeploy/autodeploy/migrations/0011_auto_20150519_1811.py deleted file mode 100644 index c3a7c6b..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0011_auto_20150519_1811.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import datetime - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0010_auto_20150519_1806'), - ] - - operations = [ - migrations.AddField( - model_name='project', - name='update_style', - field=models.CharField(max_length=10, blank=True), - ), - migrations.AlterField( - model_name='project', - name='lastUpdate', - field=models.DateTimeField(default=datetime.datetime(2015, 5, 19, 18, 11, 25, 191104), blank=True), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0012_auto_20150519_1943.py b/webapp/autoDeploy/autodeploy/migrations/0012_auto_20150519_1943.py deleted file mode 100644 index 7c79f95..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0012_auto_20150519_1943.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import datetime - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0011_auto_20150519_1811'), - ] - - operations = [ - migrations.AddField( - model_name='project', - name='newVersion', - field=models.BooleanField(default=False), - ), - migrations.AlterField( - model_name='project', - name='lastUpdate', - field=models.DateTimeField(default=datetime.datetime(2015, 5, 19, 19, 43, 49, 254988), blank=True), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0013_auto_20150817_1250.py b/webapp/autoDeploy/autodeploy/migrations/0013_auto_20150817_1250.py deleted file mode 100644 index 9841669..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0013_auto_20150817_1250.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import datetime - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0012_auto_20150519_1943'), - ] - - operations = [ - migrations.CreateModel( - name='Plugins', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('name', models.CharField(max_length=50)), - ('settings', models.TextField()), - ], - ), - migrations.AddField( - model_name='project', - name='emailUsers', - field=models.TextField(default=b'', blank=True), - ), - migrations.AlterField( - model_name='project', - name='lastUpdate', - field=models.DateTimeField(default=datetime.datetime(2015, 8, 17, 12, 50, 51, 949082), blank=True), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0014_auto_20160514_1317.py b/webapp/autoDeploy/autodeploy/migrations/0014_auto_20160514_1317.py deleted file mode 100644 index 17f275e..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0014_auto_20160514_1317.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import datetime - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0013_auto_20150817_1250'), - ] - - operations = [ - migrations.AlterField( - model_name='project', - name='lastCommit', - field=models.CharField(max_length=50, blank=True), - ), - migrations.AlterField( - model_name='project', - name='lastUpdate', - field=models.DateTimeField(default=datetime.datetime(2016, 5, 14, 13, 17, 34, 809478), blank=True), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0015_auto_20171123_0937.py b/webapp/autoDeploy/autodeploy/migrations/0015_auto_20171123_0937.py deleted file mode 100644 index 93be6ba..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0015_auto_20171123_0937.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import datetime - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0014_auto_20160514_1317'), - ] - - operations = [ - migrations.AlterModelOptions( - name='deployment_server', - options={'get_latest_by': 'id'}, - ), - # migrations.AddField( - # model_name='deployment_server', - # name='deployed', - # field=models.BooleanField(default=True), - # ), - # # migrations.AddField( - # model_name='project', - # name='autoDeploy', - # field=models.BooleanField(default=False), - # ), - migrations.AddField( - model_name='project', - name='default_branch', - field=models.CharField(max_length=255, null=True), - ), - migrations.AlterField( - model_name='project', - name='lastUpdate', - field=models.DateTimeField(default=datetime.datetime(2017, 11, 23, 9, 37, 18, 29660), blank=True), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0016_auto_20180807_1651.py b/webapp/autoDeploy/autodeploy/migrations/0016_auto_20180807_1651.py deleted file mode 100644 index f6ffb6f..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0016_auto_20180807_1651.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import datetime -from django.conf import settings - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('autodeploy', '0015_auto_20171123_0937'), - ] - - operations = [ - migrations.CreateModel( - name='User_Project', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ], - ), - migrations.AddField( - model_name='deployment_server', - name='deployed', - field=models.BooleanField(default=True), - ), - migrations.AddField( - model_name='project', - name='autoDeploy', - field=models.BooleanField(default=False), - ), - migrations.AlterField( - model_name='project', - name='lastUpdate', - field=models.DateTimeField(default=datetime.datetime(2018, 8, 7, 16, 51, 46, 165178), blank=True), - ), - migrations.AddField( - model_name='user_project', - name='project', - field=models.ForeignKey(to='autodeploy.Project'), - ), - migrations.AddField( - model_name='user_project', - name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/webapp/autoDeploy/autodeploy/migrations/0017_auto_20180812_1025.py b/webapp/autoDeploy/autodeploy/migrations/0017_auto_20180812_1025.py deleted file mode 100644 index cf52192..0000000 --- a/webapp/autoDeploy/autodeploy/migrations/0017_auto_20180812_1025.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('autodeploy', '0016_auto_20180807_1651'), - ('contenttypes', '0002_remove_content_type_name'), - ] - - operations = [ - migrations.RunSQL( - """insert into auth_permission (name, content_type_id, codename) values ("Can deploy project",10,"deploy_project");"""), - migrations.RunSQL( - """insert into auth_permission (name, content_type_id, codename) values ("Can clone project",10,"clone_project");"""), - migrations.RunSQL( - """insert into auth_permission (name, content_type_id, codename) values ("Can check server",9,"check_server");"""), - ] diff --git a/webapp/autoDeploy/autodeploy/models.py b/webapp/autoDeploy/autodeploy/models.py deleted file mode 100644 index 3f22ca4..0000000 --- a/webapp/autoDeploy/autodeploy/models.py +++ /dev/null @@ -1,70 +0,0 @@ -from django.db import models -from datetime import datetime -from django.contrib.auth.models import User -class SSHKey(models.Model): - name=models.CharField(max_length=50,primary_key=True) - key=models.TextField() - - def __unicode__(self): - return self.name - - -class Server(models.Model): - name=models.CharField(max_length=50,primary_key=True) - ip=models.CharField(max_length=50) - port=models.IntegerField(default=4567) - DNS=models.CharField(max_length=50,blank=True) - def __unicode__(self): - return self.name - - -class Project(models.Model): - name = models.CharField(max_length=50, blank=False,primary_key=True) - repo_type=models.CharField(max_length=10,blank=True) - repo = models.CharField(max_length=255, blank=True) - default_server=models.ForeignKey(Server,blank=True) - update_style=models.CharField(max_length=10,blank=True) - lastCommit = models.CharField(max_length=50,blank=True) - lastTag=models.CharField(max_length=255,blank=True) - lastCommitDate = models.DateTimeField(blank=True,default="1970-01-01") - working_dir=models.FileField(blank=True) - configFile=models.FileField(blank=True) - lastUpdate=models.DateTimeField(blank=True,default=datetime.now()) - sshKey=models.ForeignKey(SSHKey,to_field="name",verbose_name="SSH Key") - repo_link=models.URLField(blank=True) - deployment_link=models.CharField(max_length=200,blank=True) - newVersion=models.BooleanField(default=False) - emailUsers=models.TextField(default="",blank=True) - autoDeploy = models.BooleanField(default=False) - default_branch=models.CharField(max_length=255,null=True) - def __unicode__(self): - return self.name - - - -class Deployment_Server(models.Model): - datetime = models.DateTimeField() - update_type = models.CharField(max_length=6) - update_version = models.CharField(max_length=255) - has_new_version = models.IntegerField(verbose_name="Updates Behind") - project = models.ForeignKey(Project) - server = models.ForeignKey(Server) - deployed=models.BooleanField(default=True) - class Meta: - get_latest_by="id" - verbose_name_plural="Deployment_Server" - -class Plugins(models.Model): - name=models.CharField(max_length=50) - settings=models.TextField() - class Meta: - verbose_name_plural = "Plugins" - - -class User_Project(models.Model): - user=models.ForeignKey(User) - project=models.ForeignKey(Project) - def __unicode__(self): - return "%s -- %s"%(self.user.username,self.project_id) - class Meta: - verbose_name_plural = "Users_Projects" diff --git a/webapp/autoDeploy/autodeploy/templates/add_project.html b/webapp/autoDeploy/autodeploy/templates/add_project.html deleted file mode 100644 index ff7dbe0..0000000 --- a/webapp/autoDeploy/autodeploy/templates/add_project.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends "base.html" %} -{% block content %} -
- {% if done %} -
-
Project Saved
-
- {% endif %} -

Add Project

- {% if error %} -
{{ form.errors }}
- {% endif %} -
- {% if edit == True %} - - {% endif %} - {% csrf_token %} -
- - {{ form.as_table }} -
- {% if edit %} - - {% else %} - - {% endif %} - -
- -{% endblock %} \ No newline at end of file diff --git a/webapp/autoDeploy/autodeploy/templates/base.html b/webapp/autoDeploy/autodeploy/templates/base.html deleted file mode 100644 index 4a4dbd6..0000000 --- a/webapp/autoDeploy/autodeploy/templates/base.html +++ /dev/null @@ -1,200 +0,0 @@ -{% load render_table from django_tables2 %} - - - - - - - {{ TITLE }} - - - - - - - - - - - - {% block head %} - {% endblock %} - - {% if ajax %} - - {% endif %} - - - - - -
- - - - -
- {% block content %} -
-
-

{{ title }}

- {% if ajax %} -
- -
-
- Please wait while your request is processed..... -
- {% else %} -
{{ text }}
- {% endif %} - {% endblock %} - -
- - -
- - - - - - - - - - - \ No newline at end of file diff --git a/webapp/autoDeploy/autodeploy/views.py b/webapp/autoDeploy/autodeploy/views.py deleted file mode 100644 index 645b2dc..0000000 --- a/webapp/autoDeploy/autodeploy/views.py +++ /dev/null @@ -1,349 +0,0 @@ -from django.shortcuts import render, render_to_response -from django.template import RequestContext -from django_tables2_reports.utils import create_report_http_response -from forms import * -from models import Project, Server, SSHKey -from tables import * -from django.views.decorators.csrf import csrf_protect -from django_tables2_reports.config import RequestConfigReport -from django_tables2.config import RequestConfig -from autodeploy_client import Client -from django.shortcuts import redirect -from django.template.context_processors import csrf -from django.contrib.auth.decorators import login_required -from django.http import HttpResponseRedirect - -@login_required(redirect_field_name="redirect") -def projects(request): - name = "Projects" - if request.user.is_superuser: - xlstable = ProjectReport(Project.objects.all()) - else: - projects = User_Project.objects.filter(user_id=request.user.id).values_list('project',flat=True) - xlstable = ProjectReport(Project.objects.filter(name__in=list(projects))) - table_to_report = RequestConfigReport(request, paginate={"per_page": 15}).configure(xlstable) - if table_to_report: - return create_report_http_response(table_to_report, request) - return render_to_response("modify.html", {"name": name, "table": xlstable}, - context_instance=RequestContext(request)) - - -@csrf_protect -@login_required(redirect_field_name="redirect") -def add_project(request): - if request.method == "GET": - return render_to_response("add_project.html", {"form": ProjectsForm()}, - context_instance=RequestContext(request)) - else: - form = ProjectsForm(request.POST, request.FILES) - if request.POST.get("edit","False") == "True": - project=Project.objects.get(name=request.POST["name"]) - project.deployment_link=request.POST["deployment_link"] - project.repo=request.POST["repo"] - project.repo_type=request.POST["repo_type"] - project.repo_link=request.POST["repo_link"] - project.sshKey=SSHKey.objects.get(name=request.POST["sshKey"]) - project.working_dir=request.POST["working_dir"] - project.default_server=Server.objects.get(name=request.POST["default_server"]) - project.update_style=request.POST["update_style"] - project.emailUsers=request.POST["emailUsers"] - project.default_branch=request.POST["default_branch"] - if request.FILES.get("cfile","")!="": - project.configFile=saveFile(request.FILES["cfile"],project.name) - project.save() - return render_to_response("add_project.html", {"form": form, "done": True}, - context_instance=RequestContext(request)) - if form.is_valid(): - form.save(request.FILES, form.cleaned_data["name"]) - return render_to_response("add_project.html", {"form": form, "done": True}, - context_instance=RequestContext(request)) - else: - return render_to_response("add_project.html", {"form": form, "error": True}, - context_instance=RequestContext(request)) - - -@csrf_protect -@login_required(redirect_field_name="redirect") -def add_server(request): - if request.method == "GET": - return render_to_response("add_server.html", {"form": ServerForm}, context_instance=RequestContext(request)) - else: - form = ServerForm(request.POST) - print request.POST["edit"] - if request.POST["edit"] == "True": - server=Server.objects.get(name=request.POST["name"]) - server.DNS=request.POST["DNS"] - server.ip=request.POST["ip"] - server.port=request.POST["port"] - server.save() - else: - if form.is_valid(): - form.save() - else: - return render_to_response("add_server.html", {"form": form, "error": True}, - context_instance=RequestContext(request)) - return render_to_response("add_server.html", {"form": form, "done": True}, - context_instance=RequestContext(request)) - - - -@csrf_protect -@login_required(redirect_field_name="redirect") -def add_ssh_key(request): - if request.method == "GET": - return render_to_response("add_sshkey.html", {"form": SSHKeyForm()}, context_instance=RequestContext(request)) - else: - form = SSHKeyForm(request.POST) - if request.POST["edit"] == "True": - key=SSHKey.objects.get(name=request.POST["name"]) - key.key=request.POST["key"] - key.save() - else: - if form.is_valid(): - form.save() - else: - return render_to_response("add_sshkey.html", {"form": form, "error": True}, - context_instance=RequestContext(request)) - return render_to_response("add_sshkey.html", {"form": form, "done": True}, - context_instance=RequestContext(request)) - - -@csrf_protect -@login_required(redirect_field_name="redirect") -def clone(request): - if request.method == "GET": - project = Project.objects.get(name=request.GET["project"]) - return render_to_response("clone.html", {"form": CloneForm(initial={"server":project.default_server}), "project_workdir": project.working_dir}, - context_instance=RequestContext(request)) - else: - project = Project.objects.get(name=request.POST["project"]) - form = CloneForm(request.POST) - if form.is_valid(): - server = Server.objects.get(name=form.cleaned_data["server"]) - token=csrf(request).get("csrf_token") - data="{scm: '%s', ip: '%s', port: '%s', project_name: '%s',csrfmiddlewaretoken: '%s' }" % (project.repo_type,server.ip,server.port,project.name,token) - return render_to_response("base.html", {"project":project,"ajax":True, "data": data, "dataType":"html", - "title":"Cloning "+ project.name, "function":"clone"}, context_instance=RequestContext(request)) - -@login_required(redirect_field_name="redirect") -@csrf_protect -def deploy(request): - if request.method == "GET": - project = Project.objects.get(name=request.GET["project"]) - request.session["deploy_project"] = request.GET["project"] - return render_to_response("deploy.html", {"form": CloneForm(initial={"server":project.default_server})}, context_instance=RequestContext(request)) - -@login_required(redirect_field_name="redirect") -def deploy2(request): - server = None - project=Project.objects.get(name=request.session["deploy_project"]) - if request.method == "POST": - form=CloneForm(request.POST) - if form.is_valid(): - server = Server.objects.get(name=request.POST["server"]) - request.session["deploy_server"] = request.POST["server"] - else: - return HttpResponseRedirect("../deploy?project="+request.session["deploy_project"]) - else: - server = Server.objects.get(name=request.session["deploy_server"]) - if request.GET.get("refresh","False")=="True": - c=Client(str(project.repo_type),server.ip,server.port,project.sshKey.key) - c.Pull(project.repo,project.working_dir,project.sshKey.key) - if project.update_style=="tag": - return listTags(request, server) - else: - filter=request.GET.get("filter",None) - return listCommits(request,filter) - -@login_required(redirect_field_name="redirect") -def listTags(request, server): - project = Project.objects.get(name=request.session["deploy_project"]) - c = Client(str(project.repo_type), server.ip, server.port,key=project.sshKey.key) - - res = c.ListTags(project.working_dir) - print res - table=TagTable(res) - table_to_report = RequestConfig(request, paginate={"per_page": 15}).configure(table) - if table_to_report: - return create_report_http_response(table_to_report, request) - return render_to_response("deploy2.html", {"project":project,"count":len(res),"mode":"tags","tags":table}, context_instance=RequestContext(request)) - -@login_required(redirect_field_name="redirect") -def deploy3(request): - if request.method == "GET": - token=csrf(request).get("csrf_token") - if "tag" in request.GET: - data='{tag:"%s",csrfmiddlewaretoken:"%s"}'%(request.GET["tag"],token) - elif "commit" in request.GET: - data='{"commit":"%s",csrfmiddlewaretoken:"%s"}'%(request.GET["commit"],token) - - project=Project.objects.get(name=request.session["deploy_project"]) - server=Server.objects.get(name=request.session["deploy_server"]) - return render_to_response("base.html", {"project":project,"ajax": True,"data":data,"dataType":"html","function":"deploy","title":"Deploying %s on %s"%(project.name,server.name)}, context_instance=RequestContext(request)) - -@login_required(redirect_field_name="redirect") -def edit_ssh_key(request, sshKey): - if request.method == "GET": - key = SSHKey.objects.get(name=sshKey) - form = SSHKeyForm(instance=key) - return render_to_response("add_sshkey.html", {"form": form,"edit":True}, context_instance=RequestContext(request)) - -@login_required(redirect_field_name="redirect") -def edit_server(request, server): - if request.method == "GET": - server= Server.objects.get(name=server) - form = ServerForm(instance=server) - return render_to_response("add_server.html", {"form": form,"edit":True}, context_instance=RequestContext(request)) - - -def edit_project(request, project): - if request.method == "GET": - project= Project.objects.get(name=project) - form = ProjectsForm(instance=project) - return render_to_response("add_project.html", {"form": form,"edit":True}, context_instance=RequestContext(request)) - - -@login_required(redirect_field_name="redirect") -def manage_ssh_keys(request): - name = "SSH Keys" - xlstable = SSHKeysReport(SSHKey.objects.all()) - table_to_report = RequestConfigReport(request, paginate={"per_page": 15}).configure(xlstable) - if table_to_report: - return create_report_http_response(table_to_report, request) - return render_to_response("modify.html", {"name": name, "table": xlstable}, - context_instance=RequestContext(request)) - -@login_required(redirect_field_name="redirect") -def manage_servers(request): - name = "Servers" - xlstable = ServersReport(Server.objects.all()) - table_to_report = RequestConfigReport(request, paginate={"per_page": 15}).configure(xlstable) - if table_to_report: - return create_report_http_response(table_to_report, request) - return render_to_response("modify.html", {"name": name, "table": xlstable}, - context_instance=RequestContext(request)) - -@csrf_protect -@login_required(redirect_field_name="redirect") -def delete_ssh_keys(request, name): - if request.method == "GET": - return render_to_response("confirm.html", {"form": "../confirm_delete", "name": name, "type": "SSH Key", - "back_url": "./manage_sshkeys"}, - context_instance=RequestContext(request)) - -@csrf_protect -@login_required(redirect_field_name="redirect") -def delete_server(request, name): - if request.method == "GET": - return render_to_response("confirm.html", {"form": "../confirm_delete", "name": name, "type": "Server", - "back_url": "./manage_servers"}, - context_instance=RequestContext(request)) - - -def delete_project(request, name): - if request.method == "GET": - return render_to_response("confirm.html", {"form": "../confirm_delete", "name": name, "type": "Project", - "back_url": "../../"}, - context_instance=RequestContext(request)) - - -@login_required(redirect_field_name="redirect") -def confirm_delete(request): - if request.method == "POST": - n = request.POST["name"] - if request.POST["type"] == "SSH Key": - if Project.objects.filter(sshKey__name=n).count() > 0: - return render_to_response("base.html", {"class": "alert alert-danger", - "text": n + " can NOT be delete as it is linked to another projects."}, - context_instance=RequestContext(request)) - key = SSHKey.objects.get(name=n) - key.delete() - return manage_ssh_keys(request) - elif request.POST["type"]=="Server": - server=Server.objects.get(name=n) - server.delete() - return manage_servers(request) - - elif request.POST["type"]=="Project": - project=Project.objects.get(name=n) - project.delete() - return projects(request) - - - - -@login_required(redirect_field_name="redirect") -def checkServersStatus(request): - - # print res - return render_to_response("base.html", {"title":"Servers Health","function":"checkServers","dataType":"JSON","data":"","ajax": True}, context_instance=RequestContext(request)) - -@login_required(redirect_field_name="redirect") -def listCommits(request,filter=None): - #if request.method == "GET": - res = None - branches=[] - c=None - server=None - project=None - project = Project.objects.get(name=request.session["deploy_project"]) - if filter==None: filter=project.default_branch if project.default_branch not in ("",None) else None - print request.GET.get("refresh","False") - if request.GET.get("refresh","False")=="True": - if "commits" in request.session: - request.session.pop("commits","") - request.session.pop("branchs","") - return redirect("./listCommits") - if filter or not "commits" in request.session: - server = Server.objects.get(name=request.session["deploy_server"]) - - c = Client("git", server.ip, server.port,key=project.sshKey.key) - c.Pull(project.repo,project.working_dir,project.sshKey.key) - res = c.ListCommits(project.working_dir,options={"branch":filter}) - request.session["commits"] = res - else: - res = request.session["commits"] - - if not "branchs" in request.session: - if not c: - server = Server.objects.get(name=request.session["deploy_server"]) - project = Project.objects.get(name=request.session["deploy_project"]) - c = Client("git", server.ip, server.port, key=project.sshKey.key) - branches=c.ListBranchs(project.working_dir) - else: - branches=request.session["branchs"] - request.session["branchs"]=branches - table = CommitTable(res) - table_to_report = RequestConfig(request, paginate={"per_page": 15}).configure(table) - if table_to_report: - return create_report_http_response(table_to_report, request) - return render_to_response("deploy2.html", {"project":project,"mode":"commits","commits": table,"branchs":branches,"current_branch":filter}, context_instance=RequestContext(request)) - - -@login_required(redirect_field_name="redirect") -def getProjectDepHistory(request): - project_name=request.GET["project"] - details=False - text=text="Show all deployment history" - if "details" in request.GET: - if request.GET["details"]=="True": - details=True - text="Show latest updates" - deployments=Deployment_Server.objects.filter(project__name=project_name).order_by("-datetime") - res=[] - servers=[] - for deployment in deployments: - if not details and deployment.server.name in servers: continue - servers.append(deployment.server.name) - c = Client(deployment.project.repo_type, deployment.server.ip, deployment.server.port) - if deployment.update_type == "commit": - commits=c.getCommitsDiff(deployment.project.working_dir,deployment.update_version) - print commits - deployment.has_new_version = len(commits) - print deployment.server,deployment.has_new_version - res.append(deployment) - - - table=DeploymentHistory(res) - RequestConfigReport(request, paginate={"per_page": 15}).configure(table) - return render_to_response("modify.html",{"table":table,"name": "Deployments for %s"%project_name,"text":text},context_instance=RequestContext(request)) \ No newline at end of file diff --git a/webapp/autoDeploy/checkUpdates.py b/webapp/autoDeploy/checkUpdates.py index 2326359..1bfa517 100755 --- a/webapp/autoDeploy/checkUpdates.py +++ b/webapp/autoDeploy/checkUpdates.py @@ -30,13 +30,13 @@ def check_pid(pid): pid=getPreviousPID() if pid!=0: if check_pid(pid): - print "Another check is running, exiting...." + print("Another check is running, exiting....") exit(-13) savePID() for project in Project.objects.all(): updateRequired=False - print "Checking %s on %s"%(project.name,project.default_server.DNS) + print("Checking %s on %s"%(project.name,project.default_server.DNS)) c=Client(str(project.repo_type),project.default_server.ip,project.default_server.port,project.sshKey.key) c.Pull(project.repo,project.working_dir,project.sshKey.key) if project.update_style=="commit": @@ -50,11 +50,11 @@ def check_pid(pid): if project.lastTag != tags[0]["Tag"]: updateRequired=True else: - print "No Tags Found" + print("No Tags Found") if updateRequired: project.newVersion=True project.save() - print "Update Required" + print("Update Required") else: - print "Already up-to-date." \ No newline at end of file + print("Already up-to-date.") \ No newline at end of file diff --git a/webapp/autoDeploy/autodeploy/__init__.py b/webapp/autoDeploy/deployment/__init__.py similarity index 100% rename from webapp/autoDeploy/autodeploy/__init__.py rename to webapp/autoDeploy/deployment/__init__.py diff --git a/webapp/autoDeploy/autodeploy/admin.py b/webapp/autoDeploy/deployment/admin.py similarity index 99% rename from webapp/autoDeploy/autodeploy/admin.py rename to webapp/autoDeploy/deployment/admin.py index 9c07f14..0b3567f 100644 --- a/webapp/autoDeploy/autodeploy/admin.py +++ b/webapp/autoDeploy/deployment/admin.py @@ -10,4 +10,3 @@ def autoregister(*app_list): pass autoregister('autodeploy', 'admin') - diff --git a/webapp/autoDeploy/deployment/apps.py b/webapp/autoDeploy/deployment/apps.py new file mode 100644 index 0000000..3685b17 --- /dev/null +++ b/webapp/autoDeploy/deployment/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class DeploymentConfig(AppConfig): + name = 'deployment' diff --git a/webapp/autoDeploy/deployment/forms.py b/webapp/autoDeploy/deployment/forms.py new file mode 100644 index 0000000..d318c2b --- /dev/null +++ b/webapp/autoDeploy/deployment/forms.py @@ -0,0 +1,115 @@ +__author__ = 'mohamed' + +from django import forms +from . import models +import os +from autoDeploy import settings as settings + +repo_type = [('git', 'git')] +update_style = [('commit', "commits"), ("tag", "tags")] + + +def saveFile(file, project_name): + if file == '': + print("No File to save.") + return '' + if not os.path.exists(settings.MEDIA_ROOT + "/" + project_name): + os.makedirs(settings.MEDIA_ROOT + "/" + project_name) + fpath = settings.MEDIA_ROOT + "/" + project_name + "/" + file.name + with open(fpath, 'wb+') as destination: + for chunk in file.chunks(): + destination.write(chunk) + return fpath + + +class ProjectsForm(forms.ModelForm): + working_dir = forms.CharField(label="Working Directory", + widget=forms.TextInput(attrs={'class': 'form-control', 'size': 30})) + repo_type = forms.ChoiceField(choices=repo_type, label="Repo Type", + widget=forms.Select(attrs={"class": "form-control"})) + update_style = forms.ChoiceField(choices=update_style, label="Update Style", + widget=forms.Select(attrs={"class": "form-control"})) + cfile = forms.FileField(label="Config File") + name = forms.CharField(label='Project Name', widget=forms.TextInput(attrs={'class': 'form-control', 'size': 30})) + repo_link = forms.CharField(label='Repo Link', widget=forms.TextInput(attrs={'class': 'form-control', 'size': 30})) + repo = forms.CharField(label='Repo', widget=forms.TextInput(attrs={'class': 'form-control', 'size': 30})) + deployment_link = forms.CharField(label='Deployment Link', + widget=forms.TextInput(attrs={'class': 'form-control', 'size': 30})) + emailUsers = forms.CharField(required=False, label='Users emails', + help_text="comma seprated list of emails of users to notify when new version deployed", + widget=forms.TextInput(attrs={'class': 'form-control', 'size': 30})) + default_server = forms.ModelChoiceField(queryset=models.Server.objects.all(), empty_label="Select", + widget=forms.Select(attrs={"class": "form-control"}), + label="Default Server") + sshKey = forms.ModelChoiceField(queryset=models.SSHKey.objects.all(), empty_label="Select", label="SSH Key", + widget=forms.Select(attrs={"class": "form-control"})) + default_branch = forms.CharField(label='Default Branch', + widget=forms.TextInput(attrs={'class': 'form-control', 'size': 30})) + + def __init__(self, *args, **kwargs): + super(ProjectsForm, self).__init__(*args, **kwargs) + instance = getattr(self, 'instance', None) + if instance and instance.pk: + self.fields['name'].widget.attrs['readonly'] = True + + def save(self, files, name): + P = models.Project() + P.name = self.cleaned_data["name"] + P.deployment_link = self.cleaned_data["deployment_link"] + P.repo = self.cleaned_data["repo"] + P.repo_link = self.cleaned_data["repo_link"] + P.repo_type = self.cleaned_data["repo_type"] + P.working_dir = self.cleaned_data["working_dir"] + P.sshKey = self.cleaned_data["sshKey"] + P.default_server = self.cleaned_data["default_server"] + P.update_style = self.cleaned_data["update_style"] + P.emailUsers = self.cleaned_data["emailUsers"] + P.default_branch = self.cleaned_data["default_branch"] + + print("Files is ", files) + f = files.get('cfile', '') + if f != "": + P.configFile = saveFile(files.get('cfile', ''), name) + P.save() + + class Meta: + model = models.Project + fields = ( + "name", "repo", "repo_link", "working_dir", "update_style", "default_branch", "default_server", "repo_type", + "sshKey", "deployment_link", "cfile", "emailUsers") + + +class ServerForm(forms.ModelForm): + ip = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'size': 30}), label="Hostname/IP") + + def __init__(self, *args, **kwargs): + super(ServerForm, self).__init__(*args, **kwargs) + instance = getattr(self, 'instance', None) + if instance and instance.pk: + self.fields['name'].widget.attrs['readonly'] = True + + class Meta: + model = models.Server + widgets = {"name": forms.TextInput(attrs={'class': 'form-control', 'size': 30}), + "DNS": forms.TextInput(attrs={'class': 'form-control', 'size': 5}) + } + fields = ('name', 'ip', 'port', 'DNS') + + +class SSHKeyForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super(SSHKeyForm, self).__init__(*args, **kwargs) + instance = getattr(self, 'instance', None) + if instance and instance.pk: + self.fields['name'].widget.attrs['readonly'] = True + + class Meta: + model = models.SSHKey + widgets = {'name': forms.TextInput(attrs={'class': 'form-control', 'size': 30}), + 'key': forms.Textarea(attrs={'class': 'form-control'})} + fields = ('name', 'key') + + +class CloneForm(forms.Form): + server = forms.ModelChoiceField(queryset=models.Server.objects.all(), label="Server", required=True, + widget=forms.Select(attrs={"class": "form-control"})) diff --git a/webapp/autoDeploy/deployment/migrations/0001_initial.py b/webapp/autoDeploy/deployment/migrations/0001_initial.py new file mode 100644 index 0000000..7af19f1 --- /dev/null +++ b/webapp/autoDeploy/deployment/migrations/0001_initial.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- + + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Deployment_Server', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('datetime', models.DateTimeField()), + ('update_type', models.CharField(max_length=6)), + ('update_version', models.CharField(max_length=255)), + ('has_new_version', models.IntegerField(verbose_name='Updates Behind')), + ('deployed', models.BooleanField(default=True)), + ], + options={ + 'get_latest_by': 'id', + 'verbose_name_plural': 'Deployment_Server', + 'db_table': 'Deployment_Server', + }, + ), + migrations.CreateModel( + name='Plugins', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=50)), + ('settings', models.TextField()), + ], + options={ + 'db_table': 'Plugins', + 'verbose_name_plural': 'Plugins', + }, + ), + migrations.CreateModel( + name='Project', + fields=[ + ('name', models.CharField(max_length=50, serialize=False, primary_key=True)), + ('repo_type', models.CharField(max_length=10, blank=True)), + ('repo', models.CharField(max_length=255, blank=True)), + ('update_style', models.CharField(max_length=10, blank=True)), + ('lastCommit', models.CharField(max_length=50, blank=True)), + ('lastTag', models.CharField(max_length=255, blank=True)), + ('lastCommitDate', models.DateTimeField(default='1970-01-01', blank=True)), + ('working_dir', models.FileField(upload_to='', blank=True)), + ('configFile', models.FileField(upload_to='', blank=True)), + ('lastUpdate', models.DateTimeField(auto_now_add=True)), + ('repo_link', models.URLField(blank=True)), + ('deployment_link', models.CharField(max_length=200, blank=True)), + ('newVersion', models.BooleanField(default=False)), + ('emailUsers', models.TextField(default='', blank=True)), + ('autoDeploy', models.BooleanField(default=False)), + ('default_branch', models.CharField(max_length=255, null=True)), + ], + ), + migrations.CreateModel( + name='Server', + fields=[ + ('name', models.CharField(max_length=50, serialize=False, primary_key=True)), + ('ip', models.CharField(max_length=50)), + ('port', models.IntegerField(default=4567)), + ('DNS', models.CharField(max_length=50, blank=True)), + ], + options={ + 'db_table': 'Server', + }, + ), + migrations.CreateModel( + name='SSHKey', + fields=[ + ('name', models.CharField(max_length=50, serialize=False, primary_key=True)), + ('key', models.TextField()), + ], + options={ + 'db_table': 'SSHKey', + }, + ), + migrations.CreateModel( + name='User_Project', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('project', models.ForeignKey(to='deployment.Project',on_delete=models.DO_NOTHING)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL,on_delete=models.DO_NOTHING)), + ], + options={ + 'db_table': 'User_Project', + 'verbose_name_plural': 'Users_Projects', + }, + ), + migrations.AddField( + model_name='project', + name='default_server', + field=models.ForeignKey(to='deployment.Server', blank=True,on_delete=models.DO_NOTHING), + ), + migrations.AddField( + model_name='project', + name='sshKey', + field=models.ForeignKey(verbose_name=b'SSH Key', to='deployment.SSHKey',on_delete=models.DO_NOTHING), + ), + migrations.AddField( + model_name='deployment_server', + name='project', + field=models.ForeignKey(to='deployment.Project',on_delete=models.DO_NOTHING), + ), + migrations.AddField( + model_name='deployment_server', + name='server', + field=models.ForeignKey(to='deployment.Server',on_delete=models.DO_NOTHING), + ), + ] diff --git a/webapp/autoDeploy/deployment/migrations/0002_permissions.py b/webapp/autoDeploy/deployment/migrations/0002_permissions.py new file mode 100644 index 0000000..f9a8402 --- /dev/null +++ b/webapp/autoDeploy/deployment/migrations/0002_permissions.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('deployment', '0001_initial'), + ] + + operations = [ + migrations.RunSQL( + """ + insert into auth_permission (name, content_type_id, codename) + select "Can check server",id,"check_server" from django_content_type where model = 'server'; + + insert into auth_permission (name, content_type_id, codename) + select "Can clone project",id,"clone_project" from django_content_type where model = 'project'; + + insert into auth_permission (name, content_type_id, codename) + select "Can deploy project",id,"deploy_project" from django_content_type where model = 'project'; + """), + ] diff --git a/webapp/autoDeploy/deployment/migrations/0003_migrate_data_from_old_to_new.py b/webapp/autoDeploy/deployment/migrations/0003_migrate_data_from_old_to_new.py new file mode 100644 index 0000000..292f339 --- /dev/null +++ b/webapp/autoDeploy/deployment/migrations/0003_migrate_data_from_old_to_new.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- + + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('deployment', '0002_permissions'), + ] + + operations = [ + migrations.RunSQL(""" + DROP PROCEDURE IF EXISTS MigrateData; + CREATE PROCEDURE MigrateData() + BEGIN + IF (SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = 'autodeploy_plugins') > 0 + THEN + insert into Plugins (name, settings) + select `name`, `settings` + from autodeploy_plugins; + END IF; + + + IF (SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = 'autodeploy_server') > 0 THEN + insert into Server (name, ip, port, DNS) + select name, ip, port, DNS + from autodeploy_server; + END IF; + + IF (SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = 'autodeploy_sshkey') > 0 THEN + insert into SSHKey (`name`, `key`) + select `name`, `key` + from autodeploy_sshkey ; + END IF; + + IF (SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = 'autodeploy_project') > 0 THEN + insert into deployment_project (name, repo_type, repo, update_style, lastCommit, lastTag, lastCommitDate, working_dir, configFile, lastUpdate, repo_link, deployment_link, newVersion, emailUsers, autoDeploy, default_branch, default_server_id, sshKey_id) + select name, repo_type, repo, update_style, lastCommit, lastTag, lastCommitDate, working_dir, configFile, lastUpdate, repo_link, deployment_link, newVersion, emailUsers, autoDeploy, default_branch, default_server_id, sshKey_id + from autodeploy_project ; + END IF; + + IF (SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = 'autodeploy_deployment_server') > 0 THEN + insert into Deployment_Server (datetime, update_type, update_version, has_new_version, project_id, server_id, deployed ) + select datetime, update_type, update_version, has_new_version, project_id, server_id, deployed + from autodeploy_deployment_server ; + END IF; + + IF (SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = 'autodeploy_user_project') > 0 THEN + insert into User_Project (project_id, user_id) + select project_id, user_id + from autodeploy_user_project; + END IF; + END; + CALL MigrateData; + DROP PROCEDURE IF EXISTS MigrateData; + """) + ] diff --git a/webapp/autoDeploy/autodeploy/migrations/__init__.py b/webapp/autoDeploy/deployment/migrations/__init__.py similarity index 100% rename from webapp/autoDeploy/autodeploy/migrations/__init__.py rename to webapp/autoDeploy/deployment/migrations/__init__.py diff --git a/webapp/autoDeploy/deployment/models.py b/webapp/autoDeploy/deployment/models.py new file mode 100644 index 0000000..ded54a9 --- /dev/null +++ b/webapp/autoDeploy/deployment/models.py @@ -0,0 +1,98 @@ +from django.db import models +from datetime import datetime +from django.contrib.auth.models import User + + +class SSHKey(models.Model): + name = models.CharField(max_length=50, primary_key=True) + key = models.TextField() + + def __unicode__(self): + return self.name + + def __str__(self): + return self.name + + class Meta: + db_table = "SSHKey" + + +class Server(models.Model): + name = models.CharField(max_length=50, primary_key=True) + ip = models.CharField(max_length=50) + port = models.IntegerField(default=4567) + DNS = models.CharField(max_length=50, blank=True) + + def __unicode__(self): + return self.name + + def __str__(self): + return self.name + + class Meta: + db_table = "Server" + + +class Project(models.Model): + name = models.CharField(max_length=50, blank=False, primary_key=True) + repo_type = models.CharField(max_length=10, blank=True) + repo = models.CharField(max_length=255, blank=True) + default_server = models.ForeignKey(Server, blank=True,on_delete=models.DO_NOTHING) + update_style = models.CharField(max_length=10, blank=True) + lastCommit = models.CharField(max_length=50, blank=True) + lastTag = models.CharField(max_length=255, blank=True) + lastCommitDate = models.DateTimeField(blank=True, default="1970-01-01") + working_dir = models.FileField(blank=True) + configFile = models.FileField(blank=True) + lastUpdate = models.DateTimeField(blank=True,auto_now_add=True) + sshKey = models.ForeignKey(SSHKey, to_field="name", verbose_name="SSH Key",on_delete=models.DO_NOTHING) + repo_link = models.URLField(blank=True) + deployment_link = models.CharField(max_length=200, blank=True) + newVersion = models.BooleanField(default=False) + emailUsers = models.TextField(default="", blank=True) + autoDeploy = models.BooleanField(default=False) + default_branch = models.CharField(max_length=255, null=True) + + def __unicode__(self): + return self.name + + def __str__(self): + return self.name + +class Deployment_Server(models.Model): + datetime = models.DateTimeField() + update_type = models.CharField(max_length=6) + update_version = models.CharField(max_length=255) + has_new_version = models.IntegerField(verbose_name="Updates Behind") + project = models.ForeignKey(Project,on_delete=models.DO_NOTHING) + server = models.ForeignKey(Server,on_delete=models.DO_NOTHING) + deployed = models.BooleanField(default=True) + + class Meta: + get_latest_by = "id" + verbose_name_plural = "Deployment_Server" + db_table = 'Deployment_Server' + + +class Plugins(models.Model): + name = models.CharField(max_length=50) + settings = models.TextField() + + class Meta: + verbose_name_plural = "Plugins" + db_table = 'Plugins' + + +class User_Project(models.Model): + user = models.ForeignKey(User,on_delete=models.DO_NOTHING) + project = models.ForeignKey(Project,on_delete=models.DO_NOTHING) + + def __unicode__(self): + return "%s -- %s" % (self.user.username, self.project_id) + + def __str__(self): + return "%s -- %s" % (self.user.username, self.project_id) + + class Meta: + verbose_name_plural = "Users_Projects" + db_table = "User_Project" diff --git a/webapp/autoDeploy/autodeploy/tables.py b/webapp/autoDeploy/deployment/tables.py similarity index 93% rename from webapp/autoDeploy/autodeploy/tables.py rename to webapp/autoDeploy/deployment/tables.py index 0528b04..747c7f2 100644 --- a/webapp/autoDeploy/autodeploy/tables.py +++ b/webapp/autoDeploy/deployment/tables.py @@ -1,11 +1,12 @@ import django_tables2 as Table import django_tables2.tables as tables from django_tables2_reports.tables import TableReport -from models import * +from django_tables2.export.views import ExportMixin +from .models import * __author__ = 'mohamed' -class ProjectReport(TableReport): +class ProjectReport(ExportMixin, tables.Table): depLink=""" {% if not "http" in record.deployment_link%} http://{{record.default_server.DNS}}{{ record.deployment_link }} @@ -32,14 +33,14 @@ class Meta: -class SSHKeysReport(TableReport): +class SSHKeysReport(ExportMixin, tables.Table): Operations=Table.TemplateColumn("  ") class Meta: model=SSHKey fields=("name","Operations") attrs = {"class": "table table-striped"} -class ServersReport(TableReport): +class ServersReport(ExportMixin, tables.Table): Operations=Table.TemplateColumn("  ") class Meta: model=SSHKey @@ -66,7 +67,7 @@ class Meta: fields=["ID","Tagger","Date","Commit"] sequence=["ID","Tagger","Date","Commit"] -class DeploymentHistory(TableReport): +class DeploymentHistory(ExportMixin, tables.Table): class Meta: model=Deployment_Server fields=["datetime","server","update_type","update_version","has_new_version"] diff --git a/webapp/autoDeploy/deployment/templates/add_project.html b/webapp/autoDeploy/deployment/templates/add_project.html new file mode 100644 index 0000000..a94043d --- /dev/null +++ b/webapp/autoDeploy/deployment/templates/add_project.html @@ -0,0 +1,29 @@ +{% extends "base.html" %} +{% block content %} +
+ {% if done %} +
+
Project Saved
+
+ {% endif %} +

Add Project

+ {% if error %} +
{{ form.errors }}
+ {% endif %} +
+ {% if edit == True %} + + {% endif %} + {% csrf_token %} +
+ + {{ form.as_table }} +
+ {% if edit %} + + {% else %} + + {% endif %} + +
+{% endblock %} \ No newline at end of file diff --git a/webapp/autoDeploy/autodeploy/templates/clone.html b/webapp/autoDeploy/deployment/templates/clone.html similarity index 100% rename from webapp/autoDeploy/autodeploy/templates/clone.html rename to webapp/autoDeploy/deployment/templates/clone.html diff --git a/webapp/autoDeploy/autodeploy/templates/deploy.html b/webapp/autoDeploy/deployment/templates/deploy.html similarity index 100% rename from webapp/autoDeploy/autodeploy/templates/deploy.html rename to webapp/autoDeploy/deployment/templates/deploy.html diff --git a/webapp/autoDeploy/autodeploy/templates/deploy2.html b/webapp/autoDeploy/deployment/templates/deploy2.html similarity index 100% rename from webapp/autoDeploy/autodeploy/templates/deploy2.html rename to webapp/autoDeploy/deployment/templates/deploy2.html diff --git a/webapp/autoDeploy/autodeploy/templates/modify.html b/webapp/autoDeploy/deployment/templates/modify.html similarity index 85% rename from webapp/autoDeploy/autodeploy/templates/modify.html rename to webapp/autoDeploy/deployment/templates/modify.html index 3ccdc10..37136c7 100644 --- a/webapp/autoDeploy/autodeploy/templates/modify.html +++ b/webapp/autoDeploy/deployment/templates/modify.html @@ -8,6 +8,6 @@ {% if text %} {{ text|safe }}
{% endif %} - {% render_table table "table.html" %} + {% render_table table %} {% endblock %} \ No newline at end of file diff --git a/webapp/autoDeploy/deployment/tests.py b/webapp/autoDeploy/deployment/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/webapp/autoDeploy/deployment/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/webapp/autoDeploy/deployment/urls.py b/webapp/autoDeploy/deployment/urls.py new file mode 100644 index 0000000..e24e2b2 --- /dev/null +++ b/webapp/autoDeploy/deployment/urls.py @@ -0,0 +1,17 @@ +from django.urls import path as url,re_path +from . import views + +urlpatterns = [ + url(r'', views.projects, name="cd_index"), + url(r'add_project/',views.add_project,name='cd_add_project'), + url(r'clone/',views.clone,name='cd_clone'), + url(r'getDeploymentHistory/',views.getProjectDepHistory,name='cd_history'), + url(r'deploy/',views.deploy,name='cd_deploy'), + url(r'deploy2/',views.deploy2,name='cd_deploy2'), + url(r'deploy3/',views.deploy3,name='cd_deploy3'), + url(r'listCommits/',views.listCommits,name='cd_commits'), + url(r'edit_project/',views.edit_project,name='cd_edit_project'), + url(r'delete_project/',views.delete_project,name='cd_delete_project'), + + +] diff --git a/webapp/autoDeploy/deployment/views.py b/webapp/autoDeploy/deployment/views.py new file mode 100644 index 0000000..a614b62 --- /dev/null +++ b/webapp/autoDeploy/deployment/views.py @@ -0,0 +1,229 @@ +from django.shortcuts import render +from django_tables2_reports.utils import create_report_http_response +from .forms import * +from .tables import * +from django_tables2.export.export import TableExport +from django.views.decorators.csrf import csrf_protect +from django_tables2.config import RequestConfig +from autodeploy_client import Client +from django.shortcuts import redirect,reverse +from django.template.context_processors import csrf +from django.contrib.auth.decorators import login_required +from django.http import HttpResponseRedirect + + + +@login_required(redirect_field_name="redirect") +def projects(request): + name = "CD Projects" + if request.user.is_superuser: + xlstable = ProjectReport(Project.objects.all()) + else: + projects = User_Project.objects.filter(user_id=request.user.id).values_list('project', flat=True) + xlstable = ProjectReport(Project.objects.filter(name__in=list(projects))) + RequestConfig(request, paginate={"per_page": 15}).configure(xlstable) + export_format = request.GET.get('_export', None) + if TableExport.is_valid_format(export_format): + exporter = TableExport(export_format, xlstable) + return exporter.response('table.{}'.format(export_format)) + # table_to_report = RequestConfigReport(request, paginate={"per_page": 15}).configure(xlstable) + # if table_to_report: + # return create_report_http_response(table_to_report, request) + return render(request,"modify.html", {"name": name, "table": xlstable}) + + +@csrf_protect +@login_required(redirect_field_name="redirect") +def add_project(request): + if request.method == "GET": + return render(request,"add_project.html", {"form": ProjectsForm()}) + else: + form = ProjectsForm(request.POST, request.FILES) + if request.POST.get("edit", "False") == "True": + project = Project.objects.get(name=request.POST["name"]) + project.deployment_link = request.POST["deployment_link"] + project.repo = request.POST["repo"] + project.repo_type = request.POST["repo_type"] + project.repo_link = request.POST["repo_link"] + project.sshKey = SSHKey.objects.get(name=request.POST["sshKey"]) + project.working_dir = request.POST["working_dir"] + project.default_server = Server.objects.get(name=request.POST["default_server"]) + project.update_style = request.POST["update_style"] + project.emailUsers = request.POST["emailUsers"] + project.default_branch = request.POST["default_branch"] + if request.FILES.get("cfile", "") != "": + project.configFile = saveFile(request.FILES["cfile"], project.name) + project.save() + return render(request,"add_project.html", {"form": form, "done": True}) + if form.is_valid(): + form.save(request.FILES, form.cleaned_data["name"]) + return render(request,"add_project.html", {"form": form, "done": True}) + else: + return render(request,"add_project.html", {"form": form, "error": True}) + + +@csrf_protect +@login_required(redirect_field_name="redirect") +def clone(request): + if request.method == "GET": + project = Project.objects.get(name=request.GET["project"]) + return render(request,"clone.html", {"form": CloneForm(initial={"server": project.default_server}), + "project_workdir": project.working_dir}) + else: + project = Project.objects.get(name=request.POST["project"]) + form = CloneForm(request.POST) + if form.is_valid(): + server = Server.objects.get(name=form.cleaned_data["server"]) + token = csrf(request).get("csrf_token") + data = "{scm: '%s', ip: '%s', port: '%s', project_name: '%s',csrfmiddlewaretoken: '%s' }" % ( + project.repo_type, server.ip, server.port, project.name, token) + return render(request,"base.html", {"project": project, "ajax": True, "data": data, "dataType": "html", + "title": "Cloning " + project.name, "function": "cloneCD"}) + + +@login_required(redirect_field_name="redirect") +@csrf_protect +def deploy(request): + if request.method == "GET": + project = Project.objects.get(name=request.GET["project"]) + request.session["deploy_project"] = request.GET["project"] + return render(request,"deploy.html", {"form": CloneForm(initial={"server": project.default_server})}) + + +@login_required(redirect_field_name="redirect") +def deploy2(request): + server = None + project = Project.objects.get(name=request.session["deploy_project"]) + if request.method == "POST": + form = CloneForm(request.POST) + if form.is_valid(): + server = Server.objects.get(name=request.POST["server"]) + request.session["deploy_server"] = request.POST["server"] + else: + return HttpResponseRedirect("../deploy?project=" + request.session["deploy_project"]) + else: + server = Server.objects.get(name=request.session["deploy_server"]) + if request.GET.get("refresh", "False") == "True": + c = Client(str(project.repo_type), server.ip, server.port, project.sshKey.key) + c.Pull(project.repo, project.working_dir, project.sshKey.key) + if project.update_style == "tag": + return listTags(request, server) + else: + filter = request.GET.get("filter", None) + return listCommits(request, filter) + + +@login_required(redirect_field_name="redirect") +def listTags(request, server): + project = Project.objects.get(name=request.session["deploy_project"]) + c = Client(str(project.repo_type), server.ip, server.port, key=project.sshKey.key) + + res = c.ListTags(project.working_dir) + print(res) + table = TagTable(res) + table_to_report = RequestConfig(request, paginate={"per_page": 15}).configure(table) + if table_to_report: + return create_report_http_response(table_to_report, request) + return render(request,"deploy2.html", {"project": project, "count": len(res), "mode": "tags", "tags": table}) + + +@login_required(redirect_field_name="redirect") +def deploy3(request): + if request.method == "GET": + token = csrf(request).get("csrf_token") + if "tag" in request.GET: + data = '{tag:"%s",csrfmiddlewaretoken:"%s"}' % (request.GET["tag"], token) + elif "commit" in request.GET: + data = '{"commit":"%s",csrfmiddlewaretoken:"%s"}' % (request.GET["commit"], token) + + project = Project.objects.get(name=request.session["deploy_project"]) + server = Server.objects.get(name=request.session["deploy_server"]) + return render(request,"base.html", {"project": project, "ajax": True, "data": data, "dataType": "html", + "function": "deploy", + "title": "Deploying %s on %s" % (project.name, server.name)}) + + + +def edit_project(request, project): + if request.method == "GET": + project = Project.objects.get(name=project) + form = ProjectsForm(instance=project) + return render(request,"add_project.html", {"form": form, "edit": True}) + + +def delete_project(request, name): + if request.method == "GET": + return render(request,"confirm.html", {"form": "../confirm_delete", "name": name, "type": "CD Project","back_url": "../../"}) + + +@login_required(redirect_field_name="redirect") +def listCommits(request, filter=None): + # if request.method == "GET": + res = None + branches = [] + c = None + server = None + project = None + project = Project.objects.get(name=request.session["deploy_project"]) + if filter == None: filter = project.default_branch if project.default_branch not in ("", None) else None + print(request.GET.get("refresh", "False")) + if request.GET.get("refresh", "False") == "True": + if "commits" in request.session: + request.session.pop("commits", "") + request.session.pop("branchs", "") + return redirect(reverse('cd_commits')) + if filter or not "commits" in request.session: + server = Server.objects.get(name=request.session["deploy_server"]) + + c = Client("git", server.ip, server.port, key=project.sshKey.key) + c.Pull(project.repo, project.working_dir, project.sshKey.key) + res = c.ListCommits(project.working_dir, options={"branch": filter}) + request.session["commits"] = res + else: + res = request.session["commits"] + + if not "branchs" in request.session: + if not c: + server = Server.objects.get(name=request.session["deploy_server"]) + project = Project.objects.get(name=request.session["deploy_project"]) + c = Client("git", server.ip, server.port, key=project.sshKey.key) + branches = c.ListBranchs(project.working_dir) + else: + branches = request.session["branchs"] + request.session["branchs"] = branches + table = CommitTable(res) + table_to_report = RequestConfig(request, paginate={"per_page": 15}).configure(table) + if table_to_report: + return create_report_http_response(table_to_report, request) + return render(request,"deploy2.html", + {"project": project, "mode": "commits", "commits": table, "branchs": branches, + "current_branch": filter}) + + +@login_required(redirect_field_name="redirect") +def getProjectDepHistory(request): + project_name = request.GET["project"] + details = False + text = text = "Show all deployment history" + if "details" in request.GET: + if request.GET["details"] == "True": + details = True + text = "Show latest updates" + deployments = Deployment_Server.objects.filter(project__name=project_name).order_by("-datetime") + res = [] + servers = [] + for deployment in deployments: + if not details and deployment.server.name in servers: continue + servers.append(deployment.server.name) + c = Client(deployment.project.repo_type, deployment.server.ip, deployment.server.port) + if deployment.update_type == "commit": + commits = c.getCommitsDiff(deployment.project.working_dir, deployment.update_version) + print(commits) + deployment.has_new_version = len(commits) + print(deployment.server, deployment.has_new_version) + res.append(deployment) + + table = DeploymentHistory(res) + RequestConfig(request, paginate={"per_page": 15}).configure(table) + return render(request,"modify.html", + {"table": table, "name": "Deployments for %s" % project_name, "text": text}) diff --git a/webapp/autoDeploy/integration/__init__.py b/webapp/autoDeploy/integration/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/webapp/autoDeploy/integration/admin.py b/webapp/autoDeploy/integration/admin.py new file mode 100644 index 0000000..65389dc --- /dev/null +++ b/webapp/autoDeploy/integration/admin.py @@ -0,0 +1,12 @@ +from django.contrib import admin +from django.apps import apps + +# Register your models here. +def autoregister(*app_list): + for model in apps.get_models(): + try: + admin.site.register(model) + except Exception: + pass + +autoregister('CI', 'admin') diff --git a/webapp/autoDeploy/integration/apps.py b/webapp/autoDeploy/integration/apps.py new file mode 100644 index 0000000..6de3793 --- /dev/null +++ b/webapp/autoDeploy/integration/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class IntegrationConfig(AppConfig): + name = 'integration' diff --git a/webapp/autoDeploy/integration/forms.py b/webapp/autoDeploy/integration/forms.py new file mode 100644 index 0000000..1e94cdd --- /dev/null +++ b/webapp/autoDeploy/integration/forms.py @@ -0,0 +1,72 @@ +__author__ = 'mohamed' +from django import forms +from . import models +from deployment.models import Server, SSHKey +import os +import autoDeploy.settings as settings + +repo_type = [('git', 'git')] +update_style = [('commit', "commits"), ("tag", "tags")] + + +def saveFile(file, project_name): + if file == '': + print("No File to save.") + return '' + if not os.path.exists(settings.MEDIA_ROOT+"/"+project_name): + os.makedirs(settings.MEDIA_ROOT+"/"+project_name) + fpath = settings.MEDIA_ROOT+"/"+project_name+"/"+file.name + with open(fpath, 'wb+') as destination: + for chunk in file.chunks(): + destination.write(chunk) + return fpath + +class CIProjectsForm(forms.ModelForm): + working_dir = forms.CharField(label="Working Directory", widget=forms.TextInput(attrs={'class': 'form-control', 'size': 30})) + repo_type = forms.ChoiceField(choices=repo_type, label="Repo Type", widget=forms.Select(attrs={"class": "form-control"})) + update_style = forms.ChoiceField(choices=update_style,label="Update Style",widget=forms.Select(attrs={"class":"form-control"})) + cfile = forms.FileField(label="Config File") + name = forms.CharField(label='Project Name',widget=forms.TextInput(attrs={'class':'form-control','size':30})) + repo_link = forms.CharField(label='Repo Link',widget=forms.TextInput(attrs={'class':'form-control','size':30})) + repo = forms.CharField(label='Repo',widget=forms.TextInput(attrs={'class':'form-control','size':30})) + integration_link = forms.CharField(label='Integration Link',widget=forms.TextInput(attrs={'class':'form-control','size':30})) + emailUsers = forms.CharField(required=False,label='Users emails',help_text="comma seprated list of emails of users to notify when new version integrated",widget=forms.TextInput(attrs={'class':'form-control','size':30})) + default_server = forms.ModelChoiceField(queryset=Server.objects.all(),empty_label="Select",widget=forms.Select(attrs={"class":"form-control"}),label="Default Server") + sshKey = forms.ModelChoiceField(queryset=SSHKey.objects.all(), empty_label="Select",label="SSH Key",widget=forms.Select(attrs={"class": "form-control"})) + default_branch = forms.CharField(label='Default Branch', widget=forms.TextInput(attrs={'class': 'form-control', 'size': 30})) + + def __init__(self, *args, **kwargs): + super(CIProjectsForm, self).__init__(*args, **kwargs) + instance = getattr(self, 'instance', None) + if instance and instance.pk: + self.fields['name'].widget.attrs['readonly'] = True + + def save(self, files, name): + P = models.CIProject() + P.name = self.cleaned_data["name"] + P.integration_link = self.cleaned_data["integration_link"] + P.repo = self.cleaned_data["repo"] + P.repo_link = self.cleaned_data["repo_link"] + P.repo_type = self.cleaned_data["repo_type"] + P.working_dir = self.cleaned_data["working_dir"] + P.sshKey = self.cleaned_data["sshKey"] + P.default_server = self.cleaned_data["default_server"] + P.update_style = self.cleaned_data["update_style"] + P.emailUsers = self.cleaned_data["emailUsers"] + P.default_branch = self.cleaned_data["default_branch"] + + print("Files is ", files) + f = files.get('cfile', '') + if f != "": + P.configFile = saveFile(files.get('cfile', ''), name) + P.save() + + class Meta: + model = models.CIProject + fields = ("name", "repo", "repo_link", "working_dir", "update_style", "default_branch", "default_server", "repo_type", "sshKey", "integration_link", "cfile", "emailUsers") + + +class CloneForm(forms.Form): + server = forms.ModelChoiceField(queryset=Server.objects.all(), label="Server", required=True, widget=forms.Select(attrs={"class": "form-control"})) + + diff --git a/webapp/autoDeploy/integration/migrations/0001_initial.py b/webapp/autoDeploy/integration/migrations/0001_initial.py new file mode 100644 index 0000000..711fdee --- /dev/null +++ b/webapp/autoDeploy/integration/migrations/0001_initial.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + + +from django.db import models, migrations +import datetime +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + ('deployment', '0003_migrate_data_from_old_to_new'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='CIProject', + fields=[ + ('name', models.CharField(max_length=50, serialize=False, primary_key=True)), + ('repo_type', models.CharField(max_length=10, blank=True)), + ('repo', models.CharField(max_length=255, blank=True)), + ('update_style', models.CharField(max_length=10, blank=True)), + ('lastCommit', models.CharField(max_length=50, blank=True)), + ('lastTag', models.CharField(max_length=255, blank=True)), + ('lastCommitDate', models.DateTimeField(default='1970-01-01', blank=True)), + ('working_dir', models.FileField(upload_to='', blank=True)), + ('configFile', models.FileField(upload_to='', blank=True)), + ('lastUpdate', models.DateTimeField(default=datetime.datetime(2020, 9, 22, 12, 36, 50, 757401), blank=True)), + ('repo_link', models.URLField(blank=True)), + ('integration_link', models.CharField(max_length=200, blank=True)), + ('newVersion', models.BooleanField(default=False)), + ('emailUsers', models.TextField(default='', blank=True)), + ('autoDeploy', models.BooleanField(default=False)), + ('default_branch', models.CharField(max_length=255, null=True)), + ('default_server', models.ForeignKey(to='deployment.Server', blank=True,on_delete=models.DO_NOTHING)), + ('sshKey', models.ForeignKey(to='deployment.SSHKey',on_delete=models.DO_NOTHING)), + ], + options={ + 'db_table': 'Integration_Project', + }, + ), + migrations.CreateModel( + name='CIUser_Project', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('project', models.ForeignKey(to='integration.CIProject',on_delete=models.DO_NOTHING)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL,on_delete=models.DO_NOTHING)), + ], + options={ + 'db_table': 'Integration_User_Project', + 'verbose_name_plural': 'Integration_Users_Projects', + }, + ), + migrations.CreateModel( + name='Integration_server', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('datetime', models.DateTimeField()), + ('update_type', models.CharField(max_length=6)), + ('update_version', models.CharField(max_length=255)), + ('has_new_version', models.IntegerField(verbose_name=b'Updates Behind')), + ('deployed', models.BooleanField(default=True)), + ('project', models.ForeignKey(to='integration.CIProject',on_delete=models.DO_NOTHING)), + ('server', models.ForeignKey(to='deployment.Server',on_delete=models.DO_NOTHING)), + ], + options={ + 'db_table': 'Integration_Server', + 'get_latest_by': 'id', + }, + ), + ] diff --git a/webapp/autoDeploy/integration/migrations/__init__.py b/webapp/autoDeploy/integration/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/webapp/autoDeploy/integration/models.py b/webapp/autoDeploy/integration/models.py new file mode 100644 index 0000000..c6f6f7a --- /dev/null +++ b/webapp/autoDeploy/integration/models.py @@ -0,0 +1,62 @@ +from django.db import models +from datetime import datetime +from django.contrib.auth.models import User + + +class CIProject(models.Model): + name = models.CharField(max_length=50, blank=False,primary_key=True) + repo_type = models.CharField(max_length=10,blank=True) + repo = models.CharField(max_length=255, blank=True) + default_server = models.ForeignKey('deployment.Server',blank=True,on_delete=models.DO_NOTHING) + update_style = models.CharField(max_length=10,blank=True) + lastCommit = models.CharField(max_length=50,blank=True) + lastTag = models.CharField(max_length=255,blank=True) + lastCommitDate = models.DateTimeField(blank=True,default="1970-01-01") + working_dir = models.FileField(blank=True) + configFile = models.FileField(blank=True) + lastUpdate = models.DateTimeField(blank=True, default=datetime.now()) + sshKey = models.ForeignKey('deployment.SSHKey',on_delete=models.DO_NOTHING) + repo_link = models.URLField(blank=True) + integration_link = models.CharField(max_length=200, blank=True) + newVersion = models.BooleanField(default=False) + emailUsers = models.TextField(default="", blank=True) + autoDeploy = models.BooleanField(default=False) + default_branch = models.CharField(max_length=255, null=True) + + class Meta: + db_table = 'Integration_Project' + + def __unicode__(self): + return self.name + + def __str__(self): + return self.name + + +class Integration_server(models.Model): + datetime = models.DateTimeField() + update_type = models.CharField(max_length=6) + update_version = models.CharField(max_length=255) + has_new_version = models.IntegerField(verbose_name="Updates Behind") + project = models.ForeignKey(CIProject,on_delete=models.DO_NOTHING) + server = models.ForeignKey('deployment.Server',on_delete=models.DO_NOTHING) + deployed = models.BooleanField(default=True) + + class Meta: + get_latest_by = "id" + db_table = 'Integration_Server' + + +class CIUser_Project(models.Model): + user = models.ForeignKey(User,on_delete=models.DO_NOTHING) + project = models.ForeignKey(CIProject,on_delete=models.DO_NOTHING) + + def __unicode__(self): + return "%s -- %s" % (self.user.username, self.project_id) + + def __str__(self): + return "%s -- %s" % (self.user.username, self.project_id) + + class Meta: + verbose_name_plural = "Integration_Users_Projects" + db_table = 'Integration_User_Project' diff --git a/webapp/autoDeploy/integration/tables.py b/webapp/autoDeploy/integration/tables.py new file mode 100644 index 0000000..b5adfda --- /dev/null +++ b/webapp/autoDeploy/integration/tables.py @@ -0,0 +1,62 @@ +import django_tables2 as Table +import django_tables2.tables as tables +from django_tables2_reports.tables import TableReport +from django_tables2.export.views import ExportMixin +from .models import * +__author__ = 'mohamed' + +depLink = """ + {% if not "http" in record.integration_link%} + http://{{record.default_server.DNS}}{{ record.integration_link }} + {% else %} + {{ record.integration_link }} + {% endif %} + """ + +class CIProjectReport(ExportMixin, tables.Table): + name = Table.Column(verbose_name="Project Name") + Operations = Table.TemplateColumn(""" + {% if perms.CI.clone_project %}  {%endif%} + {% if perms.CI.integrate_project %} {% endif %} + + {% if perms.CI.change_project %}   {%endif%} + {% if perms.CI.delete_ci_project %}{%endif%}""") + repo_link = Table.TemplateColumn("{{ record.repo_link }} ",verbose_name="Source Link") + integration_link = Table.TemplateColumn(depLink, verbose_name="Integration Link") + lastUpdate = Table.Column(verbose_name="Last Update") + + class Meta: + model = CIProject + fields = ('name', 'repo_link', 'lastUpdate', 'integration_link') + attrs = {"class": "table table-striped"} + + +class CommitTable(Table.Table): + Short = Table.TemplateColumn("{{record.Short}}",verbose_name="Hash") + Author = Table.Column() + Committed = Table.Column() + Message = Table.Column() + + class Meta: + attrs = {"class": "table table-striped"} + fields = ["Short","Author","Committed","Message"] + sequence = ["Short","Author","Committed","Message"] + + +class TagTable(Table.Table): + ID = Table.TemplateColumn("{{record.Tag}}",verbose_name="Tag") + Tagger = Table.Column() + Date = Table.Column() + Commit = Table.Column() + + class Meta: + attrs = {"class": "table table-striped"} + fields = ["ID", "Tagger", "Date", "Commit"] + sequence = ["ID", "Tagger", "Date", "Commit"] + +class IntegrationHistory(ExportMixin, tables.Table): + class Meta: + model = Integration_server + fields = ["datetime", "server", "update_type", "update_version", "has_new_version"] + sequence = ["datetime", "server", "update_type", "update_version", "has_new_version"] + attrs = {"class": "table table-striped"} \ No newline at end of file diff --git a/webapp/autoDeploy/integration/templates/add_ciproject.html b/webapp/autoDeploy/integration/templates/add_ciproject.html new file mode 100644 index 0000000..fecb8ae --- /dev/null +++ b/webapp/autoDeploy/integration/templates/add_ciproject.html @@ -0,0 +1,30 @@ +{% extends "base.html" %} +{% block content %} +
+ {% if done %} +
+
Project Saved
+
+ {% endif %} +

Add Project

+ {% if error %} +
{{ form.errors }}
+ {% endif %} +
+ {% if edit == True %} + + {% endif %} + {% csrf_token %} +
+ + {{ form.as_table }} +
+ {% if edit %} + + {% else %} + + {% endif %} + +
+ +{% endblock %} \ No newline at end of file diff --git a/webapp/autoDeploy/integration/templates/cloneci.html b/webapp/autoDeploy/integration/templates/cloneci.html new file mode 100644 index 0000000..6e61685 --- /dev/null +++ b/webapp/autoDeploy/integration/templates/cloneci.html @@ -0,0 +1,29 @@ +{% extends "base.html" %} +{% block content %} +
+
+

Clone Project

+ {% if result %} + {% if "ERR:" in result %} +
+ {% else %} +
+ {% endif %} + {{ result }}
+ {% endif %} +
+ {% csrf_token %} + + + + {{ form.as_table }} + + + +
Project{{ request.GET.project }}
The project will be clone to {{ project_workdir }} on the selected server.
+ + + +
+
+{% endblock %} \ No newline at end of file diff --git a/webapp/autoDeploy/integration/templates/integrate.html b/webapp/autoDeploy/integration/templates/integrate.html new file mode 100644 index 0000000..d066f71 --- /dev/null +++ b/webapp/autoDeploy/integration/templates/integrate.html @@ -0,0 +1,20 @@ +{% extends "base.html"%} +{% block content %} +
+
+

Integrate Project

+
+ {% csrf_token %} + + + + {{ form.as_table }} + + +
Project{{ request.GET.project }}
+ + + +
+
+{% endblock %} \ No newline at end of file diff --git a/webapp/autoDeploy/integration/templates/integrate2.html b/webapp/autoDeploy/integration/templates/integrate2.html new file mode 100644 index 0000000..c6fdbe9 --- /dev/null +++ b/webapp/autoDeploy/integration/templates/integrate2.html @@ -0,0 +1,60 @@ +{% extends "base.html"%} +{% load render_table from django_tables2 %} +{% block head %} + +{% endblock %} +{% block content %} +
+
+

Integrate {{ project.name }}

+ + {% if result %} + {% if "ERR:" in result %} +
+ {% else %} +
+ {% endif %} + {{ result }}
+ + {% else %} + + {% if mode == "tags" %} +

List of Tags Show Commits 

+ {% if count > 0 %} + {% render_table tags %} + {% else %} +
There is no tags in the repo
+ {% endif %} + {% elif mode == "commits" %} +

List of Commits Show Tags

+ {% if branchs|length > 1 %} +
+
+ +
+
+ +
+
+ +
+
+ {% endif %} +
+ {% render_table commits %} +
+ {% endif %} + {% endif %} + +{% endblock %} \ No newline at end of file diff --git a/webapp/autoDeploy/integration/templates/modifyci.html b/webapp/autoDeploy/integration/templates/modifyci.html new file mode 100644 index 0000000..f2f9bb0 --- /dev/null +++ b/webapp/autoDeploy/integration/templates/modifyci.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} +{% load render_table from django_tables2 %} + +{% block content %} +
+

{{ name }}

+ {% if text %} + {{ text|safe }}
+ {% endif %} + {% render_table table %} +
+{% endblock %} \ No newline at end of file diff --git a/webapp/autoDeploy/integration/tests.py b/webapp/autoDeploy/integration/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/webapp/autoDeploy/integration/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/webapp/autoDeploy/integration/urls.py b/webapp/autoDeploy/integration/urls.py new file mode 100644 index 0000000..7dabd65 --- /dev/null +++ b/webapp/autoDeploy/integration/urls.py @@ -0,0 +1,15 @@ +from django.urls import path as url,re_path +from . import views + +urlpatterns = [ + url(r'', views.ci_projects, name="ci_index"), + url(r'add_ciproject', views.add_ci_project, name="ci_add_project"), + url(r'cloneci/', views.clone,name='cloneci'), + url(r'getIntegrationHistory/', views.getProjectIntHistory,name='getIntegrationHistory'), + url(r'integrate/', views.integrate,name='integrate'), + url(r'integrate2/', views.integrate2,name='integrate2'), + url(r'integrate3/', views.integrate3,name='integrate3'), + re_path('edit_ciproject/(\w+)/', views.edit_ci_project, name="edit_ciproject"), + re_path('delete_ciproject/(\w+)/', views.delete_ci_project, name="delete_ciproject"), + url(r'listCommits/',views.listCICommits,name='ci_commits'), +] \ No newline at end of file diff --git a/webapp/autoDeploy/integration/views.py b/webapp/autoDeploy/integration/views.py new file mode 100644 index 0000000..c76b56a --- /dev/null +++ b/webapp/autoDeploy/integration/views.py @@ -0,0 +1,220 @@ +from django.shortcuts import render +from django_tables2_reports.utils import create_report_http_response +from .forms import * +from deployment.models import Server, SSHKey +from .tables import * +from django_tables2.export.export import TableExport +from django.views.decorators.csrf import csrf_protect +from django_tables2_reports.config import RequestConfigReport +from django_tables2.config import RequestConfig +import sys +sys.path.append("../../../client") +from autodeploy_client import Client +from django.shortcuts import redirect,reverse +from django.template.context_processors import csrf +from django.contrib.auth.decorators import login_required +from django.http import HttpResponseRedirect + +@login_required(redirect_field_name="redirect") +def ci_projects(request): + name = "CI Projects" + if request.user.is_superuser: + xlstable = CIProjectReport(CIProject.objects.all()) + else: + projects = CIUser_Project.objects.filter(user_id=request.user.id).values_list('project', flat=True) + xlstable = CIProjectReport(CIProject.objects.filter(name__in=list(projects))) + RequestConfig(request, paginate={"per_page": 15}).configure(xlstable) + export_format = request.GET.get('_export', None) + if TableExport.is_valid_format(export_format): + exporter = TableExport(export_format, xlstable) + return exporter.response('table.{}'.format(export_format)) + # table_to_report = RequestConfigReport(request, paginate={"per_page": 15}).configure(xlstable) + # if table_to_report: + # return create_report_http_response(table_to_report, request) + return render(request,"modifyci.html", {"name": name, "table": xlstable}) + + +def add_ci_project(request): + if request.method == "GET": + return render(request,"add_ciproject.html", {"form": CIProjectsForm()}) + else: + form = CIProjectsForm(request.POST, request.FILES) + if request.POST.get("edit", "False") == "True": + project = CIProject.objects.get(name=request.POST["name"]) + project.integration_link = request.POST["integration_link"] + project.repo = request.POST["repo"] + project.repo_type = request.POST["repo_type"] + project.repo_link = request.POST["repo_link"] + project.sshKey = SSHKey.objects.get(name=request.POST["sshKey"]) + project.working_dir = request.POST["working_dir"] + project.default_server = Server.objects.get(name=request.POST["default_server"]) + project.update_style = request.POST["update_style"] + project.emailUsers = request.POST["emailUsers"] + project.default_branch = request.POST["default_branch"] + if request.FILES.get("cfile", "") != "": + project.configFile = saveFile(request.FILES["cfile"], project.name) + project.save() + return render(request,"add_ciproject.html", {"form": form, "done": True}) + if form.is_valid(): + form.save(request.FILES, form.cleaned_data["name"]) + return render(request,"add_ciproject.html", {"form": form, "done": True}) + else: + return render(request,"add_ciproject.html", {"form": form, "error": True}) + + +@csrf_protect +@login_required(redirect_field_name="redirect") +def clone(request): + if request.method == "GET": + project = CIProject.objects.get(name=request.GET["project"]) + return render(request,"cloneci.html", {"form": CloneForm(initial={"server":project.default_server}), "project_workdir": project.working_dir}) + else: + project = CIProject.objects.get(name=request.POST["project"]) + form = CloneForm(request.POST) + if form.is_valid(): + server = Server.objects.get(name=form.cleaned_data["server"]) + token = csrf(request).get("csrf_token") + data = "{scm: '%s', ip: '%s', port: '%s', project_name: '%s', csrfmiddlewaretoken: '%s' }" % (project.repo_type, server.ip, server.port, project.name, token) + return render(request,"base.html", {"project": project, "ajax": True, "data": data, "dataType": "html", + "title": "Cloning " + project.name, "function": "cloneCI"}) + +@login_required(redirect_field_name="redirect") +@csrf_protect +def integrate(request): + if request.method == "GET": + project = CIProject.objects.get(name=request.GET["project"]) + request.session["integrate_project"] = request.GET["project"] + return render(request,"integrate.html", {"form": CloneForm(initial={"server": project.default_server})}) + +@login_required(redirect_field_name="redirect") +def integrate2(request): + server = None + project = CIProject.objects.get(name=request.session["integrate_project"]) + if request.method == "POST": + form = CloneForm(request.POST) + if form.is_valid(): + server = Server.objects.get(name=request.POST["server"]) + request.session["integrate_server"] = request.POST["server"] + else: + url = reverse('integrate')+"?project="+request.session["integrate_project"] + # return HttpResponseRedirect("../integrate?project="+request.session["integrate_project"]) + return HttpResponseRedirect(redirect(url)) + else: + server = Server.objects.get(name=request.session["integrate_server"]) + if request.GET.get("refresh","False")=="True": + c=Client(str(project.repo_type), server.ip, server.port, project.sshKey.key) + c.Pull(project.repo, project.working_dir, project.sshKey.key) + if project.update_style == "tag": + return listTags(request, server) + else: + filter = request.GET.get("filter", None) + return listCICommits(request, filter) + + +@login_required(redirect_field_name="redirect") +def listTags(request, server): + project = CIProject.objects.get(name=request.session["integrate_project"]) + c = Client(str(project.repo_type), server.ip, server.port, key=project.sshKey.key) + res = c.ListTags(project.working_dir) + print(res) + table = TagTable(res) + table_to_report = RequestConfig(request, paginate={"per_page": 15}).configure(table) + if table_to_report: + return create_report_http_response(table_to_report, request) + return render(request,"integrate2.html", {"project": project, "count": len(res), "mode": "tags", "tags": table}) + + +@login_required(redirect_field_name="redirect") +def integrate3(request): + if request.method == "GET": + token = csrf(request).get("csrf_token") + if "tag" in request.GET: + data = '{tag:"%s",csrfmiddlewaretoken:"%s"}'%(request.GET["tag"],token) + elif "commit" in request.GET: + data = '{"commit":"%s",csrfmiddlewaretoken:"%s"}'%(request.GET["commit"],token) + + project = CIProject.objects.get(name=request.session["integrate_project"]) + server = Server.objects.get(name=request.session["integrate_server"]) + return render(request,"base.html", {"project":project, "ajax": True, "data": data, "dataType": "html", "function": "integrate", + "title": "integrateing %s on %s" % (project.name, server.name)}) + + +def edit_ci_project(request, project): + if request.method == "GET": + project = CIProject.objects.get(name=project) + form = CIProjectsForm(instance=project) + return render(request,"add_ciproject.html", {"form": form, "edit": True}) + + +def delete_ci_project(request, name): + if request.method == "GET": + return render(request,"confirm.html", {"form": "../confirm_delete", "name": name, "type": "CI Project", + "back_url": "../../"}) + + + +@login_required(redirect_field_name="redirect") +def getProjectIntHistory(request): + project_name = request.GET["project"] + details = False + text = "Show all integration history" + if "details" in request.GET: + if request.GET["details"] == "True": + details = True + text = "Show latest updates" + integrations = Integration_server.objects.filter(project__name=project_name).order_by("-datetime") + res = [] + servers = [] + for integration in integrations: + if not details and integration.server.name in servers: continue + servers.append(integration.server.name) + c = Client(integration.project.repo_type, integration.server.ip, integration.server.port) + if integration.update_type == "commit": + commits = c.getCommitsDiff(integration.project.working_dir, integration.update_version) + print(commits) + integration.has_new_version = len(commits) + print(integration.server, integration.has_new_version) + res.append(integration) + table = IntegrationHistory(res) + RequestConfig(request, paginate={"per_page": 15}).configure(table) + return render(request,"modifyci.html", {"table": table, "name": "Integration for %s" % project_name, "text": text}) + +@login_required(redirect_field_name="redirect") +def listCICommits(request, filter=None): + # if request.method == "GET": + res = None + branches = [] + c = None + server = None + project = None + project = CIProject.objects.get(name=request.session["integrate_project"]) + if filter == None: filter = project.default_branch if project.default_branch not in ("", None) else None + print(request.GET.get("refresh", "False")) + if request.GET.get("refresh", "False") == "True": + if "commits" in request.session: + request.session.pop("commits", "") + request.session.pop("branchs", "") + return redirect(reverse('ci_commits')) + if filter or not "commits" in request.session: + server = Server.objects.get(name=request.session["integrate_server"]) + + c = Client("git", server.ip, server.port, key=project.sshKey.key) + c.Pull(project.repo, project.working_dir, project.sshKey.key) + res = c.ListCommits(project.working_dir, options={"branch": filter}) + request.session["commits"] = res + else: + res = request.session["commits"] + if not "branchs" in request.session: + if not c: + server = Server.objects.get(name=request.session["integrate_server"]) + project = CIProject.objects.get(name=request.session["integrate_project"]) + c = Client("git", server.ip, server.port, key=project.sshKey.key) + branches = c.ListBranchs(project.working_dir) + else: + branches = request.session["branchs"] + request.session["branchs"] = branches + table = CommitTable(res) + # table_to_report = RequestConfig(request, paginate={"per_page": 15}).configure(table) + # if table_to_report: + # return create_report_http_response(table_to_report, request) + return render(request,"integrate2.html",{"project": project, "mode": "commits","server":server, "commits": table, "branchs": branches,"current_branch": filter}) \ No newline at end of file diff --git a/webapp/autoDeploy/manage.py b/webapp/autoDeploy/manage.py index 82f4957..f9cf747 100755 --- a/webapp/autoDeploy/manage.py +++ b/webapp/autoDeploy/manage.py @@ -1,10 +1,21 @@ #!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" import os import sys -if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "autoDeploy.settings") - - from django.core.management import execute_from_command_line +def main(): + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'autoDeploy.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/webapp/autoDeploy/media/AutoDeploy/sample.yaml b/webapp/autoDeploy/media/AutoDeploy/sample.yaml old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/media/BioBank/CI.yaml b/webapp/autoDeploy/media/BioBank/CI.yaml new file mode 100644 index 0000000..40dac88 --- /dev/null +++ b/webapp/autoDeploy/media/BioBank/CI.yaml @@ -0,0 +1,10 @@ +tasks: + - location: /opt/git_projects/biobank/tests + interpreter: python3.7 +events: + beforeRun: + - location: /opt/git_projects/biobank/manage.py runserver http://127.0.0.1:8080/ + interpreter: python3.7 + wait: False + afterRun: + - location: "fuser -n tcp -k 8000/tcp" diff --git a/webapp/autoDeploy/media/MatchMaking/registry.yaml b/webapp/autoDeploy/media/MatchMaking/registry.yaml deleted file mode 100644 index 9fec9c6..0000000 --- a/webapp/autoDeploy/media/MatchMaking/registry.yaml +++ /dev/null @@ -1,16 +0,0 @@ -files: - - source: / - destination: /var/www/SGP_Registry2/ - -permissions: - - object: /var/www/SGP_Registry2/ - owner: mohamed - group: users - mode: 755 - type: directory - -events: - afterInstall: - - location: "/var/www/SGP_Registry2/manage.py runserver 0.0.0.0:8001" - interpreter: python - wait: False diff --git a/webapp/autoDeploy/media/MatchMaking5/sample.yaml b/webapp/autoDeploy/media/MatchMaking5/sample.yaml deleted file mode 100644 index 34fa95f..0000000 --- a/webapp/autoDeploy/media/MatchMaking5/sample.yaml +++ /dev/null @@ -1,22 +0,0 @@ -files: - - source: index.html - destination: /var/www/autodeploy/ - - source: test.err - destination: /tmp -permissions: - - object: /var/www/autodeploy/ - owner: www-data - group: www-data - mode: 755 - type: directory -events: - beforeInstall: - - location: /home/mohamed/autoDeploy/autoDeploy/exampleConfig/EventsHandler/delDir.sh - run-as: www-data - interpreter: bash - - location: /home/mohamed/autoDeploy/autoDeploy/exampleConfig/EventsHandler/stopApache.sh - run-as: root - interpreter: bash - afterInstall: - - location: /home/mohamed/autoDeploy/autoDeploy/exampleConfig/EventsHandler/startApache.sh - interpreter: bash diff --git a/webapp/autoDeploy/media/VAT/Installation.md b/webapp/autoDeploy/media/VAT/Installation.md new file mode 100644 index 0000000..c1cfcfc --- /dev/null +++ b/webapp/autoDeploy/media/VAT/Installation.md @@ -0,0 +1,57 @@ +# Introduction + +This document shows how to install autoDeploy on Ubuntu System + +# Install Server + +* Create an autodeploy user +```sh +# adduser --system --home /opt/autodeploy/home --shell /bin/bash autodeploy +``` +* Add autodeploy to sudoers. +```sh +# adduser autodeploy sudo +``` +* Download The latest release from [github](https://github.com/mkalioby/AutoDeploy/releases) +* Expand the downloaded archive to '/opt/autodeploy/home' +* Copy the file in UnixConfig to /etc/sudoers.d/ + +* Install the Client Library +```sh +# cd client; python setup.py install +``` + +* Edit Server init script so that it points to installation directory + +* Copy server init script to /etc/init.d +* Add the init script to the start defaults +```sh +# update-rc.d autodeploy-server start +``` + +# Install Web Application + +* Install required Packages +```sh +# pip install django==1.8 django-tables2==1.0.4 django-tables2-reports +``` + +* Configure your database +* Create empty database in your DBMS. +* Edit Settings file in `webapp/autoDeploy/settings.py`. + +* Create Database by +```sh +$ python manage.py migrate +``` +1. Start Django Sever +```sh +python manage.py runserver IP:PORT +``` + +TBD: A Guide to show how to configure autodeploy Django webapp with Apache should be done. + + + + + diff --git a/webapp/autoDeploy/media/VAT/README.md b/webapp/autoDeploy/media/VAT/README.md new file mode 100644 index 0000000..a87e825 --- /dev/null +++ b/webapp/autoDeploy/media/VAT/README.md @@ -0,0 +1,43 @@ +# AutoDeploy + +[![StackShare](http://img.shields.io/badge/tech-stack-0690fa.svg?style=flat)](http://stackshare.io/mkalioby/autodeploy) + +An automated deployment system which is similar to AWS CodeDeploy but is hostable inside an enterprise. + +The target is to minimize the manual prone errors of code deployment. + +The project will have the following componemts: +* **Deployment Daemon** (to run under root role so it can restart servers). +* **Deployment Client** (which can communicate with the server giving it the scripts to run). +* **Deployment Interface** (to see the progress and it can be used to deploy certain code versions). + +The deployment configuration will be based on YAML Format. + +The client should be callable from CI systems (like Jenkins) to deploy the code after a successful build. + +##Events:## + +The following events will be handled by the system: + +1. **beforeInstall**: This event will run after the code is downloaded, normal will be used to stop servers/decrypt files +2. **Install**: doing the deployment operation itself +3. **afterInstall**: Actions required after Installing like reloading a server. +4. **Validation**: An optiomal step to make sure that everything is OK. + +Every event should have the following format: + +```yaml +events: + event-name + - location: script-location + runas: user-name + ``` +## Requirments ## +### For the Server: +* pyyaml (>3.0) +* pycrypto + +### For the web-application +* django 1.8.1+ +* django-table-2 +* django-table-report diff --git a/webapp/autoDeploy/media/VAT/YAML.md b/webapp/autoDeploy/media/VAT/YAML.md new file mode 100644 index 0000000..2e091f0 --- /dev/null +++ b/webapp/autoDeploy/media/VAT/YAML.md @@ -0,0 +1,100 @@ +# Introduction + +This is document shows the options avaliable in the YAML Config File. + +The full file should be as follows: + +### Sample File + +```yaml +files: + - source: / + destination: /var/www/autodeploy/ + - source: test.err + destination: /tmp +permissions: + - object: /var/www/autodeploy/ + owner: www-data + group: www-data + mode: 755 + type: directory +events: + beforeInstall: + - location: /home/mohamed/autoDeploy/autoDeploy/exampleConfig/EventsHandler/delDir.sh + run-as: www-data + interpreter: bash + - location: /home/mohamed/autoDeploy/autoDeploy/exampleConfig/EventsHandler/stopApache.sh + run-as: root + interpreter: bash + afterInstall: + - location: /home/mohamed/autoDeploy/autoDeploy/exampleConfig/EventsHandler/startApache.sh + interpreter: bash +``` + +# Format + +the format has three main levels: + +## files + these are the files that will be copied to the deployment directory. +It should be in the format +```yaml + - source: / + destination: /var/www/autodeploy/ + - source: test.err + destination: /tmp +``` +***The format can be repeated as many as needed. Both source and destination are required.*** + + The souce can be + + + **File** : This is file will be copied to the destination + + **Directory**: All the directory content will be copied to the destination. + +***Notes*** + + It should end '/' to be detected as a directory in the system. + + Path should be relative to the working directory. + +The destination is the folder where the file should be copied to, the system will always create the directory if it doesn't exist. + +## permissions + +If the special set of permission is required after the files are copied, it can be managed here. + +It should be in the following format: +```yaml +permissions: + - object: /var/www/autodeploy/ + owner: www-data + group: www-data + mode: 755 + type: directory +``` + ++ **object**: is the name of directory or file to manage (required). ++ **owner**: the name of the new owner of object (optional) ++ **group**: the name of the new group which owns the object (required if owner is there) ++ **mode**: the permission previliages as integers (optional) ++ **type**: the type of the object, if it is a directory, the rule will be applied on all the children files and directories. + +## events +events are an optional part where you can tell the deployer to run special scripts before or after the deployment. + +Currently, there are 2 events to handle. + ++ **beforeInstall**: Which be called before anything is done, usually this is used to stop any working servers ++ **afterInstall**: which is called after the everything is done, usually this is used to start the server back. + +It should be in the following format: + +```yaml +beforeInstall: + - location: EventsHandler/delDir.sh + run-as: www-data + interpreter: bash +``` + ++ **location**: the relative path of the script to run. ++ **run-as**: the username of the user who will run this command (optional). ++ **interpreter**: the name of the interpreter that should be used to run the script (optional but highly recommended) + diff --git a/webapp/autoDeploy/media/test/README.md b/webapp/autoDeploy/media/test/README.md new file mode 100644 index 0000000..a87e825 --- /dev/null +++ b/webapp/autoDeploy/media/test/README.md @@ -0,0 +1,43 @@ +# AutoDeploy + +[![StackShare](http://img.shields.io/badge/tech-stack-0690fa.svg?style=flat)](http://stackshare.io/mkalioby/autodeploy) + +An automated deployment system which is similar to AWS CodeDeploy but is hostable inside an enterprise. + +The target is to minimize the manual prone errors of code deployment. + +The project will have the following componemts: +* **Deployment Daemon** (to run under root role so it can restart servers). +* **Deployment Client** (which can communicate with the server giving it the scripts to run). +* **Deployment Interface** (to see the progress and it can be used to deploy certain code versions). + +The deployment configuration will be based on YAML Format. + +The client should be callable from CI systems (like Jenkins) to deploy the code after a successful build. + +##Events:## + +The following events will be handled by the system: + +1. **beforeInstall**: This event will run after the code is downloaded, normal will be used to stop servers/decrypt files +2. **Install**: doing the deployment operation itself +3. **afterInstall**: Actions required after Installing like reloading a server. +4. **Validation**: An optiomal step to make sure that everything is OK. + +Every event should have the following format: + +```yaml +events: + event-name + - location: script-location + runas: user-name + ``` +## Requirments ## +### For the Server: +* pyyaml (>3.0) +* pycrypto + +### For the web-application +* django 1.8.1+ +* django-table-2 +* django-table-report diff --git a/webapp/autoDeploy/my_static/admin/css/base.css b/webapp/autoDeploy/my_static/admin/css/base.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/css/changelists.css b/webapp/autoDeploy/my_static/admin/css/changelists.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/css/dashboard.css b/webapp/autoDeploy/my_static/admin/css/dashboard.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/css/forms.css b/webapp/autoDeploy/my_static/admin/css/forms.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/css/ie.css b/webapp/autoDeploy/my_static/admin/css/ie.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/css/login.css b/webapp/autoDeploy/my_static/admin/css/login.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/css/rtl.css b/webapp/autoDeploy/my_static/admin/css/rtl.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/css/widgets.css b/webapp/autoDeploy/my_static/admin/css/widgets.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/changelist-bg.gif b/webapp/autoDeploy/my_static/admin/img/changelist-bg.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/changelist-bg_rtl.gif b/webapp/autoDeploy/my_static/admin/img/changelist-bg_rtl.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/default-bg-reverse.gif b/webapp/autoDeploy/my_static/admin/img/default-bg-reverse.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/default-bg.gif b/webapp/autoDeploy/my_static/admin/img/default-bg.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/deleted-overlay.gif b/webapp/autoDeploy/my_static/admin/img/deleted-overlay.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/gis/move_vertex_off.png b/webapp/autoDeploy/my_static/admin/img/gis/move_vertex_off.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/gis/move_vertex_on.png b/webapp/autoDeploy/my_static/admin/img/gis/move_vertex_on.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/icon-no.gif b/webapp/autoDeploy/my_static/admin/img/icon-no.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/icon-unknown.gif b/webapp/autoDeploy/my_static/admin/img/icon-unknown.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/icon-yes.gif b/webapp/autoDeploy/my_static/admin/img/icon-yes.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/icon_addlink.gif b/webapp/autoDeploy/my_static/admin/img/icon_addlink.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/icon_alert.gif b/webapp/autoDeploy/my_static/admin/img/icon_alert.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/icon_calendar.gif b/webapp/autoDeploy/my_static/admin/img/icon_calendar.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/icon_changelink.gif b/webapp/autoDeploy/my_static/admin/img/icon_changelink.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/icon_clock.gif b/webapp/autoDeploy/my_static/admin/img/icon_clock.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/icon_deletelink.gif b/webapp/autoDeploy/my_static/admin/img/icon_deletelink.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/icon_error.gif b/webapp/autoDeploy/my_static/admin/img/icon_error.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/icon_searchbox.png b/webapp/autoDeploy/my_static/admin/img/icon_searchbox.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/icon_success.gif b/webapp/autoDeploy/my_static/admin/img/icon_success.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/inline-delete-8bit.png b/webapp/autoDeploy/my_static/admin/img/inline-delete-8bit.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/inline-delete.png b/webapp/autoDeploy/my_static/admin/img/inline-delete.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/inline-restore-8bit.png b/webapp/autoDeploy/my_static/admin/img/inline-restore-8bit.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/inline-restore.png b/webapp/autoDeploy/my_static/admin/img/inline-restore.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/inline-splitter-bg.gif b/webapp/autoDeploy/my_static/admin/img/inline-splitter-bg.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/nav-bg-grabber.gif b/webapp/autoDeploy/my_static/admin/img/nav-bg-grabber.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/nav-bg-reverse.gif b/webapp/autoDeploy/my_static/admin/img/nav-bg-reverse.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/nav-bg-selected.gif b/webapp/autoDeploy/my_static/admin/img/nav-bg-selected.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/nav-bg.gif b/webapp/autoDeploy/my_static/admin/img/nav-bg.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/selector-icons.gif b/webapp/autoDeploy/my_static/admin/img/selector-icons.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/selector-search.gif b/webapp/autoDeploy/my_static/admin/img/selector-search.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/sorting-icons.gif b/webapp/autoDeploy/my_static/admin/img/sorting-icons.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/tooltag-add.png b/webapp/autoDeploy/my_static/admin/img/tooltag-add.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/img/tooltag-arrowright.png b/webapp/autoDeploy/my_static/admin/img/tooltag-arrowright.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/LICENSE-JQUERY.txt b/webapp/autoDeploy/my_static/admin/js/LICENSE-JQUERY.txt old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/SelectBox.js b/webapp/autoDeploy/my_static/admin/js/SelectBox.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/SelectFilter2.js b/webapp/autoDeploy/my_static/admin/js/SelectFilter2.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/actions.js b/webapp/autoDeploy/my_static/admin/js/actions.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/actions.min.js b/webapp/autoDeploy/my_static/admin/js/actions.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/admin/DateTimeShortcuts.js b/webapp/autoDeploy/my_static/admin/js/admin/DateTimeShortcuts.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/admin/RelatedObjectLookups.js b/webapp/autoDeploy/my_static/admin/js/admin/RelatedObjectLookups.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/calendar.js b/webapp/autoDeploy/my_static/admin/js/calendar.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/collapse.js b/webapp/autoDeploy/my_static/admin/js/collapse.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/collapse.min.js b/webapp/autoDeploy/my_static/admin/js/collapse.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/core.js b/webapp/autoDeploy/my_static/admin/js/core.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/inlines.js b/webapp/autoDeploy/my_static/admin/js/inlines.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/inlines.min.js b/webapp/autoDeploy/my_static/admin/js/inlines.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/jquery.init.js b/webapp/autoDeploy/my_static/admin/js/jquery.init.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/jquery.js b/webapp/autoDeploy/my_static/admin/js/jquery.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/jquery.min.js b/webapp/autoDeploy/my_static/admin/js/jquery.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/prepopulate.js b/webapp/autoDeploy/my_static/admin/js/prepopulate.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/prepopulate.min.js b/webapp/autoDeploy/my_static/admin/js/prepopulate.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/related-widget-wrapper.js b/webapp/autoDeploy/my_static/admin/js/related-widget-wrapper.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/timeparse.js b/webapp/autoDeploy/my_static/admin/js/timeparse.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/admin/js/urlify.js b/webapp/autoDeploy/my_static/admin/js/urlify.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/autodeploy.css b/webapp/autoDeploy/my_static/css/autodeploy.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/bootstrap.css b/webapp/autoDeploy/my_static/css/bootstrap.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/font-awesome.css b/webapp/autoDeploy/my_static/css/font-awesome.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/images/black_file.gif b/webapp/autoDeploy/my_static/css/images/black_file.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/images/blue_file.gif b/webapp/autoDeploy/my_static/css/images/blue_file.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/images/index.html b/webapp/autoDeploy/my_static/css/images/index.html old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/images/slide.png b/webapp/autoDeploy/my_static/css/images/slide.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/images/tab_l.gif b/webapp/autoDeploy/my_static/css/images/tab_l.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/images/tab_r.gif b/webapp/autoDeploy/my_static/css/images/tab_r.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/images/trans.png b/webapp/autoDeploy/my_static/css/images/trans.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/metisMenu.css b/webapp/autoDeploy/my_static/css/metisMenu.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/morris.css b/webapp/autoDeploy/my_static/css/morris.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/sb-admin-2.css b/webapp/autoDeploy/my_static/css/sb-admin-2.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/screen.css b/webapp/autoDeploy/my_static/css/screen.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/css/timeline.css b/webapp/autoDeploy/my_static/css/timeline.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/fonts/fontawesome-webfont.woff b/webapp/autoDeploy/my_static/fonts/fontawesome-webfont.woff old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/fonts/glyphicons-halflings-regular.woff b/webapp/autoDeploy/my_static/fonts/glyphicons-halflings-regular.woff old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/img/csv_icon.png b/webapp/autoDeploy/my_static/img/csv_icon.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/img/loading.gif b/webapp/autoDeploy/my_static/img/loading.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/img/logo.png b/webapp/autoDeploy/my_static/img/logo.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/img/xls_icon.png b/webapp/autoDeploy/my_static/img/xls_icon.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/js/bootstrap.js b/webapp/autoDeploy/my_static/js/bootstrap.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/js/functions.js b/webapp/autoDeploy/my_static/js/functions.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/js/jquery.min.js b/webapp/autoDeploy/my_static/js/jquery.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/js/metisMenu.js b/webapp/autoDeploy/my_static/js/metisMenu.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/js/morris.js b/webapp/autoDeploy/my_static/js/morris.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/my_static/js/sb-admin-2.js b/webapp/autoDeploy/my_static/js/sb-admin-2.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/css/base.css b/webapp/autoDeploy/static/admin/css/base.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/css/changelists.css b/webapp/autoDeploy/static/admin/css/changelists.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/css/dashboard.css b/webapp/autoDeploy/static/admin/css/dashboard.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/css/forms.css b/webapp/autoDeploy/static/admin/css/forms.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/css/ie.css b/webapp/autoDeploy/static/admin/css/ie.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/css/login.css b/webapp/autoDeploy/static/admin/css/login.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/css/rtl.css b/webapp/autoDeploy/static/admin/css/rtl.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/css/widgets.css b/webapp/autoDeploy/static/admin/css/widgets.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/changelist-bg.gif b/webapp/autoDeploy/static/admin/img/changelist-bg.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/changelist-bg_rtl.gif b/webapp/autoDeploy/static/admin/img/changelist-bg_rtl.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/default-bg-reverse.gif b/webapp/autoDeploy/static/admin/img/default-bg-reverse.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/default-bg.gif b/webapp/autoDeploy/static/admin/img/default-bg.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/deleted-overlay.gif b/webapp/autoDeploy/static/admin/img/deleted-overlay.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/gis/move_vertex_off.png b/webapp/autoDeploy/static/admin/img/gis/move_vertex_off.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/gis/move_vertex_on.png b/webapp/autoDeploy/static/admin/img/gis/move_vertex_on.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/icon-no.gif b/webapp/autoDeploy/static/admin/img/icon-no.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/icon-unknown.gif b/webapp/autoDeploy/static/admin/img/icon-unknown.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/icon-yes.gif b/webapp/autoDeploy/static/admin/img/icon-yes.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/icon_addlink.gif b/webapp/autoDeploy/static/admin/img/icon_addlink.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/icon_alert.gif b/webapp/autoDeploy/static/admin/img/icon_alert.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/icon_calendar.gif b/webapp/autoDeploy/static/admin/img/icon_calendar.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/icon_changelink.gif b/webapp/autoDeploy/static/admin/img/icon_changelink.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/icon_clock.gif b/webapp/autoDeploy/static/admin/img/icon_clock.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/icon_deletelink.gif b/webapp/autoDeploy/static/admin/img/icon_deletelink.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/icon_error.gif b/webapp/autoDeploy/static/admin/img/icon_error.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/icon_searchbox.png b/webapp/autoDeploy/static/admin/img/icon_searchbox.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/icon_success.gif b/webapp/autoDeploy/static/admin/img/icon_success.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/inline-delete-8bit.png b/webapp/autoDeploy/static/admin/img/inline-delete-8bit.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/inline-delete.png b/webapp/autoDeploy/static/admin/img/inline-delete.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/inline-restore-8bit.png b/webapp/autoDeploy/static/admin/img/inline-restore-8bit.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/inline-restore.png b/webapp/autoDeploy/static/admin/img/inline-restore.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/inline-splitter-bg.gif b/webapp/autoDeploy/static/admin/img/inline-splitter-bg.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/nav-bg-grabber.gif b/webapp/autoDeploy/static/admin/img/nav-bg-grabber.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/nav-bg-reverse.gif b/webapp/autoDeploy/static/admin/img/nav-bg-reverse.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/nav-bg-selected.gif b/webapp/autoDeploy/static/admin/img/nav-bg-selected.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/nav-bg.gif b/webapp/autoDeploy/static/admin/img/nav-bg.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/selector-icons.gif b/webapp/autoDeploy/static/admin/img/selector-icons.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/selector-search.gif b/webapp/autoDeploy/static/admin/img/selector-search.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/sorting-icons.gif b/webapp/autoDeploy/static/admin/img/sorting-icons.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/tooltag-add.png b/webapp/autoDeploy/static/admin/img/tooltag-add.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/img/tooltag-arrowright.png b/webapp/autoDeploy/static/admin/img/tooltag-arrowright.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/LICENSE-JQUERY.txt b/webapp/autoDeploy/static/admin/js/LICENSE-JQUERY.txt old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/SelectBox.js b/webapp/autoDeploy/static/admin/js/SelectBox.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/SelectFilter2.js b/webapp/autoDeploy/static/admin/js/SelectFilter2.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/actions.js b/webapp/autoDeploy/static/admin/js/actions.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/actions.min.js b/webapp/autoDeploy/static/admin/js/actions.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/admin/DateTimeShortcuts.js b/webapp/autoDeploy/static/admin/js/admin/DateTimeShortcuts.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/admin/RelatedObjectLookups.js b/webapp/autoDeploy/static/admin/js/admin/RelatedObjectLookups.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/calendar.js b/webapp/autoDeploy/static/admin/js/calendar.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/collapse.js b/webapp/autoDeploy/static/admin/js/collapse.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/collapse.min.js b/webapp/autoDeploy/static/admin/js/collapse.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/core.js b/webapp/autoDeploy/static/admin/js/core.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/inlines.js b/webapp/autoDeploy/static/admin/js/inlines.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/inlines.min.js b/webapp/autoDeploy/static/admin/js/inlines.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/jquery.init.js b/webapp/autoDeploy/static/admin/js/jquery.init.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/jquery.js b/webapp/autoDeploy/static/admin/js/jquery.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/jquery.min.js b/webapp/autoDeploy/static/admin/js/jquery.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/prepopulate.js b/webapp/autoDeploy/static/admin/js/prepopulate.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/prepopulate.min.js b/webapp/autoDeploy/static/admin/js/prepopulate.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/related-widget-wrapper.js b/webapp/autoDeploy/static/admin/js/related-widget-wrapper.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/timeparse.js b/webapp/autoDeploy/static/admin/js/timeparse.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/admin/js/urlify.js b/webapp/autoDeploy/static/admin/js/urlify.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/autodeploy.css b/webapp/autoDeploy/static/css/autodeploy.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/bootstrap.css b/webapp/autoDeploy/static/css/bootstrap.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/font-awesome.css b/webapp/autoDeploy/static/css/font-awesome.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/images/black_file.gif b/webapp/autoDeploy/static/css/images/black_file.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/images/blue_file.gif b/webapp/autoDeploy/static/css/images/blue_file.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/images/index.html b/webapp/autoDeploy/static/css/images/index.html old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/images/slide.png b/webapp/autoDeploy/static/css/images/slide.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/images/tab_l.gif b/webapp/autoDeploy/static/css/images/tab_l.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/images/tab_r.gif b/webapp/autoDeploy/static/css/images/tab_r.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/images/trans.png b/webapp/autoDeploy/static/css/images/trans.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/metisMenu.css b/webapp/autoDeploy/static/css/metisMenu.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/morris.css b/webapp/autoDeploy/static/css/morris.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/sb-admin-2.css b/webapp/autoDeploy/static/css/sb-admin-2.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/screen.css b/webapp/autoDeploy/static/css/screen.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/css/timeline.css b/webapp/autoDeploy/static/css/timeline.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/django_tables2/themes/paleblue/css/screen.css b/webapp/autoDeploy/static/django_tables2/themes/paleblue/css/screen.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/arrow-active-down.png b/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/arrow-active-down.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/arrow-active-up.png b/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/arrow-active-up.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/arrow-inactive-down.png b/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/arrow-inactive-down.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/arrow-inactive-up.png b/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/arrow-inactive-up.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/false.gif b/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/false.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/header-bg.png b/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/header-bg.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/missing.png b/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/missing.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/pagination-bg.gif b/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/pagination-bg.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/true.gif b/webapp/autoDeploy/static/django_tables2/themes/paleblue/img/true.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/fonts/fontawesome-webfont.woff b/webapp/autoDeploy/static/fonts/fontawesome-webfont.woff old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/fonts/glyphicons-halflings-regular.woff b/webapp/autoDeploy/static/fonts/glyphicons-halflings-regular.woff old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/img/csv_icon.png b/webapp/autoDeploy/static/img/csv_icon.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/img/loading.gif b/webapp/autoDeploy/static/img/loading.gif old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/img/logo.png b/webapp/autoDeploy/static/img/logo.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/img/xls_icon.png b/webapp/autoDeploy/static/img/xls_icon.png old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/js/bootstrap.js b/webapp/autoDeploy/static/js/bootstrap.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/js/functions.js b/webapp/autoDeploy/static/js/functions.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/js/jquery.min.js b/webapp/autoDeploy/static/js/jquery.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/js/metisMenu.js b/webapp/autoDeploy/static/js/metisMenu.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/js/morris.js b/webapp/autoDeploy/static/js/morris.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/js/qrious.min.js b/webapp/autoDeploy/static/js/qrious.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/js/sb-admin-2.js b/webapp/autoDeploy/static/js/sb-admin-2.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/js/u2f-api.js b/webapp/autoDeploy/static/js/u2f-api.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/mfa/css/bootstrap-toggle.min.css b/webapp/autoDeploy/static/mfa/css/bootstrap-toggle.min.css old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/mfa/js/bootstrap-toggle.min.js b/webapp/autoDeploy/static/mfa/js/bootstrap-toggle.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/mfa/js/cbor.js b/webapp/autoDeploy/static/mfa/js/cbor.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/mfa/js/qrious.min.js b/webapp/autoDeploy/static/mfa/js/qrious.min.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/static/mfa/js/u2f-api.js b/webapp/autoDeploy/static/mfa/js/u2f-api.js old mode 100644 new mode 100755 diff --git a/webapp/autoDeploy/autodeploy/templates/add_server.html b/webapp/autoDeploy/templates/add_server.html similarity index 100% rename from webapp/autoDeploy/autodeploy/templates/add_server.html rename to webapp/autoDeploy/templates/add_server.html diff --git a/webapp/autoDeploy/autodeploy/templates/add_sshkey.html b/webapp/autoDeploy/templates/add_sshkey.html similarity index 100% rename from webapp/autoDeploy/autodeploy/templates/add_sshkey.html rename to webapp/autoDeploy/templates/add_sshkey.html diff --git a/webapp/autoDeploy/templates/base.html b/webapp/autoDeploy/templates/base.html new file mode 100644 index 0000000..24f5b03 --- /dev/null +++ b/webapp/autoDeploy/templates/base.html @@ -0,0 +1,244 @@ +{% load render_table from django_tables2 %} + + + + + + + {{ TITLE }} + + + + + + + + + + + + {% block head %} + {% endblock %} + + {% if ajax %} + + {% endif %} + + + + +
+ + + + +
+ {% block content %} +
+
+

{{ title }}

+ {% if ajax %} +
+ +
+
+ Please wait while your request is processed..... +
+ {% else %} +
{{ text }}
+ {% endif %} + {% endblock %} + +
+ + +
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/webapp/autoDeploy/autodeploy/templates/confirm.html b/webapp/autoDeploy/templates/confirm.html similarity index 100% rename from webapp/autoDeploy/autodeploy/templates/confirm.html rename to webapp/autoDeploy/templates/confirm.html diff --git a/webapp/autoDeploy/autodeploy/templates/django-table2.html b/webapp/autoDeploy/templates/django-table2.html similarity index 100% rename from webapp/autoDeploy/autodeploy/templates/django-table2.html rename to webapp/autoDeploy/templates/django-table2.html diff --git a/webapp/autoDeploy/templates/index.html b/webapp/autoDeploy/templates/index.html new file mode 100644 index 0000000..cb1bbe3 --- /dev/null +++ b/webapp/autoDeploy/templates/index.html @@ -0,0 +1,7 @@ +{% extends "base.html" %} +{% block content %} +
+
+

Welcome to AutoDeploy

+
+{% endblock %} \ No newline at end of file diff --git a/webapp/autoDeploy/autodeploy/templates/servers_status.html b/webapp/autoDeploy/templates/servers_status.html similarity index 100% rename from webapp/autoDeploy/autodeploy/templates/servers_status.html rename to webapp/autoDeploy/templates/servers_status.html diff --git a/webapp/autoDeploy/autodeploy/templates/table.html b/webapp/autoDeploy/templates/table.html similarity index 100% rename from webapp/autoDeploy/autodeploy/templates/table.html rename to webapp/autoDeploy/templates/table.html