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:
|
python:
|
||||||
- 3.4
|
- 3.4
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- "pep8 --ignore=E501 --exclude=logbook.py,utils.py ogn"
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- nosetests --with-coverage --cover-package=ogn
|
- nosetests --with-coverage --cover-package=ogn
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ $ apt-get install redis-server
|
||||||
3. Create database
|
3. Create database
|
||||||
```
|
```
|
||||||
$ ./manage.py db.init
|
$ ./manage.py db.init
|
||||||
|
$ alembic stamp head
|
||||||
```
|
```
|
||||||
|
|
||||||
## Running the aprs client and task server
|
## Running the aprs client and task server
|
||||||
|
|
|
@ -1,15 +1,14 @@
|
||||||
from ogn.model import Base
|
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
|
from manager import Manager
|
||||||
manager = Manager()
|
manager = Manager()
|
||||||
|
|
||||||
from ogn.collect.fetchddb import update_ddb_from_ogn, update_ddb_from_file
|
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@manager.command
|
||||||
def init():
|
def init():
|
||||||
"""Initialize the database."""
|
"""Initialize the database."""
|
||||||
from ogn.commands.dbutils import engine
|
|
||||||
Base.metadata.create_all(engine)
|
Base.metadata.create_all(engine)
|
||||||
print("Done.")
|
print("Done.")
|
||||||
|
|
||||||
|
|
|
@ -1,26 +1,26 @@
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
from sqlalchemy.sql import func
|
from sqlalchemy.sql import func
|
||||||
from sqlalchemy import distinct, and_
|
from sqlalchemy import distinct, and_
|
||||||
|
|
||||||
from ogn.model import ReceiverBeacon, Receiver
|
from ogn.model import ReceiverBeacon, Receiver
|
||||||
|
|
||||||
from ogn.commands.dbutils import session
|
from ogn.commands.dbutils import session
|
||||||
|
|
||||||
back_24h = datetime.utcnow() - timedelta(days=1)
|
|
||||||
receiver_messages_per_24h = 24 * 60 / 5
|
|
||||||
|
|
||||||
from manager import Manager
|
from manager import Manager
|
||||||
manager = Manager()
|
manager = Manager()
|
||||||
|
|
||||||
|
receiver_beacons_per_day = 24 * 60 / 5
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@manager.command
|
||||||
def list_all():
|
def list_all():
|
||||||
"""Show a list of all receivers."""
|
"""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).\
|
timestamp_24h_ago = datetime.utcnow() - timedelta(days=1)
|
||||||
group_by(ReceiverBeacon.name).\
|
|
||||||
subquery()
|
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).\
|
query = session.query(Receiver, sq.c.messages_count).\
|
||||||
filter(Receiver.name == sq.c.name).\
|
filter(Receiver.name == sq.c.name).\
|
||||||
|
@ -28,14 +28,21 @@ def list_all():
|
||||||
|
|
||||||
print('--- Receivers ---')
|
print('--- Receivers ---')
|
||||||
for [receiver, messages_count] in query.all():
|
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
|
@manager.command
|
||||||
def software_stats():
|
def software_stats():
|
||||||
"""Show some statistics of receiver software."""
|
"""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')).\
|
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).\
|
group_by(ReceiverBeacon.name).\
|
||||||
subquery()
|
subquery()
|
||||||
|
|
||||||
|
@ -52,8 +59,11 @@ def software_stats():
|
||||||
@manager.command
|
@manager.command
|
||||||
def hardware_stats():
|
def hardware_stats():
|
||||||
"""Show some statistics of receiver hardware."""
|
"""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')).\
|
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).\
|
group_by(ReceiverBeacon.name).\
|
||||||
subquery()
|
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
|
import socket
|
||||||
|
|
||||||
from ogn.gateway import ognGateway
|
from ogn.gateway.client import ognGateway
|
||||||
from ogn.logger import logger
|
from ogn.logger import logger
|
||||||
|
|
||||||
DB_URI = 'sqlite:///beacons.db'
|
|
||||||
|
|
||||||
from manager import Manager
|
from manager import Manager
|
||||||
manager = Manager()
|
manager = Manager()
|
||||||
|
|
||||||
|
DB_URI = 'sqlite:///beacons.db'
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@manager.command
|
||||||
def run(aprs_user="anon-dev"):
|
def run(aprs_user="anon-dev"):
|
||||||
"""Run the aprs client."""
|
"""Run the aprs client."""
|
||||||
|
|
||||||
if len(aprs_user) < 3 or len(aprs_user) > 9:
|
if len(aprs_user) < 3 or len(aprs_user) > 9:
|
||||||
print("aprs_user must be a string of 3-9 characters")
|
print("aprs_user must be a string of 3-9 characters")
|
||||||
return
|
return
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
SQLAlchemy==1.0.8
|
|
||||||
nose==1.3.7
|
nose==1.3.7
|
||||||
coveralls==0.4.4
|
coveralls==0.4.4
|
||||||
|
pep8==1.6.2
|
||||||
|
SQLAlchemy==1.0.8
|
||||||
geopy==1.11.0
|
geopy==1.11.0
|
||||||
manage.py==0.2.10
|
manage.py==0.2.10
|
||||||
celery[redis]>=3.1,<3.2
|
celery[redis]>=3.1,<3.2
|
||||||
|
alembic==0.8.3
|
||||||
|
|
Ładowanie…
Reference in New Issue