Skip to content

Commit

Permalink
new: initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
uburuntu committed Oct 14, 2020
1 parent 5f6e660 commit 2a63cd0
Show file tree
Hide file tree
Showing 13 changed files with 202 additions and 2 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ __pycache__/

# Distribution / packaging
.Python
build/
# build/
develop-eggs/
dist/
downloads/
Expand Down Expand Up @@ -127,3 +127,6 @@ dmypy.json

# Pyre type checker
.pyre/

# IDE
.idea/
1 change: 0 additions & 1 deletion README.md

This file was deleted.

Empty file added dmonitor/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions dmonitor/build/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/bash

pyinstaller --noconsole --noconfirm --clean --onefile --name DMonitor --paths .. --icon icon.ico ../main.py
Binary file added dmonitor/build/icon.ico
Binary file not shown.
19 changes: 19 additions & 0 deletions dmonitor/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import os

stathat_key = os.getenv('DMONITOR_STATHAT_KEY')

if stathat_key is None:
raise Exception('You should set `DMONITOR_STATHAT_KEY` environment variable')

domains = ('google.com', 'yandex.ru', 'vk.com')

icon = b'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'

text_about = '''DMonitor
Программа для анализа доступности интернета в общежитии Главного здания.
Чат в Telegram: https://t.me/ds_msu
Исходники: https://github.com/uburuntu/dmonitor
'''
46 changes: 46 additions & 0 deletions dmonitor/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import time

import PySimpleGUIWx as sg

import config

from pinger import Pinger
from stathat import StatHat
from utils import Timer


def main():
updates_interval = 60.
timer = Timer(updates_interval).start()
timer_notification = Timer(30 * 60.)
stathat = StatHat(config.stathat_key)
pinger = Pinger(stathat)

menu = ['UNUSED', ['Информация', '---', 'Закрыть']]
last_send = 'Данные еще не отправлялись'
tooltip = 'Мониторинг интернета в общежитии ГЗ'
tray = sg.SystemTray(menu=menu, tooltip=f'{tooltip}\n\n{last_send}', data_base64=config.icon)

while True:
event = tray.read(timeout=updates_interval * 1000)

if event == 'Закрыть':
break

if timer.acquire():
ok = pinger.analyze()
if ok:
last_send = f'Последняя отправка данных: {time.ctime()}'
tray.update(tooltip=f'{tooltip}\n\n{last_send}')
else:
if timer_notification.acquire():
sg.popup_no_wait(f'Проблема с доступом к одному из сайтов: {", ".join(config.domains)}', icon=config.icon)

if event == 'Информация':
sg.popup_no_wait(f'{config.text_about}\n\n{last_send}', icon=config.icon)

tray.close()


if __name__ == '__main__':
main()
72 changes: 72 additions & 0 deletions dmonitor/pinger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import json
import time
from pathlib import Path
from typing import Tuple

import config
from stathat import StatHat
import ping3


class Pinger:
def __init__(self, stathat: StatHat):
self.stathat = stathat
self.data = {}
self.data_file = Path.home() / Path('.dmonitor/data.json')

self.data_file.parent.mkdir(parents=True, exist_ok=True)
self.data_file.touch()
self.load()

def load(self):
try:
self.data = json.loads(self.data_file.read_text(encoding='utf-8'))
except json.decoder.JSONDecodeError:
self.data = {}

def dump(self):
self.data_file.write_text(json.dumps(self.data), encoding='utf-8')

@staticmethod
def key(ts: int = None) -> str:
ts = int(ts or time.time())
return str(ts - ts % 60)

@staticmethod
def ping() -> Tuple[dict, bool]:
data = {'avg': 0., 'downtime': False}

delays = []
for domain in config.domains:
delay = ping3.ping(domain, unit='ms')
if delay is None:
data['downtime'] = True
else:
delays.append(delay)

data['avg'] = sum(delays) / len(delays) if delays else 60_000
return data, data['downtime']

def upload_metrics(self):
try:
for k, v in self.data.items():
if v.get('downtime'):
self.stathat.post_count('@ds_msu - downtime', 1, timestamp=int(k))
self.stathat.post_count('@ds_msu - submissions', 1, timestamp=int(k))
self.stathat.post_value('@ds_msu - avg ping', v['avg'], timestamp=int(k))
except Exception:
pass
else:
self.data.clear()

def analyze(self):
key = self.key()

data, downtime = self.ping()
self.data[key] = data

if not downtime:
self.upload_metrics()

self.dump()
return not downtime
26 changes: 26 additions & 0 deletions dmonitor/stathat.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import requests


class StatHat:
api_base = 'https://api.stathat.com/'

def __init__(self, key: str):
self.key = key
self.session = requests.Session()

def request(self, path: str, data: dict) -> str:
response = self.session.post(self.api_base + path, data=data)
response.raise_for_status()
return response.text

def post_value(self, stat_name: str, value: float, timestamp: int = None):
args = {'ezkey': self.key, 'stat': stat_name, 'value': value}
if timestamp is not None:
args['t'] = timestamp
return self.request('ez', args)

def post_count(self, stat_name: str, count: int, timestamp: int = None):
args = {'ezkey': self.key, 'stat': stat_name, 'count': count}
if timestamp is not None:
args['t'] = timestamp
return self.request('ez', args)
18 changes: 18 additions & 0 deletions dmonitor/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import time


class Timer:
def __init__(self, interval: float):
self.interval = float(interval)
self.last = 0.

def start(self):
self.last = time.monotonic()
return self

def acquire(self):
curr_ts = time.monotonic()
if self.last + self.interval > curr_ts:
return False
self.last = curr_ts
return True
9 changes: 9 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# dmonitor

Программа для мониторинга интернета в Главном здании МГУ.

# Build

```
pyinstaller --noconsole -y --clean --onefile --name DMonitor main.py
```
1 change: 1 addition & 0 deletions requirements-dev.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pyinstaller
4 changes: 4 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
ping3==2.6
PySimpleGUIQt==0.17
wxPython==4.1
requests==2.24

0 comments on commit 2a63cd0

Please sign in to comment.