mirror of
https://git.ianrenton.com/ian/spothole.git
synced 2025-10-27 08:49:27 +00:00
Extract config into yaml
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,3 +4,4 @@ __pycache__
|
||||
*.pyc
|
||||
/sota_summit_data_cache.sqlite
|
||||
/gma_ref_info_cache.sqlite
|
||||
/config.yml
|
||||
|
||||
14
README.md
14
README.md
@@ -1,4 +1,4 @@
|
||||
# MetaSpot
|
||||
# Amateur Radio meta spotting tool, name TBD
|
||||
|
||||
*Work in progress.*
|
||||
|
||||
@@ -31,4 +31,14 @@ Suggested names so far:
|
||||
* Spot-o-Tron
|
||||
* Basic Universal Radio Program (BURP)
|
||||
* The Spotinator
|
||||
* DX Cluster API
|
||||
* Spotcaster
|
||||
* DX Cluster API
|
||||
* spotcollector
|
||||
* Unified Amateur Radio Data Aggregator (U-ARDA)
|
||||
* (s)pothole
|
||||
* Spot on API
|
||||
* API on Spot
|
||||
|
||||
### TODO - Setup instructions - checkout, config.yml, pip
|
||||
### TODO - systemd
|
||||
### TODO - nginx
|
||||
12
config-example.yml
Normal file
12
config-example.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
# Config file example.
|
||||
# Rename this to "config.yml" before running the software.
|
||||
|
||||
# Your callsign. Used to log into DX clusters and included in User-Agent when querying HTTP servers. Useful so if your
|
||||
# server goes crazy and causes other people problems, they know who to contact :)
|
||||
server-owner-callsign: "N0CALL"
|
||||
|
||||
# Port to open the local web server on
|
||||
web-server-port: 8080
|
||||
|
||||
# Maximum spot age to keep in the system before deleting it
|
||||
max-spot-age-sec: 3600
|
||||
13
core/config.py
Normal file
13
core/config.py
Normal file
@@ -0,0 +1,13 @@
|
||||
import logging
|
||||
import os
|
||||
|
||||
import yaml
|
||||
|
||||
# Check you have a config file
|
||||
if not os.path.isfile("config.yml"):
|
||||
logging.error("Your config file is missing. Ensure you have copied config-example.yml to config.yml and updated it according to your needs.")
|
||||
exit()
|
||||
|
||||
# Load config
|
||||
config = yaml.safe_load(open("config.yml"))
|
||||
logging.info("Loaded config.")
|
||||
@@ -4,11 +4,6 @@ from data.band import Band
|
||||
SOFTWARE_NAME = "Metaspot by M0TRT"
|
||||
SOFTWARE_VERSION = "0.1"
|
||||
|
||||
# Todo make configurable
|
||||
SERVER_OWNER_CALLSIGN = "M0TRT"
|
||||
WEB_SERVER_PORT = 8080
|
||||
MAX_SPOT_AGE_SEC = 3600
|
||||
|
||||
# Modes
|
||||
CW_MODES = ["CW"]
|
||||
PHONE_MODES = ["PHONE", "SSB", "USB", "LSB", "AM", "FM", "DV", "DMR", "DSTAR", "C4FM", "M17"]
|
||||
|
||||
6
main.py
6
main.py
@@ -5,7 +5,7 @@ import sys
|
||||
from time import sleep
|
||||
|
||||
from core.cleanup import CleanupTimer
|
||||
from core.constants import MAX_SPOT_AGE_SEC, WEB_SERVER_PORT
|
||||
from core.config import config
|
||||
from providers.dxcluster import DXCluster
|
||||
from providers.gma import GMA
|
||||
from providers.hema import HEMA
|
||||
@@ -63,11 +63,11 @@ if __name__ == '__main__':
|
||||
for p in providers: p.start()
|
||||
|
||||
# Set up timer to clear spot list of old data
|
||||
cleanup_timer = CleanupTimer(spot_list=spot_list, cleanup_interval=60, max_spot_age=MAX_SPOT_AGE_SEC)
|
||||
cleanup_timer = CleanupTimer(spot_list=spot_list, cleanup_interval=60, max_spot_age=config["max-spot-age-sec"])
|
||||
cleanup_timer.start()
|
||||
|
||||
# Set up web server
|
||||
web_server = WebServer(spot_list=spot_list, port=WEB_SERVER_PORT)
|
||||
web_server = WebServer(spot_list=spot_list, port=config["web-server-port"])
|
||||
web_server.start()
|
||||
|
||||
logging.info("Startup complete.")
|
||||
|
||||
@@ -7,10 +7,11 @@ from time import sleep
|
||||
import pytz
|
||||
import telnetlib3
|
||||
|
||||
from core.constants import SERVER_OWNER_CALLSIGN
|
||||
from data.spot import Spot
|
||||
from core.config import config
|
||||
from providers.provider import Provider
|
||||
|
||||
|
||||
# Provider for a DX Cluster. Hostname and port provided as parameters.
|
||||
class DXCluster(Provider):
|
||||
CALLSIGN_PATTERN = "([a-z|0-9|/]+)"
|
||||
@@ -49,7 +50,7 @@ class DXCluster(Provider):
|
||||
logging.info("DX Cluster " + self.hostname + " connecting...")
|
||||
self.telnet = telnetlib3.Telnet(self.hostname, self.port)
|
||||
self.telnet.read_until("login: ".encode("utf-8"))
|
||||
self.telnet.write((SERVER_OWNER_CALLSIGN + "\n").encode("utf-8"))
|
||||
self.telnet.write((config["server-owner-callsign"] + "\n").encode("utf-8"))
|
||||
connected = True
|
||||
logging.info("DX Cluster " + self.hostname + " connected.")
|
||||
except Exception as e:
|
||||
|
||||
@@ -2,14 +2,15 @@ from datetime import datetime
|
||||
|
||||
import pytz
|
||||
|
||||
from core.constants import SOFTWARE_NAME, SOFTWARE_VERSION, SERVER_OWNER_CALLSIGN
|
||||
from core.constants import SOFTWARE_NAME, SOFTWARE_VERSION
|
||||
from core.config import config
|
||||
|
||||
|
||||
# Generic data provider class. Subclasses of this query the individual APIs for data.
|
||||
class Provider:
|
||||
|
||||
# HTTP headers used for providers that use HTTP
|
||||
HTTP_HEADERS = { "User-Agent": SOFTWARE_NAME + " " + SOFTWARE_VERSION + " (operated by " + SERVER_OWNER_CALLSIGN + ")" }
|
||||
HTTP_HEADERS = { "User-Agent": SOFTWARE_NAME + " " + SOFTWARE_VERSION + " (operated by " + config["server-owner-callsign"] + ")" }
|
||||
|
||||
# Constructor
|
||||
def __init__(self):
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
pyyaml~=6.0.3
|
||||
bottle~=0.13.4
|
||||
requests-cache~=1.2.1
|
||||
pyhamtools~=0.12.0
|
||||
|
||||
Reference in New Issue
Block a user