From eb4305c734e47b1b989daccd169ce9d742edc2c9 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 8 Feb 2020 23:09:18 +0500 Subject: [PATCH] CloudFlare DNS Sync init --- .gitignore | 1 + CLManager/CageFS.py | 1 - WebTerminal/CPWebSocket.py | 14 +- .../templates/baseTemplate/index.html | 3 + dns/dnsManager.py | 55 ++ dns/static/dns/dns.js | 415 ++++++++++++++- .../dns/addDeleteDNSRecordsCloudFlare.html | 496 ++++++++++++++++++ dns/urls.py | 4 +- dns/views.py | 19 +- plogical/dnsUtilities.py | 5 + 10 files changed, 1007 insertions(+), 6 deletions(-) create mode 100755 dns/templates/dns/addDeleteDNSRecordsCloudFlare.html diff --git a/.gitignore b/.gitignore index 64dffcb6a..184684c84 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ .LSOverride *.pyc .idea +venv diff --git a/CLManager/CageFS.py b/CLManager/CageFS.py index 5969219f1..81fce624c 100644 --- a/CLManager/CageFS.py +++ b/CLManager/CageFS.py @@ -3,7 +3,6 @@ import sys import os import django sys.path.append('/usr/local/CyberCP') - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() diff --git a/WebTerminal/CPWebSocket.py b/WebTerminal/CPWebSocket.py index 64a7b59cb..28cffc428 100644 --- a/WebTerminal/CPWebSocket.py +++ b/WebTerminal/CPWebSocket.py @@ -1,3 +1,10 @@ +#!/usr/local/CyberCP/bin/python +import sys +import os +import django +sys.path.append('/usr/local/CyberCP') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging import signal import sys import ssl @@ -8,6 +15,7 @@ import json import threading as multi import time + class SSHServer(multi.Thread): OKGREEN = '\033[92m' ENDC = '\033[0m' @@ -25,8 +33,8 @@ class SSHServer(multi.Thread): pass else: SSHServer.DEFAULT_PORT = int(items.split(' ')[1]) - except: - pass + except BaseException as msg: + logging.writeToFile(str(msg)) def loadPublicKey(self): pubkey = '/root/.ssh/cyberpanel.pub' @@ -131,6 +139,8 @@ if __name__ == "__main__": SSHServer.findSSHPort() + print ('SSH Port is set to: %s' % (str(SSHServer.DEFAULT_PORT))) + server = SimpleSSLWebSocketServer('0.0.0.0', '5678', WebTerminalServer, '/usr/local/lscp/conf/cert.pem', '/usr/local/lscp/conf/key.pem', version=ssl.PROTOCOL_TLSv1) def close_sig_handler(signal, frame): diff --git a/baseTemplate/templates/baseTemplate/index.html b/baseTemplate/templates/baseTemplate/index.html index c73ceeaf2..62cf9cb29 100755 --- a/baseTemplate/templates/baseTemplate/index.html +++ b/baseTemplate/templates/baseTemplate/index.html @@ -499,6 +499,9 @@
  • {% trans "Add/Delete Records" %}
  • +
  • {% trans "CloudFlare" %} +
  • diff --git a/dns/dnsManager.py b/dns/dnsManager.py index 0c9777821..d5245d1f7 100755 --- a/dns/dnsManager.py +++ b/dns/dnsManager.py @@ -563,6 +563,61 @@ class DNSManager: writeToFile.close() + final_dic = {'status': 1, 'error_message': "None"} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def addDeleteDNSRecordsCloudFlare(self, request = None, userID = None): + try: + + currentACL = ACLManager.loadedACL(userID) + if ACLManager.currentContextPermission(currentACL, 'addDeleteRecords') == 0: + return ACLManager.loadError() + + if not os.path.exists('/home/cyberpanel/powerdns'): + return render(request, 'dns/addDeleteDNSRecordsCloudFlare.html', {"status": 0}) + + admin = Administrator.objects.get(pk=userID) + + CloudFlare = 0 + + cfPath = '%s%s' %(DNS.CFPath, admin.userName) + + if os.path.exists(cfPath): + CloudFlare = 1 + + domainsList = ACLManager.findAllDomains(currentACL, userID) + + return render(request, 'dns/addDeleteDNSRecordsCloudFlare.html', {"domainsList": domainsList, "status": 1, 'CloudFlare': CloudFlare}) + + except BaseException as msg: + return HttpResponse(str(msg)) + + def saveCFConfigs(self, userID = None, data = None): + try: + cfEmail = data['cfEmail'] + cfToken = data['cfToken'] + cfSync = data['cfSync'] + + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'addDeleteRecords') == 0: + return ACLManager.loadErrorJson('status', 0) + + admin = Administrator.objects.get(pk=userID) + cfPath = '%s%s' % (DNS.CFPath, admin.userName) + + writeToFile = open(cfPath, 'w') + writeToFile.write('%s\n%s\n%s' % (cfEmail, cfToken, cfSync)) + writeToFile.close() + + os.chmod(cfPath, 0o600) + final_dic = {'status': 1, 'error_message': "None"} final_json = json.dumps(final_dic) return HttpResponse(final_json) diff --git a/dns/static/dns/dns.js b/dns/static/dns/dns.js index 6cf85f89b..2aa5c418f 100755 --- a/dns/static/dns/dns.js +++ b/dns/static/dns/dns.js @@ -640,4 +640,417 @@ app.controller('configureDefaultNameservers', function ($scope, $http) { }); -/* Java script code to create NS ends here */ \ No newline at end of file +/* Java script code to create NS ends here */ + +/* Java script code for CloudFlare */ + +app.controller('addModifyDNSRecordsCloudFlare', function ($scope, $http) { + + $scope.saveCFConfigs = function () { + + $scope.recordsLoading = false; + + url = "/dns/saveCFConfigs"; + + var data = { + cfEmail: $scope.cfEmail, + cfToken: $scope.cfToken, + cfSync: $scope.cfSync, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.recordsLoading = true; + + if (response.data.status === 1) { + + new PNotify({ + title: 'Success', + text: 'Changes successfully saved.', + type: 'success' + }); + + + } else { + + + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + + } + + function cantLoadInitialDatas(response) { + $scope.recordsLoading = true; + + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + + + } + + + }; + + + //// + + $scope.addRecordsBox = true; + $scope.currentRecords = true; + $scope.canNotFetchRecords = true; + $scope.recordsFetched = true; + $scope.recordDeleted = true; + $scope.recordAdded = true; + $scope.couldNotConnect = true; + $scope.recordsLoading = true; + $scope.recordDeleted = true; + $scope.couldNotDeleteRecords = true; + $scope.couldNotAddRecord = true; + $scope.recordValueDefault = false; + + // Hide records boxes + $(".aaaaRecord").hide(); + $(".cNameRecord").hide(); + $(".mxRecord").hide(); + $(".txtRecord").hide(); + $(".spfRecord").hide(); + $(".nsRecord").hide(); + $(".soaRecord").hide(); + $(".srvRecord").hide(); + $(".caaRecord").hide(); + + + var currentSelection = "aRecord"; + $("#" + currentSelection).addClass("active"); + + $scope.fetchRecordsTabs = function (recordType) { + $("#" + currentSelection).removeClass("active"); + $("." + currentSelection).hide(); + $scope.recordsLoading = false; + currentSelection = recordType; + $("#" + currentSelection).addClass("active"); + $("." + currentSelection).show(); + populateCurrentRecords(); + }; + + + $scope.fetchRecords = function () { + $scope.recordsLoading = false; + $scope.addRecordsBox = false; + populateCurrentRecords(); + }; + + + $scope.addDNSRecord = function (type) { + + $scope.recordsLoading = false; + + + url = "/dns/addDNSRecord"; + + + // Record specific values + + var data = {}; + + if (type === "MX") { + data.selectedZone = $scope.selectedZone; + data.recordName = $scope.recordName; + data.recordContentMX = $scope.recordContentMX; + data.priority = $scope.priority; + data.ttl = $scope.ttl; + data.recordType = type; + } else if (type === "A") { + + data.selectedZone = $scope.selectedZone; + data.recordName = $scope.recordName; + data.recordContentA = $scope.recordContentA; + data.ttl = $scope.ttl; + data.recordType = type; + + } else if (type === "AAAA") { + data.selectedZone = $scope.selectedZone; + data.recordName = $scope.recordName; + data.recordContentAAAA = $scope.recordContentAAAA; + data.ttl = $scope.ttl; + data.recordType = type; + } else if (type === "CNAME") { + data.selectedZone = $scope.selectedZone; + data.recordName = $scope.recordName; + data.recordContentCNAME = $scope.recordContentCNAME; + data.ttl = $scope.ttl; + data.recordType = type; + } else if (type === "SPF") { + data.selectedZone = $scope.selectedZone; + data.recordName = $scope.recordName; + data.recordContentSPF = $scope.recordContentSPF; + data.ttl = $scope.ttl; + data.recordType = type; + } else if (type === "SOA") { + data.selectedZone = $scope.selectedZone; + data.recordName = $scope.selectedZone; + data.recordContentSOA = $scope.recordContentSOA; + data.ttl = $scope.ttl; + data.recordType = type; + } else if (type === "TXT") { + data.selectedZone = $scope.selectedZone; + data.recordName = $scope.recordName; + data.recordContentTXT = $scope.recordContentTXT; + data.ttl = $scope.ttl; + data.recordType = type; + } else if (type === "NS") { + data.selectedZone = $scope.selectedZone; + data.recordName = $scope.selectedZone; + data.recordContentNS = $scope.recordContentNS; + data.ttl = $scope.ttl; + data.recordType = type; + } else if (type === "SRV") { + data.selectedZone = $scope.selectedZone; + data.recordName = $scope.recordName; + data.recordContentSRV = $scope.recordContentSRV; + data.priority = $scope.priority; + data.ttl = $scope.ttl; + data.recordType = type; + } else if (type === "CAA") { + data.selectedZone = $scope.selectedZone; + data.recordName = $scope.recordName; + data.recordContentCAA = $scope.recordContentCAA; + data.ttl = $scope.ttl; + data.recordType = type; + } + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.add_status === 1) { + + + populateCurrentRecords(); + + $scope.canNotFetchRecords = true; + $scope.recordsFetched = false; + $scope.recordDeleted = true; + $scope.recordAdded = false; + $scope.couldNotConnect = true; + $scope.couldNotAddRecord = true; + $scope.recordsLoading = true; + + + } else { + + $scope.recordsFetched = true; + $scope.recordDeleted = true; + $scope.recordAdded = true; + $scope.couldNotConnect = true; + $scope.recordsLoading = true; + $scope.couldNotAddRecord = false; + + $scope.errorMessage = response.data.error_message; + } + + } + + function cantLoadInitialDatas(response) { + + $scope.addRecordsBox = true; + $scope.currentRecords = true; + $scope.canNotFetchRecords = true; + $scope.recordsFetched = true; + $scope.recordDeleted = true; + $scope.recordAdded = true; + $scope.couldNotConnect = false; + $scope.couldNotAddRecord = true; + + + } + + }; + + + function populateCurrentRecords() { + + var selectedZone = $scope.selectedZone; + + url = "/dns/getCurrentRecordsForDomain"; + + var data = { + selectedZone: selectedZone, + currentSelection: currentSelection + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + if (response.data.fetchStatus === 1) { + + $scope.records = JSON.parse(response.data.data); + + $scope.currentRecords = false; + $scope.canNotFetchRecords = true; + $scope.recordsFetched = false; + $scope.recordDeleted = true; + $scope.recordAdded = true; + $scope.couldNotConnect = true; + $scope.recordsLoading = true; + $scope.couldNotAddRecord = true; + + $scope.domainFeteched = $scope.selectedZone; + + } else { + + $scope.addRecordsBox = true; + $scope.currentRecords = true; + $scope.canNotFetchRecords = false; + $scope.recordsFetched = true; + $scope.recordDeleted = true; + $scope.recordAdded = true; + $scope.couldNotConnect = true; + $scope.recordsLoading = true; + $scope.couldNotAddRecord = true; + + $scope.errorMessage = response.data.error_message; + } + + } + + function cantLoadInitialDatas(response) { + + $scope.addRecordsBox = true; + $scope.currentRecords = true; + $scope.canNotFetchRecords = true; + $scope.recordsFetched = true; + $scope.recordDeleted = true; + $scope.recordAdded = true; + $scope.couldNotConnect = false; + $scope.couldNotAddRecord = true; + + + } + + } + + + $scope.deleteRecord = function (id) { + + + var selectedZone = $scope.selectedZone; + + url = "/dns/deleteDNSRecord"; + + var data = { + id: id, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.delete_status == 1) { + + + $scope.addRecordsBox = false; + $scope.currentRecords = false; + $scope.canNotFetchRecords = true; + $scope.recordsFetched = true; + $scope.recordDeleted = false; + $scope.recordAdded = true; + $scope.couldNotConnect = true; + $scope.recordsLoading = true; + $scope.recordDeleted = true; + $scope.couldNotDeleteRecords = true; + $scope.couldNotAddRecord = true; + + populateCurrentRecords(); + + + } else { + + $scope.addRecordsBox = true; + $scope.currentRecords = true; + $scope.canNotFetchRecords = true; + $scope.recordsFetched = false; + $scope.recordDeleted = true; + $scope.recordAdded = true; + $scope.couldNotConnect = true; + $scope.recordsLoading = true; + $scope.recordDeleted = true; + $scope.couldNotDeleteRecords = false; + $scope.couldNotAddRecord = true; + + + $scope.errorMessage = response.data.error_message; + + + } + + } + + function cantLoadInitialDatas(response) { + + $scope.addRecordsBox = false; + $scope.currentRecords = false; + $scope.canNotFetchRecords = true; + $scope.recordsFetched = true; + $scope.recordDeleted = true; + $scope.recordAdded = true; + $scope.couldNotConnect = false; + $scope.recordsLoading = true; + $scope.recordDeleted = true; + $scope.couldNotDeleteRecords = true; + $scope.couldNotAddRecord = true; + + + } + + + }; + + +}); + +/* Java script code for CloudFlare */ \ No newline at end of file diff --git a/dns/templates/dns/addDeleteDNSRecordsCloudFlare.html b/dns/templates/dns/addDeleteDNSRecordsCloudFlare.html new file mode 100755 index 000000000..aa2e1f332 --- /dev/null +++ b/dns/templates/dns/addDeleteDNSRecordsCloudFlare.html @@ -0,0 +1,496 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "Add/Modify DNS Records - CyberPanel" %}{% endblock %} +{% block content %} + + {% load static %} + {% get_current_language as LANGUAGE_CODE %} + + + +
    +
    +

    {% trans "Add/Modify DNS Zone" %} - {% trans "DNS Docs" %}

    +

    {% trans "On this page you can add/modify dns records for domains whose dns zone is already created." %}

    +
    +
    +
    +

    + {% trans "Add Records" %} +

    +
    + + + {% if not status %} + +
    +

    {% trans "PowerDNS is disabled." %} + + +

    +
    + + + {% else %} + + {% if not CloudFlare %} + +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + + + + +
    + +
    + + +
    +
    +
    + + {% else %} + +
    + + +
    + +
    + +
    +
    + + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    + +
    + +
    + + +
    + +
    + + + + + + +
    + +
    + +
    + +
    + +
    + +
    + + +
    + +
    + + + + + + + +
    + +
    + +
    + +
    + +
    + +
    + + +
    + +
    + + + + + + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + + +
    + +
    + + + + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    + +
    + + + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    + +
    + + + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    + +
    + + + + + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    + +
    + + + + + + +
    + +
    + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    + +
    + + + + + +
    + +
    +
    + +
    +
    + +
    +
    + +
    + + + + +
    + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    {% trans "ID" %}{% trans "Type" %}{% trans "Name" %}{% trans "TTL" %}{% trans "Value" %}{% trans "Priority" %}{% trans "Delete" %}
    +
    +
    + + + + +
    + + + +
    +
    +

    {% trans "Cannot fetch records. Error message:" %}{$ errorMessage $}

    +
    + +
    +

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

    +
    + +
    +

    {% trans "Records successfully fetched for" %} {$ domainFeteched + $}

    +
    + +
    +

    {% trans "Record Successfully Deleted" %}

    +
    + +
    +

    {% trans "Cannot delete record. Error message:" %} {$ errorMessage $}

    +
    + +
    +

    {% trans "Record Successfully Added." %}

    +
    + + +
    +

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

    +
    + +
    +
    + + +
    + + {% endif %} + + {% endif %} + + +
    +
    +
    + + +
    + + +{% endblock %} diff --git a/dns/urls.py b/dns/urls.py index 3f6059006..2dda84b8f 100755 --- a/dns/urls.py +++ b/dns/urls.py @@ -6,7 +6,8 @@ urlpatterns = [ url(r'^createNameserver', views.createNameserver, name='createNameserver'), url(r'^configureDefaultNameServers$', views.configureDefaultNameServers, name='configureDefaultNameServers'), url(r'^createDNSZone', views.createDNSZone, name='createDNSZone'), - url(r'^addDeleteDNSRecords', views.addDeleteDNSRecords, name='addDeleteDNSRecords'), + url(r'^addDeleteDNSRecords$', views.addDeleteDNSRecords, name='addDeleteDNSRecords'), + url(r'^addDeleteDNSRecordsCloudFlare$', views.addDeleteDNSRecordsCloudFlare, name='addDeleteDNSRecordsCloudFlare'), # JS Functions url(r'^NSCreation',views.NSCreation,name="NSCreation"), @@ -17,4 +18,5 @@ urlpatterns = [ url(r'^deleteDNSZone',views.deleteDNSZone,name='deleteDNSZone'), url(r'^submitZoneDeletion',views.submitZoneDeletion,name='submitZoneDeletion'), url(r'^saveNSConfigurations$', views.saveNSConfigurations, name='saveNSConfigurations'), + url(r'^saveCFConfigs$', views.saveCFConfigs, name='saveCFConfigs'), ] \ No newline at end of file diff --git a/dns/views.py b/dns/views.py index b391ab16f..f5b8b2c12 100755 --- a/dns/views.py +++ b/dns/views.py @@ -169,7 +169,24 @@ def saveNSConfigurations(request): except KeyError: return redirect(loadLoginPage) - +def addDeleteDNSRecordsCloudFlare(request): + try: + userID = request.session['userID'] + dm = DNSManager() + return dm.addDeleteDNSRecordsCloudFlare(request, userID) + except KeyError: + return redirect(loadLoginPage) + +def saveCFConfigs(request): + try: + userID = request.session['userID'] + + dm = DNSManager() + coreResult = dm.saveCFConfigs(userID, json.loads(request.body)) + + return coreResult + except KeyError: + return redirect(loadLoginPage) diff --git a/plogical/dnsUtilities.py b/plogical/dnsUtilities.py index 80f3eb9f1..afa07d2e4 100755 --- a/plogical/dnsUtilities.py +++ b/plogical/dnsUtilities.py @@ -16,6 +16,7 @@ try: from manageServices.models import PDNSStatus, SlaveServers except: pass +import CloudFlare class DNS: @@ -23,6 +24,7 @@ class DNS: zones_base_dir = "/usr/local/lsws/conf/zones/" create_zone_dir = "/usr/local/lsws/conf/zones" defaultNameServersPath = '/home/cyberpanel/defaultNameservers' + CFPath = '/home/cyberpanel/CloudFlare' ## DNS Functions @@ -35,6 +37,9 @@ class DNS: ipData = f.read() ipAddress = ipData.split('\n', 1)[0] + #cf = CloudFlare.CloudFlare(email='help@cyberhosting.org',token='5c033412c01a5bf8c1979182ea500057690d7') + #zone_info = cf.zones.post(data={'jump_start': False, 'name': domain}) + import tldextract extractDomain = tldextract.extract(domain)