diff --git a/.gitignore b/.gitignore index ea23d8c..cc93b8e 100644 --- a/.gitignore +++ b/.gitignore @@ -107,7 +107,7 @@ venv.bak/ .mypy_cache/ # vscode -**/.vscode +**/.vscode/** # srsLTE srsLTE/build diff --git a/src/.vscode/settings.json b/src/.vscode/settings.json index 615aafb..ed9cd4a 100644 --- a/src/.vscode/settings.json +++ b/src/.vscode/settings.json @@ -1,3 +1,5 @@ { - "python.pythonPath": "/usr/bin/python3" + "python.pythonPath": "/usr/bin/python3", + "python.linting.enabled": true, + "python.linting.pylintEnabled": true } \ No newline at end of file diff --git a/src/api_client.py b/src/api_client.py index 3928681..21c223f 100644 --- a/src/api_client.py +++ b/src/api_client.py @@ -20,7 +20,8 @@ def __init__(self, watchdog): sys.exit(1) def signup(self): - if self.config.has_option('api', 'api_key'): + if self.config.has_option('api', 'api_key') \ + and self.config['api']['api_key']: self.logger.success(f"Your API key is {self.config['api']['api_key']}") return packet = {} @@ -43,11 +44,12 @@ def signup(self): def statistics(self): self.check_api_key() j = { - 'api_key': self.api_key + 'api_key': self.api_key, + 'project': self.watchdog.project_name } r = requests.post(self._make_api_url("statistics"), json=j) resp = r.json() - if r.status_code == requests.codes.okay: + if r.ok: self.logger.info(f"Success: {resp}") return resp else: @@ -62,12 +64,13 @@ def add_towers(self): towers = [t.to_dict() for t in self.watchdog.get_all_towers_after(starting_id)] j = { 'api_key': self.api_key, - 'towers': towers + 'project': self.watchdog.project_name, + 'towers': towers, } - self.logger.debug(j) + #self.logger.debug(j) r = requests.post(self._make_api_url("add-towers"), json=j) resp = r.json() - if r.status_code == requests.codes.okay: + if r.ok: self.logger.info(f"Success: {resp}") sys.exit(0) else: @@ -82,7 +85,7 @@ def check_api_key(self): self.api_key = self.config['api']['api_key'] def _make_api_url(self, fragment): - return f"https://{self.api_host}:{self.api_port}/api/{fragment}" + return f"http://{self.api_host}:{self.api_port}/api/{fragment}" if __name__ == "__main__": from watchdog import Watchdog @@ -96,29 +99,31 @@ def _make_api_url(self, fragment): fmt=f"\b * %(asctime)s crocodile-hunter - %(levelname)s %(message)s" coloredlogs.install(level="DEBUG", fmt=fmt, datefmt='%H:%M:%S') - if not 'CH_PROJ' in os.environ: - print("Please set the CH_PROJ environment variable") - sys.exit() + parser = argparse.ArgumentParser(description="Hunt stingrays. Get revenge for Steve.") + parser.add_argument('-p', '--project-name', dest='project_name', default=None, + help="specify the project's name. defaults to 'default'", action='store') + subparsers = parser.add_subparsers(dest="command", help="command") + subparsers.add_parser('signup', help="sign up for an API key") + subparsers.add_parser('add_towers', help="submit new towers to the API Server") + subparsers.add_parser('statistics', help="get some statisitcs from teh API server") + args = parser.parse_args() + class Args: disable_gps = True disable_wigle = False debug = False - project_name = os.environ['CH_PROJ'] + project_name = args.project_name logger = logger config_fp = 'config.ini' config = configparser.ConfigParser(inline_comment_prefixes=('#', ';')) config.read(config_fp) + if not Args.project_name: + args.project_name = Args.config['general']['default_project'] + w = Watchdog(Args) apic = ApiClient(w) - parser = argparse.ArgumentParser(description="Hunt stingrays. Get revenge for Steve.") - subparsers = parser.add_subparsers(dest="command", help="command") - subparsers.add_parser('signup', help="sign up for an API key") - subparsers.add_parser('add_towers', help="submit new towers to the API Server") - subparsers.add_parser('statistics', help="get some statisitcs from teh API server") - args = parser.parse_args() - if args.command is None: parser.print_help(sys.stderr) sys.exit(1) diff --git a/src/api_controller.py b/src/api_controller.py index cfd71a8..89fc521 100644 --- a/src/api_controller.py +++ b/src/api_controller.py @@ -12,9 +12,9 @@ def __init__(self, args): self.logger = args.logger self.config = args.config - def user_tower_count(self, api_key): - if ApiTower.query.filter(ApiTower.api_key == api_key).count(): - tower = ApiTower.query.filter(ApiTower.api_key == api_key).order_by(ApiTower.ext_id.desc())[0] + def user_tower_count(self, project, api_key): + if ApiTower.query.filter(ApiTower.api_key == api_key).filter(ApiTower.project == project).count(): + tower = ApiTower.query.filter(ApiTower.api_key == api_key).filter(ApiTower.project == project).order_by(ApiTower.ext_id.desc())[0] return tower.ext_id else: return 0 @@ -25,20 +25,21 @@ def all_tower_count(self): def user_count(self): return ApiUser.query.count() - def add_towers(self, api_key, towers): + def add_towers(self, api_key, project, towers): old_tc = self.all_tower_count() for tower in towers: tower["ext_id"] = tower["id"] tower.pop("id") tower["api_key"] = api_key + tower["project"] = project tower["uploaded"] = datetime.now() t = ApiTower(**tower) self.db_session.add(t) self.db_session.commit() - self.db_session.close() + #self.db_session.close() delta_tc = self.all_tower_count() - old_tc - return (delta_tc, self.user_tower_count(api_key)) + return (delta_tc, self.user_tower_count(project, api_key)) def add_user(self, name, contact, description): @@ -52,7 +53,7 @@ def add_user(self, name, contact, description): self.db_session.add(user) self.db_session.commit() - self.db_session.close() + #self.db_session.close() return user def is_key_authorized(self, api_key): diff --git a/src/api_server.py b/src/api_server.py index 45f8487..cc3e989 100644 --- a/src/api_server.py +++ b/src/api_server.py @@ -56,10 +56,11 @@ def add_towers(self): abort(400) api_key = request.json['api_key'] + project = request.json['project'] towers = request.json['towers'] self.check_key_auth(api_key) - (towers_added, last_record) = self.api_controller.add_towers(api_key, towers) + (towers_added, last_record) = self.api_controller.add_towers(api_key, project, towers) return jsonify({ "error": None, "response": { @@ -74,14 +75,16 @@ def get_statistics(self): abort(400) api_key = request.json['api_key'] + project = request.json['project'] self.check_key_auth(api_key) tower_count = self.api_controller.all_tower_count() - user_tower_count = self.api_controller.user_tower_count(api_key) + user_tower_count = self.api_controller.user_tower_count(project, api_key) return jsonify({ "error": None, "response": { + "project": project, "user_last_tower": user_tower_count, "total_towers": tower_count, } diff --git a/src/database.py b/src/database.py index 4137e35..2f97f40 100644 --- a/src/database.py +++ b/src/database.py @@ -157,6 +157,7 @@ def get_sector_id(self): class ApiTower(BaseTower): __tablename__ = "api_tower_data" api_key = Column(String(32), ForeignKey('api_users.api_key'), nullable=False) + project = Column(String(255), nullable=False) ext_id = Column(Integer, nullable=False) uploaded = Column(DateTime, nullable=False)