refactor(repo): most of these scripts are outdated, refactored desec
All checks were successful
/ test (push) Successful in 23s
All checks were successful
/ test (push) Successful in 23s
This commit is contained in:
parent
5b03adaaa9
commit
6682679493
18 changed files with 154 additions and 133 deletions
6
.forgejo/workflows/start.yaml
Normal file
6
.forgejo/workflows/start.yaml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
on: [push]
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: docker
|
||||||
|
steps:
|
||||||
|
- run: echo "hello world"
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -1,2 +1,4 @@
|
||||||
.env
|
.env
|
||||||
server-scripts/desec/public_ip
|
server-scripts/desec/public_ip
|
||||||
|
data
|
||||||
|
venv
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
# scripts
|
# scripts
|
||||||
|
|
||||||
Scripts I made that made my life slightly easier (terrible code btw)
|
Programs made to better my workflows
|
||||||
|
|
||||||
|
## Why?
|
||||||
|
It was made fundamentally for programming practice foy myself and my niche likings for Linux WM's (it still is, honestly).
|
||||||
|
Currently, it's turned to an output to create programs that better my workflow or produce a use for my servers.
|
||||||
|
|
||||||
|
|
|
||||||
127
server-scripts/desec-ip-sync/main.py
Executable file
127
server-scripts/desec-ip-sync/main.py
Executable file
|
|
@ -0,0 +1,127 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import os
|
||||||
|
from time import sleep
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
import requests
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
# Constants
|
||||||
|
DOMAIN = os.getenv("CURRENT_DOMAIN")
|
||||||
|
DESEC_TOKEN = os.getenv("DESEC_TOKEN")
|
||||||
|
IGNORED_SUBDOMAINS_PREFIXES = ["mail._domainkey.mail", "mail", "_dmarc.mail", "skyguy"]
|
||||||
|
TIMEOUT = 10 # In seconds, 600 = 10min, 900 = 15m, 1800 = 30min
|
||||||
|
|
||||||
|
# Credits:
|
||||||
|
# https://desec.readthedocs.io/en/latest/dns/rrsets.html#modifying-an-rrset
|
||||||
|
# for documentation
|
||||||
|
|
||||||
|
|
||||||
|
def getSubDomains():
|
||||||
|
subDomainsLink = "https://desec.io/api/v1/domains/" + DOMAIN + "/rrsets/"
|
||||||
|
|
||||||
|
subDomainsHeader = {"Authorization": "Token " + DESEC_TOKEN}
|
||||||
|
|
||||||
|
subDomainsRequest = requests.get(subDomainsLink, headers=subDomainsHeader)
|
||||||
|
subDomainsJSON = subDomainsRequest.json()
|
||||||
|
|
||||||
|
return subDomainsJSON
|
||||||
|
|
||||||
|
|
||||||
|
def filterRecords():
|
||||||
|
filtered_prefixes = []
|
||||||
|
|
||||||
|
getRequestIP = requests.get("https://ifconfig.me")
|
||||||
|
requestIP = getRequestIP.text
|
||||||
|
|
||||||
|
IGNORED_SUBDOMAINS = []
|
||||||
|
for i in range(len(IGNORED_SUBDOMAINS_PREFIXES)):
|
||||||
|
IGNORED_SUBDOMAINS.append(IGNORED_SUBDOMAINS_PREFIXES[i] + "." + DOMAIN + ".")
|
||||||
|
|
||||||
|
for rrset in getSubDomains():
|
||||||
|
IS_NOT_IGNORED = rrset["name"] not in IGNORED_SUBDOMAINS
|
||||||
|
CONTAINS_A_RECORD = rrset["type"] == "A"
|
||||||
|
NOT_CURRENT_IP = rrset["records"][0] != requestIP
|
||||||
|
|
||||||
|
if IS_NOT_IGNORED and CONTAINS_A_RECORD and NOT_CURRENT_IP:
|
||||||
|
filtered_prefixes.append(rrset["subname"])
|
||||||
|
|
||||||
|
if len(filtered_prefixes) > 0:
|
||||||
|
return filtered_prefixes
|
||||||
|
|
||||||
|
|
||||||
|
def changeRecords():
|
||||||
|
prefixes = filterRecords()
|
||||||
|
|
||||||
|
# If there are no outdated subdomains...
|
||||||
|
if prefixes is None:
|
||||||
|
print("No available subdomains to change")
|
||||||
|
return
|
||||||
|
|
||||||
|
getRequestIP = requests.get("https://ifconfig.me")
|
||||||
|
requestIP = getRequestIP.text
|
||||||
|
|
||||||
|
for prefix in prefixes:
|
||||||
|
subDomainsLink = (
|
||||||
|
"https://desec.io/api/v1/domains/" + DOMAIN + "/rrsets/" + prefix + "/A/"
|
||||||
|
)
|
||||||
|
subDomainsHeader = {
|
||||||
|
"Authorization": "Token " + DESEC_TOKEN,
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
subDomainsData = {
|
||||||
|
"subname": prefix,
|
||||||
|
"type": "A",
|
||||||
|
"records": [requestIP],
|
||||||
|
"ttl": 3600,
|
||||||
|
}
|
||||||
|
|
||||||
|
changeSubDomainRequest = requests.put(
|
||||||
|
subDomainsLink, json=subDomainsData, headers=subDomainsHeader
|
||||||
|
)
|
||||||
|
|
||||||
|
print("for prefix: " + prefix)
|
||||||
|
print(changeSubDomainRequest.text)
|
||||||
|
|
||||||
|
sleep(3)
|
||||||
|
|
||||||
|
|
||||||
|
def checkIP():
|
||||||
|
if not os.path.exists("data"):
|
||||||
|
os.mknod("data")
|
||||||
|
|
||||||
|
dataFile = open("data", "r")
|
||||||
|
|
||||||
|
getRequestIP = requests.get("https://ifconfig.me")
|
||||||
|
requestIP = getRequestIP.text
|
||||||
|
|
||||||
|
dataFileIP = dataFile.readline().replace("\n", "")
|
||||||
|
|
||||||
|
if requestIP != dataFileIP:
|
||||||
|
changeRecords()
|
||||||
|
with open("data", "w") as dataFile:
|
||||||
|
dataFile.write(requestIP)
|
||||||
|
|
||||||
|
|
||||||
|
def checkInternet():
|
||||||
|
print("Checking Connection...")
|
||||||
|
try:
|
||||||
|
testRequest = requests.get("https://ifconfig.me", timeout=15)
|
||||||
|
except (requests.Timeout, requests.ConnectionError) as exception:
|
||||||
|
print("Connection Failed!\nReason: " + exception)
|
||||||
|
checkInternet()
|
||||||
|
|
||||||
|
if testRequest.text is not None:
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print("Starting Script")
|
||||||
|
while checkInternet():
|
||||||
|
checkIP()
|
||||||
|
sleep(TIMEOUT)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
13
server-scripts/desec-ip-sync/run.bash
Executable file
13
server-scripts/desec-ip-sync/run.bash
Executable file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# If virtual environment does exist..
|
||||||
|
if [ ! -d venv ]; then
|
||||||
|
python3 -m venv venv
|
||||||
|
source venv/bin/activate
|
||||||
|
pip install -U python-dotenv requests
|
||||||
|
pip install -U pip # Update pip to the latest version
|
||||||
|
else
|
||||||
|
source venv/bin/activate
|
||||||
|
fi
|
||||||
|
|
||||||
|
python main.py
|
||||||
|
|
@ -1,114 +0,0 @@
|
||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
import subprocess
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import asyncio
|
|
||||||
from time import sleep
|
|
||||||
from dotenv import load_dotenv
|
|
||||||
import urllib3
|
|
||||||
|
|
||||||
load_dotenv() # Loads up .env file
|
|
||||||
|
|
||||||
current_domain = os.getenv("CURRENT_DOMAIN")
|
|
||||||
desec_token = os.getenv("DESEC_TOKEN")
|
|
||||||
excluded_subdomains = ["mail._domainkey.mail", "mail", "_dmarc.mail"]
|
|
||||||
timeout = 1800 # In seconds, 600 = 10min, 900 = 15m, 1800 = 30min
|
|
||||||
|
|
||||||
# Credits:
|
|
||||||
# https://desec.readthedocs.io/en/latest/dns/rrsets.html#modifying-an-rrset
|
|
||||||
# for documentation
|
|
||||||
|
|
||||||
|
|
||||||
async def modifyRecords(newIP):
|
|
||||||
args = "curl https://desec.io/api/v1/domains/" + current_domain + \
|
|
||||||
"/rrsets/ --header 'Authorization: Token " + desec_token + "'"
|
|
||||||
|
|
||||||
data_binary = subprocess.run(
|
|
||||||
args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
|
|
||||||
data = data_binary.stdout.decode("utf-8")
|
|
||||||
|
|
||||||
# convert to python object from str
|
|
||||||
json_data = json.loads(data)
|
|
||||||
|
|
||||||
for i in range(len(excluded_subdomains)):
|
|
||||||
excluded_subdomains[i] = excluded_subdomains[i] + \
|
|
||||||
"." + current_domain + "."
|
|
||||||
|
|
||||||
for entry in json_data:
|
|
||||||
# Only allow "A" record subdomains at the moment
|
|
||||||
if entry["name"] not in excluded_subdomains and entry["type"] == "A":
|
|
||||||
if (entry["records"][0] != newIP):
|
|
||||||
subname = str(entry["subname"]) # Subdomain Name
|
|
||||||
|
|
||||||
# Basically runs a PATCH method for the api to change
|
|
||||||
# the ip record of all "A" record subdomains to the new
|
|
||||||
# public ip address
|
|
||||||
|
|
||||||
change_record_arg = \
|
|
||||||
"curl -X PATCH https://desec.io/api/v1/domains/" + \
|
|
||||||
current_domain + "/rrsets/" + subname + \
|
|
||||||
"/A/" + " --header 'Authorization: Token " \
|
|
||||||
+ desec_token + "'" + " --header " + \
|
|
||||||
"'Content-Type: application/json' " + \
|
|
||||||
"--data @- <<< '{\"records\": [\"" + newIP + "\"] }'"
|
|
||||||
|
|
||||||
# print(change_record_arg)
|
|
||||||
subprocess.run(change_record_arg, shell=True)
|
|
||||||
await asyncio.sleep(5)
|
|
||||||
|
|
||||||
print("done with changing records!")
|
|
||||||
|
|
||||||
|
|
||||||
def getCurrentIP():
|
|
||||||
print("getting current ip...")
|
|
||||||
|
|
||||||
# Get the current Public IP to a "public_ip" file
|
|
||||||
subprocess.run(
|
|
||||||
["curl", "ifconfig.me", "-o", "public_ip"], stderr=subprocess.DEVNULL)
|
|
||||||
|
|
||||||
|
|
||||||
async def newIPCheck():
|
|
||||||
print("checking for new ips...")
|
|
||||||
presentIPFile = open("public_ip", "r")
|
|
||||||
|
|
||||||
newIP_curl = subprocess.run(["curl", "ifconfig.me"],
|
|
||||||
stdout=subprocess.PIPE,
|
|
||||||
stderr=subprocess.DEVNULL)
|
|
||||||
|
|
||||||
newIP = newIP_curl.stdout.decode("utf-8")
|
|
||||||
|
|
||||||
if (presentIPFile.readline() == newIP):
|
|
||||||
await asyncio.sleep(timeout)
|
|
||||||
await newIPCheck()
|
|
||||||
|
|
||||||
else:
|
|
||||||
print("uh oh! public ip updated!")
|
|
||||||
await modifyRecords(newIP)
|
|
||||||
getCurrentIP() # update current ip
|
|
||||||
await newIPCheck()
|
|
||||||
|
|
||||||
def waitForConnection():
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
response = urllib3.request("GET", "https://ifconfig.me")
|
|
||||||
return
|
|
||||||
except urllib3.exceptions.MaxRetryError:
|
|
||||||
print("Failed connection!")
|
|
||||||
sleep(1)
|
|
||||||
pass
|
|
||||||
|
|
||||||
def main():
|
|
||||||
waitForConnection()
|
|
||||||
|
|
||||||
if not os.path.exists("public_ip"):
|
|
||||||
getCurrentIP()
|
|
||||||
elif not os.path.exists(".env"):
|
|
||||||
print("no visible .env file for token!")
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
asyncio.run(newIPCheck())
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# If virtual environment does exist..
|
|
||||||
if [ ! -d .venv ]; then
|
|
||||||
python3 -m venv .venv
|
|
||||||
source .venv/bin/activate
|
|
||||||
pip install -U python-dotenv urllib3
|
|
||||||
pip install -U pip # Update pip to the latest version
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo 'Make sure to run ". .venv/bin/activate" to enter the development environment'
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
cd /home/user/scripts/desec
|
|
||||||
|
|
||||||
. .venv/bin/activate
|
|
||||||
|
|
||||||
./desec.py
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue