State server v Pythonu

05.09.2011

Jedná se software, který umí centralizovaně hlídat provádění naplánovaných ůloh a oznamovat jejich výsledek. State server vznikl jako variace na SMS server, kdy je využito stejného pythoního TCP serveru, pouze se mění logika zpracování zpráv zaslaných klienty.

Intro

Mějme nějaký Windows server a na něm naplánované úlohy. Čas od času se v nějaké úloze vyskytne chyba to jak očekávaná (chybné provedení nějakého příkazu) nebo neočekávaná (baťák a Windows si ošetřování vyjímek nehraje) a úloha se hryzne. Občas se taky stane, že se úloha nespustí vůbec - např. při změně hesla uživatele, pod kterým se úloha má spustit. V každém případě to skončí nějakou návratovou hodnotou v "Plánovači úloh", na kterou člověk přijde až v momentě, když čte záplavu emailů od rozladěných uživatelů, kterým zase "něco" nejde :-) Čili by se hodilo něco, co by výše uvedené stavy hlídalo.

Myšlenka je následující:

Funkce

State server řeší evidenci naplánovaných úloh - časy spuštění a maximální dobu jejich běhu. Od běžících úloh sbírá výsledky OK nebo FAIL a u těch, které neodpoví, generuje TIMEOUT. U všech těchto událostí lze nastavit alertaci na email nebo SMS (pomocí SMS serveru). U události OK to zpravidla nemá smysl, ale u FAIL nebo TIMEOUT už ano.

V textu jsou zmíněny dva termíny:

Dokumentace

Tabulky v MySQL

Databáze: proces

TCP Server

Principem činnosti je otevření portu 2020 pro konzolovou TCP komunikaci (telnet). Na tomto portu očekává připojení od klientů a předání stavu běžícímu procesu. Pokud klient zašle požadavek ve správném formátu, server uloží jeho obsah do tabulky msg.

Skript /usr/local/procesy/vss potřebuje ke svému běhu třídu daemon. Obsahuje metody na daemononizaci procesu, tedy to, že se tcp server spustí na pozadí a zůstane běžet.

Skript /usr/local/procesy/vss potřebuje ke svému běhu třídu logger. Obsahuje jednoduché metody logování do souboru.

TCP se dá spustit nebo restartovat následujícím způsobem.

Pokud Python zakřičí, že nemá nějaký modul, stačí ho doinstalovat z debianích repozitářů.

PID file je implementován pro snadnou identifikaci procesu, neboť TCP server je po spuštění daemonizován. Obsahem PID file je číslo procesu v OS. V případě problémů se spuštěním je třeba PID soubor smazat.

Formát zprávy: #id=IDPROCESU;state=STAV;name=NAZEVULOHY

Př. #id=25;state=OK;name=JajaBackupData

Skript check_events

Spuštění tohoto skriptu způsobí vyhodnocení přijatých zpráv z tabulky msg v kombinaci s běžícími procesy uvedenými v tabulce run. Odešle SMS (přes SMS server), emaily (přes SMTP server) a nakonec zapíše informaci o ukončeném procesu do tabulky hist.

Skript create_process

Tento skript je spouštěn cronem s parametrem IDPROCESU. Způsobí zápis do tabulky run, tzn. spuštění procesu. Do uvedené tabulky se zapíše čas spuštění a čas ukončení vypočítaný dle definice procesu z tabulky defp. Záznamy do souboru /etc/crontab vytváří skript regenerate_cron spouštěný z www rozhraní, čili není potřeba nic upravovat ručně.

Skript regenerate_cron

Skript vytvoří pravidla pro spouštění procesů v /etc/crontab. Je spouštěn kliknutím ve webovém rozhraní - práva jsou řešena přes sudo - viz man sudoers.

Webové rozhraní

Seznam definic procesů. Tabulka defp.

Editace procesu. Tabulka defp.

Běžící procesy. Tabulka run.

Historie procesů. Tabulka hist.

Běžící procesy. Tabulka run. (update 29.10.2014)

Nezpracované zprávy od úloh. Tabulka msgs.

Vytvoření pravidel pro cron skriptem regenerate_cron

Web je možné stáhnout zde. Jedná se o klasiku LAMP (Linux, Apache, MySQL, PHP), napsáno lajdácky, neboť je to web pro autorizované správce a přes SSL.