From db52020fa30432c4af18bec734e25b9b78bad938 Mon Sep 17 00:00:00 2001 From: sergey Date: Tue, 11 Mar 2025 16:16:51 +0300 Subject: [PATCH] start --- config/.env-template | 14 ++++++ config/__init__.py | 7 +++ config/config.py | 75 ++++++++++++++++++++++++++++++ crud.py | 0 main.py | 11 +++++ pyproject.toml | 9 ++++ telegram.py | 0 uv.lock | 106 +++++++++++++++++++++++++++++++++++++++++++ zabbix.py | 0 9 files changed, 222 insertions(+) create mode 100755 config/.env-template create mode 100755 config/__init__.py create mode 100755 config/config.py create mode 100644 crud.py create mode 100644 main.py create mode 100644 pyproject.toml create mode 100644 telegram.py create mode 100644 uv.lock create mode 100644 zabbix.py diff --git a/config/.env-template b/config/.env-template new file mode 100755 index 0000000..178b345 --- /dev/null +++ b/config/.env-template @@ -0,0 +1,14 @@ +CFG__LOG__LEVEL=30 +CFG__LOG__LEVEL_TO_FILE=30 + +CFG__ZABBIX__URL=https://example.com +CFG__ZABBIX__TOKEN=string +CFG__ZABBIX__MIN_SEVERITY=0 + +CFG__TGBOT__TOKEN=string +CFG__TGBOT__CHAT_ID=00000000 +CFG__TGBOT__TREAD_ID=0 + +CFG__REDIS__HOST=localhost +CFG__REDIS__PORT=6379 +CFG__REDIS__PWD=P@ssw0rd! \ No newline at end of file diff --git a/config/__init__.py b/config/__init__.py new file mode 100755 index 0000000..1d61cd6 --- /dev/null +++ b/config/__init__.py @@ -0,0 +1,7 @@ +from .config import conf, STATIC_DIR + + +__all__ = [ + "conf", + STATIC_DIR, +] diff --git a/config/config.py b/config/config.py new file mode 100755 index 0000000..e970d18 --- /dev/null +++ b/config/config.py @@ -0,0 +1,75 @@ +from pydantic import BaseModel +from pydantic_settings import ( + BaseSettings, + SettingsConfigDict, +) + +from pathlib import Path + +import logging + + +BASE_DIR = Path(__file__).parent.parent +TEMPLATES_DIR = BASE_DIR / "web" / "templates" +STATIC_DIR = BASE_DIR / "web" / "static" + + +class LogConfig(BaseModel): + level: int = 30 + level_to_file: int = 30 + dateformat: str = "%Y-%m-%d %H:%M:%S" + format: str = ( + "[%(asctime)s.%(msecs)03d] %(module)-25s:%(lineno)4d | %(funcName)-20s| %(levelname)-8s | %(message)s" + ) + + +class RedisConfig(BaseModel): + host: str = "localhost" + port: int = 6379 + pwd: str | None = None + + +class TelegramBotConfig(BaseModel): + token: str + chat_id: int + tread_id: int + +class ZabbixConfig(BaseModel): + url: str + token: str + min_severity: int + +class Settings(BaseSettings): + model_config = SettingsConfigDict( + env_file=( + BASE_DIR / "config" / ".env-template", + BASE_DIR / "config" / ".env", + ), + case_sensitive=False, + env_nested_delimiter="__", + env_prefix="CFG__", + ) + log: LogConfig = LogConfig() + redis: RedisConfig + tgbot: TelegramBotConfig + zabbix: ZabbixConfig + + + +conf = Settings() + + +logging.basicConfig( + level=conf.log.level, + datefmt=conf.log.dateformat, + format=conf.log.format, +) + +file_handler = logging.FileHandler(BASE_DIR / "logfile.log") +file_handler.setLevel(conf.log.level_to_file) +file_handler.setFormatter( + logging.Formatter( + "[%(asctime)s.%(msecs)03d] %(module)s:%(lineno)4d | %(funcName)s| %(levelname)s | %(message)s" + ) +) +logging.getLogger().addHandler(file_handler) diff --git a/crud.py b/crud.py new file mode 100644 index 0000000..e69de29 diff --git a/main.py b/main.py new file mode 100644 index 0000000..5d2e541 --- /dev/null +++ b/main.py @@ -0,0 +1,11 @@ +import logging as log +from config import conf + +def main(): + print("Hello from zbx-tg-bot!") + + +if __name__ == "__main__": + log.info("Starting app") + main() + log.info("App stopped") \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..9d65d45 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,9 @@ +[project] +name = "zbx-tg-bot" +version = "0.1.0" +description = "Add your description here" +requires-python = ">=3.13" +dependencies = [ + "pydantic-settings>=2.8.1", + "zabbix-utils>=2.0.2", +] diff --git a/telegram.py b/telegram.py new file mode 100644 index 0000000..e69de29 diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..3b35bbc --- /dev/null +++ b/uv.lock @@ -0,0 +1,106 @@ +version = 1 +revision = 1 +requires-python = ">=3.13" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "pydantic" +version = "2.10.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, +] + +[[package]] +name = "pydantic-settings" +version = "2.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 }, +] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "zabbix-utils" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/18/91f24d891dd8a5a0d4536faaa65a73384c8751e71c527ba07b2eed8ccad2/zabbix_utils-2.0.2.tar.gz", hash = "sha256:3c4a98a24c101d89fd938ebe0ad6c9aaa391ac901f2afb75ae682eea88fb77af", size = 28709 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/36/197c503bcf853ccd569b92cd69a75e15f8a2d18142241029acff206b1169/zabbix_utils-2.0.2-py3-none-any.whl", hash = "sha256:1eb918096dcf1980a975ff72e4449b5d72c605f79842595dedd0f4ceba3b1225", size = 37672 }, +] + +[[package]] +name = "zbx-tg-bot" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "pydantic-settings" }, + { name = "zabbix-utils" }, +] + +[package.metadata] +requires-dist = [ + { name = "pydantic-settings", specifier = ">=2.8.1" }, + { name = "zabbix-utils", specifier = ">=2.0.2" }, +] diff --git a/zabbix.py b/zabbix.py new file mode 100644 index 0000000..e69de29