add app and msg_xfer send to process_sms

This commit is contained in:
KF7EEL 2021-04-22 12:26:29 -07:00
parent eb06c9c268
commit e15169b09c
4 changed files with 124 additions and 27 deletions

View File

@ -174,6 +174,8 @@ def build_config(_config_file):
'AUTHORIZED_TOKENS_FILE': config.get(section, 'AUTHORIZED_TOKENS_FILE'), 'AUTHORIZED_TOKENS_FILE': config.get(section, 'AUTHORIZED_TOKENS_FILE'),
'AUTHORIZED_USERS_FILE': config.get(section, 'AUTHORIZED_USERS_FILE'), 'AUTHORIZED_USERS_FILE': config.get(section, 'AUTHORIZED_USERS_FILE'),
'ACCESS_SYSTEMS_FILE': config.get(section, 'ACCESS_SYSTEMS_FILE'), 'ACCESS_SYSTEMS_FILE': config.get(section, 'ACCESS_SYSTEMS_FILE'),
'MY_API_NAME': config.get(section, 'MY_API_NAME'),
'DASHBOARD_URL': config.get(section, 'DASHBOARD_URL'),
}) })

View File

@ -175,11 +175,16 @@ AUTHORIZED_APPS_FILE: /path/to/authorized_apps.py
AUTHORIZED_TOKENS_FILE: /tmp/hblink_auth_tokens.txt AUTHORIZED_TOKENS_FILE: /tmp/hblink_auth_tokens.txt
AUTHORIZED_USERS_FILE: /path/to/authorized_users.txt AUTHORIZED_USERS_FILE: /path/to/authorized_users.txt
ACCESS_SYSTEMS_FILE: /path/to/access_systems.txt ACCESS_SYSTEMS_FILE: /path/to/access_systems.txt
MY_API_NAME: ABC
# The following options are used for the dashboard. The dashboard is optional. # The following options are used for the dashboard. The dashboard is optional.
# Title of the Dashboard # Title of the Dashboard
DASHBOARD_TITLE: HBLink3 D-APRS Dashboard DASHBOARD_TITLE: HBLink3 D-APRS Dashboard
# Used for API, RSS feed link, etc
DASHBOARD_URL: http://localhost:8092
# Logo used on dashboard page # Logo used on dashboard page
LOGO: https://raw.githubusercontent.com/kf7eel/hblink3/gps/HBlink.png LOGO: https://raw.githubusercontent.com/kf7eel/hblink3/gps/HBlink.png
@ -210,9 +215,6 @@ ZOOM_LEVEL: 7
# The following are options for map themes and just work, you should use one of these: “OpenStreetMap”, “Stamen” (Terrain, Toner, and Watercolor), # The following are options for map themes and just work, you should use one of these: “OpenStreetMap”, “Stamen” (Terrain, Toner, and Watercolor),
MAP_THEME: Stamen Toner MAP_THEME: Stamen Toner
# RSS feed link, shows in the link section of each RSS item.
RSS_LINK: http://localhost:8092
##################################################################### #####################################################################
# OPENBRIDGE INSTANCES - DUPLICATE SECTION FOR MULTIPLE CONNECTIONS # OPENBRIDGE INSTANCES - DUPLICATE SECTION FOR MULTIPLE CONNECTIONS
# OpenBridge is a protocol originall created by DMR+ for connection between an # OpenBridge is a protocol originall created by DMR+ for connection between an

View File

@ -100,6 +100,10 @@ import libscrc
import random import random
from bitarray.util import hex2ba as hex2bits from bitarray.util import hex2ba as hex2bits
#Used for sending data via API
import requests
import json
import hashlib
# Does anybody read this stuff? There's a PEP somewhere that says I should do this. # Does anybody read this stuff? There's a PEP somewhere that says I should do this.
__author__ = 'Cortney T. Buffington, N0MJS' __author__ = 'Cortney T. Buffington, N0MJS'
@ -237,6 +241,59 @@ def sos_write(dmr_id, time, message):
sos_file.write(str(sos_info)) sos_file.write(str(sos_info))
sos_file.close() sos_file.close()
logger.info('Saved SOS.') logger.info('Saved SOS.')
def send_app_request(url, message, source_id):
url = url + '/app'
#Load current AUTH token list
auth_file = ast.literal_eval(os.popen('cat ' + auth_token_file).read())
the_token = str(hashlib.md5(str(time()).encode('utf-8')).hexdigest())
new_auth_file = auth_file
new_auth_file.append(the_token)
# Write new list to file
with open(auth_token_file, 'w') as auth_token:
auth_token.write(str(auth_file))
auth_token.close()
app_request = {
'mode':'app',
'system_name':CONFIG['GPS_DATA']['MY_API_NAME'],
'response_url':CONFIG['GPS_DATA']['DASHBOARD_URL'],
'auth_token':the_token,
'data':{
'source_id':source_id,
'slot':0,
'msg_type':'unit',
'msg_format':'motorola',
'message':message
}
}
json_object = json.dumps(app_request, indent = 4)
print(json_object)
requests.post(url, data=json_object, headers={'Content-Type': 'application/json'})
def send_msg_xfer(url, user, password, message, source_id, dest_id):
url = url + '/msg_xfer'
msg_xfer = {
'mode':'msg_xfer',
'system_name':CONFIG['GPS_DATA']['MY_API_NAME'],
'response_url':CONFIG['GPS_DATA']['DASHBOARD_URL'],
'auth_type':'private',
'credentials': {
'user':user,
'password':password,
},
'data':{
1:{'source_id':source_id,
'destination_id':dest_id,
'slot':0,
'msg_type':'unit',
'msg_format':'motorola',
'message':message
}
}
}
json_object = json.dumps(msg_xfer, indent = 4)
requests.post(url, data=json_object, headers={'Content-Type': 'application/json'})
# Send email via SMTP function # Send email via SMTP function
def send_email(to_email, email_subject, email_message): def send_email(to_email, email_subject, email_message):
@ -412,7 +469,32 @@ def process_sms(_rf_src, sms):
logger.info(str(traceback.extract_tb(error_exception.__traceback__))) logger.info(str(traceback.extract_tb(error_exception.__traceback__)))
packet_assembly = '' packet_assembly = ''
elif '?' in parse_sms[0][0:1]:
use_api = CONFIG['GPS_DATA']['USE_API']
print(use_api)
if use_api == True:
auth_tokens = ast.literal_eval(os.popen('cat ' + auth_token_file).read())
access_systems = ast.literal_eval(os.popen('cat ' + access_systems_file).read())
authorized_users = ast.literal_eval(os.popen('cat ' + authorized_users_file).read())
system = parse_sms[0][1:]
#print(access_systems[system])
#print(authorized_users)
# Determin msg_xfer or app
if access_systems[system]['mode'] == 'msg_xfer':
s = ' '
message_to_send = s.join(parse_sms[2:])
dest_id = int(parse_sms[1])
source_id = int_id(_rf_src)
send_msg_xfer(access_systems[system]['url'], access_systems[system]['user'], access_systems[system]['password'], message_to_send, source_id, dest_id)
if access_systems[system]['mode'] == 'app':
s = ' '
message_to_send = s.join(parse_sms[1:])
source_id = int_id(_rf_src)
send_app_request(access_systems[system]['url'], message_to_send, source_id)
if use_api == False:
send_sms(False, int_id(_rf_src), data_id, 0000, 'unit', 'API not enabled. Contact server admin.')
elif '@' in parse_sms[0][0:1] and 'M-' not in parse_sms[1][0:2] or '@' not in parse_sms[0][1:]: elif '@' in parse_sms[0][0:1] and 'M-' not in parse_sms[1][0:2] or '@' not in parse_sms[0][1:]:
#Example SMS text: @ARMDS A-This is a test. #Example SMS text: @ARMDS A-This is a test.
s = ' ' s = ' '
@ -2123,7 +2205,6 @@ class bridgeReportFactory(reportFactory):
#************************************************ #************************************************
if __name__ == '__main__': if __name__ == '__main__':
import argparse import argparse
import sys import sys
import os import os

View File

@ -731,6 +731,9 @@ def api(api_mode=None):
access_systems = ast.literal_eval(os.popen('cat ' + access_systems_file).read()) access_systems = ast.literal_eval(os.popen('cat ' + access_systems_file).read())
authorized_users = ast.literal_eval(os.popen('cat ' + authorized_users_file).read()) authorized_users = ast.literal_eval(os.popen('cat ' + authorized_users_file).read())
api_data = request.json api_data = request.json
#print(type(api_data))
#print((api_data))
# Find out mode of JSON # Find out mode of JSON
## try: ## try:
# Filter msg_xfer # Filter msg_xfer
@ -738,28 +741,32 @@ def api(api_mode=None):
# Handle authorization # Handle authorization
if api_data['auth_type'] == 'private': if api_data['auth_type'] == 'private':
#Authenticate #Authenticate
if api_data['system_name'] in authorized_users and api_data['credentials']['user'] == authorized_users[api_data['system_name']]['user'] and api_data['credentials']['password'] == authorized_users[api_data['system_name']]['password']: if api_data['system_name'] in authorized_users:
print(api_data['credentials']['user']) if api_data['credentials']['user'] == authorized_users[api_data['system_name']]['user'] and api_data['credentials']['password'] == authorized_users[api_data['system_name']]['password']:
print(api_data['credentials']['password']) print(api_data['credentials']['user'])
for sms in api_data['data'].items(): print(api_data['credentials']['password'])
sms_data = sms[1] for sms in api_data['data'].items():
print((sms_data['destination_id'])) sms_data = sms[1]
print((sms_data['source_id'])) print((sms_data['destination_id']))
print((sms_data['message'])) print((sms_data['source_id']))
print((sms_data['slot'])) print((sms_data['message']))
if sms_data['slot'] == 0: print((sms_data['slot']))
send_slot = int(unit_sms_ts) - 1 if sms_data['slot'] == 0:
if sms_data['slot'] == 1: send_slot = int(unit_sms_ts) - 1
send_slot = 0 if sms_data['slot'] == 1:
if sms_data['slot'] == 2: send_slot = 0
send_slot = 1 if sms_data['slot'] == 2:
send_sms(False, sms_data['destination_id'], sms_data['source_id'], 0000, 'unit', send_slot, sms_data['message']) send_slot = 1
return jsonify( send_sms(False, sms_data['destination_id'], sms_data['source_id'], 0000, 'unit', send_slot, sms_data['message'])
mode=api_data['mode'], return jsonify(
status='Generated SMS', mode=api_data['mode'],
) status='Generated SMS',
)
else:
message = jsonify(message='Authentication error')
return make_response(message, 401)
else: else:
message = jsonify(message='Authentication error') message = jsonify(message='System not authorized')
return make_response(message, 401) return make_response(message, 401)
if api_data['auth_type'] == 'public': if api_data['auth_type'] == 'public':
message = jsonify(message='Not implemented') message = jsonify(message='Not implemented')
@ -770,7 +777,12 @@ def api(api_mode=None):
if api_data['mode'] == 'app': if api_data['mode'] == 'app':
auth_file = ast.literal_eval(os.popen('cat ' + auth_token_file).read()) auth_file = ast.literal_eval(os.popen('cat ' + auth_token_file).read())
for token in auth_file: for token in auth_file:
print()
print(token)
print(api_data['auth_token'])
print()
if token == api_data['auth_token']: if token == api_data['auth_token']:
auth_file.remove(api_data['auth_token']) auth_file.remove(api_data['auth_token'])
for i in api_data['data'].items(): for i in api_data['data'].items():
sms_data = i[1] sms_data = i[1]
@ -855,7 +867,7 @@ if __name__ == '__main__':
time_format = parser.get('GPS_DATA', 'TIME_FORMAT') time_format = parser.get('GPS_DATA', 'TIME_FORMAT')
# RSS feed link, shows in the link section of each RSS item. # RSS feed link, shows in the link section of each RSS item.
rss_link = parser.get('GPS_DATA', 'RSS_LINK') rss_link = parser.get('GPS_DATA', 'DASHBOARD_URL')
# Default APRS comment for users. # Default APRS comment for users.
default_comment = parser.get('GPS_DATA', 'USER_APRS_COMMENT') default_comment = parser.get('GPS_DATA', 'USER_APRS_COMMENT')