upload_log.py 4.33 KB
#!/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()