mirror of
https://github.com/bunkerity/bunkerized-nginx
synced 2023-12-13 21:30:18 +01:00
Merge pull request #333 from TheophileDiot/1.5
Centralize Database and update deps
This commit is contained in:
commit
fe89625921
15 changed files with 923 additions and 717 deletions
|
@ -15,6 +15,7 @@ COPY bw/deps/requirements.txt /opt/bunkerweb/deps/requirements.txt
|
|||
|
||||
# Install python requirements
|
||||
RUN apk add --no-cache --virtual build py3-pip g++ gcc python3-dev musl-dev libffi-dev openssl-dev cargo && \
|
||||
pip install --no-cache-dir --upgrade pip && \
|
||||
pip install wheel && \
|
||||
mkdir /opt/bunkerweb/deps/python && \
|
||||
pip install --no-cache-dir --require-hashes --target /opt/bunkerweb/deps/python -r /opt/bunkerweb/deps/requirements.txt && \
|
||||
|
@ -79,6 +80,6 @@ EXPOSE 8080/tcp 8443/tcp
|
|||
|
||||
USER nginx:nginx
|
||||
|
||||
HEALTHCHECK --interval=10s --timeout=10s --start-period=30s --retries=6 CMD /opt/bunkerweb/helpers/healthcheck.sh
|
||||
HEALTHCHECK --interval=10s --timeout=10s --start-period=10s --retries=6 CMD /opt/bunkerweb/helpers/healthcheck.sh
|
||||
|
||||
ENTRYPOINT ["/opt/bunkerweb/helpers/entrypoint.sh"]
|
||||
|
|
|
@ -1,22 +1,13 @@
|
|||
from os import getenv
|
||||
from time import sleep
|
||||
from traceback import format_exc
|
||||
from subprocess import run, DEVNULL, STDOUT
|
||||
from glob import glob
|
||||
from shutil import rmtree
|
||||
from os import getenv, makedirs, remove, listdir
|
||||
from os.path import dirname, isdir
|
||||
from typing import Tuple
|
||||
|
||||
from API import API
|
||||
from ApiCaller import ApiCaller
|
||||
from ConfigCaller import ConfigCaller
|
||||
from Database import Database
|
||||
from logger import setup_logger
|
||||
|
||||
|
||||
class Config(ApiCaller, ConfigCaller):
|
||||
class Config(ConfigCaller):
|
||||
def __init__(self, ctrl_type, lock=None):
|
||||
ApiCaller.__init__(self)
|
||||
ConfigCaller.__init__(self)
|
||||
self.__ctrl_type = ctrl_type
|
||||
self.__lock = lock
|
||||
|
@ -54,83 +45,10 @@ class Config(ApiCaller, ConfigCaller):
|
|||
return True
|
||||
return False
|
||||
|
||||
def __get_apis(self) -> list:
|
||||
apis = []
|
||||
for instance in self.__instances:
|
||||
endpoint = f"http://{instance['hostname']}:{instance['env'].get('API_HTTP_PORT', '5000')}"
|
||||
host = instance["env"].get("API_SERVER_NAME", "bwapi")
|
||||
apis.append(API(endpoint, host=host))
|
||||
return apis
|
||||
|
||||
def __write_configs(self) -> Tuple[bool, list]:
|
||||
ret = True
|
||||
custom_configs = []
|
||||
for config_type in self.__configs:
|
||||
for file, data in self.__configs[config_type].items():
|
||||
path = f"/data/configs/{config_type}/{file}"
|
||||
if not path.endswith(".conf"):
|
||||
path += ".conf"
|
||||
makedirs(dirname(path), exist_ok=True)
|
||||
try:
|
||||
mode = "w"
|
||||
if type(data) is bytes:
|
||||
mode = "wb"
|
||||
|
||||
with open(path, mode) as f:
|
||||
f.write(data)
|
||||
|
||||
exploded = file.split("/")
|
||||
custom_configs.append(
|
||||
{
|
||||
"value": data if mode == "w" else data.decode("utf-8"),
|
||||
"exploded": [exploded[0], config_type, exploded[1]],
|
||||
}
|
||||
)
|
||||
except:
|
||||
print(format_exc())
|
||||
self.__logger.error(f"Can't save file {path}")
|
||||
ret = False
|
||||
return ret, custom_configs
|
||||
|
||||
def __remove_configs(self) -> bool:
|
||||
ret = True
|
||||
for config_type in self.__configs:
|
||||
for file, _ in self.__configs[config_type].items():
|
||||
path = f"/data/configs/{config_type}/{file}"
|
||||
if not path.endswith(".conf"):
|
||||
path += ".conf"
|
||||
try:
|
||||
remove(path)
|
||||
except:
|
||||
print(format_exc())
|
||||
self.__logger.error(f"Can't remove file {path}")
|
||||
ret = False
|
||||
check_empty_dirs = []
|
||||
for _type in ["server-http", "modsec", "modsec-crs"]:
|
||||
check_empty_dirs.extend(glob(f"/data/configs/{type}/*"))
|
||||
for check_empty_dir in check_empty_dirs:
|
||||
if isdir(check_empty_dir) and len(listdir(check_empty_dir)) == 0:
|
||||
try:
|
||||
rmtree(check_empty_dir)
|
||||
except:
|
||||
print(format_exc())
|
||||
self.__logger.error(f"Can't remove directory {check_empty_dir}")
|
||||
ret = False
|
||||
return ret
|
||||
|
||||
def apply(self, instances, services, configs=None) -> bool:
|
||||
|
||||
success = True
|
||||
|
||||
# remove old autoconf configs if it exists
|
||||
if self.__configs:
|
||||
ret = self.__remove_configs()
|
||||
if not ret:
|
||||
success = False
|
||||
self.__logger.error(
|
||||
"removing custom configs failed, configuration will not work as expected...",
|
||||
)
|
||||
|
||||
# update values
|
||||
self.__instances = instances
|
||||
self.__services = services
|
||||
|
@ -139,7 +57,11 @@ class Config(ApiCaller, ConfigCaller):
|
|||
|
||||
if self.__db is None:
|
||||
self.__db = Database(
|
||||
self.__logger, sqlalchemy_string=self.__config.get("DATABASE_URI", None)
|
||||
self.__logger,
|
||||
sqlalchemy_string=self.__config.get("DATABASE_URI", None),
|
||||
bw_integration="Kubernetes"
|
||||
if self.__config.get("KUBERNETES_MODE", "no") == "yes"
|
||||
else "Cluster",
|
||||
)
|
||||
|
||||
while not self.__db.is_initialized():
|
||||
|
@ -148,84 +70,33 @@ class Config(ApiCaller, ConfigCaller):
|
|||
)
|
||||
sleep(5)
|
||||
|
||||
self._set_apis(self.__get_apis())
|
||||
|
||||
# write configs
|
||||
if configs != None:
|
||||
ret = self.__db.save_config(self.__config, "autoconf")
|
||||
if ret:
|
||||
self.__logger.error(
|
||||
f"Can't save autoconf config in database: {ret}",
|
||||
)
|
||||
|
||||
ret, custom_configs = self.__write_configs()
|
||||
if not ret:
|
||||
success = False
|
||||
self.__logger.error(
|
||||
"saving custom configs failed, configuration will not work as expected...",
|
||||
)
|
||||
|
||||
ret = self.__db.save_custom_configs(custom_configs, "autoconf")
|
||||
if ret:
|
||||
self.__logger.error(
|
||||
f"Can't save autoconf custom configs in database: {ret}",
|
||||
)
|
||||
else:
|
||||
ret = self.__db.save_config({}, "autoconf")
|
||||
if ret:
|
||||
self.__logger.error(
|
||||
f"Can't remove autoconf config from the database: {ret}",
|
||||
)
|
||||
|
||||
# get env
|
||||
env = self.__get_full_env()
|
||||
|
||||
# run jobs once
|
||||
i = 1
|
||||
for instance in self.__instances:
|
||||
endpoint = f"http://{instance['hostname']}:{instance['env'].get('API_HTTP_PORT', '5000')}"
|
||||
host = instance["env"].get("API_SERVER_NAME", "bwapi")
|
||||
env[f"CLUSTER_INSTANCE_{i}"] = f"{endpoint} {host}"
|
||||
i += 1
|
||||
|
||||
# write config to /tmp/variables.env
|
||||
with open("/tmp/variables.env", "w") as f:
|
||||
for variable, value in self.__config.items():
|
||||
f.write(f"{variable}={value}\n")
|
||||
|
||||
# run the generator
|
||||
cmd = f"python /opt/bunkerweb/gen/main.py --settings /opt/bunkerweb/settings.json --templates /opt/bunkerweb/confs --output /etc/nginx --variables /tmp/variables.env --method autoconf"
|
||||
proc = run(cmd.split(" "), stdin=DEVNULL, stderr=STDOUT)
|
||||
if proc.returncode != 0:
|
||||
success = False
|
||||
# save config to database
|
||||
ret = self.__db.save_config(self.__config, "autoconf")
|
||||
if ret:
|
||||
self.__logger.error(
|
||||
"config generator failed, configuration will not work as expected...",
|
||||
f"Can't save autoconf config in database: {ret}",
|
||||
)
|
||||
# cmd = "chown -R root:101 /etc/nginx"
|
||||
# run(cmd.split(" "), stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT)
|
||||
# cmd = "chmod -R 770 /etc/nginx"
|
||||
# run(cmd.split(" "), stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT)
|
||||
|
||||
# send nginx configs
|
||||
ret = self._send_files("/etc/nginx", "/confs")
|
||||
if not ret:
|
||||
success = False
|
||||
custom_configs = []
|
||||
for config_type in self.__configs:
|
||||
for file, data in self.__configs[config_type].items():
|
||||
exploded = file.split("/")
|
||||
custom_configs.append(
|
||||
{
|
||||
"value": data,
|
||||
"exploded": [
|
||||
exploded[0],
|
||||
config_type,
|
||||
exploded[1].replace(".conf", ""),
|
||||
],
|
||||
}
|
||||
)
|
||||
|
||||
# save custom configs to database
|
||||
ret = self.__db.save_custom_configs(custom_configs, "autoconf")
|
||||
if ret:
|
||||
self.__logger.error(
|
||||
"sending nginx configs failed, configuration will not work as expected...",
|
||||
)
|
||||
# send data/configs folder
|
||||
ret = self._send_files("/data/configs", "/custom_configs")
|
||||
if not ret:
|
||||
success = False
|
||||
self.__logger.error(
|
||||
"sending custom configs failed, configuration will not work as expected...",
|
||||
)
|
||||
# reload nginx
|
||||
ret = self._send_to_apis("POST", "/reload")
|
||||
if not ret:
|
||||
success = False
|
||||
self.__logger.error(
|
||||
"reload failed, configuration will not work as expected...",
|
||||
f"Can't save autoconf custom configs in database: {ret}",
|
||||
)
|
||||
|
||||
return success
|
||||
|
|
|
@ -5,6 +5,8 @@ COPY bw/deps/requirements.txt /opt/bunkerweb/deps/requirements.txt
|
|||
|
||||
# Install dependencies
|
||||
RUN apk add --no-cache --virtual build g++ gcc python3-dev musl-dev libffi-dev openssl-dev cargo && \
|
||||
pip install --no-cache-dir --upgrade pip && \
|
||||
pip install wheel && \
|
||||
mkdir /opt/bunkerweb/deps/python && \
|
||||
pip install --no-cache-dir --require-hashes --target /opt/bunkerweb/deps/python -r /opt/bunkerweb/deps/requirements.txt && \
|
||||
apk del build
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
from os import _exit, environ, getenv
|
||||
from os import _exit, getenv
|
||||
from signal import SIGINT, SIGTERM, signal
|
||||
from subprocess import DEVNULL, STDOUT, run
|
||||
from sys import exit as sys_exit, path as sys_path
|
||||
from time import sleep
|
||||
from traceback import format_exc
|
||||
|
||||
sys_path.append("/opt/bunkerweb/deps/python")
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
docker==5.0.3
|
||||
kubernetes==23.3.0
|
||||
jinja2==3.0.3
|
||||
docker==6.0.0
|
||||
kubernetes==25.3.0
|
||||
jinja2==3.1.2
|
||||
schedule==1.1.0
|
||||
python-dotenv==0.19.2
|
||||
requests==2.27.1
|
||||
python-dotenv==0.21.0
|
||||
requests==2.28.1
|
||||
maxminddb==2.2.0
|
||||
certbot==1.25.0
|
||||
sqlalchemy==1.4.41
|
||||
certbot==1.31.0
|
||||
sqlalchemy==1.4.42
|
||||
pymysql==1.0.2
|
||||
|
|
|
@ -4,79 +4,93 @@
|
|||
#
|
||||
# pip-compile --allow-unsafe --generate-hashes
|
||||
#
|
||||
acme==1.25.0 \
|
||||
--hash=sha256:1dfa3c0ba17a49334be4072bfd77ed520bf0d2eafa2f38d2657a2b7015d75268 \
|
||||
--hash=sha256:e3fbe36fcfa27ec46f450369498f3486370ab53a0fd7db91557a23d58b3969fa
|
||||
acme==1.31.0 \
|
||||
--hash=sha256:15134d4e404937d8464ee63a16eaf11adbe2f184960e99aa60410648a53f13ac \
|
||||
--hash=sha256:f5e13262fa1101c38dd865378ac8b4639f819120eb66c5538fc6c09b7576fc53
|
||||
# via certbot
|
||||
cachetools==5.0.0 \
|
||||
--hash=sha256:486471dfa8799eb7ec503a8059e263db000cdda20075ce5e48903087f79d5fd6 \
|
||||
--hash=sha256:8fecd4203a38af17928be7b90689d8083603073622229ca7077b72d8e5a976e4
|
||||
cachetools==5.2.0 \
|
||||
--hash=sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757 \
|
||||
--hash=sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db
|
||||
# via google-auth
|
||||
certbot==1.25.0 \
|
||||
--hash=sha256:9633d21051fe7fd076d64cb41963de61d300d7c30f4b491c8d18cb8306357509 \
|
||||
--hash=sha256:f070c91753f66c37f6ec961cc0061fc27c6881bb073c5b9116b52081ccde5281
|
||||
certbot==1.31.0 \
|
||||
--hash=sha256:29af531d33aaa87c8104864cd31ac2af541f0ec973a7252d7f7f5b15e10479db \
|
||||
--hash=sha256:dc8c86d1b56dd3ca35139967f05ed6a9264fda8107d2783f24f42868e8ae54af
|
||||
# via -r requirements.in
|
||||
certifi==2021.10.8 \
|
||||
--hash=sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872 \
|
||||
--hash=sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569
|
||||
certifi==2022.9.24 \
|
||||
--hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \
|
||||
--hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382
|
||||
# via
|
||||
# kubernetes
|
||||
# requests
|
||||
cffi==1.15.0 \
|
||||
--hash=sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3 \
|
||||
--hash=sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2 \
|
||||
--hash=sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636 \
|
||||
--hash=sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20 \
|
||||
--hash=sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728 \
|
||||
--hash=sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27 \
|
||||
--hash=sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66 \
|
||||
--hash=sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443 \
|
||||
--hash=sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0 \
|
||||
--hash=sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7 \
|
||||
--hash=sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39 \
|
||||
--hash=sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605 \
|
||||
--hash=sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a \
|
||||
--hash=sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37 \
|
||||
--hash=sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029 \
|
||||
--hash=sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139 \
|
||||
--hash=sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc \
|
||||
--hash=sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df \
|
||||
--hash=sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14 \
|
||||
--hash=sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880 \
|
||||
--hash=sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2 \
|
||||
--hash=sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a \
|
||||
--hash=sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e \
|
||||
--hash=sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474 \
|
||||
--hash=sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024 \
|
||||
--hash=sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8 \
|
||||
--hash=sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0 \
|
||||
--hash=sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e \
|
||||
--hash=sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a \
|
||||
--hash=sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e \
|
||||
--hash=sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032 \
|
||||
--hash=sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6 \
|
||||
--hash=sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e \
|
||||
--hash=sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b \
|
||||
--hash=sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e \
|
||||
--hash=sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954 \
|
||||
--hash=sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962 \
|
||||
--hash=sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c \
|
||||
--hash=sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4 \
|
||||
--hash=sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55 \
|
||||
--hash=sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962 \
|
||||
--hash=sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023 \
|
||||
--hash=sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c \
|
||||
--hash=sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6 \
|
||||
--hash=sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8 \
|
||||
--hash=sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382 \
|
||||
--hash=sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7 \
|
||||
--hash=sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc \
|
||||
--hash=sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997 \
|
||||
--hash=sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796
|
||||
cffi==1.15.1 \
|
||||
--hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \
|
||||
--hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \
|
||||
--hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \
|
||||
--hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \
|
||||
--hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \
|
||||
--hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \
|
||||
--hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \
|
||||
--hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \
|
||||
--hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \
|
||||
--hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \
|
||||
--hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \
|
||||
--hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \
|
||||
--hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \
|
||||
--hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \
|
||||
--hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \
|
||||
--hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \
|
||||
--hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \
|
||||
--hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \
|
||||
--hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \
|
||||
--hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \
|
||||
--hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \
|
||||
--hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \
|
||||
--hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \
|
||||
--hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \
|
||||
--hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \
|
||||
--hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \
|
||||
--hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \
|
||||
--hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \
|
||||
--hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \
|
||||
--hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \
|
||||
--hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \
|
||||
--hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \
|
||||
--hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \
|
||||
--hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \
|
||||
--hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \
|
||||
--hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \
|
||||
--hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \
|
||||
--hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \
|
||||
--hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \
|
||||
--hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \
|
||||
--hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \
|
||||
--hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \
|
||||
--hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \
|
||||
--hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \
|
||||
--hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \
|
||||
--hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \
|
||||
--hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \
|
||||
--hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \
|
||||
--hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \
|
||||
--hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \
|
||||
--hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \
|
||||
--hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \
|
||||
--hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \
|
||||
--hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \
|
||||
--hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \
|
||||
--hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \
|
||||
--hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \
|
||||
--hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \
|
||||
--hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \
|
||||
--hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \
|
||||
--hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \
|
||||
--hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \
|
||||
--hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \
|
||||
--hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0
|
||||
# via cryptography
|
||||
charset-normalizer==2.0.12 \
|
||||
--hash=sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597 \
|
||||
--hash=sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df
|
||||
charset-normalizer==2.1.1 \
|
||||
--hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \
|
||||
--hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f
|
||||
# via requests
|
||||
configargparse==1.5.3 \
|
||||
--hash=sha256:18f6535a2db9f6e02bd5626cc7455eac3e96b9ab3d969d366f9aafd5c5c00fe7 \
|
||||
|
@ -85,107 +99,125 @@ configargparse==1.5.3 \
|
|||
configobj==5.0.6 \
|
||||
--hash=sha256:a2f5650770e1c87fb335af19a9b7eb73fc05ccf22144eb68db7d00cd2bcb0902
|
||||
# via certbot
|
||||
cryptography==36.0.2 \
|
||||
--hash=sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b \
|
||||
--hash=sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51 \
|
||||
--hash=sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7 \
|
||||
--hash=sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d \
|
||||
--hash=sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6 \
|
||||
--hash=sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29 \
|
||||
--hash=sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9 \
|
||||
--hash=sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf \
|
||||
--hash=sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815 \
|
||||
--hash=sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf \
|
||||
--hash=sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85 \
|
||||
--hash=sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77 \
|
||||
--hash=sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86 \
|
||||
--hash=sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb \
|
||||
--hash=sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e \
|
||||
--hash=sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0 \
|
||||
--hash=sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3 \
|
||||
--hash=sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84 \
|
||||
--hash=sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2 \
|
||||
--hash=sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6
|
||||
cryptography==38.0.1 \
|
||||
--hash=sha256:0297ffc478bdd237f5ca3a7dc96fc0d315670bfa099c04dc3a4a2172008a405a \
|
||||
--hash=sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f \
|
||||
--hash=sha256:16fa61e7481f4b77ef53991075de29fc5bacb582a1244046d2e8b4bb72ef66d0 \
|
||||
--hash=sha256:194044c6b89a2f9f169df475cc167f6157eb9151cc69af8a2a163481d45cc407 \
|
||||
--hash=sha256:1db3d807a14931fa317f96435695d9ec386be7b84b618cc61cfa5d08b0ae33d7 \
|
||||
--hash=sha256:3261725c0ef84e7592597606f6583385fed2a5ec3909f43bc475ade9729a41d6 \
|
||||
--hash=sha256:3b72c360427889b40f36dc214630e688c2fe03e16c162ef0aa41da7ab1455153 \
|
||||
--hash=sha256:3e3a2599e640927089f932295a9a247fc40a5bdf69b0484532f530471a382750 \
|
||||
--hash=sha256:3fc26e22840b77326a764ceb5f02ca2d342305fba08f002a8c1f139540cdfaad \
|
||||
--hash=sha256:5067ee7f2bce36b11d0e334abcd1ccf8c541fc0bbdaf57cdd511fdee53e879b6 \
|
||||
--hash=sha256:52e7bee800ec869b4031093875279f1ff2ed12c1e2f74923e8f49c916afd1d3b \
|
||||
--hash=sha256:64760ba5331e3f1794d0bcaabc0d0c39e8c60bf67d09c93dc0e54189dfd7cfe5 \
|
||||
--hash=sha256:765fa194a0f3372d83005ab83ab35d7c5526c4e22951e46059b8ac678b44fa5a \
|
||||
--hash=sha256:79473cf8a5cbc471979bd9378c9f425384980fcf2ab6534b18ed7d0d9843987d \
|
||||
--hash=sha256:896dd3a66959d3a5ddcfc140a53391f69ff1e8f25d93f0e2e7830c6de90ceb9d \
|
||||
--hash=sha256:89ed49784ba88c221756ff4d4755dbc03b3c8d2c5103f6d6b4f83a0fb1e85294 \
|
||||
--hash=sha256:ac7e48f7e7261207d750fa7e55eac2d45f720027d5703cd9007e9b37bbb59ac0 \
|
||||
--hash=sha256:ad7353f6ddf285aeadfaf79e5a6829110106ff8189391704c1d8801aa0bae45a \
|
||||
--hash=sha256:b0163a849b6f315bf52815e238bc2b2346604413fa7c1601eea84bcddb5fb9ac \
|
||||
--hash=sha256:b6c9b706316d7b5a137c35e14f4103e2115b088c412140fdbd5f87c73284df61 \
|
||||
--hash=sha256:c2e5856248a416767322c8668ef1845ad46ee62629266f84a8f007a317141013 \
|
||||
--hash=sha256:ca9f6784ea96b55ff41708b92c3f6aeaebde4c560308e5fbbd3173fbc466e94e \
|
||||
--hash=sha256:d1a5bd52d684e49a36582193e0b89ff267704cd4025abefb9e26803adeb3e5fb \
|
||||
--hash=sha256:d3971e2749a723e9084dd507584e2a2761f78ad2c638aa31e80bc7a15c9db4f9 \
|
||||
--hash=sha256:d4ef6cc305394ed669d4d9eebf10d3a101059bdcf2669c366ec1d14e4fb227bd \
|
||||
--hash=sha256:d9e69ae01f99abe6ad646947bba8941e896cb3aa805be2597a0400e0764b5818
|
||||
# via
|
||||
# acme
|
||||
# certbot
|
||||
# josepy
|
||||
# pyopenssl
|
||||
distro==1.7.0 \
|
||||
--hash=sha256:151aeccf60c216402932b52e40ee477a939f8d58898927378a02abbe852c1c39 \
|
||||
--hash=sha256:d596311d707e692c2160c37807f83e3820c5d539d5a83e87cfb6babd8ba3a06b
|
||||
distro==1.8.0 \
|
||||
--hash=sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8 \
|
||||
--hash=sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff
|
||||
# via certbot
|
||||
docker==5.0.3 \
|
||||
--hash=sha256:7a79bb439e3df59d0a72621775d600bc8bc8b422d285824cb37103eab91d1ce0 \
|
||||
--hash=sha256:d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb
|
||||
docker==6.0.0 \
|
||||
--hash=sha256:19e330470af40167d293b0352578c1fa22d74b34d3edf5d4ff90ebc203bbb2f1 \
|
||||
--hash=sha256:6e06ee8eca46cd88733df09b6b80c24a1a556bc5cb1e1ae54b2c239886d245cf
|
||||
# via -r requirements.in
|
||||
google-auth==2.6.2 \
|
||||
--hash=sha256:3ba4d63cb29c1e6d5ffcc1c0623c03cf02ede6240a072f213084749574e691ab \
|
||||
--hash=sha256:60d449f8142c742db760f4c0be39121bc8d9be855555d784c252deaca1ced3f5
|
||||
google-auth==2.13.0 \
|
||||
--hash=sha256:9352dd6394093169157e6971526bab9a2799244d68a94a4a609f0dd751ef6f5e \
|
||||
--hash=sha256:99510e664155f1a3c0396a076b5deb6367c52ea04d280152c85ac7f51f50eb42
|
||||
# via kubernetes
|
||||
greenlet==1.1.3 \
|
||||
--hash=sha256:0118817c9341ef2b0f75f5af79ac377e4da6ff637e5ee4ac91802c0e379dadb4 \
|
||||
--hash=sha256:048d2bed76c2aa6de7af500ae0ea51dd2267aec0e0f2a436981159053d0bc7cc \
|
||||
--hash=sha256:07c58e169bbe1e87b8bbf15a5c1b779a7616df9fd3e61cadc9d691740015b4f8 \
|
||||
--hash=sha256:095a980288fe05adf3d002fbb180c99bdcf0f930e220aa66fcd56e7914a38202 \
|
||||
--hash=sha256:0b181e9aa6cb2f5ec0cacc8cee6e5a3093416c841ba32c185c30c160487f0380 \
|
||||
--hash=sha256:1626185d938d7381631e48e6f7713e8d4b964be246073e1a1d15c2f061ac9f08 \
|
||||
--hash=sha256:184416e481295832350a4bf731ba619a92f5689bf5d0fa4341e98b98b1265bd7 \
|
||||
--hash=sha256:1dd51d2650e70c6c4af37f454737bf4a11e568945b27f74b471e8e2a9fd21268 \
|
||||
--hash=sha256:1ec2779774d8e42ed0440cf8bc55540175187e8e934f2be25199bf4ed948cd9e \
|
||||
--hash=sha256:2cf45e339cabea16c07586306a31cfcc5a3b5e1626d365714d283732afed6809 \
|
||||
--hash=sha256:2fb0aa7f6996879551fd67461d5d3ab0c3c0245da98be90c89fcb7a18d437403 \
|
||||
--hash=sha256:44b4817c34c9272c65550b788913620f1fdc80362b209bc9d7dd2f40d8793080 \
|
||||
--hash=sha256:466ce0928e33421ee84ae04c4ac6f253a3a3e6b8d600a79bd43fd4403e0a7a76 \
|
||||
--hash=sha256:4f166b4aca8d7d489e82d74627a7069ab34211ef5ebb57c300ec4b9337b60fc0 \
|
||||
--hash=sha256:510c3b15587afce9800198b4b142202b323bf4b4b5f9d6c79cb9a35e5e3c30d2 \
|
||||
--hash=sha256:5b756e6730ea59b2745072e28ad27f4c837084688e6a6b3633c8b1e509e6ae0e \
|
||||
--hash=sha256:5fbe1ab72b998ca77ceabbae63a9b2e2dc2d963f4299b9b278252ddba142d3f1 \
|
||||
--hash=sha256:6200a11f003ec26815f7e3d2ded01b43a3810be3528dd760d2f1fa777490c3cd \
|
||||
--hash=sha256:65ad1a7a463a2a6f863661329a944a5802c7129f7ad33583dcc11069c17e622c \
|
||||
--hash=sha256:694ffa7144fa5cc526c8f4512665003a39fa09ef00d19bbca5c8d3406db72fbe \
|
||||
--hash=sha256:6f5d4b2280ceea76c55c893827961ed0a6eadd5a584a7c4e6e6dd7bc10dfdd96 \
|
||||
--hash=sha256:7532a46505470be30cbf1dbadb20379fb481244f1ca54207d7df3bf0bbab6a20 \
|
||||
--hash=sha256:76a53bfa10b367ee734b95988bd82a9a5f0038a25030f9f23bbbc005010ca600 \
|
||||
--hash=sha256:77e41db75f9958f2083e03e9dd39da12247b3430c92267df3af77c83d8ff9eed \
|
||||
--hash=sha256:7a43bbfa9b6cfdfaeefbd91038dde65ea2c421dc387ed171613df340650874f2 \
|
||||
--hash=sha256:7b41d19c0cfe5c259fe6c539fd75051cd39a5d33d05482f885faf43f7f5e7d26 \
|
||||
--hash=sha256:7c5227963409551ae4a6938beb70d56bf1918c554a287d3da6853526212fbe0a \
|
||||
--hash=sha256:870a48007872d12e95a996fca3c03a64290d3ea2e61076aa35d3b253cf34cd32 \
|
||||
--hash=sha256:88b04e12c9b041a1e0bcb886fec709c488192638a9a7a3677513ac6ba81d8e79 \
|
||||
--hash=sha256:8c287ae7ac921dfde88b1c125bd9590b7ec3c900c2d3db5197f1286e144e712b \
|
||||
--hash=sha256:903fa5716b8fbb21019268b44f73f3748c41d1a30d71b4a49c84b642c2fed5fa \
|
||||
--hash=sha256:9537e4baf0db67f382eb29255a03154fcd4984638303ff9baaa738b10371fa57 \
|
||||
--hash=sha256:9951dcbd37850da32b2cb6e391f621c1ee456191c6ae5528af4a34afe357c30e \
|
||||
--hash=sha256:9b2f7d0408ddeb8ea1fd43d3db79a8cefaccadd2a812f021333b338ed6b10aba \
|
||||
--hash=sha256:9c88e134d51d5e82315a7c32b914a58751b7353eb5268dbd02eabf020b4c4700 \
|
||||
--hash=sha256:9fae214f6c43cd47f7bef98c56919b9222481e833be2915f6857a1e9e8a15318 \
|
||||
--hash=sha256:a3a669f11289a8995d24fbfc0e63f8289dd03c9aaa0cc8f1eab31d18ca61a382 \
|
||||
--hash=sha256:aa741c1a8a8cc25eb3a3a01a62bdb5095a773d8c6a86470bde7f607a447e7905 \
|
||||
--hash=sha256:b0877a9a2129a2c56a2eae2da016743db7d9d6a05d5e1c198f1b7808c602a30e \
|
||||
--hash=sha256:bcb6c6dd1d6be6d38d6db283747d07fda089ff8c559a835236560a4410340455 \
|
||||
--hash=sha256:caff52cb5cd7626872d9696aee5b794abe172804beb7db52eed1fd5824b63910 \
|
||||
--hash=sha256:cbc1eb55342cbac8f7ec159088d54e2cfdd5ddf61c87b8bbe682d113789331b2 \
|
||||
--hash=sha256:cd16a89efe3a003029c87ff19e9fba635864e064da646bc749fc1908a4af18f3 \
|
||||
--hash=sha256:ce5b64dfe8d0cca407d88b0ee619d80d4215a2612c1af8c98a92180e7109f4b5 \
|
||||
--hash=sha256:d58a5a71c4c37354f9e0c24c9c8321f0185f6945ef027460b809f4bb474bfe41 \
|
||||
--hash=sha256:db41f3845eb579b544c962864cce2c2a0257fe30f0f1e18e51b1e8cbb4e0ac6d \
|
||||
--hash=sha256:db5b25265010a1b3dca6a174a443a0ed4c4ab12d5e2883a11c97d6e6d59b12f9 \
|
||||
--hash=sha256:dd0404d154084a371e6d2bafc787201612a1359c2dee688ae334f9118aa0bf47 \
|
||||
--hash=sha256:de431765bd5fe62119e0bc6bc6e7b17ac53017ae1782acf88fcf6b7eae475a49 \
|
||||
--hash=sha256:df02fdec0c533301497acb0bc0f27f479a3a63dcdc3a099ae33a902857f07477 \
|
||||
--hash=sha256:e8533f5111704d75de3139bf0b8136d3a6c1642c55c067866fa0a51c2155ee33 \
|
||||
--hash=sha256:f2f908239b7098799b8845e5936c2ccb91d8c2323be02e82f8dcb4a80dcf4a25 \
|
||||
--hash=sha256:f8bfd36f368efe0ab2a6aa3db7f14598aac454b06849fb633b762ddbede1db90 \
|
||||
--hash=sha256:ffe73f9e7aea404722058405ff24041e59d31ca23d1da0895af48050a07b6932
|
||||
greenlet==1.1.3.post0 \
|
||||
--hash=sha256:0120a879aa2b1ac5118bce959ea2492ba18783f65ea15821680a256dfad04754 \
|
||||
--hash=sha256:025b8de2273d2809f027d347aa2541651d2e15d593bbce0d5f502ca438c54136 \
|
||||
--hash=sha256:05ae7383f968bba4211b1fbfc90158f8e3da86804878442b4fb6c16ccbcaa519 \
|
||||
--hash=sha256:0914f02fcaa8f84f13b2df4a81645d9e82de21ed95633765dd5cc4d3af9d7403 \
|
||||
--hash=sha256:0971d37ae0eaf42344e8610d340aa0ad3d06cd2eee381891a10fe771879791f9 \
|
||||
--hash=sha256:0a954002064ee919b444b19c1185e8cce307a1f20600f47d6f4b6d336972c809 \
|
||||
--hash=sha256:0aa1845944e62f358d63fcc911ad3b415f585612946b8edc824825929b40e59e \
|
||||
--hash=sha256:104f29dd822be678ef6b16bf0035dcd43206a8a48668a6cae4d2fe9c7a7abdeb \
|
||||
--hash=sha256:11fc7692d95cc7a6a8447bb160d98671ab291e0a8ea90572d582d57361360f05 \
|
||||
--hash=sha256:17a69967561269b691747e7f436d75a4def47e5efcbc3c573180fc828e176d80 \
|
||||
--hash=sha256:2794eef1b04b5ba8948c72cc606aab62ac4b0c538b14806d9c0d88afd0576d6b \
|
||||
--hash=sha256:2c6e942ca9835c0b97814d14f78da453241837419e0d26f7403058e8db3e38f8 \
|
||||
--hash=sha256:2ccdc818cc106cc238ff7eba0d71b9c77be868fdca31d6c3b1347a54c9b187b2 \
|
||||
--hash=sha256:325f272eb997916b4a3fc1fea7313a8adb760934c2140ce13a2117e1b0a8095d \
|
||||
--hash=sha256:39464518a2abe9c505a727af7c0b4efff2cf242aa168be5f0daa47649f4d7ca8 \
|
||||
--hash=sha256:3a24f3213579dc8459e485e333330a921f579543a5214dbc935bc0763474ece3 \
|
||||
--hash=sha256:3aeac044c324c1a4027dca0cde550bd83a0c0fbff7ef2c98df9e718a5086c194 \
|
||||
--hash=sha256:3c22998bfef3fcc1b15694818fc9b1b87c6cc8398198b96b6d355a7bcb8c934e \
|
||||
--hash=sha256:467b73ce5dcd89e381292fb4314aede9b12906c18fab903f995b86034d96d5c8 \
|
||||
--hash=sha256:4a8b58232f5b72973350c2b917ea3df0bebd07c3c82a0a0e34775fc2c1f857e9 \
|
||||
--hash=sha256:4f74aa0092602da2069df0bc6553919a15169d77bcdab52a21f8c5242898f519 \
|
||||
--hash=sha256:5662492df0588a51d5690f6578f3bbbd803e7f8d99a99f3bf6128a401be9c269 \
|
||||
--hash=sha256:5c2d21c2b768d8c86ad935e404cc78c30d53dea009609c3ef3a9d49970c864b5 \
|
||||
--hash=sha256:5edf75e7fcfa9725064ae0d8407c849456553a181ebefedb7606bac19aa1478b \
|
||||
--hash=sha256:60839ab4ea7de6139a3be35b77e22e0398c270020050458b3d25db4c7c394df5 \
|
||||
--hash=sha256:62723e7eb85fa52e536e516ee2ac91433c7bb60d51099293671815ff49ed1c21 \
|
||||
--hash=sha256:64e10f303ea354500c927da5b59c3802196a07468332d292aef9ddaca08d03dd \
|
||||
--hash=sha256:66aa4e9a726b70bcbfcc446b7ba89c8cec40f405e51422c39f42dfa206a96a05 \
|
||||
--hash=sha256:695d0d8b5ae42c800f1763c9fce9d7b94ae3b878919379150ee5ba458a460d57 \
|
||||
--hash=sha256:70048d7b2c07c5eadf8393e6398595591df5f59a2f26abc2f81abca09610492f \
|
||||
--hash=sha256:7afa706510ab079fd6d039cc6e369d4535a48e202d042c32e2097f030a16450f \
|
||||
--hash=sha256:7cf37343e43404699d58808e51f347f57efd3010cc7cee134cdb9141bd1ad9ea \
|
||||
--hash=sha256:8149a6865b14c33be7ae760bcdb73548bb01e8e47ae15e013bf7ef9290ca309a \
|
||||
--hash=sha256:814f26b864ed2230d3a7efe0336f5766ad012f94aad6ba43a7c54ca88dd77cba \
|
||||
--hash=sha256:82a38d7d2077128a017094aff334e67e26194f46bd709f9dcdacbf3835d47ef5 \
|
||||
--hash=sha256:83a7a6560df073ec9de2b7cb685b199dfd12519bc0020c62db9d1bb522f989fa \
|
||||
--hash=sha256:8415239c68b2ec9de10a5adf1130ee9cb0ebd3e19573c55ba160ff0ca809e012 \
|
||||
--hash=sha256:88720794390002b0c8fa29e9602b395093a9a766b229a847e8d88349e418b28a \
|
||||
--hash=sha256:890f633dc8cb307761ec566bc0b4e350a93ddd77dc172839be122be12bae3e10 \
|
||||
--hash=sha256:8926a78192b8b73c936f3e87929931455a6a6c6c385448a07b9f7d1072c19ff3 \
|
||||
--hash=sha256:8c0581077cf2734569f3e500fab09c0ff6a2ab99b1afcacbad09b3c2843ae743 \
|
||||
--hash=sha256:8fda1139d87ce5f7bd80e80e54f9f2c6fe2f47983f1a6f128c47bf310197deb6 \
|
||||
--hash=sha256:91a84faf718e6f8b888ca63d0b2d6d185c8e2a198d2a7322d75c303e7097c8b7 \
|
||||
--hash=sha256:924df1e7e5db27d19b1359dc7d052a917529c95ba5b8b62f4af611176da7c8ad \
|
||||
--hash=sha256:949c9061b8c6d3e6e439466a9be1e787208dec6246f4ec5fffe9677b4c19fcc3 \
|
||||
--hash=sha256:9649891ab4153f217f319914455ccf0b86986b55fc0573ce803eb998ad7d6854 \
|
||||
--hash=sha256:96656c5f7c95fc02c36d4f6ef32f4e94bb0b6b36e6a002c21c39785a4eec5f5d \
|
||||
--hash=sha256:a812df7282a8fc717eafd487fccc5ba40ea83bb5b13eb3c90c446d88dbdfd2be \
|
||||
--hash=sha256:a8d24eb5cb67996fb84633fdc96dbc04f2d8b12bfcb20ab3222d6be271616b67 \
|
||||
--hash=sha256:bef49c07fcb411c942da6ee7d7ea37430f830c482bf6e4b72d92fd506dd3a427 \
|
||||
--hash=sha256:bffba15cff4802ff493d6edcf20d7f94ab1c2aee7cfc1e1c7627c05f1102eee8 \
|
||||
--hash=sha256:c0643250dd0756f4960633f5359884f609a234d4066686754e834073d84e9b51 \
|
||||
--hash=sha256:c6f90234e4438062d6d09f7d667f79edcc7c5e354ba3a145ff98176f974b8132 \
|
||||
--hash=sha256:c8c9301e3274276d3d20ab6335aa7c5d9e5da2009cccb01127bddb5c951f8870 \
|
||||
--hash=sha256:c8ece5d1a99a2adcb38f69af2f07d96fb615415d32820108cd340361f590d128 \
|
||||
--hash=sha256:cb863057bed786f6622982fb8b2c122c68e6e9eddccaa9fa98fd937e45ee6c4f \
|
||||
--hash=sha256:ccbe7129a282ec5797df0451ca1802f11578be018a32979131065565da89b392 \
|
||||
--hash=sha256:d25cdedd72aa2271b984af54294e9527306966ec18963fd032cc851a725ddc1b \
|
||||
--hash=sha256:d75afcbb214d429dacdf75e03a1d6d6c5bd1fa9c35e360df8ea5b6270fb2211c \
|
||||
--hash=sha256:d7815e1519a8361c5ea2a7a5864945906f8e386fa1bc26797b4d443ab11a4589 \
|
||||
--hash=sha256:eb6ac495dccb1520667cfea50d89e26f9ffb49fa28496dea2b95720d8b45eb54 \
|
||||
--hash=sha256:ec615d2912b9ad807afd3be80bf32711c0ff9c2b00aa004a45fd5d5dde7853d9 \
|
||||
--hash=sha256:f5e09dc5c6e1796969fd4b775ea1417d70e49a5df29aaa8e5d10675d9e11872c \
|
||||
--hash=sha256:f6661b58412879a2aa099abb26d3c93e91dedaba55a6394d1fb1512a77e85de9 \
|
||||
--hash=sha256:f7d20c3267385236b4ce54575cc8e9f43e7673fc761b069c820097092e318e3b \
|
||||
--hash=sha256:fe7c51f8a2ab616cb34bc33d810c887e89117771028e1e3d3b77ca25ddeace04
|
||||
# via sqlalchemy
|
||||
idna==3.3 \
|
||||
--hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \
|
||||
--hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d
|
||||
idna==3.4 \
|
||||
--hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \
|
||||
--hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2
|
||||
# via requests
|
||||
jinja2==3.0.3 \
|
||||
--hash=sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8 \
|
||||
--hash=sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7
|
||||
jinja2==3.1.2 \
|
||||
--hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \
|
||||
--hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61
|
||||
# via -r requirements.in
|
||||
josepy==1.13.0 \
|
||||
--hash=sha256:6f64eb35186aaa1776b7a1768651b1c616cab7f9685f9660bffc6491074a5390 \
|
||||
|
@ -193,9 +225,9 @@ josepy==1.13.0 \
|
|||
# via
|
||||
# acme
|
||||
# certbot
|
||||
kubernetes==23.3.0 \
|
||||
--hash=sha256:05c98e4bd92f7091fa0fa58f594490e712c9151144d5f458235663a8909e342a \
|
||||
--hash=sha256:223ff8f0ece5bc20fb65545f09a2308c5e1e9c0be83ae68504c1b1c6baa38f5b
|
||||
kubernetes==25.3.0 \
|
||||
--hash=sha256:213befbb4e5aed95f94950c7eed0c2322fc5a2f8f40932e58d28fdd42d90836c \
|
||||
--hash=sha256:eb42333dad0bb5caf4e66460c6a4a1a36f0f057a040f35018f6c05a699baed86
|
||||
# via -r requirements.in
|
||||
markupsafe==2.1.1 \
|
||||
--hash=sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003 \
|
||||
|
@ -242,10 +274,14 @@ markupsafe==2.1.1 \
|
|||
maxminddb==2.2.0 \
|
||||
--hash=sha256:e37707ec4fab115804670e0fb7aedb4b57075a8b6f80052bdc648d3c005184e5
|
||||
# via -r requirements.in
|
||||
oauthlib==3.2.0 \
|
||||
--hash=sha256:23a8208d75b902797ea29fd31fa80a15ed9dc2c6c16fe73f5d346f83f6fa27a2 \
|
||||
--hash=sha256:6db33440354787f9b7f3a6dbd4febf5d0f93758354060e802f6c06cb493022fe
|
||||
oauthlib==3.2.2 \
|
||||
--hash=sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca \
|
||||
--hash=sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918
|
||||
# via requests-oauthlib
|
||||
packaging==21.3 \
|
||||
--hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \
|
||||
--hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522
|
||||
# via docker
|
||||
parsedatetime==2.6 \
|
||||
--hash=sha256:4cb368fbb18a0b7231f4d76119165451c8d2e35951455dfee97c62a87b04d455 \
|
||||
--hash=sha256:cb96edd7016872f58479e35879294258c71437195760746faffedb692aef000b
|
||||
|
@ -268,12 +304,16 @@ pymysql==1.0.2 \
|
|||
--hash=sha256:41fc3a0c5013d5f039639442321185532e3e2c8924687abe6537de157d403641 \
|
||||
--hash=sha256:816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36
|
||||
# via -r requirements.in
|
||||
pyopenssl==22.0.0 \
|
||||
--hash=sha256:660b1b1425aac4a1bea1d94168a85d99f0b3144c869dd4390d27629d0087f1bf \
|
||||
--hash=sha256:ea252b38c87425b64116f808355e8da644ef9b07e429398bfece610f893ee2e0
|
||||
pyopenssl==22.1.0 \
|
||||
--hash=sha256:7a83b7b272dd595222d672f5ce29aa030f1fb837630ef229f62e72e395ce8968 \
|
||||
--hash=sha256:b28437c9773bb6c6958628cf9c3bebe585de661dba6f63df17111966363dd15e
|
||||
# via
|
||||
# acme
|
||||
# josepy
|
||||
pyparsing==3.0.9 \
|
||||
--hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \
|
||||
--hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc
|
||||
# via packaging
|
||||
pyrfc3339==1.1 \
|
||||
--hash=sha256:67196cb83b470709c580bb4738b83165e67c6cc60e1f2e4f286cfcb402a926f4 \
|
||||
--hash=sha256:81b8cbe1519cdb79bed04910dd6fa4e181faf8c88dff1e1b987b5f7ab23a5b1a
|
||||
|
@ -284,18 +324,19 @@ python-dateutil==2.8.2 \
|
|||
--hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \
|
||||
--hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9
|
||||
# via kubernetes
|
||||
python-dotenv==0.19.2 \
|
||||
--hash=sha256:32b2bdc1873fd3a3c346da1c6db83d0053c3c62f28f1f38516070c4c8971b1d3 \
|
||||
--hash=sha256:a5de49a31e953b45ff2d2fd434bbc2670e8db5273606c1e737cc6b93eff3655f
|
||||
python-dotenv==0.21.0 \
|
||||
--hash=sha256:1684eb44636dd462b66c3ee016599815514527ad99965de77f43e0944634a7e5 \
|
||||
--hash=sha256:b77d08274639e3d34145dfa6c7008e66df0f04b7be7a75fd0d5292c191d79045
|
||||
# via -r requirements.in
|
||||
pytz==2022.1 \
|
||||
--hash=sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7 \
|
||||
--hash=sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c
|
||||
pytz==2022.5 \
|
||||
--hash=sha256:335ab46900b1465e714b4fda4963d87363264eb662aab5e65da039c25f1f5b22 \
|
||||
--hash=sha256:c4d88f472f54d615e9cd582a5004d1e5f624854a6a27a6211591c251f22a6914
|
||||
# via
|
||||
# acme
|
||||
# certbot
|
||||
# pyrfc3339
|
||||
pyyaml==6.0 \
|
||||
--hash=sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf \
|
||||
--hash=sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293 \
|
||||
--hash=sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b \
|
||||
--hash=sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57 \
|
||||
|
@ -307,32 +348,38 @@ pyyaml==6.0 \
|
|||
--hash=sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287 \
|
||||
--hash=sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513 \
|
||||
--hash=sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0 \
|
||||
--hash=sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782 \
|
||||
--hash=sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0 \
|
||||
--hash=sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92 \
|
||||
--hash=sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f \
|
||||
--hash=sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2 \
|
||||
--hash=sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc \
|
||||
--hash=sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1 \
|
||||
--hash=sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c \
|
||||
--hash=sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86 \
|
||||
--hash=sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4 \
|
||||
--hash=sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c \
|
||||
--hash=sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34 \
|
||||
--hash=sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b \
|
||||
--hash=sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d \
|
||||
--hash=sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c \
|
||||
--hash=sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb \
|
||||
--hash=sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7 \
|
||||
--hash=sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737 \
|
||||
--hash=sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3 \
|
||||
--hash=sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d \
|
||||
--hash=sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358 \
|
||||
--hash=sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53 \
|
||||
--hash=sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78 \
|
||||
--hash=sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803 \
|
||||
--hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \
|
||||
--hash=sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f \
|
||||
--hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \
|
||||
--hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5
|
||||
# via kubernetes
|
||||
requests==2.27.1 \
|
||||
--hash=sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61 \
|
||||
--hash=sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d
|
||||
requests==2.28.1 \
|
||||
--hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \
|
||||
--hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349
|
||||
# via
|
||||
# -r requirements.in
|
||||
# acme
|
||||
|
@ -344,13 +391,13 @@ requests-oauthlib==1.3.1 \
|
|||
--hash=sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5 \
|
||||
--hash=sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a
|
||||
# via kubernetes
|
||||
requests-toolbelt==0.9.1 \
|
||||
--hash=sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f \
|
||||
--hash=sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0
|
||||
requests-toolbelt==0.10.1 \
|
||||
--hash=sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7 \
|
||||
--hash=sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d
|
||||
# via acme
|
||||
rsa==4.8 \
|
||||
--hash=sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17 \
|
||||
--hash=sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb
|
||||
rsa==4.9 \
|
||||
--hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \
|
||||
--hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21
|
||||
# via google-auth
|
||||
schedule==1.1.0 \
|
||||
--hash=sha256:617adce8b4bf38c360b781297d59918fbebfb2878f1671d189f4f4af5d0567a4 \
|
||||
|
@ -364,58 +411,59 @@ six==1.16.0 \
|
|||
# google-auth
|
||||
# kubernetes
|
||||
# python-dateutil
|
||||
sqlalchemy==1.4.41 \
|
||||
--hash=sha256:0002e829142b2af00b4eaa26c51728f3ea68235f232a2e72a9508a3116bd6ed0 \
|
||||
--hash=sha256:0005bd73026cd239fc1e8ccdf54db58b6193be9a02b3f0c5983808f84862c767 \
|
||||
--hash=sha256:0292f70d1797e3c54e862e6f30ae474014648bc9c723e14a2fda730adb0a9791 \
|
||||
--hash=sha256:036d8472356e1d5f096c5e0e1a7e0f9182140ada3602f8fff6b7329e9e7cfbcd \
|
||||
--hash=sha256:05f0de3a1dc3810a776275763764bb0015a02ae0f698a794646ebc5fb06fad33 \
|
||||
--hash=sha256:0990932f7cca97fece8017414f57fdd80db506a045869d7ddf2dda1d7cf69ecc \
|
||||
--hash=sha256:13e397a9371ecd25573a7b90bd037db604331cf403f5318038c46ee44908c44d \
|
||||
--hash=sha256:14576238a5f89bcf504c5f0a388d0ca78df61fb42cb2af0efe239dc965d4f5c9 \
|
||||
--hash=sha256:199a73c31ac8ea59937cc0bf3dfc04392e81afe2ec8a74f26f489d268867846c \
|
||||
--hash=sha256:2082a2d2fca363a3ce21cfa3d068c5a1ce4bf720cf6497fb3a9fc643a8ee4ddd \
|
||||
--hash=sha256:22ff16cedab5b16a0db79f1bc99e46a6ddececb60c396562e50aab58ddb2871c \
|
||||
--hash=sha256:2307495d9e0ea00d0c726be97a5b96615035854972cc538f6e7eaed23a35886c \
|
||||
--hash=sha256:2ad2b727fc41c7f8757098903f85fafb4bf587ca6605f82d9bf5604bd9c7cded \
|
||||
--hash=sha256:2d6495f84c4fd11584f34e62f9feec81bf373787b3942270487074e35cbe5330 \
|
||||
--hash=sha256:361f6b5e3f659e3c56ea3518cf85fbdae1b9e788ade0219a67eeaaea8a4e4d2a \
|
||||
--hash=sha256:3e2ef592ac3693c65210f8b53d0edcf9f4405925adcfc031ff495e8d18169682 \
|
||||
--hash=sha256:4676d51c9f6f6226ae8f26dc83ec291c088fe7633269757d333978df78d931ab \
|
||||
--hash=sha256:4ba7e122510bbc07258dc42be6ed45997efdf38129bde3e3f12649be70683546 \
|
||||
--hash=sha256:5102fb9ee2c258a2218281adcb3e1918b793c51d6c2b4666ce38c35101bb940e \
|
||||
--hash=sha256:5323252be2bd261e0aa3f33cb3a64c45d76829989fa3ce90652838397d84197d \
|
||||
--hash=sha256:58bb65b3274b0c8a02cea9f91d6f44d0da79abc993b33bdedbfec98c8440175a \
|
||||
--hash=sha256:59bdc291165b6119fc6cdbc287c36f7f2859e6051dd923bdf47b4c55fd2f8bd0 \
|
||||
--hash=sha256:5facb7fd6fa8a7353bbe88b95695e555338fb038ad19ceb29c82d94f62775a05 \
|
||||
--hash=sha256:639e1ae8d48b3c86ffe59c0daa9a02e2bfe17ca3d2b41611b30a0073937d4497 \
|
||||
--hash=sha256:8eb8897367a21b578b26f5713833836f886817ee2ffba1177d446fa3f77e67c8 \
|
||||
--hash=sha256:90484a2b00baedad361402c257895b13faa3f01780f18f4a104a2f5c413e4536 \
|
||||
--hash=sha256:9c56e19780cd1344fcd362fd6265a15f48aa8d365996a37fab1495cae8fcd97d \
|
||||
--hash=sha256:b67fc780cfe2b306180e56daaa411dd3186bf979d50a6a7c2a5b5036575cbdbb \
|
||||
--hash=sha256:c0dcf127bb99458a9d211e6e1f0f3edb96c874dd12f2503d4d8e4f1fd103790b \
|
||||
--hash=sha256:c23d64a0b28fc78c96289ffbd0d9d1abd48d267269b27f2d34e430ea73ce4b26 \
|
||||
--hash=sha256:ccfd238f766a5bb5ee5545a62dd03f316ac67966a6a658efb63eeff8158a4bbf \
|
||||
--hash=sha256:cd767cf5d7252b1c88fcfb58426a32d7bd14a7e4942497e15b68ff5d822b41ad \
|
||||
--hash=sha256:ce8feaa52c1640de9541eeaaa8b5fb632d9d66249c947bb0d89dd01f87c7c288 \
|
||||
--hash=sha256:d2e054aed4645f9b755db85bc69fc4ed2c9020c19c8027976f66576b906a74f1 \
|
||||
--hash=sha256:e16c2be5cb19e2c08da7bd3a87fed2a0d4e90065ee553a940c4fc1a0fb1ab72b \
|
||||
--hash=sha256:e4b12e3d88a8fffd0b4ca559f6d4957ed91bd4c0613a4e13846ab8729dc5c251 \
|
||||
--hash=sha256:e570cfc40a29d6ad46c9aeaddbdcee687880940a3a327f2c668dd0e4ef0a441d \
|
||||
--hash=sha256:eb30cf008850c0a26b72bd1b9be6730830165ce049d239cfdccd906f2685f892 \
|
||||
--hash=sha256:f37fa70d95658763254941ddd30ecb23fc4ec0c5a788a7c21034fc2305dab7cc \
|
||||
--hash=sha256:f5ebeeec5c14533221eb30bad716bc1fd32f509196318fb9caa7002c4a364e4c \
|
||||
--hash=sha256:f5fa526d027d804b1f85cdda1eb091f70bde6fb7d87892f6dd5a48925bc88898
|
||||
sqlalchemy==1.4.42 \
|
||||
--hash=sha256:04f2598c70ea4a29b12d429a80fad3a5202d56dce19dd4916cc46a965a5ca2e9 \
|
||||
--hash=sha256:0501f74dd2745ec38f44c3a3900fb38b9db1ce21586b691482a19134062bf049 \
|
||||
--hash=sha256:0ee377eb5c878f7cefd633ab23c09e99d97c449dd999df639600f49b74725b80 \
|
||||
--hash=sha256:11b2ec26c5d2eefbc3e6dca4ec3d3d95028be62320b96d687b6e740424f83b7d \
|
||||
--hash=sha256:15d878929c30e41fb3d757a5853b680a561974a0168cd33a750be4ab93181628 \
|
||||
--hash=sha256:177e41914c476ed1e1b77fd05966ea88c094053e17a85303c4ce007f88eff363 \
|
||||
--hash=sha256:1811a0b19a08af7750c0b69e38dec3d46e47c4ec1d74b6184d69f12e1c99a5e0 \
|
||||
--hash=sha256:1d0c23ecf7b3bc81e29459c34a3f4c68ca538de01254e24718a7926810dc39a6 \
|
||||
--hash=sha256:22459fc1718785d8a86171bbe7f01b5c9d7297301ac150f508d06e62a2b4e8d2 \
|
||||
--hash=sha256:28e881266a172a4d3c5929182fde6bb6fba22ac93f137d5380cc78a11a9dd124 \
|
||||
--hash=sha256:2e56dfed0cc3e57b2f5c35719d64f4682ef26836b81067ee6cfad062290fd9e2 \
|
||||
--hash=sha256:2fd49af453e590884d9cdad3586415922a8e9bb669d874ee1dc55d2bc425aacd \
|
||||
--hash=sha256:3ab7c158f98de6cb4f1faab2d12973b330c2878d0c6b689a8ca424c02d66e1b3 \
|
||||
--hash=sha256:4948b6c5f4e56693bbeff52f574279e4ff972ea3353f45967a14c30fb7ae2beb \
|
||||
--hash=sha256:4e1c5f8182b4f89628d782a183d44db51b5af84abd6ce17ebb9804355c88a7b5 \
|
||||
--hash=sha256:5ce6929417d5dce5ad1d3f147db81735a4a0573b8fb36e3f95500a06eaddd93e \
|
||||
--hash=sha256:5ede1495174e69e273fad68ad45b6d25c135c1ce67723e40f6cf536cb515e20b \
|
||||
--hash=sha256:5f966b64c852592469a7eb759615bbd351571340b8b344f1d3fa2478b5a4c934 \
|
||||
--hash=sha256:6045b3089195bc008aee5c273ec3ba9a93f6a55bc1b288841bd4cfac729b6516 \
|
||||
--hash=sha256:6c9d004eb78c71dd4d3ce625b80c96a827d2e67af9c0d32b1c1e75992a7916cc \
|
||||
--hash=sha256:6e39e97102f8e26c6c8550cb368c724028c575ec8bc71afbbf8faaffe2b2092a \
|
||||
--hash=sha256:723e3b9374c1ce1b53564c863d1a6b2f1dc4e97b1c178d9b643b191d8b1be738 \
|
||||
--hash=sha256:876eb185911c8b95342b50a8c4435e1c625944b698a5b4a978ad2ffe74502908 \
|
||||
--hash=sha256:9256563506e040daddccaa948d055e006e971771768df3bb01feeb4386c242b0 \
|
||||
--hash=sha256:934472bb7d8666727746a75670a1f8d91a9cae8c464bba79da30a0f6faccd9e1 \
|
||||
--hash=sha256:97ff50cd85bb907c2a14afb50157d0d5486a4b4639976b4a3346f34b6d1b5272 \
|
||||
--hash=sha256:9b01d9cd2f9096f688c71a3d0f33f3cd0af8549014e66a7a7dee6fc214a7277d \
|
||||
--hash=sha256:9e3a65ce9ed250b2f096f7b559fe3ee92e6605fab3099b661f0397a9ac7c8d95 \
|
||||
--hash=sha256:a7dd5b7b34a8ba8d181402d824b87c5cee8963cb2e23aa03dbfe8b1f1e417cde \
|
||||
--hash=sha256:a85723c00a636eed863adb11f1e8aaa36ad1c10089537823b4540948a8429798 \
|
||||
--hash=sha256:b42c59ffd2d625b28cdb2ae4cde8488543d428cba17ff672a543062f7caee525 \
|
||||
--hash=sha256:bd448b262544b47a2766c34c0364de830f7fb0772d9959c1c42ad61d91ab6565 \
|
||||
--hash=sha256:ca9389a00f639383c93ed00333ed763812f80b5ae9e772ea32f627043f8c9c88 \
|
||||
--hash=sha256:df76e9c60879fdc785a34a82bf1e8691716ffac32e7790d31a98d7dec6e81545 \
|
||||
--hash=sha256:e12c6949bae10f1012ab5c0ea52ab8db99adcb8c7b717938252137cdf694c775 \
|
||||
--hash=sha256:e4ef8cb3c5b326f839bfeb6af5f406ba02ad69a78c7aac0fbeeba994ad9bb48a \
|
||||
--hash=sha256:e7e740453f0149437c101ea4fdc7eea2689938c5760d7dcc436c863a12f1f565 \
|
||||
--hash=sha256:effc89e606165ca55f04f3f24b86d3e1c605e534bf1a96e4e077ce1b027d0b71 \
|
||||
--hash=sha256:f0f574465b78f29f533976c06b913e54ab4980b9931b69aa9d306afff13a9471 \
|
||||
--hash=sha256:fa5b7eb2051e857bf83bade0641628efe5a88de189390725d3e6033a1fff4257 \
|
||||
--hash=sha256:fdb94a3d1ba77ff2ef11912192c066f01e68416f554c194d769391638c8ad09a
|
||||
# via -r requirements.in
|
||||
urllib3==1.26.9 \
|
||||
--hash=sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14 \
|
||||
--hash=sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e
|
||||
urllib3==1.26.12 \
|
||||
--hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \
|
||||
--hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997
|
||||
# via
|
||||
# docker
|
||||
# kubernetes
|
||||
# requests
|
||||
websocket-client==1.3.2 \
|
||||
--hash=sha256:50b21db0058f7a953d67cc0445be4b948d7fc196ecbeb8083d68d94628e4abf6 \
|
||||
--hash=sha256:722b171be00f2b90e1d4fb2f2b53146a536ca38db1da8ff49c972a4e1365d0ef
|
||||
websocket-client==1.4.1 \
|
||||
--hash=sha256:398909eb7e261f44b8f4bd474785b6ec5f5b499d4953342fe9755e01ef624090 \
|
||||
--hash=sha256:f9611eb65c8241a67fb373bef040b3cf8ad377a9f6546a12b620b6511e8ea9ef
|
||||
# via
|
||||
# docker
|
||||
# kubernetes
|
||||
|
@ -427,98 +475,91 @@ zope-event==4.5.0 \
|
|||
--hash=sha256:2666401939cdaa5f4e0c08cf7f20c9b21423b95e88f4675b1443973bdb080c42 \
|
||||
--hash=sha256:5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330
|
||||
# via zope-component
|
||||
zope-hookable==5.1.0 \
|
||||
--hash=sha256:031e7672540685dc9d07565f2b968c6e21c7899c9391da58a23e63f229a8fdcd \
|
||||
--hash=sha256:14bac9afd00e9577227749b37dfc3b9fe4f4fb855923262fc016be47baa42712 \
|
||||
--hash=sha256:16c0748438f716894cb61f3ed00adaa65359a5abe7a12bb44d7133d4b0cd3453 \
|
||||
--hash=sha256:1da8d3386238983e97302b2cbdb510e126968e65e3cb8a8745da9744655001fc \
|
||||
--hash=sha256:24e4489ccf0dbd4c0e9d2d8b845b46994debb30cc22f96da76e973f9cb582799 \
|
||||
--hash=sha256:3111fbc3ddae5d98655691ff81b1c71bd7ad0c3bcf2c2ef659fdc8e66f664603 \
|
||||
--hash=sha256:34a84e15f2e6a3b2e372a67f7d845a372e3f0438319f26dfe9b7cb66ab75be44 \
|
||||
--hash=sha256:35320d283a364c42dbf91694066bc1e7f07628bbd5ec87c1ae08143036e1de49 \
|
||||
--hash=sha256:43855fbab9fb949fa14b5bbcf4c471e4d359428c2196061efe0d82fe3b387101 \
|
||||
--hash=sha256:4711443b964bf7ace58780a3473f520151de8d441e57583b8d8cd8a231fb7656 \
|
||||
--hash=sha256:49427208d9f65e5aa7df5c1be4dc818c51da34e261f4e52fe944a695ae90e3b3 \
|
||||
--hash=sha256:4dbdfe522741effbb507d55354664c93c81db6db66ca124c981d1e3a41e5a31b \
|
||||
--hash=sha256:4dc9693fa28a238f063ba169110ef4199e0f86f9f976b57824c1d742eb21ad2e \
|
||||
--hash=sha256:64337672794b01d039e2380d11dd895ab17043530f27b5e3e0709a11fbe5b532 \
|
||||
--hash=sha256:7067a450b15c8d41d00060890573ddc06f3414e62173dac55b38f6683920c20e \
|
||||
--hash=sha256:7091df7b4d6d897dd00e8717f0fa62b020e28aabe54a92005df22130ed204f6f \
|
||||
--hash=sha256:7b63de104e531109f606d4e3765b82fa3364e387d63b71a02460d321e24b33c8 \
|
||||
--hash=sha256:7ef3128b5bcb97029c19df95126f57638afe6d2aca0ffede989149fa0bbd744a \
|
||||
--hash=sha256:800f93479202b05e46ba7696a2dd5411cfdd9d87c47a7d2b6fcda5394a5f9042 \
|
||||
--hash=sha256:84dfb4f5189c8a3b70dfdf0d268840d5dce69048d4767120910f4665fa5ee2f3 \
|
||||
--hash=sha256:8cf9982d43f6a732d041cf68b08fa969e5bcf090212ab519a637c8a393015eda \
|
||||
--hash=sha256:8fc3e6cd0486c6af48e3317c299def719b57538332a194e0b3bc6a772f4faa0e \
|
||||
--hash=sha256:a766186b97e493928dfac4a4b6c7508e47411e78c6f3be9846e8981eb91542d4 \
|
||||
--hash=sha256:bfd1b1107a51ddfbd628c1ff884c6a67e92519b23012563b6082d438dbd16b9d \
|
||||
--hash=sha256:cbcbf6d31092caafb40ab26d07c065bf4f60f3ba7925d23d51a4e19469034544 \
|
||||
--hash=sha256:cf27270212fa51005162d75cae83bb943c84ece7c7f8d30d68efebfad2f469d9 \
|
||||
--hash=sha256:cf7f1f973aeced06ab1a245faa71e867cec6a053b807c2aad4c1728964aac071 \
|
||||
--hash=sha256:de77a946ef020d08643647e417713ed753a2eed1f4495259c38a241c8eb31dbf \
|
||||
--hash=sha256:e3b01e7cf16b4a3257ee05e4c354737a4f64af302846826c46a296a7944b8da9 \
|
||||
--hash=sha256:ff08276e555f2ef262fd03d872cca130e7ee376b87d7651a5595aae2fa5b2425
|
||||
zope-hookable==5.2 \
|
||||
--hash=sha256:00615d623295aaaad569a2e77b9659359a0c8cffd8077aaa9c114b55c3c78440 \
|
||||
--hash=sha256:120c9a4f10db108f93edc7195c2efd15bccf3dda5b7ca45d4af16bf7c04381ad \
|
||||
--hash=sha256:16d7ac04fe3bb7e8cfaf5303694ce861af9cecd84e559a1a82d2c7037fc489bc \
|
||||
--hash=sha256:2151318d6c9167bdbf9def70c56807488ae95cc2741ec2461d3b30e6ecdf6865 \
|
||||
--hash=sha256:22d47fcb3769bcdf071289a4e0ae576a00b65ff890c51995d7b2f8b68a9fa86c \
|
||||
--hash=sha256:34e1ff9d76c4d65f87ab859cb68f6b3ed2e9b1337c40568347de910fcf963d8c \
|
||||
--hash=sha256:3a0f478514051788ff6e070086be44a3caee5962661f422c74562353770995d6 \
|
||||
--hash=sha256:3b3c9d5f419704f4d8e1327d4061c12a147a43025846bce0d4a6fc01447aeba9 \
|
||||
--hash=sha256:3c6043bc00e3a49e32a3957207ce07d381f6d343b4b6ea243ccb4314b56a55d4 \
|
||||
--hash=sha256:48287c32e274672a6d3997415e6b5bea43808029b07255647e93746f3c5c33b7 \
|
||||
--hash=sha256:4c3018bcf2b39cf5cccf40826f799b4b8c140056db780f96cb0ca332a243bd29 \
|
||||
--hash=sha256:5496d75a533cdac2dacbce4a3e694dda4b4cbc45d225c1ad914526c8961aa14b \
|
||||
--hash=sha256:5e5a8412b91352b0adf2120492ffd5380452632ccd1cd625c937898d5d171d5f \
|
||||
--hash=sha256:66d80ecc62fb9f1ad21e9efa1571d18d486ab772ffd674abaa39076ad43837e4 \
|
||||
--hash=sha256:68bbd32e010b42db5d9878b98b84222f474c0641a42bd8b30bc3deffd05111c3 \
|
||||
--hash=sha256:71f00eebcd23aa26231f9130144fb146459bb4b665498c84cd0c332d45491cf5 \
|
||||
--hash=sha256:73d3161798337f7416444d3265d6939e2abd3d0f4bf30dd7116bab04707c1cff \
|
||||
--hash=sha256:74d425c708d690f0504711c5ecbcd2573cea4c355c42d2081a85c3bb76db7d6a \
|
||||
--hash=sha256:7aa7776c642cad6ea655a8c11ca8b0daa0e5513b5b91dd55b2a3512db259117f \
|
||||
--hash=sha256:7dab7c76d0bb151eb21198c7edef834d3bf0812bc40e0183deea527531ae512b \
|
||||
--hash=sha256:802c5222a6f09d01fa5d999147c3e4ef74d4f8c33fb376a85990c211b9c52e49 \
|
||||
--hash=sha256:83c42469b5adb0240d61619076d0eb9a65da5e6acb8ff27dd56c7073321582a7 \
|
||||
--hash=sha256:883338bfd1b14e56b13c406fb12ce793ade19460aeec7b02cd895351a08468e7 \
|
||||
--hash=sha256:8abc311ebed511bbe46d95c339e7ec853275e377635b16ea10b6148890cf9b7e \
|
||||
--hash=sha256:9f31beced1c28288286197e9f95173314ab4dd88bdc7a1d6aa7f3e45cf743942 \
|
||||
--hash=sha256:a50320c718610a48cd6f1ebd1c2bd65aeb8501b0a929bbdc88a898a19a744d4c \
|
||||
--hash=sha256:ae6f86f1f0dcd999eaf008b4524314624e60aa793c31454df6f86b092494ab60 \
|
||||
--hash=sha256:af4ed40fd81ef292f0c196f40b59e65b3d19e48e40ccb1490e73a10125b31577 \
|
||||
--hash=sha256:b0c1c63664ee7389db4e437e24fa6025f334593b2f63ed47e4ae6b1e82257366 \
|
||||
--hash=sha256:b3e7a4661ddabb933d80c560099f4fca6db4b58a54a97dcaccef90bf6b7bc431 \
|
||||
--hash=sha256:d3c0632b51dc0f0743054e4ae22672439774b756b632244e745f05bbc4345771 \
|
||||
--hash=sha256:df68bd26bef4a338c062a8f6a0eca8d27582b212aa74ae58714d410f348cb314 \
|
||||
--hash=sha256:e3a48050d820722907d9fad9f6e9e30f928e8a6d724aa173abd521dec8964e05 \
|
||||
--hash=sha256:e45964866a1c59c2660573730ae2409c6168873c412b57cec44b221b374b7c0f \
|
||||
--hash=sha256:eb08b8f23a75af9a9003d8990247fd2fdac7e486dafae32d2a147e805545235b \
|
||||
--hash=sha256:fabd9152bfb335892a4f980a00e861f31cec09bceffae1e9686189ea1e55141a \
|
||||
--hash=sha256:fdd147669c38ea64a3b745a01a217ac21a76b69777ca165fd2953d1c675b1779
|
||||
# via zope-component
|
||||
zope-interface==5.4.0 \
|
||||
--hash=sha256:08f9636e99a9d5410181ba0729e0408d3d8748026ea938f3b970a0249daa8192 \
|
||||
--hash=sha256:0b465ae0962d49c68aa9733ba92a001b2a0933c317780435f00be7ecb959c702 \
|
||||
--hash=sha256:0cba8477e300d64a11a9789ed40ee8932b59f9ee05f85276dbb4b59acee5dd09 \
|
||||
--hash=sha256:0cee5187b60ed26d56eb2960136288ce91bcf61e2a9405660d271d1f122a69a4 \
|
||||
--hash=sha256:0ea1d73b7c9dcbc5080bb8aaffb776f1c68e807767069b9ccdd06f27a161914a \
|
||||
--hash=sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3 \
|
||||
--hash=sha256:15e7d1f7a6ee16572e21e3576d2012b2778cbacf75eb4b7400be37455f5ca8bf \
|
||||
--hash=sha256:17776ecd3a1fdd2b2cd5373e5ef8b307162f581c693575ec62e7c5399d80794c \
|
||||
--hash=sha256:194d0bcb1374ac3e1e023961610dc8f2c78a0f5f634d0c737691e215569e640d \
|
||||
--hash=sha256:1c0e316c9add0db48a5b703833881351444398b04111188069a26a61cfb4df78 \
|
||||
--hash=sha256:205e40ccde0f37496904572035deea747390a8b7dc65146d30b96e2dd1359a83 \
|
||||
--hash=sha256:273f158fabc5ea33cbc936da0ab3d4ba80ede5351babc4f577d768e057651531 \
|
||||
--hash=sha256:2876246527c91e101184f63ccd1d716ec9c46519cc5f3d5375a3351c46467c46 \
|
||||
--hash=sha256:2c98384b254b37ce50eddd55db8d381a5c53b4c10ee66e1e7fe749824f894021 \
|
||||
--hash=sha256:2e5a26f16503be6c826abca904e45f1a44ff275fdb7e9d1b75c10671c26f8b94 \
|
||||
--hash=sha256:334701327f37c47fa628fc8b8d28c7d7730ce7daaf4bda1efb741679c2b087fc \
|
||||
--hash=sha256:3748fac0d0f6a304e674955ab1365d515993b3a0a865e16a11ec9d86fb307f63 \
|
||||
--hash=sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54 \
|
||||
--hash=sha256:3dd4952748521205697bc2802e4afac5ed4b02909bb799ba1fe239f77fd4e117 \
|
||||
--hash=sha256:3f24df7124c323fceb53ff6168da70dbfbae1442b4f3da439cd441681f54fe25 \
|
||||
--hash=sha256:469e2407e0fe9880ac690a3666f03eb4c3c444411a5a5fddfdabc5d184a79f05 \
|
||||
--hash=sha256:4de4bc9b6d35c5af65b454d3e9bc98c50eb3960d5a3762c9438df57427134b8e \
|
||||
--hash=sha256:5208ebd5152e040640518a77827bdfcc73773a15a33d6644015b763b9c9febc1 \
|
||||
--hash=sha256:52de7fc6c21b419078008f697fd4103dbc763288b1406b4562554bd47514c004 \
|
||||
--hash=sha256:5bb3489b4558e49ad2c5118137cfeaf59434f9737fa9c5deefc72d22c23822e2 \
|
||||
--hash=sha256:5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e \
|
||||
--hash=sha256:5dd9ca406499444f4c8299f803d4a14edf7890ecc595c8b1c7115c2342cadc5f \
|
||||
--hash=sha256:5f931a1c21dfa7a9c573ec1f50a31135ccce84e32507c54e1ea404894c5eb96f \
|
||||
--hash=sha256:63b82bb63de7c821428d513607e84c6d97d58afd1fe2eb645030bdc185440120 \
|
||||
--hash=sha256:66c0061c91b3b9cf542131148ef7ecbecb2690d48d1612ec386de9d36766058f \
|
||||
--hash=sha256:6f0c02cbb9691b7c91d5009108f975f8ffeab5dff8f26d62e21c493060eff2a1 \
|
||||
--hash=sha256:71aace0c42d53abe6fc7f726c5d3b60d90f3c5c055a447950ad6ea9cec2e37d9 \
|
||||
--hash=sha256:7d97a4306898b05404a0dcdc32d9709b7d8832c0c542b861d9a826301719794e \
|
||||
--hash=sha256:7df1e1c05304f26faa49fa752a8c690126cf98b40b91d54e6e9cc3b7d6ffe8b7 \
|
||||
--hash=sha256:8270252effc60b9642b423189a2fe90eb6b59e87cbee54549db3f5562ff8d1b8 \
|
||||
--hash=sha256:867a5ad16892bf20e6c4ea2aab1971f45645ff3102ad29bd84c86027fa99997b \
|
||||
--hash=sha256:877473e675fdcc113c138813a5dd440da0769a2d81f4d86614e5d62b69497155 \
|
||||
--hash=sha256:8892f89999ffd992208754851e5a052f6b5db70a1e3f7d54b17c5211e37a98c7 \
|
||||
--hash=sha256:9a9845c4c6bb56e508651f005c4aeb0404e518c6f000d5a1123ab077ab769f5c \
|
||||
--hash=sha256:a1e6e96217a0f72e2b8629e271e1b280c6fa3fe6e59fa8f6701bec14e3354325 \
|
||||
--hash=sha256:a8156e6a7f5e2a0ff0c5b21d6bcb45145efece1909efcbbbf48c56f8da68221d \
|
||||
--hash=sha256:a9506a7e80bcf6eacfff7f804c0ad5350c8c95b9010e4356a4b36f5322f09abb \
|
||||
--hash=sha256:af310ec8335016b5e52cae60cda4a4f2a60a788cbb949a4fbea13d441aa5a09e \
|
||||
--hash=sha256:b0297b1e05fd128d26cc2460c810d42e205d16d76799526dfa8c8ccd50e74959 \
|
||||
--hash=sha256:bf68f4b2b6683e52bec69273562df15af352e5ed25d1b6641e7efddc5951d1a7 \
|
||||
--hash=sha256:d0c1bc2fa9a7285719e5678584f6b92572a5b639d0e471bb8d4b650a1a910920 \
|
||||
--hash=sha256:d4d9d6c1a455d4babd320203b918ccc7fcbefe308615c521062bc2ba1aa4d26e \
|
||||
--hash=sha256:db1fa631737dab9fa0b37f3979d8d2631e348c3b4e8325d6873c2541d0ae5a48 \
|
||||
--hash=sha256:dd93ea5c0c7f3e25335ab7d22a507b1dc43976e1345508f845efc573d3d779d8 \
|
||||
--hash=sha256:f44e517131a98f7a76696a7b21b164bcb85291cee106a23beccce454e1f433a4 \
|
||||
--hash=sha256:f7ee479e96f7ee350db1cf24afa5685a5899e2b34992fb99e1f7c1b0b758d263
|
||||
zope-interface==5.5.0 \
|
||||
--hash=sha256:006f8dd81fae28027fc28ada214855166712bf4f0bfbc5a8788f9b70982b9437 \
|
||||
--hash=sha256:03f5ae315db0d0de668125d983e2a819a554f3fdb2d53b7e934e3eb3c3c7375d \
|
||||
--hash=sha256:0eb2b3e84f48dd9cfc8621c80fba905d7e228615c67f76c7df7c716065669bb6 \
|
||||
--hash=sha256:1e3495bb0cdcea212154e558082c256f11b18031f05193ae2fb85d048848db14 \
|
||||
--hash=sha256:26c1456520fdcafecc5765bec4783eeafd2e893eabc636908f50ee31fe5c738c \
|
||||
--hash=sha256:2cb3003941f5f4fa577479ac6d5db2b940acb600096dd9ea9bf07007f5cab46f \
|
||||
--hash=sha256:37ec9ade9902f412cc7e7a32d71f79dec3035bad9bd0170226252eed88763c48 \
|
||||
--hash=sha256:3eedf3d04179774d750e8bb4463e6da350956a50ed44d7b86098e452d7ec385e \
|
||||
--hash=sha256:3f68404edb1a4fb6aa8a94675521ca26c83ebbdbb90e894f749ae0dc4ca98418 \
|
||||
--hash=sha256:423c074e404f13e6fa07f4454f47fdbb38d358be22945bc812b94289d9142374 \
|
||||
--hash=sha256:43490ad65d4c64e45a30e51a2beb7a6b63e1ff395302ad22392224eb618476d6 \
|
||||
--hash=sha256:47ff078734a1030c48103422a99e71a7662d20258c00306546441adf689416f7 \
|
||||
--hash=sha256:58a66c2020a347973168a4a9d64317bac52f9fdfd3e6b80b252be30da881a64e \
|
||||
--hash=sha256:58a975f89e4584d0223ab813c5ba4787064c68feef4b30d600f5e01de90ae9ce \
|
||||
--hash=sha256:5c6023ae7defd052cf76986ce77922177b0c2f3913bea31b5b28fbdf6cb7099e \
|
||||
--hash=sha256:6566b3d2657e7609cd8751bcb1eab1202b1692a7af223035a5887d64bb3a2f3b \
|
||||
--hash=sha256:687cab7f9ae18d2c146f315d0ca81e5ffe89a139b88277afa70d52f632515854 \
|
||||
--hash=sha256:700ebf9662cf8df70e2f0cb4988e078c53f65ee3eefd5c9d80cf988c4175c8e3 \
|
||||
--hash=sha256:740f3c1b44380658777669bcc42f650f5348e53797f2cee0d93dc9b0f9d7cc69 \
|
||||
--hash=sha256:7bdcec93f152e0e1942102537eed7b166d6661ae57835b20a52a2a3d6a3e1bf3 \
|
||||
--hash=sha256:7d9ec1e6694af39b687045712a8ad14ddcb568670d5eb1b66b48b98b9312afba \
|
||||
--hash=sha256:85dd6dd9aaae7a176948d8bb62e20e2968588fd787c29c5d0d964ab475168d3d \
|
||||
--hash=sha256:8b9f153208d74ccfa25449a0c6cb756ab792ce0dc99d9d771d935f039b38740c \
|
||||
--hash=sha256:8c791f4c203ccdbcda588ea4c8a6e4353e10435ea48ddd3d8734a26fe9714cba \
|
||||
--hash=sha256:970661ece2029915b8f7f70892e88404340fbdefd64728380cad41c8dce14ff4 \
|
||||
--hash=sha256:9cdc4e898d3b1547d018829fd4a9f403e52e51bba24be0fbfa37f3174e1ef797 \
|
||||
--hash=sha256:9dc4493aa3d87591e3d2bf1453e25b98038c839ca8e499df3d7106631b66fe83 \
|
||||
--hash=sha256:a69c28d85bb7cf557751a5214cb3f657b2b035c8c96d71080c1253b75b79b69b \
|
||||
--hash=sha256:aeac590cce44e68ee8ad0b8ecf4d7bf15801f102d564ca1b0eb1f12f584ee656 \
|
||||
--hash=sha256:be11fce0e6af6c0e8d93c10ef17b25aa7c4acb7ec644bff2596c0d639c49e20f \
|
||||
--hash=sha256:cbbf83914b9a883ab324f728de869f4e406e0cbcd92df7e0a88decf6f9ab7d5a \
|
||||
--hash=sha256:cfa614d049667bed1c737435c609c0956c5dc0dbafdc1145ee7935e4658582cb \
|
||||
--hash=sha256:d18fb0f6c8169d26044128a2e7d3c39377a8a151c564e87b875d379dbafd3930 \
|
||||
--hash=sha256:d80f6236b57a95eb19d5e47eb68d0296119e1eff6deaa2971ab8abe3af918420 \
|
||||
--hash=sha256:da7912ae76e1df6a1fb841b619110b1be4c86dfb36699d7fd2f177105cdea885 \
|
||||
--hash=sha256:df6593e150d13cfcce69b0aec5df7bc248cb91e4258a7374c129bb6d56b4e5ca \
|
||||
--hash=sha256:f70726b60009433111fe9928f5d89cbb18962411d33c45fb19eb81b9bbd26fcd
|
||||
# via
|
||||
# certbot
|
||||
# zope-component
|
||||
|
||||
# The following packages are considered to be unsafe in a requirements file:
|
||||
setuptools==61.2.0 \
|
||||
--hash=sha256:8f4813dd6a4d6cc17bde85fb2e635fe19763f96efbb0ddf5575562e5ee0bc47a \
|
||||
--hash=sha256:c3d4e2ab578fbf83775755cd76dae73627915a22832cf4ea5de895978767833b
|
||||
setuptools==65.5.0 \
|
||||
--hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \
|
||||
--hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356
|
||||
# via
|
||||
# acme
|
||||
# certbot
|
||||
|
@ -527,4 +568,4 @@ setuptools==61.2.0 \
|
|||
# zope-component
|
||||
# zope-event
|
||||
# zope-hookable
|
||||
# zope-interface
|
||||
# zope-interface
|
||||
|
|
224
bw/gen/main.py
224
bw/gen/main.py
|
@ -12,6 +12,7 @@ from subprocess import DEVNULL, STDOUT, run
|
|||
from sys import exit as sys_exit, path as sys_path
|
||||
from time import sleep
|
||||
from traceback import format_exc
|
||||
from typing import Any
|
||||
|
||||
|
||||
sys_path.append("/opt/bunkerweb/deps/python")
|
||||
|
@ -20,6 +21,7 @@ sys_path.append("/opt/bunkerweb/api")
|
|||
sys_path.append("/opt/bunkerweb/db")
|
||||
|
||||
from docker import DockerClient
|
||||
from kubernetes import client as kube_client
|
||||
|
||||
from logger import setup_logger
|
||||
from Database import Database
|
||||
|
@ -161,6 +163,10 @@ if __name__ == "__main__":
|
|||
for plugin in core_plugins[order]:
|
||||
core_settings.update(plugin["settings"])
|
||||
|
||||
if exists("/opt/bunkerweb/INTEGRATION"):
|
||||
with open("/opt/bunkerweb/INTEGRATION", "r") as f:
|
||||
integration = f.read().strip()
|
||||
|
||||
if args.variables or args.init:
|
||||
# Compute the config
|
||||
logger.info("Computing config ...")
|
||||
|
@ -259,23 +265,25 @@ if __name__ == "__main__":
|
|||
|
||||
sys_exit(0)
|
||||
|
||||
config = config_files
|
||||
elif args.method != "autoconf":
|
||||
config = db.get_config()
|
||||
elif integration == "Docker":
|
||||
bw_integration = "Cluster"
|
||||
docker_client = DockerClient(
|
||||
base_url=getenv("DOCKER_HOST", "unix:///var/run/docker.sock")
|
||||
)
|
||||
tmp_config = {}
|
||||
custom_confs = []
|
||||
apis = []
|
||||
db = None
|
||||
|
||||
for instance in docker_client.containers.list(
|
||||
filters={"label": "bunkerweb.INSTANCE"}
|
||||
):
|
||||
api = None
|
||||
def get_instance_configs_and_apis(instance: Any, db, _type="Docker"):
|
||||
api_http_port = None
|
||||
api_server_name = None
|
||||
tmp_config = {}
|
||||
custom_confs = []
|
||||
apis = []
|
||||
|
||||
for var in instance.attrs["Config"]["Env"]:
|
||||
for var in (
|
||||
instance.attrs["Config"]["Env"]
|
||||
if _type == "Docker"
|
||||
else instance.attrs["Spec"]["TaskTemplate"]["ContainerSpec"]["Env"]
|
||||
):
|
||||
splitted = var.split("=", 1)
|
||||
if custom_confs_rx.match(splitted[0]):
|
||||
custom_confs.append(
|
||||
|
@ -289,20 +297,60 @@ if __name__ == "__main__":
|
|||
else:
|
||||
tmp_config[splitted[0]] = splitted[1]
|
||||
|
||||
if splitted[0] == "DATABASE_URI":
|
||||
if db is None and splitted[0] == "DATABASE_URI":
|
||||
db = Database(
|
||||
logger,
|
||||
sqlalchemy_string=splitted[1],
|
||||
)
|
||||
elif splitted[0] == "API_HTTP_PORT":
|
||||
api = API(f"http://{instance.name}:{splitted[1]}")
|
||||
api_http_port = splitted[1]
|
||||
elif splitted[0] == "API_SERVER_NAME":
|
||||
api_server_name = splitted[1]
|
||||
|
||||
if api:
|
||||
apis.append(api)
|
||||
else:
|
||||
apis.append(
|
||||
API(f"http://{instance.name}:{getenv('API_HTTP_PORT', '5000')}")
|
||||
apis.append(
|
||||
API(
|
||||
f"http://{instance.name}:{api_http_port or getenv('API_HTTP_PORT', '5000')}",
|
||||
host=api_server_name or getenv("API_SERVER_NAME", "bwapi"),
|
||||
)
|
||||
)
|
||||
|
||||
return tmp_config, custom_confs, apis, db
|
||||
|
||||
tmp_config = {}
|
||||
custom_confs = []
|
||||
apis = []
|
||||
db = None
|
||||
|
||||
for instance in docker_client.containers.list(
|
||||
filters={"label": "bunkerweb.INSTANCE"}
|
||||
):
|
||||
conf, cstm_confs, tmp_apis, tmp_db = get_instance_configs_and_apis(
|
||||
instance, db
|
||||
)
|
||||
tmp_config.update(conf)
|
||||
custom_confs.extend(cstm_confs)
|
||||
apis.extend(tmp_apis)
|
||||
if db is None:
|
||||
db = tmp_db
|
||||
|
||||
is_swarm = True
|
||||
try:
|
||||
docker_client.swarm.version
|
||||
except:
|
||||
is_swarm = False
|
||||
|
||||
if is_swarm:
|
||||
for instance in docker_client.services.list(
|
||||
filters={"label": "bunkerweb.INSTANCE"}
|
||||
):
|
||||
conf, cstm_confs, tmp_apis, tmp_db = get_instance_configs_and_apis(
|
||||
instance, db, "Swarm"
|
||||
)
|
||||
tmp_config.update(conf)
|
||||
custom_confs.extend(cstm_confs)
|
||||
apis.extend(tmp_apis)
|
||||
if db is None:
|
||||
db = tmp_db
|
||||
|
||||
if db is None:
|
||||
db = Database(logger)
|
||||
|
@ -338,7 +386,125 @@ if __name__ == "__main__":
|
|||
else:
|
||||
logger.info("Config successfully saved to database")
|
||||
|
||||
config = config_files
|
||||
config = db.get_config()
|
||||
elif integration == "Kubernetes":
|
||||
bw_integration = "Kubernetes"
|
||||
corev1 = kube_client.CoreV1Api()
|
||||
tmp_config = {}
|
||||
apis = []
|
||||
db = None
|
||||
|
||||
for pod in corev1.list_pod_for_all_namespaces(watch=False).items:
|
||||
if (
|
||||
pod.metadata.annotations != None
|
||||
and "bunkerweb.io/INSTANCE" in pod.metadata.annotations
|
||||
):
|
||||
api_http_port = None
|
||||
api_server_name = None
|
||||
|
||||
for pod_env in pod.spec.containers[0].env:
|
||||
tmp_config[pod_env.name] = pod_env.value
|
||||
|
||||
if db is None and pod_env.name == "DATABASE_URI":
|
||||
db = Database(
|
||||
logger,
|
||||
sqlalchemy_string=pod_env.value,
|
||||
)
|
||||
elif pod_env.name == "API_HTTP_PORT":
|
||||
api_http_port = pod_env.value
|
||||
elif pod_env.name == "API_SERVER_NAME":
|
||||
api_server_name = pod_env.value
|
||||
|
||||
apis.append(
|
||||
API(
|
||||
f"http://{pod.status.pod_ip}:{api_http_port or getenv('API_HTTP_PORT', '5000')}",
|
||||
host=api_server_name or getenv("API_SERVER_NAME", "bwapi"),
|
||||
)
|
||||
)
|
||||
|
||||
if db is None:
|
||||
db = Database(logger)
|
||||
|
||||
api_caller = ApiCaller(apis=apis)
|
||||
|
||||
# Compute the config
|
||||
logger.info("Computing config ...")
|
||||
config = Configurator(
|
||||
args.settings, core_settings, args.plugins, tmp_config, logger
|
||||
)
|
||||
config_files = config.get_config()
|
||||
|
||||
if config_files.get("LOG_LEVEL", logger.level) != logger.level:
|
||||
logger = setup_logger("Generator", config_files["LOG_LEVEL"])
|
||||
|
||||
err = db.save_config(config_files, args.method)
|
||||
|
||||
if not err:
|
||||
supported_config_types = [
|
||||
"http",
|
||||
"stream",
|
||||
"server-http",
|
||||
"server-stream",
|
||||
"default-server-http",
|
||||
"modsec",
|
||||
"modsec-crs",
|
||||
]
|
||||
custom_confs = []
|
||||
|
||||
for configmap in corev1.list_config_map_for_all_namespaces(
|
||||
watch=False
|
||||
).items:
|
||||
if (
|
||||
configmap.metadata.annotations is None
|
||||
or "bunkerweb.io/CONFIG_TYPE"
|
||||
not in configmap.metadata.annotations
|
||||
):
|
||||
continue
|
||||
|
||||
config_type = configmap.metadata.annotations[
|
||||
"bunkerweb.io/CONFIG_TYPE"
|
||||
]
|
||||
|
||||
if config_type not in supported_config_types:
|
||||
logger.warning(
|
||||
f"Ignoring unsupported CONFIG_TYPE {config_type} for ConfigMap {configmap.metadata.name}",
|
||||
)
|
||||
continue
|
||||
elif not configmap.data:
|
||||
logger.warning(
|
||||
f"Ignoring blank ConfigMap {configmap.metadata.name}",
|
||||
)
|
||||
continue
|
||||
|
||||
config_site = ""
|
||||
if "bunkerweb.io/CONFIG_SITE" in configmap.metadata.annotations:
|
||||
config_site = f"{configmap.metadata.annotations['bunkerweb.io/CONFIG_SITE']}/"
|
||||
|
||||
for config_name, config_data in configmap.data.items():
|
||||
custom_confs.append(
|
||||
{
|
||||
"value": config_data,
|
||||
"exploded": (config_site, config_type, config_name),
|
||||
}
|
||||
)
|
||||
|
||||
err1 = db.save_custom_configs(custom_confs, args.method)
|
||||
else:
|
||||
err = None
|
||||
err1 = None
|
||||
|
||||
with open("/opt/bunkerweb/VERSION", "r") as f:
|
||||
bw_version = f.read().strip()
|
||||
|
||||
if err or err1:
|
||||
logger.error(
|
||||
f"Can't save config to database : {err or err1}",
|
||||
)
|
||||
sys_exit(1)
|
||||
else:
|
||||
logger.info("Config successfully saved to database")
|
||||
|
||||
config = db.get_config()
|
||||
else:
|
||||
db = Database(
|
||||
logger,
|
||||
|
@ -360,7 +526,7 @@ if __name__ == "__main__":
|
|||
|
||||
logger = setup_logger("Generator", config.get("LOG_LEVEL", "INFO"))
|
||||
|
||||
if args.method != "autoconf" and bw_integration == "Cluster":
|
||||
if integration == "Docker":
|
||||
while not api_caller._send_to_apis("GET", "/ping"):
|
||||
logger.warning(
|
||||
"Waiting for BunkerWeb's temporary nginx to start, retrying in 5 seconds ...",
|
||||
|
@ -392,22 +558,6 @@ if __name__ == "__main__":
|
|||
elif isdir(file):
|
||||
rmtree(file, ignore_errors=False)
|
||||
|
||||
if args.method != "autoconf":
|
||||
logger.info(
|
||||
"Generating custom configs from Database ...",
|
||||
)
|
||||
custom_configs = db.get_custom_configs()
|
||||
original_path = "/data/configs"
|
||||
makedirs(original_path, exist_ok=True)
|
||||
for custom_config in custom_configs:
|
||||
tmp_path = f"{original_path}/{custom_config['type'].replace('_', '-')}"
|
||||
if custom_config["service_id"]:
|
||||
tmp_path += f"/{custom_config['service_id']}"
|
||||
tmp_path += f"/{custom_config['name']}.conf"
|
||||
makedirs(dirname(tmp_path), exist_ok=True)
|
||||
with open(tmp_path, "w") as f:
|
||||
f.write(custom_config["data"])
|
||||
|
||||
# Render the templates
|
||||
logger.info("Rendering templates ...")
|
||||
templator = Templator(
|
||||
|
@ -420,7 +570,7 @@ if __name__ == "__main__":
|
|||
)
|
||||
templator.render()
|
||||
|
||||
if args.method != "autoconf" and bw_integration == "Cluster":
|
||||
if integration == "Docker":
|
||||
ret = api_caller._send_to_apis("POST", "/reload")
|
||||
if not ret:
|
||||
logger.error(
|
||||
|
|
202
db/Database.py
202
db/Database.py
|
@ -65,6 +65,26 @@ class Database:
|
|||
if sqlalchemy_string:
|
||||
break
|
||||
|
||||
is_swarm = True
|
||||
try:
|
||||
docker_client.swarm.version
|
||||
except:
|
||||
is_swarm = False
|
||||
|
||||
if not sqlalchemy_string and is_swarm:
|
||||
for instance in docker_client.services.list(
|
||||
filters={"label": "bunkerweb.INSTANCE"}
|
||||
):
|
||||
for var in instance.attrs["Spec"]["TaskTemplate"][
|
||||
"ContainerSpec"
|
||||
]["Env"]:
|
||||
if var.startswith("DATABASE_URI="):
|
||||
sqlalchemy_string = var.replace("DATABASE_URI=", "", 1)
|
||||
break
|
||||
|
||||
if sqlalchemy_string:
|
||||
break
|
||||
|
||||
if not sqlalchemy_string:
|
||||
sqlalchemy_string = getenv("DATABASE_URI", "sqlite:////data/db.sqlite3")
|
||||
|
||||
|
@ -131,7 +151,12 @@ class Database:
|
|||
"""Check if the first configuration has been saved"""
|
||||
with self.__db_session() as session:
|
||||
try:
|
||||
metadata = session.query(Metadata).get(1)
|
||||
metadata = (
|
||||
session.query(Metadata)
|
||||
.with_entities(Metadata.first_config_saved)
|
||||
.filter_by(id=1)
|
||||
.first()
|
||||
)
|
||||
return metadata is not None and metadata.first_config_saved
|
||||
except (ProgrammingError, OperationalError):
|
||||
return False
|
||||
|
@ -140,7 +165,12 @@ class Database:
|
|||
"""Check if the database is initialized"""
|
||||
with self.__db_session() as session:
|
||||
try:
|
||||
metadata = session.query(Metadata).get(1)
|
||||
metadata = (
|
||||
session.query(Metadata)
|
||||
.with_entities(Metadata.is_initialized)
|
||||
.filter_by(id=1)
|
||||
.first()
|
||||
)
|
||||
return metadata is not None and metadata.is_initialized
|
||||
except (ProgrammingError, OperationalError):
|
||||
return False
|
||||
|
@ -268,6 +298,14 @@ class Database:
|
|||
if config["MULTISITE"] == "yes":
|
||||
global_values = []
|
||||
for server_name in config["SERVER_NAME"].split(" "):
|
||||
if (
|
||||
session.query(Services)
|
||||
.with_entities(Services.id)
|
||||
.filter_by(id=server_name)
|
||||
.first()
|
||||
):
|
||||
continue
|
||||
|
||||
if server_name:
|
||||
to_put.append(Services(id=server_name, method=method))
|
||||
|
||||
|
@ -290,7 +328,10 @@ class Database:
|
|||
)
|
||||
elif key not in global_values:
|
||||
setting = (
|
||||
session.query(Settings).filter_by(id=key).first()
|
||||
session.query(Settings)
|
||||
.with_entities(Settings.default)
|
||||
.filter_by(id=key)
|
||||
.first()
|
||||
)
|
||||
|
||||
if setting and value != setting.default:
|
||||
|
@ -347,14 +388,15 @@ class Database:
|
|||
to_put = []
|
||||
for custom_config in custom_configs:
|
||||
config = {
|
||||
"data": custom_config["value"]
|
||||
.replace("\\\n", "\n")
|
||||
.encode("utf-8"),
|
||||
"data": custom_config["value"].replace("\\\n", "\n").encode("utf-8")
|
||||
if isinstance(custom_config["value"], str)
|
||||
else custom_config["value"].replace(b"\\\n", b"\n"),
|
||||
"method": method,
|
||||
}
|
||||
if custom_config["exploded"][0]:
|
||||
if (
|
||||
not session.query(Services)
|
||||
.with_entities(Services.id)
|
||||
.filter_by(id=custom_config["exploded"][0])
|
||||
.first()
|
||||
):
|
||||
|
@ -388,78 +430,78 @@ class Database:
|
|||
|
||||
return ""
|
||||
|
||||
def __get_setting_value(
|
||||
self,
|
||||
session: scoped_session,
|
||||
service: Any,
|
||||
setting: Any,
|
||||
suffix: int,
|
||||
) -> Optional[dict]:
|
||||
tmp_config = {}
|
||||
global_value = (
|
||||
session.query(Global_values)
|
||||
.filter_by(setting_id=setting.id, suffix=suffix)
|
||||
.first()
|
||||
)
|
||||
|
||||
if global_value is None:
|
||||
if suffix:
|
||||
if setting.context != "multisite":
|
||||
return None
|
||||
|
||||
tmp_config[f"{setting.id}_{suffix}"] = setting.default
|
||||
else:
|
||||
tmp_config[setting.id] = setting.default
|
||||
else:
|
||||
tmp_config[
|
||||
setting.id + (f"_{suffix}" if suffix else "")
|
||||
] = global_value.value
|
||||
|
||||
if setting.context == "multisite":
|
||||
try:
|
||||
tmp_config[
|
||||
f"{service.id}_{setting.id}" + (f"_{suffix}" if suffix else "")
|
||||
] = next(
|
||||
s
|
||||
for s in service.settings
|
||||
if s.setting_id == setting.id and s.suffix == suffix
|
||||
).value
|
||||
except StopIteration:
|
||||
if global_value is None and suffix:
|
||||
return None
|
||||
elif suffix:
|
||||
tmp_config[f"{service.id}_{setting.id}_{suffix}"] = tmp_config[
|
||||
f"{setting.id}_{suffix}"
|
||||
]
|
||||
else:
|
||||
tmp_config[f"{service.id}_{setting.id}"] = tmp_config[setting.id]
|
||||
|
||||
return tmp_config
|
||||
|
||||
def get_config(self) -> Dict[str, Any]:
|
||||
"""Get the config from the database"""
|
||||
with self.__db_session() as session:
|
||||
config = {}
|
||||
settings = session.query(Settings).all()
|
||||
for service in session.query(Services).all():
|
||||
for setting in settings:
|
||||
if setting.multiple:
|
||||
i = 0
|
||||
while True:
|
||||
tmp_config = self.__get_setting_value(
|
||||
session, service, setting, i
|
||||
)
|
||||
settings = (
|
||||
session.query(Settings)
|
||||
.with_entities(
|
||||
Settings.id, Settings.context, Settings.default, Settings.multiple
|
||||
)
|
||||
.all()
|
||||
)
|
||||
|
||||
if tmp_config is None:
|
||||
break
|
||||
for setting in settings:
|
||||
suffix = 0
|
||||
while True:
|
||||
global_value = (
|
||||
session.query(Global_values)
|
||||
.with_entities(Global_values.value)
|
||||
.filter_by(setting_id=setting.id, suffix=suffix)
|
||||
.first()
|
||||
)
|
||||
|
||||
config.update(tmp_config)
|
||||
i += 1
|
||||
if global_value is None:
|
||||
if suffix > 0:
|
||||
break
|
||||
else:
|
||||
config[setting.id] = setting.default
|
||||
else:
|
||||
config.update(
|
||||
self.__get_setting_value(session, service, setting, 0)
|
||||
config[
|
||||
setting.id + (f"_{suffix}" if suffix > 0 else "")
|
||||
] = global_value.value
|
||||
|
||||
if not setting.multiple:
|
||||
break
|
||||
|
||||
suffix += 1
|
||||
|
||||
for service in session.query(Services).with_entities(Services.id).all():
|
||||
for setting in settings:
|
||||
if setting.context != "multisite":
|
||||
continue
|
||||
|
||||
suffix = 0
|
||||
while True:
|
||||
if suffix == 0:
|
||||
config[f"{service.id}_{setting.id}"] = config[setting.id]
|
||||
elif f"{setting.id}_{suffix}" in config:
|
||||
config[f"{service.id}_{setting.id}_{suffix}"] = config[
|
||||
f"{setting.id}_{suffix}"
|
||||
]
|
||||
|
||||
service_setting = (
|
||||
session.query(Services_settings)
|
||||
.with_entities(Services_settings.value)
|
||||
.filter_by(
|
||||
service_id=service.id,
|
||||
setting_id=setting.id,
|
||||
suffix=suffix,
|
||||
)
|
||||
.first()
|
||||
)
|
||||
|
||||
if service_setting is not None:
|
||||
config[
|
||||
f"{service.id}_{setting.id}"
|
||||
+ (f"_{suffix}" if suffix > 0 else "")
|
||||
] = service_setting.value
|
||||
elif suffix > 0:
|
||||
break
|
||||
|
||||
suffix += 1
|
||||
|
||||
return config
|
||||
|
||||
def get_custom_configs(self) -> List[Dict[str, Any]]:
|
||||
|
@ -471,10 +513,30 @@ class Database:
|
|||
"type": custom_config.type,
|
||||
"name": custom_config.name,
|
||||
"data": custom_config.data.decode("utf-8"),
|
||||
"method": custom_config.method,
|
||||
}
|
||||
for custom_config in session.query(Custom_configs).all()
|
||||
for custom_config in session.query(Custom_configs)
|
||||
.with_entities(
|
||||
Custom_configs.service_id,
|
||||
Custom_configs.type,
|
||||
Custom_configs.name,
|
||||
Custom_configs.data,
|
||||
Custom_configs.method,
|
||||
)
|
||||
.all()
|
||||
]
|
||||
|
||||
def get_services(self) -> List[Dict[str, Any]]:
|
||||
"""Get the services' configs from the database"""
|
||||
services = []
|
||||
with self.__db_session() as session:
|
||||
for service in (
|
||||
session.query(Services).with_entities(Services.settings).all()
|
||||
):
|
||||
services.append(service.settings)
|
||||
|
||||
return services
|
||||
|
||||
def update_job(self, plugin_id: str, job_name: str) -> str:
|
||||
"""Update the job last_run in the database"""
|
||||
with self.__db_session() as session:
|
||||
|
|
|
@ -16,7 +16,7 @@ from sqlalchemy.schema import UniqueConstraint
|
|||
Base = declarative_base()
|
||||
CONTEXTS_ENUM = Enum("global", "multisite")
|
||||
SETTINGS_TYPES_ENUM = Enum("text", "check", "select")
|
||||
METHODS_ENUM = Enum("ui", "scheduler", "autoconf")
|
||||
METHODS_ENUM = Enum("ui", "scheduler", "autoconf", "manual")
|
||||
SCHEDULES_ENUM = Enum("once", "minute", "hour", "day", "week")
|
||||
CUSTOM_CONFIGS_TYPES = Enum(
|
||||
"http",
|
||||
|
|
|
@ -5,6 +5,7 @@ COPY bw/deps/requirements.txt /opt/bunkerweb/deps/requirements.txt
|
|||
|
||||
# Install python requirements
|
||||
RUN apk add --no-cache --virtual build py3-pip g++ gcc python3-dev musl-dev libffi-dev openssl-dev cargo && \
|
||||
pip install --no-cache-dir --upgrade pip && \
|
||||
pip install wheel && \
|
||||
mkdir /opt/bunkerweb/deps/python && \
|
||||
pip install --no-cache-dir --require-hashes --target /opt/bunkerweb/deps/python -r /opt/bunkerweb/deps/requirements.txt && \
|
||||
|
|
|
@ -2,7 +2,6 @@ from glob import glob
|
|||
from json import loads
|
||||
from logging import Logger
|
||||
from os import environ
|
||||
from os.path import isfile
|
||||
from subprocess import DEVNULL, PIPE, STDOUT, run
|
||||
from schedule import (
|
||||
clear as schedule_clear,
|
||||
|
@ -27,24 +26,17 @@ class JobScheduler(ApiCaller):
|
|||
lock=None,
|
||||
apis=[],
|
||||
logger: Logger = setup_logger("Scheduler", environ.get("LOG_LEVEL", "INFO")),
|
||||
auto: bool = False,
|
||||
bw_integration: str = "Local",
|
||||
):
|
||||
super().__init__(apis)
|
||||
|
||||
if auto is True:
|
||||
self.auto_setup()
|
||||
|
||||
self.__logger = logger
|
||||
self.__bw_integration = bw_integration
|
||||
self.__db = Database(
|
||||
self.__logger,
|
||||
sqlalchemy_string=env.get("DATABASE_URI", None),
|
||||
bw_integration=bw_integration,
|
||||
bw_integration=self.__bw_integration,
|
||||
)
|
||||
self.__env = env
|
||||
with open("/tmp/autoconf.env", "w") as f:
|
||||
for k, v in self.__env.items():
|
||||
f.write(f"{k}={v}\n")
|
||||
self.__env.update(environ)
|
||||
self.__jobs = self.__get_jobs()
|
||||
self.__lock = lock
|
||||
|
@ -83,7 +75,7 @@ class JobScheduler(ApiCaller):
|
|||
|
||||
def __reload(self):
|
||||
reload = True
|
||||
if isfile("/usr/sbin/nginx") and isfile("/opt/bunkerweb/tmp/nginx.pid"):
|
||||
if self.__bw_integration == "Local":
|
||||
self.__logger.info("Reloading nginx ...")
|
||||
proc = run(
|
||||
["/usr/sbin/nginx", "-s", "reload"],
|
||||
|
@ -107,14 +99,6 @@ class JobScheduler(ApiCaller):
|
|||
self.__logger.error("Error while reloading nginx")
|
||||
return reload
|
||||
|
||||
def __gen_conf(self):
|
||||
success = True
|
||||
cmd = "/opt/bunkerweb/gen/main.py --settings /opt/bunkerweb/settings.json --templates /opt/bunkerweb/confs --output /etc/nginx --variables /tmp/autoconf.env --method autoconf"
|
||||
proc = run(cmd.split(" "), stdin=DEVNULL, stderr=STDOUT)
|
||||
if proc.returncode != 0:
|
||||
success = False
|
||||
return success
|
||||
|
||||
def __job_wrapper(self, path, plugin, name, file):
|
||||
self.__logger.info(
|
||||
f"Executing job {name} from plugin {plugin} ...",
|
||||
|
@ -215,24 +199,6 @@ class JobScheduler(ApiCaller):
|
|||
f"Exception while running jobs once for plugin {plugin} : {format_exc()}",
|
||||
)
|
||||
|
||||
if ret is False:
|
||||
return False
|
||||
|
||||
try:
|
||||
if len(self._get_apis()) > 0:
|
||||
self.__logger.info("Sending /data/cache folder ...")
|
||||
if not self._send_files("/data/cache", "/cache"):
|
||||
ret = False
|
||||
self.__logger.error("Error while sending /data/cache folder")
|
||||
else:
|
||||
self.__logger.info("Successfuly sent /data/cache folder")
|
||||
if not self.__reload():
|
||||
self.__logger.error("Can't reload BunkerWeb")
|
||||
except:
|
||||
ret = False
|
||||
self.__logger.error(
|
||||
f"Exception while reloading after running jobs once scheduling : {format_exc()}",
|
||||
)
|
||||
return ret
|
||||
|
||||
def clear(self):
|
||||
|
@ -243,9 +209,6 @@ class JobScheduler(ApiCaller):
|
|||
try:
|
||||
self.__env = env
|
||||
super().__init__(apis)
|
||||
with open("/tmp/autoconf.env", "w") as f:
|
||||
for k, v in self.__env.items():
|
||||
f.write(f"{k}={v}\n")
|
||||
self.clear()
|
||||
self.__jobs = self.__get_jobs()
|
||||
if not self.run_once():
|
||||
|
|
|
@ -44,35 +44,18 @@ if [ "$?" -ne 0 ] ; then
|
|||
exit 1
|
||||
fi
|
||||
|
||||
generate=yes
|
||||
if [ -v VARIABLES_PATH ] && [ -f "/etc/nginx/variables.env" ] && grep -q "^TEMP_NGINX=no$" /etc/nginx/variables.env ; then
|
||||
log "ENTRYPOINT" "⚠️ " "Looks like BunkerWeb configuration is already generated, will not generate it again"
|
||||
elif [ "$SWARM_MODE" != "yes" ] && [ "$KUBERNETES_MODE" != "yes" ] && [ "$AUTOCONF_MODE" != "yes" ] ; then
|
||||
# Generate configuration and send config to bunkerweb
|
||||
/opt/bunkerweb/gen/main.py --method scheduler
|
||||
if [ "$?" -ne 0 ] ; then
|
||||
log "ENTRYPOINT" "❌" "Scheduler generator failed"
|
||||
exit 1
|
||||
fi
|
||||
generate=no
|
||||
fi
|
||||
|
||||
# execute jobs
|
||||
log "ENTRYPOINT" "ℹ️ " "Executing jobs ..."
|
||||
log "ENTRYPOINT" "ℹ️ " "Executing scheduler ..."
|
||||
if [ -v VARIABLES_PATH ] ; then
|
||||
/opt/bunkerweb/scheduler/main.py --variables $VARIABLES_PATH --run
|
||||
/opt/bunkerweb/scheduler/main.py --variables $VARIABLES_PATH --generate $generate
|
||||
else
|
||||
/opt/bunkerweb/scheduler/main.py --run
|
||||
fi
|
||||
if [ "$?" -ne 0 ] ; then
|
||||
log "ENTRYPOINT" "❌" "Scheduler failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
log "ENTRYPOINT" "ℹ️ " "Executing job scheduler ..."
|
||||
if [ -v VARIABLES_PATH ] ; then
|
||||
/opt/bunkerweb/scheduler/main.py --variables $VARIABLES_PATH
|
||||
else
|
||||
/opt/bunkerweb/scheduler/main.py
|
||||
/opt/bunkerweb/scheduler/main.py --generate $generate
|
||||
fi
|
||||
|
||||
log "ENTRYPOINT" "ℹ️ " "Scheduler stopped"
|
||||
|
|
|
@ -2,9 +2,12 @@
|
|||
|
||||
from argparse import ArgumentParser
|
||||
from copy import deepcopy
|
||||
from os import _exit, environ, getenv, getpid, path, remove
|
||||
from os.path import exists
|
||||
from glob import glob
|
||||
from os import _exit, getenv, getpid, makedirs, path, remove, unlink
|
||||
from os.path import dirname, isdir, isfile, islink
|
||||
from shutil import rmtree
|
||||
from signal import SIGINT, SIGTERM, SIGUSR1, SIGUSR2, signal
|
||||
from subprocess import PIPE, run as subprocess_run, DEVNULL, STDOUT
|
||||
from sys import path as sys_path
|
||||
from time import sleep
|
||||
from traceback import format_exc
|
||||
|
@ -19,7 +22,7 @@ from dotenv import dotenv_values
|
|||
from logger import setup_logger
|
||||
from Database import Database
|
||||
from JobScheduler import JobScheduler
|
||||
from API import API
|
||||
from ApiCaller import ApiCaller
|
||||
|
||||
run = True
|
||||
scheduler = None
|
||||
|
@ -91,19 +94,27 @@ if __name__ == "__main__":
|
|||
|
||||
# Parse arguments
|
||||
parser = ArgumentParser(description="Job scheduler for BunkerWeb")
|
||||
parser.add_argument(
|
||||
"--run", action="store_true", help="only run jobs one time in foreground"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--variables",
|
||||
type=str,
|
||||
help="path to the file containing environment variables",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--generate",
|
||||
default="no",
|
||||
type=str,
|
||||
help="Precise if the configuration needs to be generated directly or not",
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
logger.info("Scheduler started ...")
|
||||
|
||||
bw_integration = "Local"
|
||||
bw_integration = (
|
||||
"Local"
|
||||
if not isfile("/usr/sbin/nginx")
|
||||
and not isfile("/opt/bunkerweb/tmp/nginx.pid")
|
||||
else "Cluster"
|
||||
)
|
||||
|
||||
if args.variables:
|
||||
logger.info(f"Variables : {args.variables}")
|
||||
|
@ -116,6 +127,9 @@ if __name__ == "__main__":
|
|||
"Kubernetes" if getenv("KUBERNETES_MODE", "no") == "yes" else "Cluster"
|
||||
)
|
||||
|
||||
api_caller = ApiCaller()
|
||||
api_caller.auto_setup(bw_integration=bw_integration)
|
||||
|
||||
db = Database(
|
||||
logger,
|
||||
sqlalchemy_string=getenv("DATABASE_URI", None),
|
||||
|
@ -136,65 +150,157 @@ if __name__ == "__main__":
|
|||
sleep(3)
|
||||
env = db.get_config()
|
||||
|
||||
if args.run:
|
||||
# write config to /tmp/variables.env
|
||||
with open("/tmp/variables.env", "w") as f:
|
||||
for variable, value in env.items():
|
||||
f.write(f"{variable}={value}\n")
|
||||
run_once = True
|
||||
else:
|
||||
# Check if config as changed since last run
|
||||
run_once = dotenv_values("/tmp/variables.env") != env
|
||||
custom_configs = db.get_custom_configs()
|
||||
|
||||
if run_once:
|
||||
logger.info("Config changed since last run, reloading ...")
|
||||
original_path = "/data/configs"
|
||||
makedirs(original_path, exist_ok=True)
|
||||
for custom_config in custom_configs:
|
||||
tmp_path = f"{original_path}/{custom_config['type'].replace('_', '-')}"
|
||||
if custom_config["service_id"]:
|
||||
tmp_path += f"/{custom_config['service_id']}"
|
||||
tmp_path += f"/{custom_config['name']}.conf"
|
||||
makedirs(dirname(tmp_path), exist_ok=True)
|
||||
with open(tmp_path, "w") as f:
|
||||
f.write(custom_config["data"])
|
||||
|
||||
logger.info("Executing job scheduler ...")
|
||||
if bw_integration != "Local":
|
||||
logger.info("Sending custom configs to BunkerWeb")
|
||||
ret = api_caller._send_files("/data/configs", "/custom_configs")
|
||||
|
||||
if not ret:
|
||||
logger.error(
|
||||
"Sending custom configs failed, configuration will not work as expected...",
|
||||
)
|
||||
|
||||
logger.info("Executing scheduler ...")
|
||||
while True:
|
||||
# Instantiate scheduler
|
||||
scheduler = JobScheduler(
|
||||
env=deepcopy(env),
|
||||
apis=[],
|
||||
apis=api_caller._get_apis(),
|
||||
logger=logger,
|
||||
auto=not args.variables,
|
||||
bw_integration=bw_integration,
|
||||
)
|
||||
|
||||
# Only run jobs once
|
||||
if run_once:
|
||||
if not scheduler.run_once():
|
||||
logger.error("At least one job in run_once() failed")
|
||||
if args.run:
|
||||
stop(1)
|
||||
if not scheduler.run_once():
|
||||
logger.error("At least one job in run_once() failed")
|
||||
else:
|
||||
logger.info("All jobs in run_once() were successful")
|
||||
|
||||
# run the generator
|
||||
cmd = f"python /opt/bunkerweb/gen/main.py --settings /opt/bunkerweb/settings.json --templates /opt/bunkerweb/confs --output /etc/nginx{f' --variables {args.variables}' if args.variables else ''} --method scheduler"
|
||||
proc = subprocess_run(cmd.split(" "), stdin=DEVNULL, stderr=STDOUT)
|
||||
if proc.returncode != 0:
|
||||
logger.error(
|
||||
"Config generator failed, configuration will not work as expected...",
|
||||
)
|
||||
|
||||
if len(api_caller._get_apis()) > 0:
|
||||
# send nginx configs
|
||||
logger.info("Sending /etc/nginx folder ...")
|
||||
ret = api_caller._send_files("/etc/nginx", "/confs")
|
||||
if not ret:
|
||||
logger.error(
|
||||
"Sending nginx configs failed, configuration will not work as expected...",
|
||||
)
|
||||
|
||||
try:
|
||||
if len(api_caller._get_apis()) > 0:
|
||||
# send cache
|
||||
logger.info("Sending /data/cache folder ...")
|
||||
if not api_caller._send_files("/data/cache", "/cache"):
|
||||
logger.error("Error while sending /data/cache folder")
|
||||
else:
|
||||
logger.info("Successfuly sent /data/cache folder")
|
||||
|
||||
# reload nginx
|
||||
if bw_integration == "Local":
|
||||
logger.info("Reloading nginx ...")
|
||||
proc = run(
|
||||
["/usr/sbin/nginx", "-s", "reload"],
|
||||
stdin=DEVNULL,
|
||||
stderr=PIPE,
|
||||
env=deepcopy(env),
|
||||
)
|
||||
if proc.returncode == 0:
|
||||
logger.info("Successfuly reloaded nginx")
|
||||
else:
|
||||
logger.error(
|
||||
f"Error while reloading nginx - returncode: {proc.returncode} - error: {proc.stderr.decode('utf-8')}",
|
||||
)
|
||||
else:
|
||||
logger.info("All jobs in run_once() were successful")
|
||||
if args.run:
|
||||
break
|
||||
logger.info("Reloading nginx ...")
|
||||
if api_caller._send_to_apis("POST", "/reload"):
|
||||
logger.info("Successfuly reloaded nginx")
|
||||
else:
|
||||
logger.error("Error while reloading nginx")
|
||||
except:
|
||||
logger.error(
|
||||
f"Exception while reloading after running jobs once scheduling : {format_exc()}",
|
||||
)
|
||||
|
||||
run_once = False
|
||||
|
||||
# Or infinite schedule
|
||||
# infinite schedule for the jobs
|
||||
scheduler.setup()
|
||||
logger.info("Executing job scheduler ...")
|
||||
while run:
|
||||
scheduler.run_pending()
|
||||
sleep(1)
|
||||
|
||||
# check if the custom configs have changed since last time
|
||||
tmp_custom_configs = db.get_custom_configs()
|
||||
if custom_configs != tmp_custom_configs:
|
||||
logger.info("Custom configs changed, generating ...")
|
||||
logger.debug(f"{tmp_custom_configs}")
|
||||
logger.debug(f"{custom_configs}")
|
||||
custom_configs = tmp_custom_configs
|
||||
original_path = "/data/configs"
|
||||
|
||||
# Remove old custom configs files
|
||||
logger.info("Removing old custom configs files ...")
|
||||
files = glob(f"{original_path}/*")
|
||||
for file in files:
|
||||
if islink(file):
|
||||
unlink(file)
|
||||
elif isfile(file):
|
||||
remove(file)
|
||||
elif isdir(file):
|
||||
rmtree(file, ignore_errors=False)
|
||||
|
||||
logger.info("Generating new custom configs ...")
|
||||
makedirs(original_path, exist_ok=True)
|
||||
for custom_config in custom_configs:
|
||||
tmp_path = (
|
||||
f"{original_path}/{custom_config['type'].replace('_', '-')}"
|
||||
)
|
||||
if custom_config["service_id"]:
|
||||
tmp_path += f"/{custom_config['service_id']}"
|
||||
tmp_path += f"/{custom_config['name']}.conf"
|
||||
makedirs(dirname(tmp_path), exist_ok=True)
|
||||
with open(tmp_path, "w") as f:
|
||||
f.write(custom_config["data"])
|
||||
|
||||
if bw_integration != "Local":
|
||||
logger.info("Sending custom configs to BunkerWeb")
|
||||
ret = api_caller._send_files("/data/configs", "/custom_configs")
|
||||
|
||||
if not ret:
|
||||
logger.error(
|
||||
"Sending custom configs failed, configuration will not work as expected...",
|
||||
)
|
||||
|
||||
# check if the config have changed since last time
|
||||
tmp_env = (
|
||||
dotenv_values(args.variables) if args.variables else db.get_config()
|
||||
)
|
||||
if env != tmp_env:
|
||||
logger.info("Config changed, reloading ...")
|
||||
logger.info("Config changed, generating ...")
|
||||
logger.debug(f"{tmp_env=}")
|
||||
logger.debug(f"{env=}")
|
||||
env = tmp_env
|
||||
run_once = True
|
||||
env = deepcopy(tmp_env)
|
||||
break
|
||||
|
||||
except:
|
||||
logger.error(
|
||||
f"Exception while executing scheduler : {format_exc()}",
|
||||
)
|
||||
stop(1)
|
||||
|
||||
logger.info("Job scheduler stopped")
|
||||
stop(0)
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
from io import BytesIO
|
||||
from os import environ, getenv
|
||||
from os.path import exists
|
||||
from tarfile import open as taropen
|
||||
|
||||
from logger import setup_logger
|
||||
|
@ -25,22 +24,21 @@ class ApiCaller:
|
|||
pod.metadata.annotations != None
|
||||
and "bunkerweb.io/INSTANCE" in pod.metadata.annotations
|
||||
):
|
||||
api = None
|
||||
api_http_port = None
|
||||
api_server_name = None
|
||||
|
||||
for pod_env in pod.spec.containers[0].env:
|
||||
if pod_env.name == "API_HTTP_PORT":
|
||||
api = API(
|
||||
f"http://{pod.status.pod_ip}:{pod_env.value or '5000'}"
|
||||
)
|
||||
break
|
||||
api_http_port = pod_env.value or "5000"
|
||||
elif pod_env.name == "API_SERVER_NAME":
|
||||
api_server_name = pod_env.value or "bwapi"
|
||||
|
||||
if api:
|
||||
self.__apis.append(api)
|
||||
else:
|
||||
self.__apis.append(
|
||||
API(
|
||||
f"http://{pod.status.pod_ip}:{getenv('API_HTTP_PORT', '5000')}"
|
||||
)
|
||||
self.__apis.append(
|
||||
API(
|
||||
f"http://{pod.status.pod_ip}:{api_http_port or getenv('API_HTTP_PORT', '5000')}",
|
||||
host=api_server_name or getenv("API_SERVER_NAME", "bwapi"),
|
||||
)
|
||||
)
|
||||
else:
|
||||
from docker import DockerClient
|
||||
|
||||
|
@ -50,19 +48,48 @@ class ApiCaller:
|
|||
for instance in docker_client.containers.list(
|
||||
filters={"label": "bunkerweb.INSTANCE"}
|
||||
):
|
||||
api = None
|
||||
api_http_port = None
|
||||
api_server_name = None
|
||||
|
||||
for var in instance.attrs["Config"]["Env"]:
|
||||
if var.startswith("API_HTTP_PORT="):
|
||||
api = API(
|
||||
f"http://{instance.name}:{var.replace('API_HTTP_PORT=', '', 1)}"
|
||||
)
|
||||
break
|
||||
api_http_port = var.replace("API_HTTP_PORT=", "", 1)
|
||||
elif var.startswith("API_SERVER_NAME="):
|
||||
api_server_name = var.replace("API_SERVER_NAME=", "", 1)
|
||||
|
||||
self.__apis.append(
|
||||
API(
|
||||
f"http://{instance.name}:{api_http_port or getenv('API_HTTP_PORT', '5000')}",
|
||||
host=api_server_name or getenv("API_SERVER_NAME", "bwapi"),
|
||||
)
|
||||
)
|
||||
|
||||
is_swarm = True
|
||||
try:
|
||||
docker_client.swarm.version
|
||||
except:
|
||||
is_swarm = False
|
||||
|
||||
if is_swarm:
|
||||
for instance in docker_client.services.list(
|
||||
filters={"label": "bunkerweb.INSTANCE"}
|
||||
):
|
||||
api_http_port = None
|
||||
api_server_name = None
|
||||
|
||||
for var in instance.attrs["Spec"]["TaskTemplate"]["ContainerSpec"][
|
||||
"Env"
|
||||
]:
|
||||
if var.startswith("API_HTTP_PORT="):
|
||||
api_http_port = var.replace("API_HTTP_PORT=", "", 1)
|
||||
elif var.startswith("API_SERVER_NAME="):
|
||||
api_server_name = var.replace("API_SERVER_NAME=", "", 1)
|
||||
|
||||
if api:
|
||||
self.__apis.append(api)
|
||||
else:
|
||||
self.__apis.append(
|
||||
API(f"http://{instance.name}:{getenv('API_HTTP_PORT', '5000')}")
|
||||
API(
|
||||
f"http://{instance.name}:{api_http_port or getenv('API_HTTP_PORT', '5000')}",
|
||||
host=api_server_name or getenv("API_SERVER_NAME", "bwapi"),
|
||||
)
|
||||
)
|
||||
|
||||
def _set_apis(self, apis):
|
||||
|
|
|
@ -63,7 +63,7 @@ class ConfigCaller:
|
|||
and env_instances.get("SERVER_NAME", "") != ""
|
||||
):
|
||||
for server_name in env_instances["SERVER_NAME"].split(" "):
|
||||
full_env[f"{server_name}_" + k] = v
|
||||
full_env[f"{server_name}_{k}"] = v
|
||||
# Replace with services values
|
||||
for k, v in env_services.items():
|
||||
full_env[k] = v
|
||||
|
|
Loading…
Reference in a new issue