17.06.2025 11:42
This commit is contained in:
parent
7d9bf01ca0
commit
b3f27e4a75
|
@ -6,4 +6,4 @@ __pycache__
|
||||||
*.log
|
*.log
|
||||||
.idea/
|
.idea/
|
||||||
*.idea
|
*.idea
|
||||||
/app/config/config.yml
|
/app/config/config.ini
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
TG_CHAT_ID =
|
||||||
|
TG_BOT_TOKEN =
|
|
@ -0,0 +1,5 @@
|
||||||
|
from .config import config
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"config",
|
||||||
|
]
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Конфиг для отправки оповещений через телеграм
|
||||||
|
[tg]
|
||||||
|
send: False
|
||||||
|
|
||||||
|
# Конфиг удалённого гит репозитория
|
||||||
|
[git]
|
||||||
|
push: False
|
||||||
|
user:
|
||||||
|
mail:
|
||||||
|
pwd:
|
||||||
|
dir:
|
||||||
|
remote:
|
||||||
|
token:
|
||||||
|
|
||||||
|
[log]
|
||||||
|
console_lvl: 20
|
||||||
|
file_lvl: 30
|
||||||
|
date_format: %Y-%m-%d %H:%M:%S
|
||||||
|
format= [%(asctime)s.%(msecs)03d] %(module)-25s:%(lineno)4d | %(funcName)-20s| %(levelname)-8s | %(message)s
|
|
@ -0,0 +1,95 @@
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
from typing import Optional
|
||||||
|
import logging
|
||||||
|
|
||||||
|
import configparser
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
|
||||||
|
def default_logging(main_logging: logging) -> None:
|
||||||
|
log_dir: str = os.path.join(
|
||||||
|
os.path.dirname(os.path.abspath(os.path.dirname(__file__))), "logs"
|
||||||
|
)
|
||||||
|
main_logging.basicConfig(
|
||||||
|
level=20,
|
||||||
|
datefmt="%Y-%m-%d %H:%M:%S",
|
||||||
|
format="[%(asctime)s.%(msecs)03d] %(module)-25s:%(lineno)4d | %(funcName)-20s| %(levelname)-8s | %(message)s",
|
||||||
|
)
|
||||||
|
file_handler = main_logging.FileHandler(os.path.join(log_dir, "logfile.log"))
|
||||||
|
file_handler.setLevel(30)
|
||||||
|
file_handler.setFormatter(
|
||||||
|
logging.Formatter(
|
||||||
|
"[%(asctime)s.%(msecs)03d] %(module)s:%(lineno)4d | %(funcName)s| %(levelname)s | %(message)s"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
main_logging.getLogger().addHandler(file_handler)
|
||||||
|
main_logging.info("success configure logging")
|
||||||
|
|
||||||
|
|
||||||
|
default_logging(logging)
|
||||||
|
|
||||||
|
|
||||||
|
def configure_loging(main_logging: logging) -> None:
|
||||||
|
log_dir: str = os.path.join(
|
||||||
|
os.path.dirname(os.path.abspath(os.path.dirname(__file__))), "logs"
|
||||||
|
)
|
||||||
|
logging.info("configure logging")
|
||||||
|
main_logging.basicConfig(
|
||||||
|
level=cfg.log.console_lvl,
|
||||||
|
datefmt=cfg.log.dare_format,
|
||||||
|
format=cfg.log.format,
|
||||||
|
)
|
||||||
|
handler = main_logging.FileHandler(os.path.join(log_dir, "logfile.log"))
|
||||||
|
handler.setLevel(cfg.log.file_lvl)
|
||||||
|
handler.setFormatter(logging.Formatter(cfg.log.format))
|
||||||
|
logging.getLogger().addHandler(handler)
|
||||||
|
logging.info("success configure logging")
|
||||||
|
|
||||||
|
|
||||||
|
def load_config():
|
||||||
|
cfg_dir: str = os.path.abspath(os.path.dirname(__file__))
|
||||||
|
logging.info("loading env")
|
||||||
|
load_dotenv(dotenv_path=os.path.join(cfg_dir, ".env"))
|
||||||
|
logging.info("success loading env")
|
||||||
|
|
||||||
|
logging.info("loading config")
|
||||||
|
loaded_config: configparser.ConfigParser = configparser.ConfigParser(
|
||||||
|
interpolation=None
|
||||||
|
)
|
||||||
|
user_config: str = os.path.join(cfg_dir, "config.ini")
|
||||||
|
loaded_config.read(user_config)
|
||||||
|
logging.info("success loading config")
|
||||||
|
return loaded_config
|
||||||
|
|
||||||
|
|
||||||
|
config = load_config()
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ConfigLog:
|
||||||
|
console_lvl: int = config["log"].getint("console_lvl")
|
||||||
|
file_lvl: int = config["log"].getint("file_lvl")
|
||||||
|
dare_format: str = config["log"].get("dare_format")
|
||||||
|
format: str = config["log"].get("format")
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ConfigTelegram:
|
||||||
|
send: bool = config["tg"].getboolean("send")
|
||||||
|
if send:
|
||||||
|
bot_token: str = os.getenv("TG_BOT_TOKEN")
|
||||||
|
chat_id: int = int(os.getenv("TG_CHAT_ID"))
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass()
|
||||||
|
class ConfigAll:
|
||||||
|
log: ConfigLog = ConfigLog
|
||||||
|
tg: ConfigTelegram = ConfigTelegram
|
||||||
|
|
||||||
|
|
||||||
|
cfg = ConfigAll
|
||||||
|
|
||||||
|
configure_loging(logging)
|
11
app/main.py
11
app/main.py
|
@ -1,6 +1,15 @@
|
||||||
|
from config import config as cfg
|
||||||
|
import logging as log
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
log.info("Starting app")
|
||||||
|
try:
|
||||||
|
main()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
log.info("Manual app stopped")
|
||||||
|
log.info("App stopped")
|
||||||
|
|
|
@ -4,4 +4,6 @@ version = "0.1.0"
|
||||||
description = "Create backup network devices"
|
description = "Create backup network devices"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.13"
|
requires-python = ">=3.13"
|
||||||
dependencies = []
|
dependencies = [
|
||||||
|
"python-dotenv>=1.1.0",
|
||||||
|
]
|
||||||
|
|
15
uv.lock
15
uv.lock
|
@ -6,3 +6,18 @@ requires-python = ">=3.13"
|
||||||
name = "net-backup"
|
name = "net-backup"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = { virtual = "." }
|
source = { virtual = "." }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "python-dotenv" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.metadata]
|
||||||
|
requires-dist = [{ name = "python-dotenv", specifier = ">=1.1.0" }]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "python-dotenv"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload-time = "2025-03-25T10:14:56.835Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload-time = "2025-03-25T10:14:55.034Z" },
|
||||||
|
]
|
||||||
|
|
Loading…
Reference in New Issue