bunkerweb 1.4.0

This commit is contained in:
bunkerity
2022-06-03 17:24:14 +02:00
parent 3a078326c5
commit a9f886804a
5245 changed files with 1432051 additions and 27894 deletions

View File

@@ -0,0 +1,85 @@
#!/usr/bin/python3
import sys, os, traceback
sys.path.append("/opt/bunkerweb/deps/python")
sys.path.append("/opt/bunkerweb/utils")
sys.path.append("/opt/bunkerweb/core/bunkernet/jobs")
import logger, jobs
from bunkernet import data
status = 0
try :
# Check if at least a server has BunkerNet activated
bunkernet_activated = False
# Multisite case
if os.getenv("MULTISITE") == "yes" :
for first_server in os.getenv("SERVER_NAME").split(" ") :
if os.getenv(first_server + "_USE_BUNKERNET", os.getenv("USE_BUNKERNET")) == "yes" :
bunkernet_activated = True
break
# Singlesite case
elif os.getenv("USE_BUNKERNET") == "yes" :
bunkernet_activated = True
if not bunkernet_activated :
logger.log("BUNKERNET", "", "BunkerNet is not activated, skipping download...")
os._exit(0)
# Create directory if it doesn't exist
os.makedirs("/opt/bunkerweb/cache/bunkernet", exist_ok=True)
# Check if ID is present
if not os.path.isfile("/opt/bunkerweb/cache/bunkernet/instance.id") :
logger.log("BUNKERNET", "", "Not downloading BunkerNet data because instance is not registered")
os._exit(2)
# Don't go further if the cache is fresh
if jobs.is_cached_file("/opt/bunkerweb/cache/bunkernet/ip.list", "day") :
logger.log("BUNKERNET", "", "BunkerNet list is already in cache, skipping download...")
os._exit(0)
# Download data
logger.log("BUNKERNET", "", "Downloading BunkerNet data ...")
ok, status, data = data()
if not ok :
logger.log("BUNKERNET", "", "Error while sending data request to BunkerNet API : " + data)
os._exit(2)
elif status == 429 :
logger.log("BUNKERNET", "⚠️", "BunkerNet API is rate limiting us, trying again later...")
os._exit(0)
elif data["result"] != "ok" :
logger.log("BUNKERNET", "", "Received error from BunkerNet API while sending db request : " + data["data"] + ", removing instance ID")
os._exit(2)
logger.log("BUNKERNET", "", "Successfully downloaded data from BunkerNet API")
# Writing data to file
logger.log("BUNKERNET", "", "Saving BunkerNet data ...")
with open("/opt/bunkerweb/tmp/bunkernet-ip.list", "w") as f :
for ip in data["data"] :
f.write(ip + "\n")
# Check if file has changed
file_hash = jobs.file_hash("/opt/bunkerweb/tmp/bunkernet-ip.list")
cache_hash = jobs.cache_hash("/opt/bunkerweb/cache/bunkernet/ip.list")
if file_hash == cache_hash :
logger.log("BUNKERNET", "", "New file is identical to cache file, reload is not needed")
os._exit(0)
# Put file in cache
cached, err = jobs.cache_file("/opt/bunkerweb/tmp/bunkernet-ip.list", "/opt/bunkerweb/cache/bunkernet/ip.list", file_hash)
if not cached :
logger.log("BUNKERNET", "", "Error while caching BunkerNet data : " + err)
os._exit(2)
logger.log("BUNKERNET", "", "Successfully saved BunkerNet data")
status = 1
except :
status = 2
logger.log("BUNKERNET", "", "Exception while running bunkernet-data.py :")
print(traceback.format_exc())
sys.exit(status)

View File

@@ -0,0 +1,81 @@
#!/usr/bin/python3
import sys, os, traceback
sys.path.append("/opt/bunkerweb/deps/python")
sys.path.append("/opt/bunkerweb/utils")
sys.path.append("/opt/bunkerweb/core/bunkernet/jobs")
import logger
from bunkernet import register, ping, get_id
status = 0
try :
# Check if at least a server has BunkerNet activated
bunkernet_activated = False
# Multisite case
if os.getenv("MULTISITE") == "yes" :
for first_server in os.getenv("SERVER_NAME").split(" ") :
if os.getenv(first_server + "_USE_BUNKERNET", os.getenv("USE_BUNKERNET")) == "yes" :
bunkernet_activated = True
break
# Singlesite case
elif os.getenv("USE_BUNKERNET") == "yes" :
bunkernet_activated = True
if not bunkernet_activated :
logger.log("BUNKERNET", "", "BunkerNet is not activated, skipping registration...")
os._exit(0)
# Create directory if it doesn't exist
os.makedirs("/opt/bunkerweb/cache/bunkernet", exist_ok=True)
# Ask an ID if needed
if not os.path.isfile("/opt/bunkerweb/cache/bunkernet/instance.id") :
logger.log("BUNKERNET", "", "Registering instance on BunkerNet API ...")
ok, status, data = register()
if not ok :
logger.log("BUNKERNET", "", "Error while sending register request to BunkerNet API : " + data)
os._exit(1)
elif status == 429 :
logger.log("BUNKERNET", "⚠️", "BunkerNet API is rate limiting us, trying again later...")
os._exit(0)
elif status != 200 :
logger.log("BUNKERNET", "", "Error " + str(status) + " from BunkerNet API : " + data["data"])
os._exit(1)
elif data["result"] != "ok" :
logger.log("BUNKERNET", "", "Received error from BunkerNet API while sending register request : " + data["data"])
os._exit(1)
with open("/opt/bunkerweb/cache/bunkernet/instance.id", "w") as f :
f.write(data["data"])
logger.log("BUNKERNET", "", "Successfully registered on BunkerNet API with instance id " + get_id())
else :
logger.log("BUNKERNET", "", "Already registered on BunkerNet API with instance id " + get_id())
# Ping
logger.log("BUNKERNET", "", "Checking connectivity with BunkerNet API ...")
ok, status, data = ping()
if not ok :
logger.log("BUNKERNET", "", "Error while sending ping request to BunkerNet API : " + data)
os._exit(2)
elif status == 429 :
logger.log("BUNKERNET", "⚠️", "BunkerNet API is rate limiting us, trying again later...")
os._exit(0)
elif status == 401 :
logger.log("BUNKERNET", "⚠️", "Instance ID is not registered, removing it and retrying a register later...")
os.remove("/opt/bunkerweb/cache/bunkernet/instance.id")
os._exit(1)
elif data["result"] != "ok" :
logger.log("BUNKERNET", "", "Received error from BunkerNet API while sending ping request : " + data["data"] + ", removing instance ID")
os._exit(1)
logger.log("BUNKERNET", "", "Successfully checked connectivity with BunkerNet API")
status = 1
except :
status = 2
logger.log("BUNKERNET", "", "Exception while running bunkernet-register.py :")
print(traceback.format_exc())
sys.exit(status)

View File

@@ -0,0 +1,55 @@
import requests, traceback
from os import getenv
def request(method, url, _id=None) :
data = {
"integration": get_integration(),
"version": get_version()
}
headers = {
"User-Agent": "BunkerWeb/" + get_version()
}
if _id is not None :
data["id"] = _id
try :
resp = requests.request(method, getenv("BUNKERNET_SERVER") + url, json=data, headers=headers, timeout=5)
status = resp.status_code
if status == 429 :
return True, 429, "rate limited"
raw_data = resp.json()
assert "result" in raw_data
assert "data" in raw_data
except Exception as e :
return False, None, traceback.format_exc()
return True, status, raw_data
def register() :
return request("POST", "/register")
def ping() :
return request("GET", "/ping", _id=get_id())
def data() :
return request("GET", "/db", _id=get_id())
def get_id() :
with open("/opt/bunkerweb/cache/bunkernet/instance.id", "r") as f :
return f.read().strip()
def get_version() :
with open("/opt/bunkerweb/VERSION", "r") as f :
return f.read().strip()
def get_integration() :
try :
if getenv("KUBERNETES_MODE") == "yes" :
return "kubernetes"
if getenv("SWARM_MODE") == "yes" :
return "swarm"
with open("/etc/os-release", "r") as f :
if f.read().contains("Alpine") :
return "docker"
return "linux"
except :
return "unknown"