satnogs_client: Use the new scheduling API

[kerel+git@mailbox.org:
- Rebased on master (`schedule_observations` moved from `utils.py`
  to `satnogs_client.py`)
- Moved error logging into the `schedule_observations` function
  (more context available)
- Import python-requests in `satnogs_client` directly instead of
  passing a `requests` object to `schedule_observations`
- Squashed the commits and reworded the commit message
- Changed code formatting]
Signed-off-by: Fabian P. Schmidt <kerel+git@mailbox.org>
master
Sebastian Woetzel 2019-10-11 15:10:16 +02:00 committed by Fabian P. Schmidt
parent 0ae102d19b
commit f7e11c683a
5 changed files with 24 additions and 48 deletions

View File

@ -13,7 +13,7 @@ pip install -r requirements.txt
## Configuration
Copy the env-dist file to .env and set your legacy SatNOGS Network credentials.
Copy the env-dist file to .env and set your SatNOGS Network API token.
## Test run

View File

@ -1,5 +1,4 @@
# Copy this file to .env and complete the information needed
# Username and password to SatNOGS Network using the old authentication system
NETWORK_USERNAME = ''
NETWORK_PASSWORD = ''
# Your SatNOGS network API token
NETWORK_API_TOKEN = ''

View File

@ -145,19 +145,20 @@ def get_groundstation_info(ground_station_id, allow_testing):
return {}
def schedule_observation(session, norad_cat_id, uuid, ground_station_id, starttime, endtime):
obsURL = '{}/observations/new/'.format(settings.NETWORK_BASE_URL) # Observation URL
# Get the observation/new/ page to get the CSFR token
obs = session.get(obsURL)
obs_html = lxml.html.fromstring(obs.text)
hidden_inputs = obs_html.xpath(r'//form//input[@type="hidden"]')
form = {x.attrib["name"]: x.attrib["value"] for x in hidden_inputs}
form["obs-0-transmitter_uuid"] = uuid
form["obs-0-start"] = starttime
form["obs-0-end"] = endtime
form["obs-0-ground_station"] = ground_station_id
form["obs-TOTAL_FORMS"] = str(1)
form["obs-INITIAL_FORMS"] = str(0)
session.post(obsURL, data=form, headers={'referer': obsURL})
logging.debug("Scheduled!")
def schedule_observation(uuid,
ground_station_id,
starttime,
endtime):
observation = [{'ground_station': ground_station_id,
'transmitter_uuid': uuid,
'start': starttime,
'end': endtime}]
try:
r = requests.post('{}/api/observations/'.format(settings.NETWORK_BASE_URL),
json=observation,
headers={'Authorization': 'Token {}'.format(settings.NETWORK_API_TOKEN)})
r.raise_for_status()
logging.debug("Scheduled!")
except requests.HTTPError:
err = r.json()
logging.info("Failed to schedule pass: {}".format(err))

View File

@ -1,6 +1,5 @@
#!/usr/bin/env python
from __future__ import division
import requests
import ephem
from datetime import datetime, timedelta
import os
@ -271,28 +270,6 @@ def main():
# Login and schedule passes
if schedule and schedule_needed:
loginUrl = '{}/accounts/login/'.format(settings.NETWORK_BASE_URL) # login URL
session = requests.session()
login = session.get(loginUrl) # Get login page for CSFR token
login_html = lxml.html.fromstring(login.text)
login_hidden_inputs = login_html.xpath(r'//form//input[@type="hidden"]') # Get CSFR token
form = {x.attrib["name"]: x.attrib["value"] for x in login_hidden_inputs}
form["login"] = settings.NETWORK_USERNAME
form["password"] = settings.NETWORK_PASSWORD
# Login
result = session.post(loginUrl,
data=form,
headers={
'referer': loginUrl,
'user-agent': 'satnogs-auto-scheduler/0.0.1'
})
if result.url.endswith("/accounts/login/"):
logging.info("Authentication failed")
sys.exit(-1)
else:
logging.info("Authentication successful")
# Sort passes
scheduledpasses_sorted = sorted(scheduledpasses, key=lambda satpass: satpass['tr'])
@ -303,10 +280,10 @@ def main():
(int(satpass['id']), satpass['tr'].strftime("%Y-%m-%dT%H:%M:%S"),
satpass['ts'].strftime("%Y-%m-%dT%H:%M:%S"), float(satpass['altt']),
satpass['priority'], satpass['uuid'], satpass['name'].rstrip()))
schedule_observation(session, int(satpass['id']), satpass['uuid'],
schedule_observation(satpass['uuid'],
ground_station_id,
satpass['tr'].strftime("%Y-%m-%d %H:%M:%S") + ".000",
satpass['ts'].strftime("%Y-%m-%d %H:%M:%S") + ".000")
satpass['tr'].strftime("%Y-%m-%d %H:%M:%S"),
satpass['ts'].strftime("%Y-%m-%d %H:%M:%S"))
logging.info("All passes are scheduled. Exiting!")

View File

@ -9,5 +9,4 @@ MAX_NORAD_CAT_ID = config('MAX_NORAD_CAT_ID', default=90000)
MIN_PASS_DURATION = config('MIN_PASS_DURATION', default=2) # In minutes
# Credentials
NETWORK_USERNAME = config('NETWORK_USERNAME', default='')
NETWORK_PASSWORD = config('NETWORK_PASSWORD', default='')
NETWORK_API_TOKEN = config('NETWORK_API_TOKEN', default='')