mirror of
https://github.com/huggingface/knockknock.git
synced 2021-08-28 00:30:42 +03:00
add sms sender
This commit is contained in:
committed by
Victor SANH
parent
d6af72eeba
commit
cadce197c4
3
.idea/.gitignore
generated
vendored
Normal file
3
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
# Default ignored files
|
||||
/workspace.xml
|
||||
16
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
16
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@@ -0,0 +1,16 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ignoredPackages">
|
||||
<value>
|
||||
<list size="3">
|
||||
<item index="0" class="java.lang.String" itemvalue="yagmail" />
|
||||
<item index="1" class="java.lang.String" itemvalue="keyring" />
|
||||
<item index="2" class="java.lang.String" itemvalue="python-telegram-bot" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
||||
5
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
5
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="PROJECT_PROFILE" />
|
||||
</settings>
|
||||
</component>
|
||||
11
.idea/knockknock.iml
generated
Normal file
11
.idea/knockknock.iml
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.7 (knockknock)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
<component name="TestRunnerService">
|
||||
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
|
||||
</component>
|
||||
</module>
|
||||
7
.idea/misc.xml
generated
Normal file
7
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="JavaScriptSettings">
|
||||
<option name="languageLevel" value="ES6" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (knockknock)" project-jdk-type="Python SDK" />
|
||||
</project>
|
||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/knockknock.iml" filepath="$PROJECT_DIR$/.idea/knockknock.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -1,4 +1,5 @@
|
||||
from knockknock.email_sender import email_sender
|
||||
from knockknock.slack_sender import slack_sender
|
||||
from knockknock.sms_sender import sms_sender
|
||||
from knockknock.telegram_sender import telegram_sender
|
||||
from knockknock.teams_sender import teams_sender
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import argparse
|
||||
import subprocess
|
||||
|
||||
from knockknock import email_sender, slack_sender, telegram_sender, teams_sender
|
||||
from knockknock import email_sender, slack_sender, telegram_sender, teams_sender, sms_sender
|
||||
|
||||
|
||||
def main():
|
||||
@@ -58,6 +58,22 @@ def main():
|
||||
help="Optional user ids to notify, as comma seperated list.")
|
||||
teams_parser.set_defaults(sender_func=teams_sender)
|
||||
|
||||
twilio_parser = subparsers.add_parser(
|
||||
name="twilio", description="Send SMS using the Twilio API")
|
||||
twilio_parser.add_argument(
|
||||
"--account-sid", type=str, required=True,
|
||||
help="The account sid to access your Twilio account.")
|
||||
twilio_parser.add_argument(
|
||||
"--auth-token", type=str, required=True,
|
||||
help="The auth token to access your Twilio account.")
|
||||
twilio_parser.add_argument(
|
||||
"--recipient-number", type=str, required=True,
|
||||
help="Phone number of the recipient")
|
||||
twilio_parser.add_argument(
|
||||
"--sender-number", type=str, required=True,
|
||||
help="Phone number of the sender")
|
||||
teams_parser.set_defaults(sender_func=sms_sender)
|
||||
|
||||
args, remaining_args = parser.parse_known_args()
|
||||
args = vars(args)
|
||||
|
||||
|
||||
82
knockknock/sms_sender.py
Normal file
82
knockknock/sms_sender.py
Normal file
@@ -0,0 +1,82 @@
|
||||
import os
|
||||
import datetime
|
||||
import traceback
|
||||
import functools
|
||||
import socket
|
||||
import twilio
|
||||
|
||||
DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
|
||||
|
||||
def sms_sender(account_sid: str, auth_token: str, recipient_number: str, sender_number: str):
|
||||
client = twilio.rest.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
|
||||
Reference in New Issue
Block a user