Merge branch 'v1.9.5' into qtwrkdev

This commit is contained in:
qtwrk
2020-02-12 17:04:31 +01:00
25 changed files with 2182 additions and 29 deletions

View File

@@ -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()

View File

@@ -0,0 +1,126 @@
#!/bin/bash
## Author: Michael Ramsey
## Objective Find A Cyberpanel Users Domlogs Stats for last 5 days for all of their domains. v2
## https://gitlab.com/cyberpaneltoolsnscripts/snapshotbycyberpaneluser
## How to use.
# ./CyberpanelSnapshotByCyberpanelUser.sh username
#./CyberpanelSnapshotCyberpanelUser.sh exampleuserbob
#
##bash <(curl -s https://gitlab.com/cyberpaneltoolsnscripts/snapshotbycyberpaneluser/-/raw/master/CyberpanelSnapshotByCyberpanelUser.sh || wget -qO - https://gitlab.com/cyberpaneltoolsnscripts/snapshotbycyberpaneluser/-/raw/master/CyberpanelSnapshotByCyberpanelUser.sh) exampleuserbob;
##
Username=$1
#CURRENTDATE=$(date +"%Y-%m-%d %T") # 2019-02-09 06:47:56
#PreviousDay1=$(date --date='1 day ago' +"%Y-%m-%d") # 2019-02-08
#PreviousDay2=$(date --date='2 days ago' +"%Y-%m-%d") # 2019-02-07
#PreviousDay3=$(date --date='3 days ago' +"%Y-%m-%d") # 2019-02-06
#PreviousDay4=$(date --date='4 days ago' +"%Y-%m-%d") # 2019-02-05
#datetimeDom=$(date +"%d/%b/%Y") # 09/Feb/2019
#datetimeDom1DaysAgo=$(date --date='1 day ago' +"%d/%b/%Y") # 08/Feb/2019
#datetimeDom2DaysAgo=$(date --date='2 days ago' +"%d/%b/%Y") # 07/Feb/2019
#datetimeDom3DaysAgo=$(date --date='3 days ago' +"%d/%b/%Y") # 06/Feb/2019
#datetimeDom4DaysAgo=$(date --date='4 days ago' +"%d/%b/%Y") # 05/Feb/2019
#Domlog Date array for past 5 days
declare -a datetimeDomLast5_array=($(date +"%d/%b/%Y") $(date --date='1 day ago' +"%d/%b/%Y") $(date --date='2 days ago' +"%d/%b/%Y") $(date --date='3 days ago' +"%d/%b/%Y") $(date --date='4 days ago' +"%d/%b/%Y")); #for DATE in "${datetimeDomLast5_array[@]}"; do echo $DATE; done;
#Get users homedir path
user_homedir=$(sudo egrep "^${Username}:" /etc/passwd | cut -d: -f6)
#setup Domlogs/Accesslog path based off user_homedir/logs
domlogs_path="${user_homedir}/logs/"
Now=$(date +"%Y-%m-%d_%T")
user_CyberpanelSnapshot="${Username}-CyberpanelSnapshot_${Now}.txt";
#create logfile in user's homedirectory.
#sudo touch "$user_CyberpanelSnapshot"
#chown logfile to user
#sudo chown ${Username}:${Username} "$user_CyberpanelSnapshot";
main_function() {
echo ""
echo "Web Traffic Stats Check";
echo "";
for DATE in "${datetimeDomLast5_array[@]}"; do
echo "=============================================================";
echo "Apache Dom Logs POST Requests for ${DATE} for $Username";
sudo grep -r "$DATE" ${domlogs_path} | grep POST | awk '{print $1}' | cut -d: -f1|sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'| sort | uniq -c | sort -rn | head
echo ""
echo "HTTP Dom Logs GET Requests for ${DATE} for $Username"
sudo grep -r "$DATE" ${domlogs_path} | grep GET | awk '{print $1}' | cut -d: -f1 |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'| sort | uniq -c | sort -rn | head
echo ""
echo "HTTP Dom Logs Top 10 bot/crawler requests per domain name for ${DATE}"
sudo grep -r "$DATE" ${domlogs_path} | grep -Ei 'crawl|bot|spider|yahoo|bing|google'| awk '{print $1}' | cut -d: -f1|sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'| sort | uniq -c | sort -rn | head
echo ""
echo "HTTP Dom Logs top ten IPs for ${DATE} for $Username"
command=$(sudo grep -r "$DATE" ${domlogs_path} | grep POST | awk '{print $1}'|sed -e 's/^[^=:]*[=:]//' -e 's|"||g' | sort | uniq -c | sort -rn | head| column -t);readarray -t iparray < <( echo "${command}" | tr '/' '\n'); echo ""; for IP in "${iparray[@]}"; do echo "$IP"; done; echo ""; echo "Show unique IP's with whois IP, Country,and ISP"; echo ""; for IP in "${iparray[@]}"; do IP=$(echo "$IP" |grep -Eo '([0-9]{1,3}[.]){3}[0-9]{1,3}|(*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:)))(%.+)?\s*)'); whois -h whois.cymru.com " -c -p $IP"|cut -d"|" -f 2,4,5|grep -Ev 'IP|whois.cymru.com'; done
echo ""
echo "Checking the IPs that Have Hit the Server Most and What Site they were hitting:"
sudo grep -rs "$DATE" ${domlogs_path} | awk {'print $1'} |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log:/ /g'| sort | uniq -c | sort -n | tail -10| sort -rn| column -t
echo ""
echo "Checking the Top Hits Per Site Per IP:"
sudo grep -rs "$DATE" ${domlogs_path} | awk {'print $1,$6,$7'} |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log:/ /g'| sort | uniq -c | sort -n | tail -15| sort -rn| column -t
echo ""
echo "Apache Dom Logs find the top number of uri's being requested for ${DATE}"
sudo grep -r "$DATE" ${domlogs_path} | grep POST | awk '{print $7}' | cut -d: -f2 |sed "s|$domlogs_path||g"| sort | uniq -c | sort -rn | head| column -t
echo ""
echo "";
echo "View Apache requests per hour for $Username";
sudo grep -r "$DATE" ${domlogs_path} | cut -d[ -f2 | cut -d] -f1 | awk -F: '{print $2":00"}' | sort -n | uniq -c| column -t
echo ""
echo "CMS Checks"
echo ""
echo "Wordpress Checks"
echo "Wordpress Login Bruteforcing checks for wp-login.php for ${DATE} for $Username"
sudo grep -r "$DATE" ${domlogs_path} | grep -E "wp-login.php|wp-admin.php" | cut -f 1 -d ":" |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'|awk {'print $1,$6,$7'} | sort | uniq -c | sort -n|tail| sort -rn
echo ""
echo "Wordpress Cron wp-cron.php(virtual cron) checks for ${DATE} for $Username"
sudo grep -r "$DATE" ${domlogs_path} | grep wp-cron.php| cut -f 1 -d ":" |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'|awk {'print $1,$6,$7'} | sort | uniq -c | sort -n|tail| sort -rn
echo ""
echo "Wordpress XMLRPC Attacks checks for xmlrpc.php for ${DATE} for $Username"
sudo grep -r "$DATE" ${domlogs_path} | grep xmlrpc.php| cut -f 1 -d ":" |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'|awk {'print $1,$6,$7'} | sort | uniq -c | sort -n|tail| sort -rn
echo ""
echo "Wordpress Heartbeat API checks for admin-ajax.php for ${DATE} for $Username"
sudo grep -r "$DATE" ${domlogs_path} | grep admin-ajax.php| cut -f 1 -d ":" |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'|awk {'print $1,$6,$7'} | sort | uniq -c | sort -n|tail| sort -rn;
echo ""
echo "CMS Bruteforce Checks"
echo "Drupal Login Bruteforcing checks for user/login/ for ${DATE} for $Username"
sudo grep -r "$DATE" ${domlogs_path} | grep -E "user/login/" | cut -f 1 -d ":" |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'|awk {'print $1,$6,$7'} | sort | uniq -c | sort -n|tail| sort -rn
echo ""
echo "Magento Login Bruteforcing checks for admin pages /admin_xxxxx/admin/index/index for ${DATE} for $Username"
sudo grep -r "$DATE" ${domlogs_path} | grep -E "admin_[a-zA-Z0-9_]*[/admin/index/index]" | cut -f 1 -d ":" |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'|awk {'print $1,$6,$7'} | sort | uniq -c | sort -n|tail| sort -rn
echo ""
echo "Joomla Login Bruteforcing checks for admin pages /administrator/index.php for ${DATE} for $Username"
sudo grep -r "$DATE" ${domlogs_path} | grep -E "admin_[a-zA-Z0-9_]*[/admin/index/index]" | cut -f 1 -d ":" |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'|awk {'print $1,$6,$7'} | sort | uniq -c | sort -n|tail| sort -rn
echo ""
echo "vBulletin Login Bruteforcing checks for admin pages admincp for ${DATE} for $Username"
sudo grep -r "$DATE" ${domlogs_path} | grep -E "admincp" | cut -f 1 -d ":" |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'|awk {'print $1,$6,$7'} | sort | uniq -c | sort -n|tail| sort -rn
echo ""
echo "Opencart Login Bruteforcing checks for admin pages /admin/index.php for ${DATE} for $Username"
sudo grep -r "$DATE" ${domlogs_path} | grep -E "/admin/index.php" | cut -f 1 -d ":" |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'|awk {'print $1,$6,$7'} | sort | uniq -c | sort -n|tail| sort -rn
echo ""
echo "Prestashop Login Bruteforcing checks for admin pages /adminxxxx for ${DATE} for $Username"
sudo grep -r "$DATE" ${domlogs_path} | grep -E "/admin[a-zA-Z0-9_]*$" | cut -f 1 -d ":" |sed -e "s|$domlogs_path||g" -e 's|"||g' -e 's/.access_log//g'|awk {'print $1,$6,$7'} | sort | uniq -c | sort -n|tail| sort -rn
echo ""
done;
echo "============================================================="
echo "Contents have been saved to ${user_CyberpanelSnapshot}"
}
# log everything, but also output to stdout
main_function 2>&1 | tee -a "${user_CyberpanelSnapshot}"

View File

@@ -0,0 +1,230 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Originally based on code from: https://leancrew.com/all-this/2013/07/parsing-my-apache-logs/
import os
import re
import sys
from collections import Counter
from datetime import datetime, date, timedelta
# print('version is', sys.version)
def detectcontrolpanel():
global controlpanel
try:
if os.path.isfile('/usr/local/cpanel/cpanel'):
controlpanel = 'cpanel'
except:
controlpanel = 'Control Panel not found'
try:
if os.path.isfile('/usr/bin/cyberpanel'):
controlpanel = 'cyberpanel'
except:
controlpanel = 'Control Panel not found'
return controlpanel
def main():
script = sys.argv[0]
filename = sys.argv[2]
# filenametest = "/home/example.com.access_log"
# Define the day of interest in the Apache common log format.
try:
daysAgo = int(sys.argv[1])
# daysAgo = 2
except:
daysAgo = 1
theDay = date.today() - timedelta(daysAgo)
apacheDay = theDay.strftime('[%d/%b/%Y:')
# Regex for the Apache common log format.
parts = [ # host %h :ip/hostname of the client 172.68.142.138
# indent %l (unused) :client identity via client's identd configuration -
# user %u :HTTP authenticated user ID -
# time %t :timestamp [09/Mar/2019:00:38:03 -0600]
# request "%r" :request method of request, resource requested, & protocol "POST /wp-login.php HTTP/1.1"
# status %>s :Apache status code 404
# size %b (careful,can be'-'):size of request in bytes, excluding headers 3767
# referrer "%{Referer}i" :Referer "https://www.google.com/"
# user agent "%{User-agent}i":User-Agent "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"
r'(?P<host>\S+)',
r'\S+',
r'(?P<user>\S+)',
r'\[(?P<time>.+)\]',
r'"(?P<request>.*)"',
r'(?P<status>[0-9]+)',
r'(?P<size>\S+)',
r'"(?P<referrer>.*)"',
r'"(?P<agent>.*)"',
]
pattern = re.compile(r'\s+'.join(parts) + r'\s*\Z')
# Regex for a feed request.
feed = re.compile(r'/all-this/(\d\d\d\d/\d\d/[^/]+/)?feed/(atom/)?')
# Regexes for internal and Google search referrers.
internal = re.compile(r'https?://(www\.)?example\.com.*')
google = re.compile(r'https?://(www\.)?google\..*')
# Regexes for Uptime Monitoring Robots
uptimeroboturl = re.compile(r'https?://(www\.)?uptimerobot\..*')
uptimerobot = re.compile(r'UptimeRobot')
# WordPress CMS Regex
wordpresslogin = re.compile(r'wp-login\.php.*')
wordpressadmin = re.compile(r'wp-admin')
wordpresscron = re.compile(r'wp-cron\.php.*')
wordpressxmlrpc = re.compile(r'xmlrpc\.php')
wordpressajax = re.compile(r'admin-ajax\.php')
# Change Apache log items into Python types.
def pythonized(d):
# Clean up the request.
d['request'] = d['request'].split()[1]
# Some dashes become None.
for k in ('user', 'referrer', 'agent'):
if d[k] == '-':
d[k] = None
# The size dash becomes 0.
if d['size'] == '-':
d['size'] = 0
else:
d['size'] = int(d['size'])
# Convert the timestamp into a datetime object. Accept the server's time zone.
(time, zone) = d['time'].split()
d['time'] = datetime.strptime(time, '%d/%b/%Y:%H:%M:%S')
return d
# Is this hit a page?
def ispage(hit):
# Failures and redirects.
hit['status'] = int(hit['status'])
if hit['status'] < 200 or hit['status'] >= 300:
return False
# Feed requests.
if feed.search(hit['request']):
return False
# Requests that aren't GET.
# if (hit['request'])[0:3] != 'GET':
# return False
# Images, sounds, etc.
if hit['request'].split()[1][-1] != '/':
return False
# Requests that aren't Head type. AKA uptime monitoring
if (hit['request'])[0:3] == 'HEAD':
return False
# Must be a page.
return True
# Is the referrer interesting? Internal and Google referrers are not.
def goodref(hit):
if hit['referrer']:
return not (google.search(hit['referrer'])
or internal.search(hit['referrer']))
else:
return False
# Is the user agent interesting? An uptime monitoring robot is not.
def goodagent(hit):
if hit['agent']:
return not (uptimerobot.search(hit['agent'])
or uptimeroboturl.search(hit['agent']))
else:
return False
# Is the request a Wordpress related login event?
def wordpressbrute(hit):
if hit['request']:
return (wordpresslogin.search(hit['request'])
or wordpressadmin.search(hit['request']))
else:
return False
# Initialize.
pages = []
# Parse all the lines associated with the day of interest.
# Open file
log = open(filename)
for line in log:
if apacheDay in line:
m = pattern.match(line)
hit = m.groupdict()
if ispage(hit):
pages.append(pythonized(hit))
else:
continue
log.close()
# Show the top five pages and the total.
print ('Show top 10 pages %s' % theDay.strftime('%b %d, %Y'))
pageviews = Counter(x['request'] for x in pages if goodagent(x))
pagestop10 = pageviews.most_common(10)
for p in pagestop10:
print (' %5d %s' % p[::-1])
print (' %5d total' % len(pages))
# Show the top five referrers.
print ('''
Show top 10 referrers %s''' % theDay.strftime('%b %d, %Y'))
referrers = Counter(x['referrer'] for x in pages if goodref(x))
referrerstop10 = referrers.most_common(10)
for r in referrerstop10:
print (' %5d %s' % r[::-1])
print (' %5d total' % sum(referrers.values()))
# Show the top 10 IPs.
print ('''
Show Top 10 IPs %s''' % theDay.strftime('%b %d, %Y'))
iphits = Counter(x['host'] for x in pages if goodagent(x))
iptop10 = iphits.most_common(10)
for p in iptop10:
print (' %5d %s' % p[::-1])
print (' %5d total hits' % sum(iphits.values()))
# CMS Checks
# Wordpress Checks
# Wordpress Login Bruteforcing checks for wp-login.php
print ('''
Wordpress Bruteforce Logins for wp-login.php %s''' % theDay.strftime('%b %d, %Y'))
wordpressloginhits = Counter(x['request'] for x in pages if wordpressbrute(x))
# wordpresslogintop10 = wordpressloginhits.most_common(10)
# for p in wordpresslogintop10:
# print ' %5d %s' % p[::-1]
print (' %5d total' % sum(wordpressloginhits.values()))
if __name__ == '__main__':
# detectcontrolpanel()
main()

View File

@@ -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):

View File

@@ -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 -->

View File

@@ -54,15 +54,4 @@ class cliParser:
parser.add_argument('--userName', help='Email Username.')
parser.add_argument('--password', help='Email password.')
## Get CurrentVersion
with open('/usr/local/CyberCP/version.txt') as file:
file_contents = file.read()
version = re.search('\d.\d', file_contents)
version = version.group()
build = file_contents[-2:]
build = build[0:1]
currentversion = version + '.' + build
parser.add_argument('--version', action='version', version=currentversion)
parser.parse_args(['--version'])
return parser.parse_args()

View File

@@ -1312,6 +1312,16 @@ def main():
command = '/usr/bin/cyberpanel_utility --help'
ProcessUtilities.executioner(command)
elif args.function == 'version' or args.function == 'v' or args.function == 'V':
## Get CurrentVersion
with open('/usr/local/CyberCP/version.txt') as file:
file_contents = file.read()
version = re.search('\d.\d', file_contents)
version = version.group()
build = file_contents[-2:]
build = build[0:1]
currentversion = version + '.' + build
print (currentversion)

View File

@@ -517,7 +517,11 @@ if [[ $DEV == "ON" ]] ; then
dnf install python3 -y
check_return
fi
pip3.6 install virtualenv
if [[ $SERVER_OS == "CentOS" ]] ; then
pip3.6 install virtualenv==16.7.9
else
pip3.6 install virtualenv
fi
check_return
fi
fi
@@ -1133,7 +1137,12 @@ if [[ $PROVIDER == "Alibaba Cloud" ]] ; then
pip install setuptools==40.8.0
fi
pip install virtualenv
if [[ $SERVER_OS == "CentOS" ]] ; then
pip install virtualenv==16.7.9
else
pip install virtualenv
fi
virtualenv --system-site-packages /usr/local/CyberPanel
source /usr/local/CyberPanel/bin/activate
rm -rf requirements.txt

View File

@@ -15,10 +15,20 @@ from .models import Domains,Records
from re import match,I,M
from plogical.mailUtilities import mailUtilities
from plogical.acl import ACLManager
import CloudFlare
import re
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
class DNSManager:
defaultNameServersPath = '/home/cyberpanel/defaultNameservers'
def loadCFKeys(self):
cfFile = '%s%s' % (DNS.CFPath, self.admin.userName)
data = open(cfFile, 'r').readlines()
self.email = data[0].rstrip('\n')
self.key = data[1].rstrip('\n')
def loadDNSHome(self, request = None, userID = None):
try:
admin = Administrator.objects.get(pk=userID)
@@ -245,8 +255,6 @@ class DNSManager:
if ACLManager.currentContextPermission(currentACL, 'addDeleteRecords') == 0:
return ACLManager.loadErrorJson('add_status', 0)
zoneDomain = data['selectedZone']
recordType = data['recordType']
recordName = data['recordName']
@@ -570,4 +578,391 @@ class DNSManager:
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)
except BaseException as msg:
final_dic = {'status': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
def getCurrentRecordsForDomainCloudFlare(self, userID = None, data = None):
try:
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'addDeleteRecords') == 0:
return ACLManager.loadErrorJson('fetchStatus', 0)
zoneDomain = data['selectedZone']
currentSelection = data['currentSelection']
admin = Administrator.objects.get(pk=userID)
self.admin = admin
if ACLManager.checkOwnershipZone(zoneDomain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
self.loadCFKeys()
params = {'name': zoneDomain, 'per_page':50}
cf = CloudFlare.CloudFlare(email=self.email,token=self.key)
try:
zones = cf.zones.get(params=params)
except CloudFlare.CloudFlareAPIError as e:
final_json = json.dumps({'status': 0, 'fetchStatus': 0, 'error_message': str(e), "data": '[]'})
return HttpResponse(final_json)
# there should only be one zone
if len(zones) == 0:
final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': '', "data": '[]'})
return HttpResponse(final_json)
for zone in sorted(zones, key=lambda v: v['name']):
zone_name = zone['name']
zone_id = zone['id']
fetchType = ""
if currentSelection == 'aRecord':
fetchType = 'A'
elif currentSelection == 'aaaaRecord':
fetchType = 'AAAA'
elif currentSelection == 'cNameRecord':
fetchType = 'CNAME'
elif currentSelection == 'mxRecord':
fetchType = 'MX'
elif currentSelection == 'txtRecord':
fetchType = 'TXT'
elif currentSelection == 'spfRecord':
fetchType = 'SPF'
elif currentSelection == 'nsRecord':
fetchType = 'NS'
elif currentSelection == 'soaRecord':
fetchType = 'SOA'
elif currentSelection == 'srvRecord':
fetchType = 'SRV'
elif currentSelection == 'caaRecord':
fetchType = 'CAA'
try:
dns_records = cf.zones.dns_records.get(zone_id, params={'per_page':50, 'type':fetchType})
except CloudFlare.exceptions.CloudFlareAPIError as e:
final_json = json.dumps({'status': 0, 'fetchStatus': 0, 'error_message': str(e), "data": '[]'})
return HttpResponse(final_json)
prog = re.compile('\.*' + zone_name + '$')
dns_records = sorted(dns_records, key=lambda v: prog.sub('', v['name']) + '_' + v['type'])
json_data = "["
checker = 0
for dns_record in dns_records:
dic = {'id': dns_record['id'],
'type': dns_record['type'],
'name': dns_record['name'],
'content': dns_record['content'],
'priority': '1400',
'ttl': dns_record['ttl']
}
if checker == 0:
json_data = json_data + json.dumps(dic)
checker = 1
else:
json_data = json_data + ',' + json.dumps(dic)
json_data = json_data + ']'
final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": json_data})
return HttpResponse(final_json)
except BaseException as msg:
final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
def deleteDNSRecordCloudFlare(self, userID = None, data = None):
try:
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'addDeleteRecords') == 0:
return ACLManager.loadErrorJson('fetchStatus', 0)
zoneDomain = data['selectedZone']
id = data['id']
admin = Administrator.objects.get(pk=userID)
self.admin = admin
if ACLManager.checkOwnershipZone(zoneDomain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
self.loadCFKeys()
params = {'name': zoneDomain, 'per_page': 50}
cf = CloudFlare.CloudFlare(email=self.email, token=self.key)
try:
zones = cf.zones.get(params=params)
except CloudFlare.CloudFlareAPIError as e:
final_json = json.dumps({'status': 0, 'delete_status': 0, 'error_message': str(e), "data": '[]'})
return HttpResponse(final_json)
for zone in sorted(zones, key=lambda v: v['name']):
zone_id = zone['id']
cf.zones.dns_records.delete(zone_id, int(id))
final_dic = {'status': 1, 'delete_status': 1, 'error_message': "None"}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
except BaseException as msg:
final_dic = {'status': 0, 'delete_status': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
def addDNSRecordCloudFlare(self, userID = None, data = None):
try:
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'addDeleteRecords') == 0:
return ACLManager.loadErrorJson('add_status', 0)
zoneDomain = data['selectedZone']
recordType = data['recordType']
recordName = data['recordName']
ttl = int(data['ttl'])
admin = Administrator.objects.get(pk=userID)
self.admin = admin
if ACLManager.checkOwnershipZone(zoneDomain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
## Get zone
self.loadCFKeys()
params = {'name': zoneDomain, 'per_page': 50}
cf = CloudFlare.CloudFlare(email=self.email, token=self.key)
try:
zones = cf.zones.get(params=params)
except CloudFlare.CloudFlareAPIError as e:
final_json = json.dumps({'status': 0, 'delete_status': 0, 'error_message': str(e), "data": '[]'})
return HttpResponse(final_json)
for zone in sorted(zones, key=lambda v: v['name']):
zone = zone['id']
value = ""
if recordType == "A":
recordContentA = data['recordContentA'] ## IP or ponting value
if recordName == "@":
value = zoneDomain
## re.match
elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName,
M | I):
value = recordName
else:
value = recordName + "." + zoneDomain
DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentA, 0, ttl)
elif recordType == "MX":
if recordName == "@":
value = zoneDomain
## re.match
elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName,
M | I):
value = recordName
else:
value = recordName + "." + zoneDomain
recordContentMX = data['recordContentMX']
priority = data['priority']
DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentMX, priority, ttl)
elif recordType == "AAAA":
if recordName == "@":
value = zoneDomain
## re.match
elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName,
M | I):
value = recordName
else:
value = recordName + "." + zoneDomain
recordContentAAAA = data['recordContentAAAA'] ## IP or ponting value
DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentAAAA, 0, ttl)
elif recordType == "CNAME":
if recordName == "@":
value = zoneDomain
## re.match
elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName,
M | I):
value = recordName
else:
value = recordName + "." + zoneDomain
recordContentCNAME = data['recordContentCNAME'] ## IP or ponting value
DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentCNAME, 0, ttl)
elif recordType == "SPF":
if recordName == "@":
value = zoneDomain
## re.match
elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName,
M | I):
value = recordName
else:
value = recordName + "." + zoneDomain
recordContentSPF = data['recordContentSPF'] ## IP or ponting value
DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentSPF, 0, ttl)
elif recordType == "TXT":
if recordName == "@":
value = zoneDomain
## re.match
elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName,
M | I):
value = recordName
else:
value = recordName + "." + zoneDomain
recordContentTXT = data['recordContentTXT'] ## IP or ponting value
DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentTXT, 0, ttl)
elif recordType == "SOA":
recordContentSOA = data['recordContentSOA']
DNS.createDNSRecordCloudFlare(cf, zone, recordName, recordType, recordContentSOA, 0, ttl)
elif recordType == "NS":
recordContentNS = data['recordContentNS']
if recordContentNS == "@":
recordContentNS = "ns1." + zoneDomain
## re.match
elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?',
recordContentNS, M | I):
recordContentNS = recordContentNS
else:
recordContentNS = recordContentNS + "." + zoneDomain
DNS.createDNSRecordCloudFlare(cf, zone, recordName, recordType, recordContentNS, 0, ttl)
elif recordType == "SRV":
if recordName == "@":
value = zoneDomain
## re.match
elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName,
M | I):
value = recordName
else:
value = recordName + "." + zoneDomain
recordContentSRV = data['recordContentSRV']
priority = data['priority']
DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentSRV, priority, ttl)
elif recordType == "CAA":
if recordName == "@":
value = zoneDomain
## re.match
elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName,
M | I):
value = recordName
else:
value = recordName + "." + zoneDomain
recordContentCAA = data['recordContentCAA'] ## IP or ponting value
DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentCAA, 0, ttl)
final_dic = {'status': 1, 'add_status': 1, 'error_message': "None"}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
except BaseException as msg:
final_dic = {'status': 0, 'add_status': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)

View File

@@ -640,4 +640,418 @@ 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/addDNSRecordCloudFlare";
// 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/getCurrentRecordsForDomainCloudFlare";
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/deleteDNSRecordCloudFlare";
var data = {
selectedZone: selectedZone,
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 */

View File

@@ -0,0 +1,493 @@
{% 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 "Name" %}</th>
<th>{% trans "Type" %}</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.name"></td>
<td ng-bind="record.type"></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 %}

View File

@@ -6,15 +6,21 @@ 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"),
url(r'^zoneCreation', views.zoneCreation, name='zoneCreation'),
url(r'^getCurrentRecordsForDomain',views.getCurrentRecordsForDomain,name='getCurrentRecordsForDomain'),
url(r'^addDNSRecord',views.addDNSRecord,name='addDNSRecord'),
url(r'^deleteDNSRecord',views.deleteDNSRecord,name='deleteDNSRecord'),
url(r'^getCurrentRecordsForDomain$',views.getCurrentRecordsForDomain,name='getCurrentRecordsForDomain'),
url(r'^addDNSRecord$',views.addDNSRecord,name='addDNSRecord'),
url(r'^deleteDNSRecord$',views.deleteDNSRecord,name='deleteDNSRecord'),
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'),
url(r'^getCurrentRecordsForDomainCloudFlare$', views.getCurrentRecordsForDomainCloudFlare, name='getCurrentRecordsForDomainCloudFlare'),
url(r'^deleteDNSRecordCloudFlare$', views.deleteDNSRecordCloudFlare, name='deleteDNSRecordCloudFlare'),
url(r'^addDNSRecordCloudFlare$', views.addDNSRecordCloudFlare,name='addDNSRecordCloudFlare')
]

View File

@@ -169,8 +169,54 @@ 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)
def getCurrentRecordsForDomainCloudFlare(request):
try:
userID = request.session['userID']
dm = DNSManager()
return dm.getCurrentRecordsForDomainCloudFlare(userID, json.loads(request.body))
except KeyError:
return redirect(loadLoginPage)
def deleteDNSRecordCloudFlare(request):
try:
userID = request.session['userID']
dm = DNSManager()
coreResult = dm.deleteDNSRecordCloudFlare(userID, json.loads(request.body))
return coreResult
except KeyError:
return redirect(loadLoginPage)
def addDNSRecordCloudFlare(request):
try:
userID = request.session['userID']
dm = DNSManager()
coreResult = dm.addDNSRecordCloudFlare(userID, json.loads(request.body))
return coreResult
except KeyError:
return redirect(loadLoginPage)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -5974,7 +5974,7 @@ msgstr "Detalhes do Website"
#: websiteFunctions/templates/websiteFunctions/createWebsite.html:54
msgid "Do not enter WWW, it will be auto created!"
msgstr ""
msgstr "Não digite WWW, ele será criado automaticamente!"
#: websiteFunctions/templates/websiteFunctions/deleteWebsite.html:3
msgid "Delete Website - CyberPanel"

Binary file not shown.

View File

@@ -6468,7 +6468,7 @@ msgstr "Detalhes do Website"
#: websiteFunctions/templates/websiteFunctions/createWebsite.html:54
msgid "Do not enter WWW, it will be auto created!"
msgstr ""
msgstr "Não digite WWW, ele será criado automaticamente!"
#: websiteFunctions/templates/websiteFunctions/deleteWebsite.html:3
msgid "Delete Website - CyberPanel"

Binary file not shown.

View File

@@ -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
@@ -417,6 +419,12 @@ class DNS:
except:
return 0
@staticmethod
def createDNSRecordCloudFlare(cf, zone, name, type, value, priority, ttl):
dns_record = {'name': name, 'type': type, 'content': value, 'ttl': ttl, 'priority': priority}
r = cf.zones.dns_records.post(zone, data=dns_record)
@staticmethod
def createDNSRecord(zone, name, type, value, priority, ttl):
try:

View File

@@ -255,8 +255,8 @@ password=%s
def submitDBCreation(dbName, dbUsername, dbPassword, databaseWebsite):
try:
if len(dbName) > 16 or len(dbUsername) > 16:
raise BaseException("Length of Database name or Database user should be 16 at max.")
if len(dbName) > 32 or len(dbUsername) > 32:
raise BaseException("Length of Database name or Database user should be 32 at max.")
website = Websites.objects.get(domain=databaseWebsite)
@@ -763,4 +763,4 @@ password=%s
except BaseException as msg:
logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[mysqlUtilities.fetchuser]")
return 0
return 0

View File

@@ -10,6 +10,7 @@ certbot==0.21.1
certifi==2018.4.16
cffi==1.11.5
chardet==3.0.4
cloudflare==2.6.1
ConfigArgParse==0.15.2
configobj==5.0.6
cryptography==2.8

View File

@@ -640,4 +640,418 @@ 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/addDNSRecordCloudFlare";
// 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/getCurrentRecordsForDomainCloudFlare";
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/deleteDNSRecordCloudFlare";
var data = {
selectedZone: selectedZone,
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 */