mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2026-03-16 09:10:15 +01:00
Merge branch 'v1.9.5' into qtwrkdev
This commit is contained in:
@@ -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()
|
||||
|
||||
126
CPScripts/CyberpanelSnapshotByCyberpanelUser.sh
Normal file
126
CPScripts/CyberpanelSnapshotByCyberpanelUser.sh
Normal 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}"
|
||||
230
CPScripts/access-logparser.py
Normal file
230
CPScripts/access-logparser.py
Normal 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()
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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()
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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 */
|
||||
493
dns/templates/dns/addDeleteDNSRecordsCloudFlare.html
Executable file
493
dns/templates/dns/addDeleteDNSRecordsCloudFlare.html
Executable 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 %}
|
||||
14
dns/urls.py
14
dns/urls.py
@@ -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')
|
||||
]
|
||||
46
dns/views.py
46
dns/views.py
@@ -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.
@@ -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.
@@ -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.
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
Reference in New Issue
Block a user