Path: blob/master/stream/ipro-adam-app/installer.py
643 views
import argparse1import logging2import os3from pathlib import Path45import requests6import tqdm7from requests.auth import HTTPDigestAuth8from requests_toolbelt.multipart.encoder import (9MultipartEncoder,10MultipartEncoderMonitor,11)1213# tqdm-4.67.114# requests-toolbelt-1.0.01516lgr = logging.getLogger(__name__)171819def make_request(method, params=None, data=None, headers=None, use_install_url=False):20if use_install_url:21url = f"{camera_url}/cgi-bin/adam_install.cgi"22else:23url = f"{camera_url}/cgi-bin/adam.cgi"24lgr.debug(f"url: {url}")25lgr.debug(f"headers: {headers}")2627response = requests.request(28method,29url,30params=params,31data=data,32headers=headers,33auth=HTTPDigestAuth(username, password),34)3536lgr.info(f"response: {response}")37lgr.debug(f"response: {response.text}")3839return response404142def list_applications(name):43applications = make_request("GET", {"methodName": "getApplicationList"}).json()44for a in applications["appList"]:45if a["appInfo"]["appNameList"][0]["name"] == name:46return a47return None484950def upload_adam_app(ext_file_path):51"""52Content-Type: multipart/form-data; boundary=----WebKitFormBoundary9dLmSwnFFi6H43X653Body Format:54------WebKitFormBoundaryKeEUnMHC1xkj75DO55Content-Disposition: form-data; name="methodName"5657installApplication58------WebKitFormBoundaryKeEUnMHC1xkj75DO59Content-Disposition: form-data; name="applicationPackage"; filename="stream-adam_1.1.ext"60Content-Type: application/octet-stream6162------WebKitFormBoundaryKeEUnMHC1xkj75DO--6364:param ext_file_path:65:return:66"""67file_size = os.path.getsize(ext_file_path)68progress_bar = tqdm.tqdm(69desc=f"Uploading App File:[{ext_file_path}]",70total=file_size,71unit="B",72unit_scale=True,73unit_divisor=1024,74)7576def progress_callback(monitor):77# uploaded = monitor.bytes_read78# total = monitor.len79progress_bar.update(monitor.bytes_read - progress_bar.n)8081with open(ext_file_path, "rb") as fp:82try:83# Construct the multipart body84encoder = MultipartEncoder(85fields={86"methodName": "installApplication",87"applicationPackage": (88os.path.basename(ext_file_path),89fp,90"application/octet-stream",91),92}93)94# Wrap encoder with a monitor for progress tracking95monitor = MultipartEncoderMonitor(encoder, progress_callback)96headers = {"Content-Type": monitor.content_type}97response = make_request(98"POST", use_install_url=True, data=monitor, headers=headers99)100101if response.status_code == 204:102print("Application Installed!!!")103print(response.headers)104else:105print(106f"Application Install Failed - status code: {response.status_code}"107)108print(response.text)109except Exception:110raise111112113def uninstall(install_id):114data = {"methodName": "uninstallApplication", "installId": install_id}115res = make_request("POST", data=data)116if res.status_code != 200:117lgr.error(res.text)118else:119print("Application Uninstalled!!!")120121122def stop(install_id):123params = {"methodName": "stopApplication", "installId": install_id}124res = make_request("GET", params)125126if res.status_code != 200:127# {"faultCode":"3","faultString":"Invalid Install ID"}128lgr.error(res.text)129else:130print("Application Stopped!!!")131132133def start(install_id):134params = {"methodName": "startApplication", "installId": install_id}135res = make_request("GET", params)136if res.status_code != 200:137# {"faultCode":"3","faultString":"Invalid Install ID"}138raise Exception(res.text)139print("Application Started!!!")140141142if __name__ == "__main__":143parser = argparse.ArgumentParser(144prog="AdamAPP Installer",145description="Quick Install or Replace AdamAPP(.ext) on i-PRO",146epilog="Upload Adam APP to i-PRO with Progress",147)148149camera_url = "http://CAMERA_IP:80"150username = "CAMERA_USERNAME"151password = "CAMERA_PASSWORD"152ext_file = "/tmp/app-build-dir/stream-adam_1.1.ext"153installed_app_name = "Platerecognizer Stream"154155parser.add_argument(156"--ext-file",157type=Path,158default=ext_file,159help="App ext file to install",160required=False,161)162parser.add_argument(163"--app-name",164type=str,165default=installed_app_name,166help="app_name after install, used to find app app install ID",167required=False,168)169parser.add_argument(170"--camera-url",171type=str,172default=camera_url,173help="camera access url including port and scheme",174required=False,175)176parser.add_argument(177"--username",178type=str,179# default=username,180help="username of camera login",181required=False,182)183parser.add_argument(184"--password",185type=str,186# default=password,187help="password of camera login",188required=False,189)190# Add skip param to skip directly to upload191args = parser.parse_args()192if username != args.username:193username = args.username194if password != args.password:195password = args.password196if camera_url != args.camera_url:197camera_url = args.camera_url198199# list applications200application = list_applications(args.app_name)201print(f"Uninstall application: {application}")202if application is not None:203app_install_id = application["appInfo"]["installId"]204# Stop205stop(app_install_id)206# Uninstall207uninstall(app_install_id)208209# Upload new Install210upload_adam_app(args.ext_file)211212installed_application = list_applications(args.app_name)213print(f"Installed application: {installed_application}")214if installed_application:215app_install_id = installed_application["appInfo"]["installId"]216# Start Application217start(app_install_id)218219220