mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2026-06-27 14:08:04 +02:00
CloudFlare DNS Sync init
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,3 +3,4 @@
|
||||
.LSOverride
|
||||
*.pyc
|
||||
.idea
|
||||
venv
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -499,6 +499,9 @@
|
||||
<li class="addDeleteRecords"><a href="{% url 'addDeleteDNSRecords' %}"
|
||||
title="{% trans 'Add/Delete Records' %}"><span>{% trans "Add/Delete Records" %}</span></a>
|
||||
</li>
|
||||
<li class="addDeleteRecords"><a href="{% url 'addDeleteDNSRecordsCloudFlare' %}"
|
||||
title="{% trans 'CloudFlare' %}"><span>{% trans "CloudFlare" %}</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div><!-- .sidebar-submenu -->
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -640,4 +640,417 @@ app.controller('configureDefaultNameservers', function ($scope, $http) {
|
||||
|
||||
|
||||
});
|
||||
/* Java script code to create NS ends here */
|
||||
/* 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 */
|
||||
496
dns/templates/dns/addDeleteDNSRecordsCloudFlare.html
Executable file
496
dns/templates/dns/addDeleteDNSRecordsCloudFlare.html
Executable file
@@ -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 %}
|
||||
<!-- Current language: {{ LANGUAGE_CODE }} -->
|
||||
|
||||
|
||||
<div class="container">
|
||||
<div id="page-title">
|
||||
<h2>{% trans "Add/Modify DNS Zone" %} - <a target="_blank" href="http://go.cyberpanel.net/dns-records"
|
||||
style="height: 23px;line-height: 21px;"
|
||||
class="btn btn-border btn-alt border-red btn-link font-red"
|
||||
title=""><span>{% trans "DNS Docs" %}</span></a></h2>
|
||||
<p>{% trans "On this page you can add/modify dns records for domains whose dns zone is already created." %}</p>
|
||||
</div>
|
||||
<div ng-controller="addModifyDNSRecordsCloudFlare" class="panel">
|
||||
<div class="panel-body">
|
||||
<h3 class="content-box-header">
|
||||
{% trans "Add Records" %} <img ng-hide="recordsLoading" src="{% static 'images/loading.gif' %}">
|
||||
</h3>
|
||||
<div class="example-box-wrapper">
|
||||
|
||||
|
||||
{% if not status %}
|
||||
|
||||
<div class="col-md-12 text-center" style="margin-bottom: 2%;">
|
||||
<h3>{% trans "PowerDNS is disabled." %}
|
||||
<a href="{% url 'managePowerDNS' %}">
|
||||
<button class="btn btn-alt btn-hover btn-blue-alt">
|
||||
<span>{% trans "Enable Now" %}</span>
|
||||
<i class="glyph-icon icon-arrow-right"></i>
|
||||
</button>
|
||||
</a></h3>
|
||||
</div>
|
||||
|
||||
|
||||
{% else %}
|
||||
|
||||
{% if not CloudFlare %}
|
||||
|
||||
<form action="/" class="form-horizontal bordered-row panel-body">
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">{% trans "CloudFlare Email" %}</label>
|
||||
<div class="col-sm-6">
|
||||
<input name="cfEmail" type="text" class="form-control" ng-model="cfEmail"
|
||||
required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">{% trans "API Token" %}</label>
|
||||
<div class="col-sm-6">
|
||||
<input name="cfToken" type="text" class="form-control" ng-model="cfToken"
|
||||
required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">{% trans "Sync local Records to CloudFlare" %} </label>
|
||||
<div class="col-sm-6">
|
||||
<select ng-model="cfSync" class="form-control">
|
||||
<option>Enable</option>
|
||||
<option>Disable</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label"></label>
|
||||
<div class="col-sm-4">
|
||||
<button type="button" ng-click="saveCFConfigs()"
|
||||
class="btn btn-primary btn-lg">{% trans "Save" %}</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% else %}
|
||||
|
||||
<form action="/" class="form-horizontal bordered-row panel-body">
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">{% trans "Select Domain" %} </label>
|
||||
<div class="col-sm-6">
|
||||
<select ng-change="fetchRecords()" ng-model="selectedZone" class="form-control">
|
||||
{% for items in domainsList %}
|
||||
<option>{{ items }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div ng-hide="addRecordsBox" class="form-group">
|
||||
|
||||
<div class="example-box-wrapper">
|
||||
<ul class="nav nav-tabs">
|
||||
<li ng-click="fetchRecordsTabs('aRecord')" id="aRecord"><a href="">A</a>
|
||||
</li>
|
||||
<li ng-click="fetchRecordsTabs('aaaaRecord')" id="aaaaRecord"><a href="">AAAA</a>
|
||||
</li>
|
||||
<li ng-click="fetchRecordsTabs('cNameRecord')" id="cNameRecord"><a href="">CNAME</a>
|
||||
</li>
|
||||
<li ng-click="fetchRecordsTabs('mxRecord')" id="mxRecord"><a href="">MX</a>
|
||||
</li>
|
||||
<li ng-click="fetchRecordsTabs('txtRecord')" id="txtRecord"><a
|
||||
href="">TXT</a></li>
|
||||
<li ng-click="fetchRecordsTabs('spfRecord')" id="spfRecord"><a
|
||||
href="">SPF</a></li>
|
||||
<li ng-click="fetchRecordsTabs('nsRecord')" id="nsRecord"><a href="">NS</a>
|
||||
</li>
|
||||
<li ng-click="fetchRecordsTabs('soaRecord')" id="soaRecord"><a
|
||||
href="">SOA</a></li>
|
||||
<li ng-click="fetchRecordsTabs('srvRecord')" id="srvRecord"><a
|
||||
href="">SRV</a></li>
|
||||
<li ng-click="fetchRecordsTabs('caaRecord')" id="caaRecord"><a
|
||||
href="">CAA</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!------------- A Record box ------------->
|
||||
|
||||
|
||||
<div class="col-sm-3 aRecord">
|
||||
<input placeholder="{% trans 'Name' %}" name="dom" type="text"
|
||||
class="form-control" ng-model="recordName" required>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 aRecord">
|
||||
<input placeholder="{% trans 'TTL' %}" type="number" class="form-control"
|
||||
ng-model="ttl" required>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 aRecord">
|
||||
<input placeholder="{% trans 'IP Address' %}" name="dom" type="text"
|
||||
class="form-control" ng-model="recordContentA" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-3 aRecord">
|
||||
<button style="width: 100%;" type="button" ng-click="addDNSRecord('A')"
|
||||
class="btn btn-primary">{% trans "Add" %}</button>
|
||||
</div>
|
||||
|
||||
<!------------- A Record box ------------->
|
||||
|
||||
<!------------- AAAA Record box ------------->
|
||||
|
||||
|
||||
<div class="col-sm-3 aaaaRecord">
|
||||
<input placeholder="{% trans 'Name' %}" name="dom" type="text"
|
||||
class="form-control" ng-model="recordName" required>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 aaaaRecord">
|
||||
<input placeholder="{% trans 'TTL' %}" type="number" class="form-control"
|
||||
ng-model="ttl" required>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 aaaaRecord">
|
||||
<input placeholder="{% trans 'IPV6 Address' %}" name="dom" type="text"
|
||||
class="form-control" ng-model="recordContentAAAA" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-3 aaaaRecord">
|
||||
<button style="width: 100%;" type="button" ng-click="addDNSRecord('AAAA')"
|
||||
class="btn btn-primary">{% trans "Add" %}</button>
|
||||
</div>
|
||||
|
||||
<!------------- AAAA Record box ------------->
|
||||
|
||||
|
||||
<!------------- CNAME Record box ------------->
|
||||
|
||||
|
||||
<div class="col-sm-3 cNameRecord">
|
||||
<input placeholder="{% trans 'Name' %}" type="text" class="form-control"
|
||||
ng-model="recordName" required>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 cNameRecord">
|
||||
<input placeholder="{% trans 'TTL' %}" type="number" class="form-control"
|
||||
ng-model="ttl" required>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 cNameRecord">
|
||||
<input placeholder="{% trans 'Domain Name' %}" type="text" class="form-control"
|
||||
ng-model="recordContentCNAME" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-3 cNameRecord">
|
||||
<button style="width: 100%;" type="button" ng-click="addDNSRecord('CNAME')"
|
||||
class="btn btn-primary">{% trans "Add" %}</button>
|
||||
</div>
|
||||
|
||||
<!------------- CNAME Record box ------------->
|
||||
|
||||
<!------------- MX Record box ------------->
|
||||
|
||||
|
||||
<div class="col-sm-3 mxRecord">
|
||||
<input placeholder="{% trans 'Name' %}" type="text" class="form-control"
|
||||
ng-model="recordName" required>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-2 mxRecord">
|
||||
<input placeholder="{% trans 'TTL' %}" type="number" class="form-control"
|
||||
ng-model="ttl" required>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-2 mxRecord">
|
||||
<input placeholder="{% trans 'Priority' %}" type="number" class="form-control"
|
||||
ng-model="priority" required>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 mxRecord">
|
||||
<input placeholder="{% trans 'Domain Name' %}" type="text" class="form-control"
|
||||
ng-model="recordContentMX" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-2 mxRecord">
|
||||
<button style="width: 100%;" type="button" ng-click="addDNSRecord('MX')"
|
||||
class="btn btn-primary">{% trans "Add" %}</button>
|
||||
</div>
|
||||
|
||||
<!------------- CNAME Record box ------------->
|
||||
|
||||
|
||||
<!------------- SPF Record box ------------->
|
||||
|
||||
|
||||
<div class="col-sm-3 spfRecord">
|
||||
<input placeholder="{% trans 'Name' %}" type="text" class="form-control"
|
||||
ng-model="recordName" required>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 spfRecord">
|
||||
<input placeholder="{% trans 'TTL' %}" type="number" class="form-control"
|
||||
ng-model="ttl" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-3 spfRecord">
|
||||
<input placeholder="{% trans 'Policy' %}" type="text" class="form-control"
|
||||
ng-model="recordContentSPF" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-3 spfRecord">
|
||||
<button style="width: 100%;" type="button" ng-click="addDNSRecord('SPF')"
|
||||
class="btn btn-primary">{% trans "Add" %}</button>
|
||||
</div>
|
||||
|
||||
<!------------- SPF Record box ------------->
|
||||
|
||||
<!------------- TXT Record box ------------->
|
||||
|
||||
|
||||
<div class="col-sm-3 txtRecord">
|
||||
<input placeholder="{% trans 'Name' %}" type="text" class="form-control"
|
||||
ng-model="recordName" required>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 txtRecord">
|
||||
<input placeholder="{% trans 'TTL' %}" type="number" class="form-control"
|
||||
ng-model="ttl" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-3 txtRecord">
|
||||
<input placeholder="{% trans 'Text' %}" type="text" class="form-control"
|
||||
ng-model="recordContentTXT" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-3 txtRecord">
|
||||
<button style="width: 100%;" type="button" ng-click="addDNSRecord('TXT')"
|
||||
class="btn btn-primary">{% trans "Add" %}</button>
|
||||
</div>
|
||||
|
||||
<!------------- TXT Record box ------------->
|
||||
|
||||
<!------------- SOA Record box ------------->
|
||||
|
||||
|
||||
<div class="col-sm-3 soaRecord">
|
||||
<input placeholder="{% trans 'Name' %}" type="text" class="form-control"
|
||||
ng-model="selectedZone" disabled>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 soaRecord">
|
||||
<input placeholder="{% trans 'TTL' %}" type="number" class="form-control"
|
||||
ng-model="ttl" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-3 soaRecord">
|
||||
<input placeholder="{% trans 'SOA Value' %}" type="text" class="form-control"
|
||||
ng-model="recordContentSOA" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-3 soaRecord">
|
||||
<button style="width: 100%;" type="button" ng-click="addDNSRecord('SOA')"
|
||||
class="btn btn-primary">{% trans "Add" %}</button>
|
||||
</div>
|
||||
|
||||
<!------------- SOA Record box ------------->
|
||||
|
||||
<!------------- NS Record box ------------->
|
||||
|
||||
|
||||
<div class="col-sm-3 nsRecord">
|
||||
<input placeholder="{% trans 'Name' %}" type="text" class="form-control"
|
||||
ng-model="selectedZone" disabled>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3 nsRecord">
|
||||
<input placeholder="{% trans 'TTL' %}" type="number" class="form-control"
|
||||
ng-model="ttl" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-3 nsRecord">
|
||||
<input placeholder="{% trans 'Name server' %}" type="text" class="form-control"
|
||||
ng-model="recordContentNS" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-3 nsRecord">
|
||||
<button style="width: 100%;" type="button" ng-click="addDNSRecord('NS')"
|
||||
class="btn btn-primary">{% trans "Add" %}</button>
|
||||
</div>
|
||||
|
||||
<!------------- NS Record box ------------->
|
||||
|
||||
<!------------- SRV Record box ------------->
|
||||
|
||||
|
||||
<div class="col-sm-3 srvRecord">
|
||||
<input placeholder="{% trans 'Name' %}" type="text" class="form-control"
|
||||
ng-model="recordName">
|
||||
</div>
|
||||
|
||||
<div class="col-sm-2 srvRecord">
|
||||
<input placeholder="{% trans 'TTL' %}" type="number" class="form-control"
|
||||
ng-model="ttl" required>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-2 srvRecord">
|
||||
<input placeholder="{% trans 'Prioirty' %}" type="number" class="form-control"
|
||||
ng-model="priority" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-3 srvRecord">
|
||||
<input placeholder="{% trans 'Content' %}" type="text" class="form-control"
|
||||
ng-model="recordContentSRV" required>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-sm-2 srvRecord">
|
||||
<button style="width: 100%;" type="button" ng-click="addDNSRecord('SRV')"
|
||||
class="btn btn-primary">{% trans "Add" %}</button>
|
||||
</div>
|
||||
|
||||
<!------------- SRV Record box ------------->
|
||||
|
||||
<!------------- CAA Record box ------------->
|
||||
|
||||
<div class="col-sm-3 caaRecord">
|
||||
<input placeholder="{% trans 'Name' %}" type="text" class="form-control"
|
||||
ng-model="recordName">
|
||||
</div>
|
||||
<div class="col-sm-3 caaRecord">
|
||||
<input placeholder="{% trans 'TTL' %}" type="number" class="form-control"
|
||||
ng-model="ttl" required>
|
||||
</div>
|
||||
<div class="col-sm-3 caaRecord">
|
||||
<input placeholder='Value e.g: 0 issue "letsencrypt.org"' type="text"
|
||||
class="form-control" ng-model="recordContentCAA" required>
|
||||
</div>
|
||||
<div class="col-sm-3 caaRecord">
|
||||
<button style="width: 100%;" type="button" ng-click="addDNSRecord('CAA')"
|
||||
class="btn btn-primary">{% trans "Add" %}</button>
|
||||
</div>
|
||||
|
||||
<!------------- CAA Record box ------------->
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!------ List of records --------------->
|
||||
|
||||
<div ng-hide="currentRecords" class="form-group">
|
||||
|
||||
<div class="col-sm-12">
|
||||
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{% trans "ID" %}</th>
|
||||
<th>{% trans "Type" %}</th>
|
||||
<th>{% trans "Name" %}</th>
|
||||
<th>{% trans "TTL" %}</th>
|
||||
<th>{% trans "Value" %}</th>
|
||||
<th>{% trans "Priority" %}</th>
|
||||
<th>{% trans "Delete" %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="record in records track by $index">
|
||||
<td ng-bind="record.id"></td>
|
||||
<td ng-bind="record.type"></td>
|
||||
<td ng-bind="record.name"></td>
|
||||
<td ng-bind="record.ttl"></td>
|
||||
<td ng-bind="record.content"></td>
|
||||
<td ng-bind="record.priority"></td>
|
||||
<td ng-click="deleteRecord(record.id)"><img
|
||||
src="{% static 'images/delete.png' %}"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!------ List of records --------------->
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
|
||||
|
||||
<label class="col-sm-3 control-label"></label>
|
||||
<div class="col-sm-4">
|
||||
<div ng-hide="canNotFetchRecords" class="alert alert-danger">
|
||||
<p>{% trans "Cannot fetch records. Error message:" %}{$ errorMessage $}</p>
|
||||
</div>
|
||||
|
||||
<div ng-hide="couldNotAddRecord" class="alert alert-danger">
|
||||
<p>{% trans "Cannot add record. Error message: " %}{$ errorMessage $}</p>
|
||||
</div>
|
||||
|
||||
<div ng-hide="recordsFetched" class="alert alert-success">
|
||||
<p>{% trans "Records successfully fetched for" %} <strong>{$ domainFeteched
|
||||
$}</strong></p>
|
||||
</div>
|
||||
|
||||
<div ng-hide="recordDeleted" class="alert alert-success">
|
||||
<p>{% trans "Record Successfully Deleted" %}</p>
|
||||
</div>
|
||||
|
||||
<div ng-hide="couldNotDeleteRecords" class="alert alert-danger">
|
||||
<p>{% trans "Cannot delete record. Error message:" %} {$ errorMessage $}</p>
|
||||
</div>
|
||||
|
||||
<div ng-hide="recordAdded" class="alert alert-success">
|
||||
<p>{% trans "Record Successfully Added." %}</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div ng-hide="couldNotConnect" class="alert alert-success">
|
||||
<p>{% trans "Could not connect to server. Please refresh this page." %}</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</form>
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
@@ -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'),
|
||||
]
|
||||
19
dns/views.py
19
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)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user