import os import base64 import requests import json import time from datetime import datetime import sys, getopt, random def build_post_payload(identifier, metadata_payload, file_payload): return { 'id': identifier, 'metadata': metadata_payload, 'image_data': file_payload } def print_response(response): print("Code: " + str(response.status_code) + "; Body: " + str(response.json())) def unwrap_file(file_str: str) -> bytes: return base64.b64decode(file_str) def send_image(identifier, image_path, metadata_payload): print("Sending image with identifier " + identifier) if not os.path.isfile(image_path): print("No image found at path " + image_path) return False file_encoded_b64 = None with open(image_path, "rb") as file_to_send: file_encoded_b64 = base64.b64encode(file_to_send.read()) if file_encoded_b64 is None: print("Error reading file") return False file_payload = file_encoded_b64.decode('utf-8') baseurl = "http://middleware:8000" post_url = "/image/post" body = build_post_payload(identifier, metadata_payload, file_payload) try: response = requests.post(baseurl + post_url, json=body) print_response(response) except os.error: print("Error sending request") return True def update_image(identifier, image_path, metadata_payload): print("Updating image with identifier " + identifier) if not os.path.isfile(image_path): print("No image found at path " + image_path) return False file_encoded_b64 = None with open(image_path, "rb") as file_to_send: file_encoded_b64 = base64.b64encode(file_to_send.read()) if file_encoded_b64 is None: print("Error reading file") return False file_payload = file_encoded_b64.decode('utf-8') baseurl = "http://middleware:8000" post_url = "/image/update/" + identifier body = build_post_payload(identifier, metadata_payload, file_payload) try: response = requests.put(baseurl + post_url, json=body) print_response(response) except os.error: print("Error sending request") return True def get_image(identifier, version=None): print("Getting image with identifier " + identifier) baseurl = "http://middleware:8000" get_url = "/image/get/" + identifier if version is not None: get_url = get_url + "/version/"+str(version) try: response = requests.get(baseurl + get_url) if response.status_code != 200: print_response(response) return False payload = response.json() if not 'id' in payload: print('no image id') return False if not 'metadata' in payload: print('no metadata') return False if not 'image_data' in payload: print('no Image data') return False print(payload['id']) print(payload['metadata']) if not 'filename' in payload['metadata']: print('no filename in metadata') return False b64encoded_image = unwrap_file(payload['image_data']) goal_folder_name = "images_fetch" path = "../../" + goal_folder_name + "/" + payload['metadata']['filename'] goal_folder_path = os.path.sep.join( os.path.abspath(__file__).split(os.path.sep)[:-3]) + os.path.sep + goal_folder_name if not os.path.isdir(goal_folder_path): os.mkdir(goal_folder_path) out = open(path, 'wb') out.write(b64encoded_image) out.close() os.system(goal_folder_path + os.path.sep + payload['metadata']['filename']) txtpath = "../../" + goal_folder_name + "/" + payload['id'] + '.txt' out = open(txtpath, 'w') out.write(json.dumps(payload['metadata'])) out.close() os.system(goal_folder_path + os.path.sep + payload['id'] + '.txt') except os.error as e: print("Error sending request {}".format(e)) except KeyError as e: print("Key error {}".format(e)) return True def delete_image(identifier): print("Deleting image with identifier " + identifier) baseurl = "http://middleware:8000" get_url = "/image/delete/" + identifier try: response = requests.delete(baseurl + get_url) payload = response.json() print(payload) except os.error: print("Error deleting request") return True def delete_all_image(): print("Deleting all images") baseurl = "http://middleware:8000" get_url = "/image/delete/all" try: response = requests.delete(baseurl + get_url) payload = response.json() print(payload) except os.error: print("Error deleting request") return True def get_all(): print("Getting all images") baseurl = "http://middleware:8000" get_url = "/image/get/all" try: response = requests.get(baseurl + get_url) print_response(response) except os.error: print("Error sending request") return True def check_system(): print("Checking system health") baseurl = "http://middleware:8000" get_url = "/check" try: response = requests.get(baseurl + get_url) print_response(response) except os.error: print("Server not available") return True metadata = None index = 0 metadata_folder = "." + os.path.sep + "data" metadata_file = "metadata" + ".json" metadata_path = metadata_folder + os.path.sep + metadata_file image_folder = "." + os.path.sep + "data" + os.path.sep + "images" try: opts, args = getopt.getopt(sys.argv[1:],"hm:i:",["metadata=","imagefolder="]) for opt, arg in opts: if opt == '-h': print('iot_client.py -m -i ') sys.exit() elif opt in ("-m", "--metadata"): metadata_path = arg elif opt in ("-i", "--imagefolder"): image_folder = arg except getopt.GetoptError: print('iot_client.py -m -i ') if (os.path.isfile(metadata_path)): print("Loading metadata to memory from " + metadata_path) metadata = sorted(json.load(open(metadata_path, "r")), key=lambda k: datetime.strptime(k['datetime'], '%d-%b-%Y (%H:%M:%S.%f)')) else: print("Metadata_file '" + str(metadata_path) + "' not found.") if (os.path.isdir(image_folder)): print("Image folder set to " + image_folder) else: print("Image folder '" + str(image_folder) + "' not found.") def print_cursor(): if metadata is None: print('Cursor on 0 of 0') return print('Cursor on ' + str(index) + " out of " + str(len(metadata)) + " - " + metadata[index]['filename']) testCommands=[] testscriptData=[] def test_script(argv): try: testscriptData.append(False) testscriptData.append(0) opts, args=getopt.getopt(argv,"t") except getopt.GetoptError: print("Error by starting test script") sys.exit(2) for opt, arg in opts: if opt == '-t': testscriptData.clear() testscriptData.append(True) testCommands.append("deleteall") for i in range(5): testCommands.append("trigger") testCommands.append("fetchall") testCommands.append("delete") for i in range(6): testCommands.append("trigger") testCommands.append("update") for i in range(4): testCommands.append("trigger") testCommands.append("update") testCommands.append("trigger") testCommands.append("delete") for i in range(5): testCommands.append("trigger") testCommands.append("update") for i in range(7): testCommands.append("trigger") testCommands.append("fetchall") testCommands.append("delete") for i in range(4): testCommands.append("trigger") testCommands.append("exit") testscriptData.append(len(testCommands)) else: testscriptData.append(False) testscriptData.append(0) # main input loop command = "dummy" test_script(sys.argv[1:]) i = 0 j = 0 while (command.lower() not in ["exit", "quit", "end"] and j < 3): try: if testscriptData[0] and i < testscriptData[1]: command = testCommands[i] if (command.lower() == "exit" and j < 3): i = 1 j += 1 command = testCommands[i] if i > 0: time.sleep(random.randrange(1, 5)) print(datetime.now()) if command == "delete" or command == "update": index -= 1 i+=1 else: command = input("Please enter command: ") except Exception as ex: print(ex) print("Error while reading keyboard input") break command_split = command.split(" ") command = command_split[0] attributes = command_split[1:] if command.lower() == "help" or command == "?": print() print("List of commands:") print("exit - exits the program") print("help - lists all commands") print("check - control health of all associated systems") print("dir - list current selected image folder") print("len - length of current metadata set") print("index - display index of current lined up image") print("info - display info of current lined up image") print("metadata - load new metadata file from path") print("imagefolder - selected new image folder") print("show - opens image next in line in default os program") print("trigger - next image in line is sent to backend") print("update - next image in line is updated in backend") print("fetch - gets the next image from database if exists") print("fetchversion - gets the next image with specified version from database if exists") print("fetchall - get all images") print("delete - delets the next image from db if exists") print("deleteall - delets all images from the service") print("rapid <#amount> [<#time>] - next images in line are sent to backend in