Advertisement
Guest User

Untitled

a guest
Nov 3rd, 2011
603
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.87 KB | None | 0 0
  1. #!/usr/bin/env python2
  2.  
  3. import os
  4. import pygtk
  5. import string
  6. import socket
  7. import httplib
  8. import logging
  9. import pynotify
  10. import telnetlib
  11. pygtk.require("2.0")
  12. from pg import connect
  13. from xml.dom import minidom
  14. from time import sleep, time
  15. from threading import Thread
  16. import gtk, gtk.glade, gobject
  17. from xml.sax.saxutils import escape
  18.  
  19. sid = 0
  20. alPort = 8894
  21. myPhone = 199
  22. logArray = []
  23. sessionID = 0
  24. phonebook = {}
  25. ctime = time()
  26. alcatel = "192.168.253.17"
  27.  
  28. class telnetThread(Thread):
  29.     def __init__(self, alcatel, alPort, myPhone, timeOut=60):
  30.         Thread.__init__(self)
  31.         self.setDaemon(True)
  32.         #self.logger = logging.get_logger()
  33.         self.alcatel = alcatel
  34.         self.timeOut = timeOut
  35.         self.myPhone = myPhone
  36.         self.alPort = alPort
  37.         self.alive = False
  38.  
  39.     def run(self):
  40.         lastNumber = 0
  41.         state = 'blank'
  42.         oldstate = state
  43.         self.alive = True
  44.         global sid, sessionID, ctime
  45.         xmlmsg = """POST /services/xmlsrv/services/XmlApp HTTP/1.1
  46. SOAPAction:
  47. Content-Type: text/xml; charset=utf-8
  48. Host: %s:%s
  49. Content-Length: 293
  50. Connection: Keep-Alive
  51.  
  52. <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)
  53.        
  54.         while self.alive:
  55.             try:
  56.                 telnetConn = telnetlib.Telnet(self.alcatel,
  57.                         self.alPort, self.timeOut)
  58.             except:
  59.                 print('Error while connecting telnet session.')
  60.                 print('Sleeping for 60 seconds...')
  61.                 sleep(60)
  62.                 continue
  63.             else:
  64.                 print("Connected!")
  65.                 telnetConn.write(xmlmsg+"\n")
  66.            
  67.             while self.alive:
  68.                 resp = telnetConn.read_until('Envelope>', timeout=10)
  69.                 print resp
  70.                 if resp.find('e_ping') > 0:
  71.                     ctime = time()
  72.                     continue
  73.                 elif resp.find('e_unanswdCallNotifResponse') > 0:
  74.                     state = 'notAnswered'
  75.                 elif resp.find('startSubscribeAppResponse') > 0:
  76.                     sid = resp.split('subscribeId')[1][1:][:-2]
  77.                     subscribe(self.alcatel)
  78.                 elif resp.find('e_callStateResponse') > 0:
  79.                     if resp.find('callRef') > 0:
  80.                         msg = resp.split('e_callState')[1][1:][:-2]
  81.                         callRef = resp.split('callRef')[1][1:][:-2]
  82.                         state = resp.split('state')[1][1:][:-2]
  83.                         number = resp.split('number')[1][1:][:-2]
  84.                         if resp.find('origin') > 0:
  85.                             origin = resp.split('origin')[1][1:][:-2]
  86.                         else:
  87.                             origin = '0'
  88.                         if resp.find('ringingIncoming') > 0:
  89.                             callerid = 1
  90.                             lastNumber = number
  91.                         if resp.find('ringingOutgoing') > 0:
  92.                             callerid = -1
  93.                 if resp.find('e_callChangeResponse') > 0:
  94.                     callRef = resp.split('callRef')[1][1:][:-2]
  95.                     msg = resp.split('e_callChange')[1][1:][:-2]
  96.                     state = resp.split('state')[1][1:][:-2]
  97.                     callPresent = resp.split('callIsPresent')[1][1:][:-2]
  98.                     if callPresent ==  'false':
  99.                         state = 'call_end'
  100.                         number = ''
  101.                
  102.                 if state != oldstate:
  103.                     oldstate = state
  104.                     if state in ['notAnswered', 'call_end']:
  105.                         state = 'blank'
  106.                         number = ''
  107.                     global statusicon
  108.                     mstr = '%s %s %s %s %s %s %s' % (msg, callRef, state,
  109.                                 number, origin, callerid, callPresent)
  110.                     statusicon.notify([mstr, ""])
  111.                
  112.                 if (time() - ctime) > 120:
  113.                     self.finish()
  114.  
  115.     def finish(self):
  116.         self.alive = False
  117.  
  118. def post(alcatel, rurl, request, resfld):
  119.     headers = {
  120.         'Content-type':'text/xml; charset=utf-8',
  121.         'TE':'deflate,gzip;q=0.3',
  122.         'Connection':'TE, close'
  123.     }
  124.     connection = httplib.HTTPConnection(alcatel, 80)
  125.     connection.request("POST", rurl, request, headers)
  126.     response = connection.getresponse()
  127.     document = minidom.parseString(response.read())
  128.     if response.status == 500:
  129.         for node in document.getElementsByTagName("faultstring"):
  130. #           print str("".join([child.data for child in node.childNodes]))
  131.             for child in node.childNodes:
  132.                 try: print child.data
  133.                 except: pass
  134.         return False
  135.     else:
  136.         result = []
  137.         for node in document.getElementsByTagName(resfld):
  138.             result.append("".join([child.data for child in node.childNodes]))
  139.         return result
  140.  
  141. def subscribe(alcatel):
  142.     global sid, sessionID
  143.     rf = 'code'
  144.     rurl = '/services/xmlsrv/services/XmlPhone'
  145.     request = """<?xml version="1.0" encoding="utf-8"?>
  146.         <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  147.                 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
  148.                 xmlns:tns="http://xmlapi.alcatel.com/phone"
  149.                 xmlns:types="http://xmlapi.alcatel.com/phone/encodedTypes"
  150.                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  151.                 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  152.             <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  153.                 <tns:subscribe>
  154.                     <invoke href="#id1" />
  155.                 </tns:subscribe>
  156.                 <q1:SubscribeInvoke id="id1" xsi:type="q1:SubscribeInvoke" xmlns:q1="http://xmlapi.alcatel.com/phone/types">
  157.                     <sessionId xsi:type="xsd:string">%s</sessionId>
  158.                     <subscribeId xsi:type="xsd:long">%s</subscribeId>
  159.                 </q1:SubscribeInvoke>
  160.             </soap:Body>
  161.         </soap:Envelope>';""" % (sessionID, sid)
  162.    
  163.     return post(alcatel, rurl, request, rf)
  164.  
  165.  
  166. def getAPIVersion(alcatel):
  167.     rf = 'result'
  168.     rurl = "/services/xmlsrv/services/XmlOxo"
  169.     request = """<?xml version="1.0" encoding="utf-8"?>
  170.         <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  171.                 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
  172.                 xmlns:tns="http://xmlapi.alcatel.com/oxo"
  173.                 xmlns:types="http://xmlapi.alcatel.com/oxo/encodedTypes"
  174.                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  175.                 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  176.             <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  177.                 <tns:getAPIVersion>
  178.                     <sessionId xsi:type="xsd:string">0</sessionId>
  179.                 </tns:getAPIVersion>
  180.             </soap:Body>
  181.         </soap:Envelope>"""
  182.    
  183.     return post(alcatel, rurl, request, rf)
  184.  
  185. def userLogin(alcatel, phone):
  186.     rf = 'sessionId'
  187.     rurl = '/services/xmlsrv/services/XmlPhone'
  188.     request = """<?xml version="1.0" encoding="utf-8"?>
  189.         <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  190.                 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
  191.                 xmlns:tns="http://xmlapi.alcatel.com/phone"
  192.                 xmlns:types="http://xmlapi.alcatel.com/phone/encodedTypes"
  193.                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  194.                 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  195.                 <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  196.                 <tns:login>
  197.                     <invoke href="#id1" />
  198.                 </tns:login>
  199.                 <q1:UserLogin id="id1" xsi:type="q1:UserLogin" xmlns:q1="http://xmlapi.alcatel.com/phone/types">
  200.                     <loginName xsi:type="xsd:string">%s</loginName>
  201.                     <password xsi:type="xsd:string">1111</password>
  202.                 </q1:UserLogin>
  203.             </soap:Body>
  204.         </soap:Envelope>""" % (phone)
  205.    
  206.     return post(alcatel, rurl, request, rf)
  207.  
  208. class MainWindow:
  209.     def __init__(self):
  210.         self.phoneBook = {}
  211.         self.shown = False
  212.         self.readF()
  213.         self.shittyDict = {}
  214.         self.current = ''
  215.        
  216.         builder = gtk.Builder()
  217.         builder.add_from_file("pbx.ui")
  218.         builder.connect_signals(self)
  219.        
  220.         self.main = builder.get_object("window1")
  221.         self.main.connect("delete-event", self.delete_event)
  222.         # Tree
  223.         self.grp = builder.get_object('treeview1')
  224.         self.tree()
  225.         # Buttons
  226.         self.bcall = builder.get_object('button1')
  227.         self.badd = builder.get_object('button2')
  228.         self.bedit = builder.get_object('button3')
  229.         self.bdel = builder.get_object('button4')
  230.         self.bhide = builder.get_object('button5')
  231.         self.bmiss = builder.get_object('button6')
  232.         # Labels
  233.         self.lname = builder.get_object('label3')
  234.         self.lphone = builder.get_object('label4')
  235.         # Text area /log file/
  236.         self.logarea = builder.get_object('textview1')
  237.        
  238.  
  239.     def on_quit(self, *dummy):
  240.         self.main.destroy()
  241.  
  242.     def delete_event(self, *widget):
  243.         self.hide()
  244.         return True
  245.  
  246.     def show(self):
  247.         self.shown = True
  248.         self.main.present()
  249.         self.main.activate_focus()
  250.         self.main.set_focus(self.grp)
  251.  
  252.     def click_hide(self, *dummy):
  253.         self.hide()
  254.  
  255.     def hide(self):
  256.         self.shown = False
  257.         self.main.hide()
  258.  
  259.     def get_shown(self, *dummy):
  260.         return self.shown
  261.  
  262.     def click_missed(self, *dummy):
  263.         cpoz = self.get_possition()
  264.         if cpoz: pass
  265.  
  266.     def click_delete(self, button, data=None):
  267.         dialog = gtk.MessageDialog(
  268.         parent         = None,
  269.         flags          = gtk.DIALOG_DESTROY_WITH_PARENT,
  270.         type           = gtk.MESSAGE_INFO,
  271.         buttons        = gtk.BUTTONS_OK_CANCEL,
  272.         message_format = "Delete %s?" % self.shittyDict[self.current])
  273.         dialog.set_title('Delete phone')
  274.         dialog.connect('response', self.click_remove)
  275.         dialog.show()
  276.  
  277.     def click_remove(self, widget, response_id):
  278.         cpoz = self.get_possition()
  279.         if cpoz:
  280.             if response_id == gtk.RESPONSE_OK:
  281.                 print("Removing %s" % self.shittyDict[self.current])
  282.                 del self.phoneBook[self.shittyDict[self.current]]
  283.                 self.writeF()
  284.                 self.tree()
  285.             widget.hide()
  286.  
  287.     def click_call(self, *dummy):
  288.         cpoz = self.get_possition()
  289.         if cpoz:
  290.             print("Call %s" % cpoz)
  291.  
  292.     def get_possition(self):
  293.         sresult = False
  294.         if len(self.current) > 0:
  295.             if self.current in self.shittyDict:
  296.                 if self.shittyDict[self.current] in self.phoneBook:
  297.                     sresult = self.phoneBook[self.shittyDict[self.current]]
  298.         return sresult
  299.  
  300.     def click_edit(self, *dummy): pass
  301.     def click_add(self, *dummy): pass
  302.  
  303.     def on_col_change(self, *dummy):
  304.         pos = self.grp.get_cursor()[0]
  305.         if len(pos) == 2:
  306.             self.current = '%s_%s' % pos
  307.             self.lname.set_label(self.shittyDict[self.current])
  308.             self.lphone.set_label(
  309.                 str(self.phoneBook[self.shittyDict[self.current]])
  310.             )
  311.         else:
  312.             self.lname.set_label('-')
  313.             self.lphone.set_label('-')
  314.             self.current = ''
  315.  
  316.     def on_dail(self, *dummy):
  317.         return self.click_call(self, dummy)
  318.  
  319.     def readF(self):
  320.         myList = '/var/tmp/alcomaster.list'
  321.        
  322.         if os.path.exists(myList):
  323.             mf = open(myList, 'r')
  324.             mfc = mf.read()
  325.             mf.close()
  326.        
  327.             try: self.phoneBook = eval(mfc)
  328.             except:
  329.                 print('Error while doing eval()')
  330.                 self.phoneBook = {}
  331.             else: print('Phonebook loaded.')
  332.         else:
  333.             self.phoneBook = {}
  334.  
  335.     def writeF(self):
  336.         myList = '/var/tmp/alcomaster.list'
  337.        
  338.         mf = open(myList, 'w')
  339.         mf.write(repr(self.phoneBook))
  340.         mf.close()
  341.        
  342.         print('Phonebook saved.')
  343.  
  344.     def tree(self):
  345.         for col in self.grp.get_columns():
  346.             self.grp.remove_column(col)
  347.         C_DATA_COLUMN_NUMBER_IN_MODEL = 0
  348.         cell0 = gtk.CellRendererText()
  349.         col0 = gtk.TreeViewColumn("Phones", cell0,
  350.                 text=C_DATA_COLUMN_NUMBER_IN_MODEL)
  351.         self.grp.append_column(col0)
  352.         # set model (i.e. the data it contains. We assume this is not done via glade.)
  353.         store = gtk.TreeStore(gobject.TYPE_STRING)
  354.         store.clear()
  355.         treestore = gtk.TreeStore(str,str)
  356.         treestore.set_sort_column_id(1,gtk.SORT_ASCENDING)
  357.         treestore.clear()
  358.         n = 0
  359.  
  360.         for somegroup in ['Phones']:
  361.             piter = treestore.append(None, [somegroup, None])
  362.             z = 0
  363.             for puser in self.phoneBook.keys():
  364.                     self.shittyDict[str(str(n) + "_" + str(z))] = puser
  365.                     treestore.append(piter, [puser, None])
  366.                     z += 1
  367.             n += 1
  368.         self.grp.set_model(treestore)
  369.         # set the selection option so that only one row can be selected
  370.         sel = self.grp.get_selection()
  371.         sel.set_mode(gtk.SELECTION_SINGLE)
  372.         # Set reorderable
  373.         self.grp.set_reorderable(False)
  374.  
  375. #   def click_add(self, dummy):
  376. #       AddWindow(self)
  377.  
  378. #   def click_edit(self, dummy):
  379. #       EditWindow(self.ln, self, self.mainDict)
  380.  
  381.  
  382. class PyApp(gtk.Window):
  383.     def __init__(self):
  384.         super(PyApp, self).__init__()
  385.  
  386.         self.set_size_request(250, 100)
  387.         self.set_position(gtk.WIN_POS_CENTER)
  388.         self.connect("destroy", gtk.main_quit)
  389.         self.set_title("Message dialogs")
  390.  
  391.         erro = gtk.Button("Error")
  392.         erro.connect("clicked", self.on_erro)
  393.         self.show_all()
  394.  
  395.     def on_erro(self, widget):
  396.         md = gtk.MessageDialog(self,
  397.             gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR,
  398.             gtk.BUTTONS_CLOSE, "Error loading file")
  399.         md.run()
  400.         md.destroy()
  401.  
  402.  
  403. class StatusIcc:
  404.     # active callback
  405.     def activate(self, widget, data=None):
  406.         if self.app.get_shown():
  407.             self.app.hide()
  408.         else: self.app.show()
  409.  
  410.     # Show_Hide callback
  411.     def show_hide(self, widget, response_id, data=None):
  412.         if response_id == gtk.RESPONSE_YES:
  413.             widget.hide()
  414.         else:
  415.             widget.hide()
  416.  
  417.     # Destroy callback
  418.     def destroyer(self, widget, response_id, data=None):
  419.         if response_id == gtk.RESPONSE_OK:
  420.             gtk.main_quit()
  421.         else:
  422.             widget.hide()
  423.  
  424.     # POP UP callback
  425.     def popup(self, button, widget, data=None):
  426.         dialog = gtk.MessageDialog(
  427.         parent         = None,
  428.         flags          = gtk.DIALOG_DESTROY_WITH_PARENT,
  429.         type           = gtk.MESSAGE_WARNING,
  430.         buttons        = gtk.BUTTONS_OK_CANCEL,
  431.         message_format = "Wanna quit?")
  432.         dialog.set_title('Quit alcomaster?')
  433.         dialog.connect('response', self.destroyer)
  434.         dialog.show()
  435.  
  436.  
  437.     def __init__(self):
  438.         # create a new Status Icon
  439.         self.app = MainWindow()
  440.         self.shown = False
  441.         self.staticon = gtk.StatusIcon()
  442.         self.staticon.set_title('alcomaster')
  443.         # Icon
  444.         self.staticon.set_from_icon_name('modem')
  445.         self.staticon.set_blinking(False)
  446.         self.staticon.connect("activate", self.activate)
  447.         self.staticon.connect("popup_menu", self.popup)
  448.         self.staticon.set_visible(True)
  449.         # Notifications
  450.         pynotify.init("alcomaster")
  451.         #self.notify(['a', 'b'])
  452.  
  453.     def notify(self, inMsg):
  454.         self.notification = pynotify.Notification(inMsg[0], inMsg[1], "dialog-warning")
  455.         self.notification.set_urgency(pynotify.URGENCY_CRITICAL)
  456.         self.notification.set_timeout(pynotify.EXPIRES_DEFAULT)
  457. #       self.notification.attach_to_status_icon(self.staticon)
  458.         self.notification.show()
  459.  
  460. def getTime():
  461.     return "-".join(map(str, time.localtime()[:3])) + " " \
  462.             + ":".join(map(str, time.localtime()[:6][3:]))
  463.  
  464.  
  465. APIVersion = getAPIVersion(alcatel)
  466. sessionID = userLogin(alcatel, myPhone)
  467. telnetThread(alcatel, alPort, myPhone).start()
  468. statusicon = StatusIcc()
  469. gobject.threads_init()
  470. gtk.main()
  471.  
  472.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement