From eb000bff466bf8f8e82f06a4485d158530e73564 Mon Sep 17 00:00:00 2001 From: Berhsi Date: Tue, 15 Oct 2019 19:21:23 +0200 Subject: [PATCH] setstatus.py: changes by code review better english in comments. the command line arguments are now processed by argparse. reading vom cli removed. fix bug in exception handling. --- setstatus.py | 64 +++++++++++++--------------------------------------- 1 file changed, 16 insertions(+), 48 deletions(-) diff --git a/setstatus.py b/setstatus.py index e19ffa2..5ede31f 100755 --- a/setstatus.py +++ b/setstatus.py @@ -5,52 +5,22 @@ # date: 26.07.2019 # email: berhsi@web.de -# client, who connects to the statusserver at port 10001 to update the -# krautspace door status. If no status is given as argument, he reads from -# stdin until input is 0 or 1. +# client, that connects to the statusserver at port 10001 to update the +# krautspace door status. allowed arguments are 0 or 1. +import argparse import socket import ssl -from sys import exit, argv - - -def check_arguments(argv): - ''' - Checks length and validity of command line argument vectors. If there is - no argument or argument is not valid, it returns None. Otherwise it - converts the string value into a byte value. - param 1: array of strings - return: None or byte value - ''' - if len(argv) == 1: - byte_value = None - else: - if argv[1].strip() == '0' or argv[1].strip() == '1': - i = int(argv[1].strip()) - print('Set value to {}'.format(i)) - byte_value = bytes([i]) - else: - byte_value = None - return byte_value - - -def read_argument(): - ''' - Reads from stdin until the given value is valid. Convert the given - string to a byte value and return this value. - return: byte value - ''' - status = None - - while status is None: - buf = input('Enter new status (0/1): ') - if buf == '0' or buf == '1': - status = bytes([int(buf)]) - print('Read status: {}'.format(status)) - return status +import sys def main(): + parser = argparse.ArgumentParser(description="Set door status of + Krautspace.") + parser.add_argument("status_code", help="status to set", type=int, + choices=(0, 1)) + args = parser.parse_args() + print("Status set to {}".format(bytes([args.status_code]))) HOST = 'localhost' PORT = 10001 @@ -61,10 +31,6 @@ def main(): STATUS = None RESPONSE = None - STATUS = check_arguments(argv) - while STATUS is None: - STATUS = read_argument() - context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=SERVER_CERT) context.set_ciphers('EECDH+AESGCM') # only ciphers for tls 1.2 and 1.3 @@ -80,7 +46,7 @@ def main(): print('Connection wrapped with ssl.context') conn.settimeout(5.0) except Exception as e: - print('Context wrapper failed: [}'.format(e)) + print('Context wrapper failed: {}'.format(e)) try: conn.connect((HOST, PORT)) print('Connection established: {}'.format(conn.getpeercert())) @@ -88,13 +54,15 @@ def main(): print('Connection timeout') except Exception as e: print('Connection failed: {}'.format(e)) - exit(1) + sys.exit(1) + try: print('Send new status: {}'.format(STATUS)) conn.send(STATUS) except Exception as e: print('Error: {}'.format(e)) - exit(2) + sys.exit(2) + try: RESPONSE = conn.recv(1) print('Server returns: {}'.format(RESPONSE)) @@ -105,7 +73,7 @@ def main(): print('Disconnect from server') except Exception as e: print('Error: {}'.format(e)) - exit(3) + sys.exit(3) if __name__ == '__main__':