Created
July 22, 2021 10:25
-
-
Save Vankalif/eabf3d87ae954acd783e737bd4db302d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import servicemanager | |
import win32event | |
import win32service | |
import os | |
import time | |
import socket | |
import logging | |
from watchdog.observers import Observer | |
from watchdog.events import FileSystemEventHandler | |
from win32serviceutil import ServiceFramework, HandleCommandLine | |
# Возвращает путь к файлу который был изменён последним в указанной папке | |
def get_modified_file(target_folder: str, _logger: logging.Logger) -> str: | |
assert target_folder == str, "Target folder must be sting" | |
latest_timestamp = 0 | |
latest_filename = "" | |
_, _, filenames = next(os.walk(target_folder), (None, None, [])) | |
for file in filenames: | |
file_timestamp = os.stat(target_folder + "\\" + file).st_mtime | |
if latest_timestamp < file_timestamp: | |
latest_timestamp = file_timestamp | |
latest_filename = file | |
continue | |
_logger.debug(f"Файл с изменениями найден {latest_filename}") | |
return os.path.abspath(latest_filename) | |
# Класс для обработки событий файлов | |
class FileEventHandler(FileSystemEventHandler): | |
def __init__(self, api_url, directory, _logger): | |
self.api_url = api_url | |
self.observeDirectory = directory | |
self.logger = _logger | |
def on_modified(self, event): | |
self.logger.debug(f"Сработал триггер on_modified событие {event}") | |
print(get_modified_file(self.observeDirectory, self.logger)) | |
class UsbTemperService(ServiceFramework): | |
_svc_name_ = "UsbTemperHandler" | |
_svc_display_name_ = "UsbTemperHandler" | |
_svc_description_ = "Служба для считывания данных из файла температурного датчика. Разработчик Туршиев Н.М." | |
def __init__(self, args): | |
ServiceFramework.__init__(self, args) | |
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) | |
self.observer = Observer() | |
socket.setdefaulttimeout(60) | |
self.isRunning = True | |
logging.basicConfig(filename="C:\\Users\\admin\\Desktop\\climatControl\\log.txt", | |
filemode="a", | |
format="%(name)s - %(levelname)s - %(message)s", | |
datefmt="%H:%M:%S", | |
level=logging.INFO) | |
self.logger = logging.getLogger("UsbTemperServiceLogger") | |
def SvcStop(self): | |
self.logger.debug("Получен сигнал остановки") | |
self.stop() | |
self.logger.debug("Переменная isRunning переведена в состояние False") | |
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) | |
win32event.SetEvent(self.hWaitStop) | |
def SvcDoRun(self): | |
self.logger.debug("Получен сигнал Запуска") | |
self.isRunning = True | |
self.logger.debug("Переменная isRunning переведена в состояние True") | |
win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) | |
servicemanager.LogMsg( | |
servicemanager.EVENTLOG_INFORMATION_TYPE, | |
servicemanager.PYS_SERVICE_STOPPED, | |
(self._svc_name_, '') | |
) | |
self.main() | |
def main(self): | |
self.logger.debug("Начало исполнения функции main()") | |
file_folder = "C:\\Users\\admin\\Desktop\\climatControl\\test" | |
api_url = "" | |
self.logger.debug("Конфигурирование Observer'а") | |
self.observer.schedule(FileEventHandler(api_url, file_folder, self.logger), path=file_folder, recursive=False) | |
self.logger.debug("Observer успешно сконфигурирован") | |
self.logger.debug("Запуск Observer'а") | |
self.observer.start() | |
self.logger.debug("Observer запущен") | |
try: | |
while self.isRunning: | |
time.sleep(1) | |
finally: | |
self.logger.debug("Попытка остановки Observer'а") | |
self.observer.stop() | |
self.logger.debug("Observer остановлен") | |
self.logger.debug("Начало ожидания завершения всех процессов") | |
self.observer.join() | |
self.logger.debug("Все процессы завершены") | |
def stop(self): | |
self.isRunning = False | |
if __name__ == '__main__': | |
HandleCommandLine(UsbTemperService) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment