kopia lustrzana https://github.com/glidernet/ogn-python
Merge pull request #13 from kerel-fs/fix/dependencies
Fix dependencies; add pep8 check; move gateway to a separate file.pull/17/head
commit
76ec41a2ae
|
@ -3,6 +3,9 @@ language: python
|
|||
python:
|
||||
- 3.4
|
||||
|
||||
before_script:
|
||||
- "pep8 --ignore=E501 --exclude=logbook.py,utils.py ogn"
|
||||
|
||||
script:
|
||||
- nosetests --with-coverage --cover-package=ogn
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@ $ apt-get install redis-server
|
|||
3. Create database
|
||||
```
|
||||
$ ./manage.py db.init
|
||||
$ alembic stamp head
|
||||
```
|
||||
|
||||
## Running the aprs client and task server
|
||||
|
|
|
@ -1,15 +1,14 @@
|
|||
from ogn.model import Base
|
||||
from ogn.collect.fetchddb import update_ddb_from_ogn, update_ddb_from_file
|
||||
from ogn.commands.dbutils import engine
|
||||
|
||||
from manager import Manager
|
||||
manager = Manager()
|
||||
|
||||
from ogn.collect.fetchddb import update_ddb_from_ogn, update_ddb_from_file
|
||||
|
||||
|
||||
@manager.command
|
||||
def init():
|
||||
"""Initialize the database."""
|
||||
from ogn.commands.dbutils import engine
|
||||
Base.metadata.create_all(engine)
|
||||
print("Done.")
|
||||
|
||||
|
|
|
@ -1,26 +1,26 @@
|
|||
from datetime import datetime, timedelta
|
||||
|
||||
from sqlalchemy.sql import func
|
||||
from sqlalchemy import distinct, and_
|
||||
|
||||
from ogn.model import ReceiverBeacon, Receiver
|
||||
|
||||
from ogn.commands.dbutils import session
|
||||
|
||||
back_24h = datetime.utcnow() - timedelta(days=1)
|
||||
receiver_messages_per_24h = 24 * 60 / 5
|
||||
|
||||
from manager import Manager
|
||||
manager = Manager()
|
||||
|
||||
receiver_beacons_per_day = 24 * 60 / 5
|
||||
|
||||
|
||||
@manager.command
|
||||
def list_all():
|
||||
"""Show a list of all receivers."""
|
||||
sq = session.query(distinct(ReceiverBeacon.name).label('name'), func.max(ReceiverBeacon.timestamp).label('lastseen'), func.count(ReceiverBeacon.name).label('messages_count')).\
|
||||
filter(ReceiverBeacon.timestamp > back_24h).\
|
||||
group_by(ReceiverBeacon.name).\
|
||||
subquery()
|
||||
|
||||
timestamp_24h_ago = datetime.utcnow() - timedelta(days=1)
|
||||
|
||||
sq = session.query(distinct(ReceiverBeacon.name).label('name'),
|
||||
func.max(ReceiverBeacon.timestamp).label('lastseen'),
|
||||
func.count(ReceiverBeacon.name).label('messages_count')
|
||||
).filter(ReceiverBeacon.timestamp > timestamp_24h_ago).group_by(ReceiverBeacon.name).subquery()
|
||||
|
||||
query = session.query(Receiver, sq.c.messages_count).\
|
||||
filter(Receiver.name == sq.c.name).\
|
||||
|
@ -28,14 +28,21 @@ def list_all():
|
|||
|
||||
print('--- Receivers ---')
|
||||
for [receiver, messages_count] in query.all():
|
||||
print('%9s (%2s): %3d%% avail, %s, %s ' % (receiver.name, receiver.country_code, 100.0*float(messages_count/receiver_messages_per_24h), receiver.version, receiver.platform))
|
||||
print('%9s (%2s): %3d%% avail, %s, %s ' % (receiver.name,
|
||||
receiver.country_code,
|
||||
100.0 * float(messages_count / receiver_beacons_per_day),
|
||||
receiver.version,
|
||||
receiver.platform))
|
||||
|
||||
|
||||
@manager.command
|
||||
def software_stats():
|
||||
"""Show some statistics of receiver software."""
|
||||
|
||||
timestamp_24h_ago = datetime.utcnow() - timedelta(days=1)
|
||||
|
||||
sq = session.query(ReceiverBeacon.name, func.max(ReceiverBeacon.timestamp).label('lastseen')).\
|
||||
filter(ReceiverBeacon.timestamp > back_24h).\
|
||||
filter(ReceiverBeacon.timestamp > timestamp_24h_ago).\
|
||||
group_by(ReceiverBeacon.name).\
|
||||
subquery()
|
||||
|
||||
|
@ -52,8 +59,11 @@ def software_stats():
|
|||
@manager.command
|
||||
def hardware_stats():
|
||||
"""Show some statistics of receiver hardware."""
|
||||
|
||||
timestamp_24h_ago = datetime.utcnow() - timedelta(days=1)
|
||||
|
||||
sq = session.query(ReceiverBeacon.name, func.max(ReceiverBeacon.timestamp).label('lastseen')).\
|
||||
filter(ReceiverBeacon.timestamp > back_24h).\
|
||||
filter(ReceiverBeacon.timestamp > timestamp_24h_ago).\
|
||||
group_by(ReceiverBeacon.name).\
|
||||
subquery()
|
||||
|
||||
|
|
|
@ -1,69 +0,0 @@
|
|||
import socket
|
||||
from time import time
|
||||
|
||||
from ogn.gateway import settings
|
||||
from ogn.commands.dbutils import session
|
||||
from ogn.aprs_parser import parse_aprs
|
||||
from ogn.aprs_utils import create_aprs_login
|
||||
from ogn.exceptions import AprsParseError, OgnParseError
|
||||
from ogn.logger import logger
|
||||
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from ogn.model import Base
|
||||
|
||||
|
||||
class ognGateway:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def connect_db(self):
|
||||
self.session = session
|
||||
|
||||
def connect(self, aprs_user):
|
||||
# create socket, connect to server, login and make a file object associated with the socket
|
||||
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
|
||||
self.sock.connect((settings.APRS_SERVER_HOST, settings.APRS_SERVER_PORT))
|
||||
|
||||
login = create_aprs_login(aprs_user, -1, settings.APRS_APP_NAME, settings.APRS_APP_VER, settings.APRS_FILTER)
|
||||
self.sock.send(login.encode())
|
||||
self.sock_file = self.sock.makefile('rw')
|
||||
|
||||
def disconnect(self):
|
||||
# close everything
|
||||
self.sock.shutdown(0)
|
||||
self.sock.close()
|
||||
|
||||
def run(self):
|
||||
keepalive_time = time()
|
||||
while True:
|
||||
if time() - keepalive_time > settings.APRS_KEEPALIVE_TIME:
|
||||
logger.debug('Sending keepalive')
|
||||
self.sock.send("#keepalive".encode())
|
||||
keepalive_time = time()
|
||||
|
||||
# Read packet string from socket
|
||||
packet_str = self.sock_file.readline().strip()
|
||||
|
||||
# A zero length line should not be return if keepalives are being sent
|
||||
# A zero length line will only be returned after ~30m if keepalives are not sent
|
||||
if len(packet_str) == 0:
|
||||
logger.warning('Read returns zero length string. Failure. Orderly closeout')
|
||||
break
|
||||
|
||||
self.proceed_line(packet_str)
|
||||
|
||||
def proceed_line(self, line):
|
||||
try:
|
||||
beacon = parse_aprs(line)
|
||||
except AprsParseError:
|
||||
logger.error('AprsParseError while parsing line: %s' % line, exc_info=True)
|
||||
return
|
||||
except OgnParseError:
|
||||
logger.error('OgnParseError while parsing line: ' % line, exc_info=True)
|
||||
return
|
||||
|
||||
if beacon is not None:
|
||||
self.session.add(beacon)
|
||||
self.session.commit()
|
|
@ -0,0 +1,69 @@
|
|||
import socket
|
||||
from time import time
|
||||
|
||||
from ogn.gateway import settings
|
||||
from ogn.commands.dbutils import session
|
||||
from ogn.aprs_parser import parse_aprs
|
||||
from ogn.aprs_utils import create_aprs_login
|
||||
from ogn.exceptions import AprsParseError, OgnParseError
|
||||
from ogn.logger import logger
|
||||
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from ogn.model import Base
|
||||
|
||||
|
||||
class ognGateway:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def connect_db(self):
|
||||
self.session = session
|
||||
|
||||
def connect(self, aprs_user):
|
||||
# create socket, connect to server, login and make a file object associated with the socket
|
||||
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
|
||||
self.sock.connect((settings.APRS_SERVER_HOST, settings.APRS_SERVER_PORT))
|
||||
|
||||
login = create_aprs_login(aprs_user, -1, settings.APRS_APP_NAME, settings.APRS_APP_VER, settings.APRS_FILTER)
|
||||
self.sock.send(login.encode())
|
||||
self.sock_file = self.sock.makefile('rw')
|
||||
|
||||
def disconnect(self):
|
||||
# close everything
|
||||
self.sock.shutdown(0)
|
||||
self.sock.close()
|
||||
|
||||
def run(self):
|
||||
keepalive_time = time()
|
||||
while True:
|
||||
if time() - keepalive_time > settings.APRS_KEEPALIVE_TIME:
|
||||
logger.debug('Sending keepalive')
|
||||
self.sock.send("#keepalive".encode())
|
||||
keepalive_time = time()
|
||||
|
||||
# Read packet string from socket
|
||||
packet_str = self.sock_file.readline().strip()
|
||||
|
||||
# A zero length line should not be return if keepalives are being sent
|
||||
# A zero length line will only be returned after ~30m if keepalives are not sent
|
||||
if len(packet_str) == 0:
|
||||
logger.warning('Read returns zero length string. Failure. Orderly closeout')
|
||||
break
|
||||
|
||||
self.proceed_line(packet_str)
|
||||
|
||||
def proceed_line(self, line):
|
||||
try:
|
||||
beacon = parse_aprs(line)
|
||||
except AprsParseError:
|
||||
logger.error('AprsParseError while parsing line: %s' % line, exc_info=True)
|
||||
return
|
||||
except OgnParseError:
|
||||
logger.error('OgnParseError while parsing line: ' % line, exc_info=True)
|
||||
return
|
||||
|
||||
if beacon is not None:
|
||||
self.session.add(beacon)
|
||||
self.session.commit()
|
|
@ -1,17 +1,18 @@
|
|||
import socket
|
||||
|
||||
from ogn.gateway import ognGateway
|
||||
from ogn.gateway.client import ognGateway
|
||||
from ogn.logger import logger
|
||||
|
||||
DB_URI = 'sqlite:///beacons.db'
|
||||
|
||||
from manager import Manager
|
||||
manager = Manager()
|
||||
|
||||
DB_URI = 'sqlite:///beacons.db'
|
||||
|
||||
|
||||
@manager.command
|
||||
def run(aprs_user="anon-dev"):
|
||||
"""Run the aprs client."""
|
||||
|
||||
if len(aprs_user) < 3 or len(aprs_user) > 9:
|
||||
print("aprs_user must be a string of 3-9 characters")
|
||||
return
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
SQLAlchemy==1.0.8
|
||||
nose==1.3.7
|
||||
coveralls==0.4.4
|
||||
pep8==1.6.2
|
||||
SQLAlchemy==1.0.8
|
||||
geopy==1.11.0
|
||||
manage.py==0.2.10
|
||||
celery[redis]>=3.1,<3.2
|
||||
alembic==0.8.3
|
||||
|
|
Ładowanie…
Reference in New Issue