Merge branch 'feature/new_scheduling_api' into 'master'
uses the new scheduling API See merge request librespacefoundation/satnogs/satnogs-auto-scheduler!45merge-requests/45/merge
commit
8c238fc7d7
|
@ -13,7 +13,7 @@ pip install -r requirements.txt
|
||||||
|
|
||||||
## Configuration
|
## 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
|
## Test run
|
||||||
|
|
||||||
|
|
5
env-dist
5
env-dist
|
@ -1,5 +1,4 @@
|
||||||
# Copy this file to .env and complete the information needed
|
# Copy this file to .env and complete the information needed
|
||||||
|
|
||||||
# Username and password to SatNOGS Network using the old authentication system
|
# Your SatNOGS network API token
|
||||||
NETWORK_USERNAME = ''
|
NETWORK_API_TOKEN = ''
|
||||||
NETWORK_PASSWORD = ''
|
|
||||||
|
|
|
@ -145,19 +145,20 @@ def get_groundstation_info(ground_station_id, allow_testing):
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
def schedule_observation(session, norad_cat_id, uuid, ground_station_id, starttime, endtime):
|
def schedule_observation(uuid,
|
||||||
|
ground_station_id,
|
||||||
obsURL = '{}/observations/new/'.format(settings.NETWORK_BASE_URL) # Observation URL
|
starttime,
|
||||||
# Get the observation/new/ page to get the CSFR token
|
endtime):
|
||||||
obs = session.get(obsURL)
|
observation = [{'ground_station': ground_station_id,
|
||||||
obs_html = lxml.html.fromstring(obs.text)
|
'transmitter_uuid': uuid,
|
||||||
hidden_inputs = obs_html.xpath(r'//form//input[@type="hidden"]')
|
'start': starttime,
|
||||||
form = {x.attrib["name"]: x.attrib["value"] for x in hidden_inputs}
|
'end': endtime}]
|
||||||
form["obs-0-transmitter_uuid"] = uuid
|
try:
|
||||||
form["obs-0-start"] = starttime
|
r = requests.post('{}/api/observations/'.format(settings.NETWORK_BASE_URL),
|
||||||
form["obs-0-end"] = endtime
|
json=observation,
|
||||||
form["obs-0-ground_station"] = ground_station_id
|
headers={'Authorization': 'Token {}'.format(settings.NETWORK_API_TOKEN)})
|
||||||
form["obs-TOTAL_FORMS"] = str(1)
|
r.raise_for_status()
|
||||||
form["obs-INITIAL_FORMS"] = str(0)
|
logging.debug("Scheduled!")
|
||||||
session.post(obsURL, data=form, headers={'referer': obsURL})
|
except requests.HTTPError:
|
||||||
logging.debug("Scheduled!")
|
err = r.json()
|
||||||
|
logging.info("Failed to schedule pass: {}".format(err))
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
from __future__ import division
|
from __future__ import division
|
||||||
import requests
|
|
||||||
import ephem
|
import ephem
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import os
|
import os
|
||||||
|
@ -271,28 +270,6 @@ def main():
|
||||||
|
|
||||||
# Login and schedule passes
|
# Login and schedule passes
|
||||||
if schedule and schedule_needed:
|
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
|
# Sort passes
|
||||||
scheduledpasses_sorted = sorted(scheduledpasses, key=lambda satpass: satpass['tr'])
|
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"),
|
(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['ts'].strftime("%Y-%m-%dT%H:%M:%S"), float(satpass['altt']),
|
||||||
satpass['priority'], satpass['uuid'], satpass['name'].rstrip()))
|
satpass['priority'], satpass['uuid'], satpass['name'].rstrip()))
|
||||||
schedule_observation(session, int(satpass['id']), satpass['uuid'],
|
schedule_observation(satpass['uuid'],
|
||||||
ground_station_id,
|
ground_station_id,
|
||||||
satpass['tr'].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") + ".000")
|
satpass['ts'].strftime("%Y-%m-%d %H:%M:%S"))
|
||||||
|
|
||||||
logging.info("All passes are scheduled. Exiting!")
|
logging.info("All passes are scheduled. Exiting!")
|
||||||
|
|
||||||
|
|
|
@ -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
|
MIN_PASS_DURATION = config('MIN_PASS_DURATION', default=2) # In minutes
|
||||||
|
|
||||||
# Credentials
|
# Credentials
|
||||||
NETWORK_USERNAME = config('NETWORK_USERNAME', default='')
|
NETWORK_API_TOKEN = config('NETWORK_API_TOKEN', default='')
|
||||||
NETWORK_PASSWORD = config('NETWORK_PASSWORD', default='')
|
|
||||||
|
|
Loading…
Reference in New Issue