PX4-Autopilot/Tools/upload_log.py
Julian Oes 9a96ca14be Tools: make Python import error more readable
The problem with printing the exception was that starting with
Python 3.6 the ImportError is yet another (sub) exception called
ModuleNotFoundError which can't be printed as a string and then triggers
another exception:

```
Traceback (most recent call last):
  File "/home/julianoes/src/Firmware/Tools/serial/generate_config.py", line 11, in <module>
    import jinja2
ModuleNotFoundError: No module named 'jinja2'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/julianoes/src/Firmware/Tools/serial/generate_config.py", line 13, in <module>
    print("Failed to import jinja2: " + e)
TypeError: must be str, not ModuleNotFoundError
```

As per @bkueng's suggestion the easiest is to cast the exception to str
and that way prevent the second exception.
2020-02-14 11:40:05 +01:00

129 lines
4.3 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Upload an ULog file to the logs.px4.io web server.
@author: Beat Kueng (beat-kueng@gmx.net)
"""
from __future__ import print_function
from argparse import ArgumentParser
from six.moves import input
import subprocess
import sys
try:
import requests
except ImportError as e:
print("Failed to import requests: " + str(e))
print("")
print("You may need to install it using:")
print(" pip3 install --user requests")
print("")
sys.exit(1)
SERVER = 'https://logs.px4.io'
#SERVER = 'http://localhost:5006' # for testing locally
UPLOAD_URL = SERVER+'/upload'
quiet = False
def ask_value(text, default=None):
""" ask the user to provide a certain value """
if quiet:
return ""
ask_string = 'Enter ' + text
if default != None:
ask_string += ' (Press ENTER to use ' + default + ')'
ask_string += ': '
ret = input(ask_string).strip()
if ret == "" and default != None:
return default
return ret
def get_git_email():
""" get (globally) configured git email """
try:
output = subprocess.check_output(["git", "config", "--global", "user.email"])
except Exception:
return ""
return output.decode("utf-8").replace('\n', '')
def main():
global quiet
parser = ArgumentParser(description=__doc__)
parser.add_argument('--quiet', '-q', dest='quiet', action='store_true', default=False,
help='Quiet mode: do not ask for values which were not provided as parameters')
parser.add_argument("--description", dest="description", type=str,
help="Log description", default=None)
parser.add_argument("--feedback", dest="feedback", type=str,
help="Additional feedback", default=None)
parser.add_argument("--source", dest="source", type=str,
help="Log source (Eg. CI)", default="webui")
parser.add_argument("--email", dest="email", type=str,
help="Your e-mail (to send the upload link)", default=None)
parser.add_argument("--type", dest="type", type=str, default='flightreport',
help="The upload type (either flightreport or personal).")
parser.add_argument("--videoUrl", dest="videoUrl", type=str, default='',
help="An Url to a video (only used for type flightreport).")
parser.add_argument("--rating", dest="rating", type=str, default='notset',
help="A rating for the flight (only used for type flightreport).")
parser.add_argument("--windSpeed", dest="windSpeed", type=int, default=-1,
help="A wind speed category for the flight (only used for flightreport).")
parser.add_argument("--public", dest="public", type=bool, default=True,
help="Whether the log is uploaded as public (only used for flightreport).")
parser.add_argument("FILE", help="ULog file(s)", nargs="+")
args = parser.parse_args()
# arguments
quiet = args.quiet
if args.description == None:
description = ask_value('Log Description')
else:
description = args.description
if args.feedback == None:
feedback = ask_value('Additional Feedback')
else:
feedback = args.feedback
if args.email == None:
default_email = get_git_email()
email = ask_value('Your e-mail', default_email)
else:
email = args.email
payload = {'type': args.type, 'description': description,
'feedback': feedback, 'email': email, 'source': args.source}
if args.type == 'flightreport':
payload['videoUrl'] = args.videoUrl
payload['rating'] = args.rating
payload['windSpeed'] = args.windSpeed
payload['public'] = str(args.public).lower()
for file_name in args.FILE:
if not quiet:
print('Uploading '+file_name+'...')
with open(file_name, 'rb') as f:
r = requests.post(UPLOAD_URL, data=payload, files={'filearg': f},
allow_redirects=False)
if r.status_code == 302: # redirect
if 'Location' in r.headers:
plot_url = r.headers['Location']
if len(plot_url) > 0 and plot_url[0] == '/':
plot_url = SERVER + plot_url
print('URL: '+plot_url)
if __name__ == '__main__':
main()