diff --git a/README.md b/README.md index b729869..36b52d4 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ available commands: create_gaps2d Create 'gaps' from logfile tables. file_export Export separate logfile tables to csv files. They can be used for fast bulk import with sql COPY command. file_import Import APRS logfiles into separate logfile tables. - transfer Transfer beacons from separate logfile tables to beacon table. + transfer_aircraft_beaconsTransfer beacons from separate logfile tables to beacon table. update Update beacons (add foreign keys, compute distance, bearing, ags, etc.) in separate logfile tables. [db] @@ -108,6 +108,9 @@ available commands: update_country_codes Update country codes of all receivers. upgrade Upgrade database to the latest version. + [flights] + flights2d Compute flights. + [gateway] run Run the aprs client. @@ -124,23 +127,6 @@ available commands: add_missing_receivers Update receivers with data from stats. create_flights Create Flights. create_stats Create DeviceStats, ReceiverStats and RelationStats. - - [show.airport] - list_all Show a list of all airports. - - [show.deviceinfos] - stats Show some stats on registered devices. - - [show.devices] - aircraft_type_stats Show stats about aircraft types used by devices. - hardware_stats Show stats about hardware version used by devices. - software_stats Show stats about software version used by devices. - stealth_stats Show stats about stealth flag set by devices. - - [show.receiver] - hardware_stats Show some statistics of receiver hardware. - list_all Show a list of all receivers. - software_stats Show some statistics of receiver software. ``` Only the command `logbook.compute` requires a running task server (celery) at the moment. diff --git a/ogn/commands/__init__.py b/ogn/commands/__init__.py index 1cc73b7..04719ca 100644 --- a/ogn/commands/__init__.py +++ b/ogn/commands/__init__.py @@ -1,12 +1,9 @@ from .database import manager as database_manager from .bulkimport import manager as bulkimport_manager from .igcexport import manager as igcexport_manager -from .showairport import manager as show_airport_manager -from .showreceiver import manager as show_receiver_manager -from .showdevices import manager as show_devices_manager -from .showdeviceinfos import manager as show_deviceinfos_manager from .logbook import manager as logbook_manager -from ogn.commands.stats import manager as stats_manager +from .stats import manager as stats_manager +from .flights import manager as flights_manager from manager import Manager @@ -15,9 +12,6 @@ manager = Manager() manager.merge(database_manager, namespace='db') manager.merge(bulkimport_manager, namespace='bulkimport') manager.merge(igcexport_manager, namespace='igcexport') -manager.merge(show_airport_manager, namespace='show.airport') -manager.merge(show_receiver_manager, namespace='show.receiver') -manager.merge(show_devices_manager, namespace='show.devices') -manager.merge(show_deviceinfos_manager, namespace='show.deviceinfos') manager.merge(logbook_manager, namespace='logbook') manager.merge(stats_manager, namespace='stats') +manager.merge(flights_manager, namespace='flights') diff --git a/ogn/commands/showairport.py b/ogn/commands/showairport.py deleted file mode 100644 index 861aa58..0000000 --- a/ogn/commands/showairport.py +++ /dev/null @@ -1,26 +0,0 @@ -from manager import Manager -from ogn.commands.dbutils import session -from ogn.model import Airport -from sqlalchemy import and_, between - - -manager = Manager() - - -@manager.arg('country_code', help='filter by country code, eg. "de" for germany') -@manager.command -def list_all(country_code=None): - """Show a list of all airports.""" - or_args = [] - if country_code is None: - or_args = [between(Airport.style, 2, 5)] - else: - or_args = [and_(between(Airport.style, 2, 5), - Airport.country_code == country_code)] - query = session.query(Airport) \ - .order_by(Airport.name) \ - .filter(*or_args) - - print('--- Airports ---') - for airport in query.all(): - print(airport.name) diff --git a/ogn/commands/showdeviceinfos.py b/ogn/commands/showdeviceinfos.py deleted file mode 100644 index b1a46aa..0000000 --- a/ogn/commands/showdeviceinfos.py +++ /dev/null @@ -1,63 +0,0 @@ -from manager import Manager -from ogn.commands.dbutils import session -from ogn.model import DeviceInfoOrigin -from ogn.model.device_info import DeviceInfo -from sqlalchemy import func, and_, true, false - - -manager = Manager() - - -def get_devices_stats(session): - sq_default = session.query(DeviceInfo.address) \ - .filter(and_(DeviceInfo.tracked == true(), DeviceInfo.identified == true())) \ - .subquery() - - sq_nt = session.query(DeviceInfo.address) \ - .filter(and_(DeviceInfo.tracked == false(), DeviceInfo.identified == true())) \ - .subquery() - - sq_ni = session.query(DeviceInfo.address) \ - .filter(and_(DeviceInfo.tracked == true(), DeviceInfo.identified == false())) \ - .subquery() - - sq_ntni = session.query(DeviceInfo.address) \ - .filter(and_(DeviceInfo.tracked == false(), DeviceInfo.identified == false())) \ - .subquery() - - query = session.query(DeviceInfo.address_origin, - func.count(DeviceInfo.id), - func.count(sq_default.c.address), - func.count(sq_nt.c.address), - func.count(sq_ni.c.address), - func.count(sq_ntni.c.address)) \ - .outerjoin(sq_default, sq_default.c.address == DeviceInfo.address) \ - .outerjoin(sq_nt, sq_nt.c.address == DeviceInfo.address) \ - .outerjoin(sq_ni, sq_ni.c.address == DeviceInfo.address) \ - .outerjoin(sq_ntni, sq_ntni.c.address == DeviceInfo.address) \ - .group_by(DeviceInfo.address_origin) - - stats = {} - for [address_origin, device_count, default_count, nt_count, ni_count, ntni_count] in query.all(): - origin = DeviceInfoOrigin(address_origin).name() - stats[origin] = {'device_count': device_count, - 'default_count': default_count, - 'nt_count': nt_count, - 'ni_count': ni_count, - 'ntni_count': ntni_count} - return stats - - -@manager.command -def stats(): - """Show some stats on registered devices.""" - print('--- Devices ---') - stats = get_devices_stats(session) - for origin in stats: - print('{:12s} Total:{:5d} - default:{:3d}, just not tracked:{:3d}, just not identified:{:3d}, not tracked & not identified: {:3d}' - .format(origin, - stats[origin]['device_count'], - stats[origin]['default_count'], - stats[origin]['nt_count'], - stats[origin]['ni_count'], - stats[origin]['ntni_count'])) diff --git a/ogn/commands/showdevices.py b/ogn/commands/showdevices.py deleted file mode 100644 index 813dfc3..0000000 --- a/ogn/commands/showdevices.py +++ /dev/null @@ -1,56 +0,0 @@ -from manager import Manager -from ogn.commands.dbutils import session -from ogn.model import Device, AircraftType -from sqlalchemy import func - - -manager = Manager() - - -@manager.command -def aircraft_type_stats(): - """Show stats about aircraft types used by devices.""" - aircraft_type_query = session.query(Device.aircraft_type, - func.count(Device.id)) \ - .group_by(Device.aircraft_type) \ - .order_by(func.count(Device.id).desc()) - print("--- Aircraft types ---") - for [aircraft_type, count] in aircraft_type_query.all(): - at = AircraftType(aircraft_type) - print("{}: {}".format(at.name(), count)) - - -@manager.command -def stealth_stats(): - """Show stats about stealth flag set by devices.""" - stealth_query = session.query(Device.stealth, - func.count(Device.id)) \ - .group_by(Device.stealth) \ - .order_by(func.count(Device.id).desc()) - print("--- Stealth ---") - for [is_stealth, count] in stealth_query.all(): - print("{}: {}".format(is_stealth, count)) - - -@manager.command -def software_stats(): - """Show stats about software version used by devices.""" - software_query = session.query(Device.software_version, - func.count(Device.id)) \ - .group_by(Device.software_version) \ - .order_by(func.count(Device.id).desc()) - print("--- Software version ---") - for [software_version, count] in software_query.all(): - print("{}: {}".format(software_version, count)) - - -@manager.command -def hardware_stats(): - """Show stats about hardware version used by devices.""" - hardware_query = session.query(Device.hardware_version, - func.count(Device.id)) \ - .group_by(Device.hardware_version) \ - .order_by(func.count(Device.id).desc()) - print("\n--- Hardware version ---") - for [hardware_version, count] in hardware_query.all(): - print("{}: {}".format(hardware_version, count)) diff --git a/ogn/commands/showreceiver.py b/ogn/commands/showreceiver.py deleted file mode 100644 index 2873235..0000000 --- a/ogn/commands/showreceiver.py +++ /dev/null @@ -1,77 +0,0 @@ -from datetime import datetime, timedelta -from manager import Manager -from ogn.commands.dbutils import session -from ogn.model import ReceiverBeacon, Receiver -from sqlalchemy import distinct, and_ -from sqlalchemy.sql import func - - -manager = Manager() - -receiver_beacons_per_day = 24 * 60 / 5 - - -@manager.command -def list_all(): - """Show a list of all receivers.""" - 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).\ - order_by(Receiver.name) - - 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_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 > timestamp_24h_ago).\ - group_by(ReceiverBeacon.name).\ - subquery() - - versions = session.query(distinct(ReceiverBeacon.version), func.count(ReceiverBeacon.version)).\ - filter(and_(ReceiverBeacon.name == sq.c.name, ReceiverBeacon.timestamp == sq.c.lastseen)).\ - group_by(ReceiverBeacon.version).\ - order_by(ReceiverBeacon.version) - - print('--- Versions ---') - for [version, count] in versions.all(): - print('%5s: %s' % (version, count)) - - -@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 > timestamp_24h_ago).\ - group_by(ReceiverBeacon.name).\ - subquery() - - platforms = session.query(distinct(ReceiverBeacon.platform), func.count(ReceiverBeacon.platform)).\ - filter(and_(ReceiverBeacon.name == sq.c.name, ReceiverBeacon.timestamp == sq.c.lastseen)).\ - group_by(ReceiverBeacon.platform).\ - order_by(ReceiverBeacon.platform) - - print('--- Platforms ---') - for [platform, count] in platforms.all(): - print('%7s: %s' % (platform, count))