#!/usr/bin/python # -*- coding: utf-8 -*-) #Anthony BERGER #Envoie de sms par SFR DMC #https://extranet.sfrbusinessteam.fr/extranet/cvg/accueil #https://www.les800.com/e8ab/main.jsp?contrat=428020 #https://www.dmc.sfr-sh.fr/eDMC from ftplib import FTP import ftplib import getopt import sys import os import time import tempfile #DEFAULT PARAMS verbose=0 tmp_dir='/tmp' tmp_file='' serviceid='' spaceid='' callplanningid='' customizableid='' scenarioid='' mdp='' pager='' text='' long=0 nsms=1 #init dtime=int(time.time()) stime=time.strftime('%Y-%m-%d') def debug(mess): """ print message if verbose is 1 """ global verbose if verbose == 1: print mess def usage(): """ print the usage """ print """sms_dmc_sfr : send sms from DMC SFR sms_dmc_sfr [-h] [-s serviceId] [-e spaceId] [-a callPlanningId] [-c customizableId] [-o scenarioId] [-m password] [-p pager] [-t text_message] [-d dir] [-v] [-l] [-n] optional parameters: -h print this message -v verbose mode -d temp directory (default is /tmp) -l use long sms (for message greater than 160 characters; message send by up to 25 sms [25*160=4000 characters]; be careful!; you should limite the number of sms ) -n max number of sms : implies -l option. mandatory parameters -s serviceId -e spaceId -a callPlanningId -c customizableId -o scenarioId -m password -p pager number -t message to send """ def check_args(): """ use to verify the arguments passed to this script """ global long global nsms try: o, a = getopt.getopt(sys.argv[1:], 'hvln:d:s:e:a:c:m:p:t:o:') opts = {} except getopt.GetoptError, err: print '\nERREUR : \n' + str(err) print '\nUSAGE :' usage() sys.exit(1) for k,v in o: opts[k] = v if opts.has_key('-h'): usage(); sys.exit(0) if '-v' in opts: global verbose verbose = 1 if '-d' in opts: global tmp_dir tmp_dir= opts['-d'] if '-n' in opts: nsms=opts['-n'] if int(nsms) > 25: #text can not contain more than 4000 characters so 25 sms of 160 characters nsms=25 debug("->init : long sms limited to " + str(nsms)) if '-l' not in opts: debug("->init : -n option implies -l option") long=1 if '-l' in opts: debug("->init : long sms") long=1 if '-s' not in opts: usage(); sys.exit(1) else : global serviceid serviceid = opts['-s'] if '-e' not in opts: usage(); sys.exit(1) else: global spaceid spaceid = opts['-e'] if '-a' not in opts: usage(); sys.exit(1) else: global callplanningid callplanningid = opts['-a'] if '-c' not in opts: usage(); sys.exit(1) else: global customizableid customizableid = opts['-c'] if '-o' not in opts: usage(); sys.exit(1) else: global scenarioid scenarioid = opts['-o'] if '-m' not in opts: usage(); sys.exit(1) else: global mdp mdp = opts['-m'] if '-p' not in opts: usage(); sys.exit(1) else: global pager pager = opts['-p'] if '-t' not in opts: usage(); sys.exit(1) else: global text if long == 0 : text=opts['-t'][0:160] #only the 160 first characters else: u=(int(nsms))*160 text=opts['-t'][0:int(u)] #text limited to nsms def create_csv(filename): """ create the temporary csv file with the following format #COMMAND serviceId:255935401 spaceId:833 broadcastName:Nagios scenarioId:6755 startDate:2011-11-21 00:00:00 stopDate:2011-11-21 23:59:59 callPlanningId:2002 description:SMS Nagios maxSimultaneousContact:2 customizableId:9956 multimediaType:TXT text:"text du sms 160 caracteres" #CONTACTS NAME;PHONENUMBER1 contact;0612345678 #END """ global dtime global tmp_dir global tmp_file debug("->create_csv : creating csv") try : fn=tmp_dir + '/' + filename + '_' + str(dtime) tmp_f=open(fn , 'w') except IOError, err: print str(err) sys.exit(0) tmp_file=tmp_f.name debug ("->create_csv : "+tmp_file+' created') tmp_f.write('#COMMAND\n'+ 'serviceId:'+serviceid+'\n'+ 'spaceId:'+spaceid+'\n'+ 'broadcastName:Nagios\n'+ 'scenarioId:'+ scenarioid +'\n'+ 'startDate:'+ stime + ' 00:00:00\n'+ 'stopDate:'+stime + ' 23:59:59\n'+ 'callPlanningId:'+callplanningid+'\n'+ 'description:SMS Nagios\n'+ 'maxSimultaneousContact:1\n'+ 'customizableId:'+customizableid+'\n'+ 'multimediaType:TXT\n'+ 'smsLong:' + str(long) + '\n' + 'text:"'+text+'"\n'+ '#CONTACTS\n'+ 'NAME;PHONENUMBER1\n'+ 'contact;'+pager+'\n'+ '#END\n' ) tmp_f.close() def main(): """ main function : call create_csv to create de temporary csv file to send it by ftp establish the ftp connection and upload the csv temporary file """ global tmp_file #filename with absolute path debug ("->main") create_csv('ALERT_NAGIOS') #create the temporary before upload it on ftp server tmp_fbn=os.path.basename(tmp_file) #basename tmp_fbnup= tmp_fbn + '.csv.uploading'#add extension debug ("->main : ftp login") try: #ftp connection ftp = FTP('ftp.dmc.sfr-sh.fr') # host,port,login,mdp ftp.set_debuglevel(0) ftp.login(serviceid,mdp) ftp.set_pasv(0) #disable the passive mode except ftplib.error_perm, err: print '\nERREUR : ' + str(err) +'\n' sys.exit(1) ftp.cwd('in') #file must be uploaded in the directory 'in' debug("->main : send file "+tmp_file) ftp.storbinary('STOR ' + tmp_fbnup , open(tmp_file, 'r')) # send temporary file on ftp server; file with extension debug ("->main : rename file uploaded " + tmp_fbnup +" in " + tmp_fbn + '.csv') ftp.rename(tmp_fbnup, tmp_fbn + '.csv' ) #rename the file to be interpreted on server; remove the extension ftp.quit() #quit the ftp session def clean(): """ delete the temporary file """ #TODO debug('->clean') debug('->delete '+ tmp_file) try : os.remove(tmp_file) except os.error, err: print str(err) sys.exit(1) ###################################### # # MAIN # ###################################### if __name__ == "__main__": check_args() main() clean() ######################################