Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python2
- import os
- import pygtk
- import string
- import socket
- import httplib
- import logging
- import pynotify
- import telnetlib
- pygtk.require("2.0")
- from pg import connect
- from xml.dom import minidom
- from time import sleep, time
- from threading import Thread
- import gtk, gtk.glade, gobject
- from xml.sax.saxutils import escape
- sid = 0
- alPort = 8894
- myPhone = 199
- logArray = []
- sessionID = 0
- phonebook = {}
- ctime = time()
- alcatel = "192.168.253.17"
- class telnetThread(Thread):
- def __init__(self, alcatel, alPort, myPhone, timeOut=60):
- Thread.__init__(self)
- self.setDaemon(True)
- #self.logger = logging.get_logger()
- self.alcatel = alcatel
- self.timeOut = timeOut
- self.myPhone = myPhone
- self.alPort = alPort
- self.alive = False
- def run(self):
- lastNumber = 0
- state = 'blank'
- oldstate = state
- self.alive = True
- global sid, sessionID, ctime
- xmlmsg = """POST /services/xmlsrv/services/XmlApp HTTP/1.1
- SOAPAction:
- Content-Type: text/xml; charset=utf-8
- Host: %s:%s
- Content-Length: 293
- Connection: Keep-Alive
- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><tns:startSubscribeApp xmlns:tns="http://xmlapi.alcatel.com/app"><applicationId xmlns="http://www.w3.org/2001/XMLSchema-instance">OXOWebServices</applicationId></tns:startSubscribeApp></soap:Body></soap:Envelope>""" % (self.alcatel, self.alPort)
- while self.alive:
- try:
- telnetConn = telnetlib.Telnet(self.alcatel,
- self.alPort, self.timeOut)
- except:
- print('Error while connecting telnet session.')
- print('Sleeping for 60 seconds...')
- sleep(60)
- continue
- else:
- print("Connected!")
- telnetConn.write(xmlmsg+"\n")
- while self.alive:
- resp = telnetConn.read_until('Envelope>', timeout=10)
- print resp
- if resp.find('e_ping') > 0:
- ctime = time()
- continue
- elif resp.find('e_unanswdCallNotifResponse') > 0:
- state = 'notAnswered'
- elif resp.find('startSubscribeAppResponse') > 0:
- sid = resp.split('subscribeId')[1][1:][:-2]
- subscribe(self.alcatel)
- elif resp.find('e_callStateResponse') > 0:
- if resp.find('callRef') > 0:
- msg = resp.split('e_callState')[1][1:][:-2]
- callRef = resp.split('callRef')[1][1:][:-2]
- state = resp.split('state')[1][1:][:-2]
- number = resp.split('number')[1][1:][:-2]
- if resp.find('origin') > 0:
- origin = resp.split('origin')[1][1:][:-2]
- else:
- origin = '0'
- if resp.find('ringingIncoming') > 0:
- callerid = 1
- lastNumber = number
- if resp.find('ringingOutgoing') > 0:
- callerid = -1
- if resp.find('e_callChangeResponse') > 0:
- callRef = resp.split('callRef')[1][1:][:-2]
- msg = resp.split('e_callChange')[1][1:][:-2]
- state = resp.split('state')[1][1:][:-2]
- callPresent = resp.split('callIsPresent')[1][1:][:-2]
- if callPresent == 'false':
- state = 'call_end'
- number = ''
- if state != oldstate:
- oldstate = state
- if state in ['notAnswered', 'call_end']:
- state = 'blank'
- number = ''
- global statusicon
- mstr = '%s %s %s %s %s %s %s' % (msg, callRef, state,
- number, origin, callerid, callPresent)
- statusicon.notify([mstr, ""])
- if (time() - ctime) > 120:
- self.finish()
- def finish(self):
- self.alive = False
- def post(alcatel, rurl, request, resfld):
- headers = {
- 'Content-type':'text/xml; charset=utf-8',
- 'TE':'deflate,gzip;q=0.3',
- 'Connection':'TE, close'
- }
- connection = httplib.HTTPConnection(alcatel, 80)
- connection.request("POST", rurl, request, headers)
- response = connection.getresponse()
- document = minidom.parseString(response.read())
- if response.status == 500:
- for node in document.getElementsByTagName("faultstring"):
- # print str("".join([child.data for child in node.childNodes]))
- for child in node.childNodes:
- try: print child.data
- except: pass
- return False
- else:
- result = []
- for node in document.getElementsByTagName(resfld):
- result.append("".join([child.data for child in node.childNodes]))
- return result
- def subscribe(alcatel):
- global sid, sessionID
- rf = 'code'
- rurl = '/services/xmlsrv/services/XmlPhone'
- request = """<?xml version="1.0" encoding="utf-8"?>
- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
- xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
- xmlns:tns="http://xmlapi.alcatel.com/phone"
- xmlns:types="http://xmlapi.alcatel.com/phone/encodedTypes"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
- <tns:subscribe>
- <invoke href="#id1" />
- </tns:subscribe>
- <q1:SubscribeInvoke id="id1" xsi:type="q1:SubscribeInvoke" xmlns:q1="http://xmlapi.alcatel.com/phone/types">
- <sessionId xsi:type="xsd:string">%s</sessionId>
- <subscribeId xsi:type="xsd:long">%s</subscribeId>
- </q1:SubscribeInvoke>
- </soap:Body>
- </soap:Envelope>';""" % (sessionID, sid)
- return post(alcatel, rurl, request, rf)
- def getAPIVersion(alcatel):
- rf = 'result'
- rurl = "/services/xmlsrv/services/XmlOxo"
- request = """<?xml version="1.0" encoding="utf-8"?>
- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
- xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
- xmlns:tns="http://xmlapi.alcatel.com/oxo"
- xmlns:types="http://xmlapi.alcatel.com/oxo/encodedTypes"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
- <tns:getAPIVersion>
- <sessionId xsi:type="xsd:string">0</sessionId>
- </tns:getAPIVersion>
- </soap:Body>
- </soap:Envelope>"""
- return post(alcatel, rurl, request, rf)
- def userLogin(alcatel, phone):
- rf = 'sessionId'
- rurl = '/services/xmlsrv/services/XmlPhone'
- request = """<?xml version="1.0" encoding="utf-8"?>
- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
- xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
- xmlns:tns="http://xmlapi.alcatel.com/phone"
- xmlns:types="http://xmlapi.alcatel.com/phone/encodedTypes"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
- <tns:login>
- <invoke href="#id1" />
- </tns:login>
- <q1:UserLogin id="id1" xsi:type="q1:UserLogin" xmlns:q1="http://xmlapi.alcatel.com/phone/types">
- <loginName xsi:type="xsd:string">%s</loginName>
- <password xsi:type="xsd:string">1111</password>
- </q1:UserLogin>
- </soap:Body>
- </soap:Envelope>""" % (phone)
- return post(alcatel, rurl, request, rf)
- class MainWindow:
- def __init__(self):
- self.phoneBook = {}
- self.shown = False
- self.readF()
- self.shittyDict = {}
- self.current = ''
- builder = gtk.Builder()
- builder.add_from_file("pbx.ui")
- builder.connect_signals(self)
- self.main = builder.get_object("window1")
- self.main.connect("delete-event", self.delete_event)
- # Tree
- self.grp = builder.get_object('treeview1')
- self.tree()
- # Buttons
- self.bcall = builder.get_object('button1')
- self.badd = builder.get_object('button2')
- self.bedit = builder.get_object('button3')
- self.bdel = builder.get_object('button4')
- self.bhide = builder.get_object('button5')
- self.bmiss = builder.get_object('button6')
- # Labels
- self.lname = builder.get_object('label3')
- self.lphone = builder.get_object('label4')
- # Text area /log file/
- self.logarea = builder.get_object('textview1')
- def on_quit(self, *dummy):
- self.main.destroy()
- def delete_event(self, *widget):
- self.hide()
- return True
- def show(self):
- self.shown = True
- self.main.present()
- self.main.activate_focus()
- self.main.set_focus(self.grp)
- def click_hide(self, *dummy):
- self.hide()
- def hide(self):
- self.shown = False
- self.main.hide()
- def get_shown(self, *dummy):
- return self.shown
- def click_missed(self, *dummy):
- cpoz = self.get_possition()
- if cpoz: pass
- def click_delete(self, button, data=None):
- dialog = gtk.MessageDialog(
- parent = None,
- flags = gtk.DIALOG_DESTROY_WITH_PARENT,
- type = gtk.MESSAGE_INFO,
- buttons = gtk.BUTTONS_OK_CANCEL,
- message_format = "Delete %s?" % self.shittyDict[self.current])
- dialog.set_title('Delete phone')
- dialog.connect('response', self.click_remove)
- dialog.show()
- def click_remove(self, widget, response_id):
- cpoz = self.get_possition()
- if cpoz:
- if response_id == gtk.RESPONSE_OK:
- print("Removing %s" % self.shittyDict[self.current])
- del self.phoneBook[self.shittyDict[self.current]]
- self.writeF()
- self.tree()
- widget.hide()
- def click_call(self, *dummy):
- cpoz = self.get_possition()
- if cpoz:
- print("Call %s" % cpoz)
- def get_possition(self):
- sresult = False
- if len(self.current) > 0:
- if self.current in self.shittyDict:
- if self.shittyDict[self.current] in self.phoneBook:
- sresult = self.phoneBook[self.shittyDict[self.current]]
- return sresult
- def click_edit(self, *dummy): pass
- def click_add(self, *dummy): pass
- def on_col_change(self, *dummy):
- pos = self.grp.get_cursor()[0]
- if len(pos) == 2:
- self.current = '%s_%s' % pos
- self.lname.set_label(self.shittyDict[self.current])
- self.lphone.set_label(
- str(self.phoneBook[self.shittyDict[self.current]])
- )
- else:
- self.lname.set_label('-')
- self.lphone.set_label('-')
- self.current = ''
- def on_dail(self, *dummy):
- return self.click_call(self, dummy)
- def readF(self):
- myList = '/var/tmp/alcomaster.list'
- if os.path.exists(myList):
- mf = open(myList, 'r')
- mfc = mf.read()
- mf.close()
- try: self.phoneBook = eval(mfc)
- except:
- print('Error while doing eval()')
- self.phoneBook = {}
- else: print('Phonebook loaded.')
- else:
- self.phoneBook = {}
- def writeF(self):
- myList = '/var/tmp/alcomaster.list'
- mf = open(myList, 'w')
- mf.write(repr(self.phoneBook))
- mf.close()
- print('Phonebook saved.')
- def tree(self):
- for col in self.grp.get_columns():
- self.grp.remove_column(col)
- C_DATA_COLUMN_NUMBER_IN_MODEL = 0
- cell0 = gtk.CellRendererText()
- col0 = gtk.TreeViewColumn("Phones", cell0,
- text=C_DATA_COLUMN_NUMBER_IN_MODEL)
- self.grp.append_column(col0)
- # set model (i.e. the data it contains. We assume this is not done via glade.)
- store = gtk.TreeStore(gobject.TYPE_STRING)
- store.clear()
- treestore = gtk.TreeStore(str,str)
- treestore.set_sort_column_id(1,gtk.SORT_ASCENDING)
- treestore.clear()
- n = 0
- for somegroup in ['Phones']:
- piter = treestore.append(None, [somegroup, None])
- z = 0
- for puser in self.phoneBook.keys():
- self.shittyDict[str(str(n) + "_" + str(z))] = puser
- treestore.append(piter, [puser, None])
- z += 1
- n += 1
- self.grp.set_model(treestore)
- # set the selection option so that only one row can be selected
- sel = self.grp.get_selection()
- sel.set_mode(gtk.SELECTION_SINGLE)
- # Set reorderable
- self.grp.set_reorderable(False)
- # def click_add(self, dummy):
- # AddWindow(self)
- # def click_edit(self, dummy):
- # EditWindow(self.ln, self, self.mainDict)
- class PyApp(gtk.Window):
- def __init__(self):
- super(PyApp, self).__init__()
- self.set_size_request(250, 100)
- self.set_position(gtk.WIN_POS_CENTER)
- self.connect("destroy", gtk.main_quit)
- self.set_title("Message dialogs")
- erro = gtk.Button("Error")
- erro.connect("clicked", self.on_erro)
- self.show_all()
- def on_erro(self, widget):
- md = gtk.MessageDialog(self,
- gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR,
- gtk.BUTTONS_CLOSE, "Error loading file")
- md.run()
- md.destroy()
- class StatusIcc:
- # active callback
- def activate(self, widget, data=None):
- if self.app.get_shown():
- self.app.hide()
- else: self.app.show()
- # Show_Hide callback
- def show_hide(self, widget, response_id, data=None):
- if response_id == gtk.RESPONSE_YES:
- widget.hide()
- else:
- widget.hide()
- # Destroy callback
- def destroyer(self, widget, response_id, data=None):
- if response_id == gtk.RESPONSE_OK:
- gtk.main_quit()
- else:
- widget.hide()
- # POP UP callback
- def popup(self, button, widget, data=None):
- dialog = gtk.MessageDialog(
- parent = None,
- flags = gtk.DIALOG_DESTROY_WITH_PARENT,
- type = gtk.MESSAGE_WARNING,
- buttons = gtk.BUTTONS_OK_CANCEL,
- message_format = "Wanna quit?")
- dialog.set_title('Quit alcomaster?')
- dialog.connect('response', self.destroyer)
- dialog.show()
- def __init__(self):
- # create a new Status Icon
- self.app = MainWindow()
- self.shown = False
- self.staticon = gtk.StatusIcon()
- self.staticon.set_title('alcomaster')
- # Icon
- self.staticon.set_from_icon_name('modem')
- self.staticon.set_blinking(False)
- self.staticon.connect("activate", self.activate)
- self.staticon.connect("popup_menu", self.popup)
- self.staticon.set_visible(True)
- # Notifications
- pynotify.init("alcomaster")
- #self.notify(['a', 'b'])
- def notify(self, inMsg):
- self.notification = pynotify.Notification(inMsg[0], inMsg[1], "dialog-warning")
- self.notification.set_urgency(pynotify.URGENCY_CRITICAL)
- self.notification.set_timeout(pynotify.EXPIRES_DEFAULT)
- # self.notification.attach_to_status_icon(self.staticon)
- self.notification.show()
- def getTime():
- return "-".join(map(str, time.localtime()[:3])) + " " \
- + ":".join(map(str, time.localtime()[:6][3:]))
- APIVersion = getAPIVersion(alcatel)
- sessionID = userLogin(alcatel, myPhone)
- telnetThread(alcatel, alPort, myPhone).start()
- statusicon = StatusIcc()
- gobject.threads_init()
- gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement