From 867908bcd3b63e53cf6fe315b784cc9d2a1e7194 Mon Sep 17 00:00:00 2001 From: rainmaker Date: Tue, 16 Jul 2024 23:34:03 +0200 Subject: [PATCH] Add main.py --- main.py | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 main.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..215104f --- /dev/null +++ b/main.py @@ -0,0 +1,114 @@ +import select +from threading import Thread + +# Load configuration +with open("config.json", "r") as config_file: + data = json.load(config_file) + +smppserverhostname = data["Hostname"] +smppserverport = int(data["Port"]) +smppserverusername = data["Username"] +smppserverpassword = data["Password"] +usessl = bool(int(data["SSL"])) +smssendsource = data["Source"] +smssenddest = data["Destination"] +smssendcont = data["Content"] +numberofmsgtosend = int(data['Count']) +validityperiod = data["Validityperiod"] + +# Setup logging +logging.basicConfig(level=logging.INFO) + + +def get_state_description(state): + state_map = { + 1: "Enroute", + 2: "Delivered", + 3: "Expired", + 4: "Deleted", + 5: "Undeliverable", + 6: "Accepted", + 7: "Unknown", + 8: "Rejected", + } + return state_map.get(state, "Unknown") + + +# Initialize SMPP client with or without SSL +if usessl: + ssl_context = ssl.create_default_context() + ssl_context.check_hostname = False + ssl_context.verify_mode = ssl.CERT_NONE + ssl_context.options = ssl.OP_NO_SSLv2 + client = smpplib.client.Client(smppserverhostname, smppserverport, allow_unknown_opt_params=True, + ssl_context=ssl_context) +else: + client = smpplib.client.Client(smppserverhostname, smppserverport, allow_unknown_opt_params=True) + +client.set_message_sent_handler( + lambda pdu: sys.stdout.write('Sent msg with sequence ID {}, got ID back {}\n'.format(pdu.sequence, pdu.message_id))) +client.set_message_received_handler(lambda pdu: sys.stdout.write( + 'DLR received, msg with ID {}, and state {}\n'.format( + pdu.receipted_message_id, + get_state_description(pdu.message_state) + ) +)) + +try: + print("Connecting to SMPP Server", smppserverhostname, "on port", smppserverport) + client.connect() + client.bind_transceiver(system_id=smppserverusername, password=smppserverpassword) + print("Connected to SMPP Server", smppserverhostname, "on port", smppserverport) + print("Sending", numberofmsgtosend, "messages towards server", smppserverhostname) +except Exception as e: + print(f"Error connecting to SMPP Server: {e}") + client.disconnect() + sys.exit(1) + +try: + for i in range(numberofmsgtosend): + parts, encoding_flag, msg_type_flag = smpplib.gsm.make_parts(smssendcont + str(random.randint(1, 10000))) + for part in parts: + client.send_message( + source_addr_ton=smpplib.consts.SMPP_TON_ALNUM, + source_addr=smssendsource, + dest_addr_ton=smpplib.consts.SMPP_TON_INTL, + destination_addr=smssenddest, + short_message=part, + data_coding=encoding_flag, + esm_class=msg_type_flag, + registered_delivery=True, + ) + print('Messages sent successfully.') + + def listen_for_delivery_reports(): + print("Waiting for delivery reports...") + while True: + try: + # Get the file descriptor associated with the client's socket + client_fd = client._socket.fileno() + + # Use select with a timeout to prevent blocking for more than 5 seconds + ready = select.select([client_fd], [], [], 5) + if ready[0]: + client.listen() + except smpplib.exceptions.ConnectionError: + break + + delivery_report_thread = Thread(target=listen_for_delivery_reports) + delivery_report_thread.start() + delivery_report_thread.join(timeout=5) + client.disconnect() + +except ConnectionError as e: + print("Connection error, probably already disconnected.", e) + # Handle the connection error here, such as retrying the connection or logging the error. + +# finally: +# try: +# client.disconnect() +# except ConnectionError as e: +# print("Connection error, probably already disconnected from SMPP Server", e) +# print("Disconnected from SMPP server") + +