From f3b5153522f7059c6cad085dd57422f009981ad3 Mon Sep 17 00:00:00 2001 From: Gautam Date: Thu, 26 Dec 2019 21:25:01 +0530 Subject: [PATCH 1/3] Create WhatsApp_sender.py Adding whatsapp --- knockknock/whatsapp_sender | 83 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 knockknock/whatsapp_sender diff --git a/knockknock/whatsapp_sender b/knockknock/whatsapp_sender new file mode 100644 index 0000000..7a14301 --- /dev/null +++ b/knockknock/whatsapp_sender @@ -0,0 +1,83 @@ +import os +import datetime +import traceback +import functools +import socket +from twilio.rest import Client + + +DATE_FORMAT = "%Y-%m-%d %H:%M:%S" + +def whatsapp_sender(account_sid: str, auth_token: str, recipient_number: str, sender_number: str): + client = Client(account_sid, auth_token) + def decorator_sender(func): + @functools.wraps(func) + def wrapper_sender(*args, **kwargs): + + start_time = datetime.datetime.now() + host_name = socket.gethostname() + func_name = func.__name__ + + # Handling distributed training edge case. + # In PyTorch, the launch of `torch.distributed.launch` sets up a RANK environment variable for each process. + # This can be used to detect the master process. + # See https://github.com/pytorch/pytorch/blob/master/torch/distributed/launch.py#L211 + # Except for errors, only the master process will send notifications. + if 'RANK' in os.environ: + master_process = (int(os.environ['RANK']) == 0) + host_name += ' - RANK: %s' % os.environ['RANK'] + else: + master_process = True + + if master_process: + contents = ['Your training has started 🎬', + 'Machine name: %s' % host_name, + 'Main call: %s' % func_name, + 'Starting date: %s' % start_time.strftime(DATE_FORMAT)] + text = '\n'.join(contents) + client.messages.create(body=text, from_=sender_number, to=recipient_number) + + try: + value = func(*args, **kwargs) + + if master_process: + end_time = datetime.datetime.now() + elapsed_time = end_time - start_time + contents = ["Your training is complete 🎉", + 'Machine name: %s' % host_name, + 'Main call: %s' % func_name, + 'Starting date: %s' % start_time.strftime(DATE_FORMAT), + 'End date: %s' % end_time.strftime(DATE_FORMAT), + 'Training duration: %s' % str(elapsed_time)] + + try: + str_value = str(value) + contents.append('Main call returned value: %s'% str_value) + except: + contents.append('Main call returned value: %s'% "ERROR - Couldn't str the returned value.") + + text = '\n'.join(contents) + client.messages.create(body=text, from_=sender_number, to=recipient_number) + + return value + + except Exception as ex: + end_time = datetime.datetime.now() + elapsed_time = end_time - start_time + contents = ["Your training has crashed ☠️", + 'Machine name: %s' % host_name, + 'Main call: %s' % func_name, + 'Starting date: %s' % start_time.strftime(DATE_FORMAT), + 'Crash date: %s' % end_time.strftime(DATE_FORMAT), + 'Crashed training duration: %s\n\n' % str(elapsed_time), + "Here's the error:", + '%s\n\n' % ex, + "Traceback:", + '%s' % traceback.format_exc()] + text = '\n'.join(contents) + client.messages.create(body=text, from_=sender_number, to=recipient_number) + raise ex + + return wrapper_sender + + return decorator_sender From e40e31824dd32f38532ed14637670664a19fc920 Mon Sep 17 00:00:00 2001 From: Gautam Date: Tue, 7 Jan 2020 08:04:06 +0530 Subject: [PATCH 2/3] Rename whatsapp_sender to whatsapp_sender.py --- knockknock/{whatsapp_sender => whatsapp_sender.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename knockknock/{whatsapp_sender => whatsapp_sender.py} (100%) diff --git a/knockknock/whatsapp_sender b/knockknock/whatsapp_sender.py similarity index 100% rename from knockknock/whatsapp_sender rename to knockknock/whatsapp_sender.py From 65404fe00317828a7f50bdca17c3797bb309419c Mon Sep 17 00:00:00 2001 From: Gautam Date: Wed, 8 Jan 2020 17:25:40 +0530 Subject: [PATCH 3/3] Update whatsapp_sender.py making changes so that it supports whatsapp --- knockknock/whatsapp_sender.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/knockknock/whatsapp_sender.py b/knockknock/whatsapp_sender.py index 7a14301..41d8984 100644 --- a/knockknock/whatsapp_sender.py +++ b/knockknock/whatsapp_sender.py @@ -35,7 +35,8 @@ def wrapper_sender(*args, **kwargs): 'Main call: %s' % func_name, 'Starting date: %s' % start_time.strftime(DATE_FORMAT)] text = '\n'.join(contents) - client.messages.create(body=text, from_=sender_number, to=recipient_number) + y = 'whatsapp:' + client.messages.create(body=text, from_=y+sender_number, to=y+recipient_number) try: value = func(*args, **kwargs)