Moved alfred python stuff into external lib
--> https://github.com/asdil12/pyalfred
This commit is contained in:
parent
c34246f3a8
commit
12b7c75508
|
@ -0,0 +1,13 @@
|
||||||
|
Alfred <--> Monitoring Proxy
|
||||||
|
============================
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
```
|
||||||
|
pip3 install pyalfred
|
||||||
|
|
||||||
|
python3 setup.py install
|
||||||
|
```
|
||||||
|
|
||||||
|
Then create a cron job to run `/usr/local/bin/alfred-monitoring-proxy` every 5 minutes.
|
|
@ -0,0 +1,17 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import pyalfred
|
||||||
|
import requests
|
||||||
|
|
||||||
|
CONFIG = {
|
||||||
|
"api_url": "https://monitoring.freifunk-franken.de/api/alfred",
|
||||||
|
"fetch_ids": [64]
|
||||||
|
}
|
||||||
|
|
||||||
|
ac = pyalfred.AlfredConnection()
|
||||||
|
|
||||||
|
for req_data_type in CONFIG["fetch_ids"]:
|
||||||
|
data = {req_data_type: ac.fetch(req_data_type)}
|
||||||
|
response = requests.post(CONFIG["api_url"], json=data).json()
|
||||||
|
for data_type, data in response.items():
|
||||||
|
ac.send(int(data_type), data)
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
from distutils.core import setup
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='alfred-monitoring-proxy',
|
||||||
|
version='0.0.1',
|
||||||
|
license='GPL',
|
||||||
|
description='FFF ALFRED <--> Monitoring Proxy',
|
||||||
|
author='Dominik Heidler',
|
||||||
|
author_email='dominik@heidler.eu',
|
||||||
|
url='http://github.com/asdil12/fff-monitoring',
|
||||||
|
requires=['pyalfred'],
|
||||||
|
scripts=['alfred-monitoring-proxy'],
|
||||||
|
)
|
||||||
|
|
|
@ -1,173 +0,0 @@
|
||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
import socket
|
|
||||||
import gzip
|
|
||||||
from struct import Struct
|
|
||||||
from random import randint
|
|
||||||
|
|
||||||
CONFIG = {
|
|
||||||
"api_url": "https://monitoring.freifunk-franken.de/api/alfred"
|
|
||||||
}
|
|
||||||
|
|
||||||
alfred_tlv = Struct("!BBH")
|
|
||||||
# type
|
|
||||||
# version
|
|
||||||
# length
|
|
||||||
|
|
||||||
alfred_request_v0 = Struct("!%isBH" % alfred_tlv.size)
|
|
||||||
# (alfred_tlv) header
|
|
||||||
# requested_type
|
|
||||||
# tx_id
|
|
||||||
|
|
||||||
alfred_transaction_mgmt = Struct("!HH")
|
|
||||||
# id
|
|
||||||
# seqno
|
|
||||||
|
|
||||||
ETH_ALEN = 6
|
|
||||||
mac_address = Struct("!%iB" % ETH_ALEN)
|
|
||||||
|
|
||||||
alfred_data = Struct("!%is%is" % (ETH_ALEN, alfred_tlv.size))
|
|
||||||
# (mac_address) source
|
|
||||||
# (alfred_tlv) header
|
|
||||||
# data[0]
|
|
||||||
|
|
||||||
alfred_push_data_v0 = Struct("!%is%is" % (alfred_tlv.size, alfred_transaction_mgmt.size))
|
|
||||||
# (alfred_tlv) header
|
|
||||||
# (alfred_transaction_mgmt) txm
|
|
||||||
# (alfred_data) data[0]
|
|
||||||
|
|
||||||
class AlfredPacketType(object):
|
|
||||||
ALFRED_PUSH_DATA = 0
|
|
||||||
ALFRED_ANNOUNCE_MASTER = 1
|
|
||||||
ALFRED_REQUEST = 2
|
|
||||||
ALFRED_STATUS_TXEND = 3
|
|
||||||
ALFRED_STATUS_ERROR = 4
|
|
||||||
|
|
||||||
ALFRED_VERSION = 0
|
|
||||||
|
|
||||||
|
|
||||||
def get_alfred_socket():
|
|
||||||
client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
||||||
client.connect("/var/run/alfred.sock")
|
|
||||||
return client
|
|
||||||
|
|
||||||
def send_data(data_type, data):
|
|
||||||
"""
|
|
||||||
Args:
|
|
||||||
data_type (int)
|
|
||||||
data (string)
|
|
||||||
"""
|
|
||||||
client = get_alfred_socket()
|
|
||||||
|
|
||||||
data = data.encode("UTF-8")
|
|
||||||
data_tlv = alfred_tlv.pack(data_type, ALFRED_VERSION, len(data))
|
|
||||||
# ALFRED server will fill this field
|
|
||||||
source = mac_address.pack([0]*ETH_ALEN)
|
|
||||||
pkt_data = alfred_data.pack(source, data_tlv) + data
|
|
||||||
|
|
||||||
request_id = randint(0, 65535)
|
|
||||||
seq_id = 0
|
|
||||||
txm = alfred_transaction_mgmt.pack(request_id, seq_id)
|
|
||||||
tlv = alfred_tlv.pack(AlfredPacketType.ALFRED_PUSH_DATA, ALFRED_VERSION, len(pkt_data) + len(txm))
|
|
||||||
pkt_push_data = alfred_push_data_v0.pack(tlv, txm) + pkt_data
|
|
||||||
|
|
||||||
client.send(pkt_push_data)
|
|
||||||
client.close()
|
|
||||||
|
|
||||||
def request_data(data_type):
|
|
||||||
"""
|
|
||||||
Args:
|
|
||||||
data_type (int)
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
data (string)
|
|
||||||
"""
|
|
||||||
client = get_alfred_socket()
|
|
||||||
|
|
||||||
header = alfred_tlv.pack(AlfredPacketType.ALFRED_REQUEST, ALFRED_VERSION, alfred_request_v0.size - alfred_tlv.size)
|
|
||||||
request_id = randint(0, 65535)
|
|
||||||
request = alfred_request_v0.pack(header, data_type, request_id)
|
|
||||||
|
|
||||||
client.send(request)
|
|
||||||
|
|
||||||
response = {}
|
|
||||||
|
|
||||||
last_seq_id = -1
|
|
||||||
while True:
|
|
||||||
tlv = client.recv(alfred_tlv.size)
|
|
||||||
if len(tlv) < alfred_tlv.size:
|
|
||||||
# no (more) data available
|
|
||||||
break
|
|
||||||
assert len(tlv) == alfred_tlv.size
|
|
||||||
|
|
||||||
res_type, res_version, res_length = alfred_tlv.unpack(tlv)
|
|
||||||
assert res_type == AlfredPacketType.ALFRED_PUSH_DATA
|
|
||||||
assert res_version == ALFRED_VERSION
|
|
||||||
|
|
||||||
push = tlv + client.recv(alfred_push_data_v0.size - alfred_tlv.size)
|
|
||||||
assert len(push) == alfred_push_data_v0.size
|
|
||||||
res_length -= (alfred_push_data_v0.size - alfred_tlv.size)
|
|
||||||
|
|
||||||
# check transaction_id and sequence_id
|
|
||||||
tlv, txm = alfred_push_data_v0.unpack(push)
|
|
||||||
trx_id, seq_id = alfred_transaction_mgmt.unpack(txm)
|
|
||||||
assert seq_id > last_seq_id
|
|
||||||
last_seq_id = seq_id
|
|
||||||
assert trx_id == request_id
|
|
||||||
|
|
||||||
while res_length > 0:
|
|
||||||
data = client.recv(alfred_data.size)
|
|
||||||
assert len(data) == alfred_data.size
|
|
||||||
res_length -= alfred_data.size
|
|
||||||
|
|
||||||
source, data_tlv = alfred_data.unpack(data)
|
|
||||||
|
|
||||||
mac = ":".join(["%02x" % i for i in mac_address.unpack(source)])
|
|
||||||
|
|
||||||
data_type_recv, data_version, data_length = alfred_tlv.unpack(data_tlv)
|
|
||||||
assert data_type == data_type_recv
|
|
||||||
|
|
||||||
payload = client.recv(data_length)
|
|
||||||
assert len(payload) == data_length
|
|
||||||
res_length -= data_length
|
|
||||||
|
|
||||||
try:
|
|
||||||
payload = gzip.decompress(payload)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# decode string (expect unicode)
|
|
||||||
payload = payload.decode("UTF-8", errors="replace")
|
|
||||||
|
|
||||||
if mac in response:
|
|
||||||
response[mac] += payload
|
|
||||||
else:
|
|
||||||
response[mac] = payload
|
|
||||||
|
|
||||||
client.close()
|
|
||||||
return response
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import sys
|
|
||||||
import requests
|
|
||||||
if len(sys.argv) > 1 and sys.argv[1] == "client":
|
|
||||||
if len(sys.argv) > 3:
|
|
||||||
push_data_type = int(sys.argv[2])
|
|
||||||
data = sys.argv[3]
|
|
||||||
send_data(push_data_type, data)
|
|
||||||
elif len(sys.argv) > 2:
|
|
||||||
req_data_type = int(sys.argv[2])
|
|
||||||
data = request_data(req_data_type)
|
|
||||||
print(data)
|
|
||||||
elif len(sys.argv) > 1:
|
|
||||||
# send all updated data to HTTP server and send response to ALFRED
|
|
||||||
for i in sys.argv[1:]:
|
|
||||||
req_data_type = int(i)
|
|
||||||
data = {req_data_type: request_data(req_data_type)}
|
|
||||||
response = requests.post(CONFIG["api_url"], json=data).json()
|
|
||||||
for data_type, data in response.items():
|
|
||||||
send_data(int(data_type), data)
|
|
||||||
else:
|
|
||||||
print("Get: %s client DATA_TYPE" % sys.argv[0])
|
|
||||||
print("Set: %s client DATA_TYPE VALUE)" % sys.argv[0])
|
|
||||||
print("Proxy: %s DATA_TYPE_1 [DATA_TYPE_N])" % sys.argv[0])
|
|
Loading…
Reference in New Issue