nodepower/bin/i2cmux/smsalert.py
bcffd916
 #!/usr/bin/python3
 #!/usr/bin/python3
 #
 # Module: smsalert.py
 #
 # Description: This module provides a utility for sending SMS text
 # messages to an SMS Gateway server.  The gateway server sends the
 # text message to the supplied phone number.  This class acts as a
 # library module that can be imported into and called from other
 # Python programs.
 #
 # Copyright 2022 Jeff Owrey
 #    This program is free software: you can redistribute it and/or modify
 #    it under the terms of the GNU General Public License as published by
 #    the Free Software Foundation, either version 3 of the License, or
 #    (at your option) any later version.
 #
 #    This program is distributed in the hope that it will be useful,
 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 #    GNU General Public License for more details.
 #
 #    You should have received a copy of the GNU General Public License
 #    along with this program.  If not, see http://www.gnu.org/license.
 #
 # Revision History
 #   * v10 released 16 March 2022 by J L Owrey; first release
 #
 #2345678901234567890123456789012345678901234567890123456789012345678901234567890
 
 import telnetlib
 
 _DEFAULT_HOST = 'ai7nc-aprs-is-vm.local.mesh'
 _DEFAULT_PORT = '14580'
 _DEFAULT_SERVER = 'AI7NC-30'
 
 class smsalert:
 
     def __init__(self, callsign, passcode, host=_DEFAULT_HOST, \
       port=_DEFAULT_PORT, server=_DEFAULT_SERVER, debug=False):
         """
         Initialize an instance of this class.
         Parameters:
           callsign - amateur radio callsign of user (must be verified)
           passcode - passcode for verified callsign
           host - domain name or IP address of APRS-IS server
           port - port on which the APRS-IS server receives messages
           server - APRS service name
           debug - set equal to True for debug output
         Returns: nothing
         """
         # Initialize class instance variables.
         self.callsign = callsign
         self.passcode = passcode
         self.host = host
         self.port = port
         self.server = server
         self.debug = debug
     ## end def
 
     def sendSMS(self, phone_number, text_message):
         """
         Sends an SMS text message to the provided phone number.
         Parameters:
           phone_number - phone number to which to send the text message
           text_message - text message to be sent to the provided
           phone number
         Returns: True if successful, False otherwise
         """
         initial_prompt = '# aprsc 2.1.8-gf8824e8'
         login_string = 'user ' + self.callsign + \
                        ' pass ' + self.passcode + '\n'
         login_result = self.server
 
         # For compatibility with python 2 telnet library, convert
         # utf-8 strings to bytes.
         initial_prompt = initial_prompt.encode()
         login_string = login_string.encode()
         login_result = login_result.encode()
 
         try:
             # Establish network connection to APRS-IS server. Look for
             tn = telnetlib.Telnet(self.host, self.port)
             tn.read_until(initial_prompt)
 
             # Login and verify passcode accepted.
             tn.write(login_string)
             response = tn.read_until(login_result)
             response = response.decode() # convert response to utf-8 string
             if self.debug:
                 print('sms response: ' + response[0:])
             if not response.find('verified'):
                 print('sms error: unverified user')
                 del tn
                 return False
 
             # Format and send SMS message to SMS gateway.
             cmd = '%s>%s::SMSGTE:@%s %s\n' % \
               (self.callsign, self.server, phone_number, text_message)
             if self.debug:
                 print('sms cmd: ' + cmd)
             tn.write(cmd.encode())
             del tn
             return True
         except Exception as exError:
             print("sms error: %s" % (exError))
             return False
     ## end def
 ## end class
 
 def test_smsalert():
     import time
 
     # Initialize a telnet instance.  Default host, port, and server
     # automatically defined if not included in function call.
     sm = smsalert('KA7JLO', '17318', debug=True)
 
     # Send a text message to a phone number.
     message = 'Python script test message sent via AREDN: msg %d' % time.time()
     sm.sendSMS('5416021314', message)
 ## end def
 
 if __name__ == '__main__':
     test_smsalert()