Guest User

Untitled

a guest
May 26th, 2018
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 22.09 KB | None | 0 0
  1. #!/usr/bin/env python2.7
  2. #
  3. #  Copyright 2010 shadowx <georgi.kolev@gmail.com>
  4. #
  5. #  This program is free software; you can redistribute it and/or modify
  6. #  it under the terms of the GNU General Public License as published by
  7. #  the Free Software Foundation; either version 2 of the License, or
  8. #  (at your option) any later version.
  9. #
  10. #  This program is distributed in the hope that it will be useful,
  11. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. #  GNU General Public License for more details.
  14. #
  15. #  You should have received a copy of the GNU General Public License
  16. #  along with this program; if not, write to the Free Software
  17. #  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  18. #  MA 02110-1301, USA.
  19.  
  20. confFile = '/etc/xpqt.conf'
  21.  
  22. import os
  23. import sys
  24. import time
  25. import pickle
  26. import subprocess
  27. import ConfigParser
  28. import gtk, gtk.glade
  29. import pygtk
  30. pygtk.require("2.0")
  31. import gobject
  32.  
  33. try:
  34.     import pg
  35. except:
  36.     print 'pg modul not found. quiting!'
  37.     sys.exit(1)
  38.  
  39. try:
  40.     import keybinder
  41. except:
  42.     print 'keybinder not found. skipping.'
  43.     keyb = False
  44. else:
  45.     keyb = True
  46.  
  47.  
  48. class InfoWindow:
  49.     def __init__(self, mainDict, boxList, swList):
  50.         builder = gtk.Builder()
  51.         builder.add_from_file("gui/info.xml")
  52.         builder.connect_signals(self)
  53.  
  54.         self.mainDict = mainDict
  55.         self.boxList = boxList
  56.         self.swList = swList
  57.  
  58.         global lback, lastupdate
  59.  
  60.         self.main = builder.get_object("window1")
  61.         self.lastupdate = builder.get_object('label7')
  62.         self.lastupdate.set_text(lastupdate)
  63.         self.lastbackup = builder.get_object('label8')
  64.         self.lastbackup.set_text(lback)
  65.         self.totalcount = builder.get_object('label9')
  66.         self.totalcount.set_text("%s [%s/%s]" % (len(self.mainDict),
  67.                         len(self.boxList), len(self.swList)))
  68.  
  69.         self.main.show()
  70.  
  71.  
  72. class SettingsWindow:
  73.     def __init__(self):
  74.         global hotkey, bfile, dbhost
  75.         global dbname, dbuser, dbpass
  76.         builder = gtk.Builder()
  77.         builder.add_from_file("gui/settings.xml")
  78.         builder.connect_signals(self)
  79.         self.main = builder.get_object("window1")
  80.  
  81.         self.hkey = builder.get_object('entry1')
  82.         self.hkey.set_text(hotkey)
  83.         self.bfile = builder.get_object('entry2')
  84.         self.bfile.set_text(bfile)
  85.         self.dbhost = builder.get_object('entry3')
  86.         self.dbhost.set_text(dbhost)
  87.         self.dbname = builder.get_object('entry4')
  88.         self.dbname.set_text(dbname)
  89.         self.dbuser = builder.get_object('entry5')
  90.         self.dbuser.set_text(dbuser)
  91.         self.dbpass = builder.get_object('entry6')
  92.         self.dbpass.set_text(dbpass)
  93.         self.main.show()
  94.  
  95.     def click_cancel(self, *dummy):
  96.         self.main.destroy()
  97.  
  98.     def click_ok(self, *dummy):
  99.         global hotkey, bfile, dbhost
  100.         global dbname, dbuser, dbpass
  101.  
  102.         hotkey = self.hkey.get_text().strip()
  103.         bfile = self.bfile.get_text().strip()
  104.         dbhost = self.dbhost.get_text().strip()
  105.         dbname = self.dbname.get_text().strip()
  106.         dbuser = self.dbuser.get_text().strip()
  107.         dbpass = self.dbpass.get_text().strip()
  108.         save_settings()
  109.         self.main.destroy()
  110.  
  111. class AboutWindow:
  112.     def __init__(self):
  113.         builder = gtk.Builder()
  114.         builder.add_from_file("gui/about.xml")
  115.         builder.connect_signals(self)
  116.         self.main = builder.get_object("aboutdialog1")
  117.         self.main.show()
  118.  
  119.     def click_cancel(self, *dummy):
  120.         self.main.destroy()
  121.  
  122. class EditWindow:
  123.     def __init__(self, ln, mainWindow, mainDict):
  124.         if ln == None:
  125.             return
  126.         self.ln = ln
  127.  
  128.         self.mainWindow = mainWindow
  129.         builder = gtk.Builder()
  130.         builder.add_from_file("gui/edit.xml")
  131.         builder.connect_signals(self)
  132.  
  133.         self.hidden_p = False
  134.         self.ln = self.ln.strip()
  135.         self.main = builder.get_object("window1")
  136.         self.boxname = builder.get_object('entry1')
  137.         self.boxname.set_text(self.ln.strip())
  138.         self.ipaddr = builder.get_object('entry2')
  139.         self.ipaddr.set_text(mainDict[self.ln][0].strip())
  140.         self.bipaddr = builder.get_object('entry3')
  141.         self.bipaddr.set_text(mainDict[self.ln][1].strip())
  142.         self.usr = builder.get_object('entry4')
  143.         self.usr.set_text(mainDict[self.ln][2].strip())
  144.         self.grp = builder.get_object('entry6')
  145.         self.grp.set_text(mainDict[self.ln][-1].strip())
  146.         self.pas = builder.get_object('entry5')
  147.         self.pas.set_text(dpswd(mainDict[self.ln][3].strip()))
  148.         self.spas = builder.get_object('entry7')
  149.         self.spas.set_text(mainDict[self.ln][7].strip())
  150.         self.cport = builder.get_object('entry8')
  151.         self.cport.set_text(mainDict[self.ln][9].strip())
  152.         # su
  153.         self.su1 = builder.get_object('radiobutton1')
  154.         self.su2 = builder.get_object('radiobutton2')
  155.         if mainDict[self.ln][5].lower()[0] == 't':
  156.             self.su1.set_active(True)
  157.         else: self.su2.set_active(True)
  158.         # dev type
  159.         self.d1 = builder.get_object('radiobutton3')
  160.         self.d2 = builder.get_object('radiobutton4')
  161.         if mainDict[self.ln][4].lower() == 'switch':
  162.             self.d2.set_active(True)
  163.         else: self.d1.set_active(True)
  164.         # conn type
  165.         self.c1 = builder.get_object('radiobutton5')
  166.         self.c2 = builder.get_object('radiobutton6')
  167.         if mainDict[self.ln][6].lower()[0] == 's':
  168.             self.c1.set_active(True)
  169.         else: self.c2.set_active(True)
  170.  
  171.         self.main.show()
  172.  
  173.     def on_ssh_change(self, *dummy):
  174.         if self.c1.get_active():
  175.             self.cport.set_text('23')
  176.         elif self.c2.get_active():
  177.             self.cport.set_text('22')
  178.  
  179.     def click_hidden(self, *dummy):
  180.         if self.hidden_p:
  181.             self.pas.set_visibility(False)
  182.             self.spas.set_visibility(False)
  183.             self.hidden_p = False
  184.         else:
  185.             self.pas.set_visibility(True)
  186.             self.spas.set_visibility(True)
  187.             self.hidden_p = True
  188.  
  189.     def click_edit(self, *dummy):
  190.         if self.d1.get_active():
  191.             self.dtype = 'server'
  192.         else:
  193.             self.dtype = 'switch'
  194.         if self.c1.get_active():
  195.             self.ct = 'ssh'
  196.         else:
  197.             self.ct = 'telnet'
  198.         if len(self.spas.get_text()) < 1:
  199.             self.spas_val.set_text('0')
  200.  
  201.         _sql1 = "DELETE from xpqt WHERE boxname = '%s';" % self.ln.strip()
  202.         _sql2 = """INSERT INTO xpqt(boxname, ipaddr, bipaddr, usr, pas, grp,
  203.                         su, supas, cport, conntype, dtype)
  204.                 VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s',
  205.                     '%s', '%s', '%s');""" % (self.boxname.get_text(),
  206.                     self.ipaddr.get_text(), self.bipaddr.get_text(),
  207.                     self.usr.get_text().strip(), pswd(self.pas.get_text()),
  208.                     self.grp.get_text().strip(), str(self.c2.get_active()),
  209.                     pswd(self.spas.get_text()), self.cport.get_text(),
  210.                     self.ct, self.dtype)
  211.         mSQL = [_sql1, _sql2]
  212.         sqls(mSQL)
  213.         self.main.destroy()
  214.  
  215.         return self.mainWindow.click_refresh()
  216.  
  217.     def on_cancel(self, *dummy):
  218.         self.main.destroy()
  219.  
  220. class AddWindow:
  221.     def __init__(self, mainWindow):
  222.         builder = gtk.Builder()
  223.         builder.add_from_file("gui/add_new.xml")
  224.         builder.connect_signals(self)
  225.  
  226.         self.mainWindow = mainWindow
  227.         self.main = builder.get_object("window1")
  228.         self.boxname = builder.get_object('entry1')
  229.         self.ipaddr = builder.get_object('entry2')
  230.         self.bipaddr = builder.get_object('entry3')
  231.         self.usr = builder.get_object('entry4')
  232.         self.usr.set_text('root')
  233.         self.pas = builder.get_object('entry5')
  234.         self.spas = builder.get_object('entry7')
  235.         self.cport = builder.get_object('entry8')
  236.         self.cport.set_text('22')
  237.         self.group = builder.get_object('entry6')
  238.         self.group.set_text('default')
  239.         self.su1 = builder.get_object('radiobutton1')
  240.         self.su2 = builder.get_object('radiobutton2')
  241.         self.d1 = builder.get_object('radiobutton3')
  242.         self.d2 = builder.get_object('radiobutton4')
  243.         self.c1 = builder.get_object('radiobutton5')
  244.         self.c2 = builder.get_object('radiobutton6')
  245.         self.main.show()
  246.  
  247.     def click_port(self, *dummy):
  248.         return
  249.  
  250.     def on_ssh_change(self, *dummy):
  251.         if self.c1.get_active():
  252.             self.cport.set_text('23')
  253.         elif self.c2.get_active():
  254.             self.cport.set_text('22')
  255.  
  256.  
  257.     def click_add(self, *dummy):
  258.         self.pas_val = self.pas.get_text()
  259.         self.usr_val = self.usr.get_text()
  260.         self.spas_val = self.spas.get_text()
  261.         self.group_val = self.group.get_text()
  262.         self.cport_val = self.cport.get_text()
  263.         self.ipaddr_val = self.ipaddr.get_text()
  264.         self.boxname_val = self.boxname.get_text()
  265.         self.bipaddr_val = self.bipaddr.get_text()
  266.  
  267.         if len(self.spas_val) < 1:
  268.             self.spas_val = '0'
  269.  
  270.         if self.c1.get_active():
  271.             self.suv = True
  272.         else:
  273.             self.suv = False
  274.  
  275.         if self.d1.get_active():
  276.             self.dev = 'server'
  277.         else:
  278.             self.dev = 'switch'
  279.  
  280.         if self.c1.get_active():
  281.             self.ctype = 'ssh'
  282.         else:
  283.             self.ctype = 'telnet'
  284.  
  285.         _sql = """INSERT INTO xpqt(boxname, ipaddr, bipaddr, usr, pas, su,
  286.                         supas, cport, conntype, dtype, grp)
  287.                 VALUES ('%s', '%s', '%s', '%s', '%s', '%s',
  288.                     '%s', '%s', '%s', '%s', '%s');""" % (
  289.                     self.boxname_val, self.ipaddr_val, self.bipaddr_val,
  290.                     self.usr_val, pswd(self.pas_val), str(self.suv),
  291.                     pswd(self.spas_val), self.cport_val, self.ctype,
  292.                     self.dev, self.group_val
  293.                 )
  294.         sqls([_sql,])
  295.         self.main.destroy()
  296.  
  297.         return self.mainWindow.click_refresh()
  298.  
  299.     def on_cancel(self, *dummy):
  300.         self.main.destroy()
  301.  
  302. class MainWindow:
  303.     def __init__(self):
  304.         global boxList, swList, \
  305.             mainDict, lastupdate, grpList
  306.         self.ln = None
  307.         self.mainDict = mainDict
  308.         self.boxList = boxList
  309.         self.swList = swList
  310.         self.grpList = grpList
  311.         self.shittyDict = {}
  312.  
  313.         builder = gtk.Builder()
  314.         builder.add_from_file("gui/main.xml")
  315.         builder.connect_signals(self)
  316.         #connect the signals to the callbacks
  317.         #self.main.signal_autoconnect(self)
  318.  
  319.         self.main = builder.get_object("window1")
  320.         self.grp = builder.get_object('treeview1')
  321.         #load the data into a ListStore
  322.         self.tree()
  323.         # Connect button
  324.         self.cbutton = builder.get_object('button1')
  325.         self.cbutton.hide()
  326.         # Labels
  327.         self.proto_label = builder.get_object('label7')
  328.         self.dev_label = builder.get_object('label8')
  329.         self.su_label = builder.get_object('label9')
  330.         self.boxname = builder.get_object('label10')
  331.         self.ipaddr = builder.get_object('label11')
  332.         self.bipaddr = builder.get_object('label12')
  333.         self.clipspace = builder.get_object('label10')
  334.         self.group_label = builder.get_object('label14')
  335.         self.port_label = builder.get_object('label16')
  336.         # Progress bar
  337.         self.pbar = builder.get_object('progressbar1')
  338.         self.pbar.hide()
  339.         # Protocol
  340.         self.protocol = list()
  341.         self.protocol.append(builder.get_object('radiobutton1'))
  342.         self.protocol.append(builder.get_object('radiobutton2'))
  343.         # Device type
  344.         self.dtype = list()
  345.         self.dtype.append(builder.get_object('radiobutton3'))
  346.         self.dtype.append(builder.get_object('radiobutton4'))
  347.         # su
  348.         self.su = list()
  349.         self.su.append(builder.get_object('radiobutton5'))
  350.         self.su.append(builder.get_object('radiobutton6'))
  351.  
  352.         self.shown = False
  353.         # Show main window
  354.         #self.main.show()
  355.  
  356.         self.clipspace.connect('populate-popup', self.clip_me)
  357.         # Catch close ( 'x' ) button
  358.         self.main.connect("delete-event", self.delete_event)
  359.  
  360.     def delete_event(self, *widget):
  361.         self.hide()
  362.         return True
  363.  
  364.     def tree(self):
  365.         global boxList, swList, grpList
  366.  
  367.         for col in self.grp.get_columns():
  368.             self.grp.remove_column(col)
  369.         C_DATA_COLUMN_NUMBER_IN_MODEL = 0
  370.         cell0 = gtk.CellRendererText()
  371.         col0 = gtk.TreeViewColumn("Devices", cell0,
  372.                 text=C_DATA_COLUMN_NUMBER_IN_MODEL)
  373.         self.grp.append_column(col0)
  374.         # set model (i.e. the data it contains. We assume this is not done via glade.)
  375.         store = gtk.TreeStore(gobject.TYPE_STRING)
  376.         store.clear()
  377.         treestore = gtk.TreeStore(str,str)
  378.         treestore.set_sort_column_id(1,gtk.SORT_ASCENDING)
  379.         treestore.clear()
  380.         n = 0
  381.  
  382.         for somegroup in grpList:
  383.             piter = treestore.append(None, [somegroup, None])
  384.             z = 0
  385.             for bx in self.mainDict:
  386.                 if self.mainDict[bx][-1].strip() == somegroup:
  387.                     print bx
  388.                     self.shittyDict[str(str(n) + "_" + str(z))] = bx
  389.                     treestore.append(piter, [bx, None])
  390.                     z += 1
  391.             n += 1
  392.         self.grp.set_model(treestore)
  393.         # set the selection option so that only one row can be selected
  394.         sel = self.grp.get_selection()
  395.         sel.set_mode(gtk.SELECTION_SINGLE)
  396.         # Set reorderable
  397.         self.grp.set_reorderable(False)
  398.  
  399.     def click_settings(self, *dummy):
  400.         SettingsWindow()
  401.  
  402.     def click_save(self, parent):
  403.         if save_backup():
  404.             msg_string = 'Backup file saved.'
  405.             msg_type = gtk.MESSAGE_INFO
  406.         else:
  407.             msg_string = 'Error while saving backup file:\n%s' % bfile
  408.             msg_type = gtk.MESSAGE_ERROR
  409.  
  410.         mw = gtk.MessageDialog(
  411.             parent = None,
  412.             flags = 0,
  413.             type = msg_type,
  414.             buttons = gtk.BUTTONS_CLOSE,
  415.             message_format = msg_string)
  416.         mw.show()
  417.         mw.connect('response', self.resp)
  418.  
  419.     def resp(self, dummy, dummy2):
  420.         dummy.destroy()
  421.  
  422.     def click_remove(self, widget, response_id):
  423.         try: self.ln.split()[0]
  424.         except: pass
  425.         if response_id == gtk.RESPONSE_OK:
  426.             _sql = "DELETE FROM xpqt WHERE boxname = '%s';" % self.ln.split()[0]
  427.             sqls([_sql,])
  428.             widget.hide()
  429.         else: widget.hide()
  430.         self.click_refresh()
  431.  
  432.     # POP UP callback
  433.     def popup(self, button, data=None):
  434.         dialog = gtk.MessageDialog(
  435.         parent         = None,
  436.         flags          = gtk.DIALOG_DESTROY_WITH_PARENT,
  437.         type           = gtk.MESSAGE_INFO,
  438.         buttons        = gtk.BUTTONS_OK_CANCEL,
  439.         message_format = "Remove '%s' from sql db?" % self.ln.split()[0])
  440.         dialog.set_title('Delete box')
  441.         dialog.connect('response', self.click_remove)
  442.         dialog.show()
  443.  
  444.     def click_info(self, *dummy):
  445.         InfoWindow(self.mainDict, self.boxList, self.swList)
  446.  
  447.     def click_about(self, *dummy):
  448.         AboutWindow()
  449.  
  450.     def show(self):
  451.         self.shown = True
  452.         self.main.present()
  453.         self.main.activate_focus()
  454.         self.main.set_focus(self.grp)
  455.  
  456.     def click_hide(self, *dummy):
  457.         self.hide()
  458.  
  459.     def hide(self):
  460.         self.shown = False
  461.         self.main.hide()
  462.  
  463.     def get_shown(self):
  464.         return self.shown
  465.  
  466.     def on_col_change(self, pos):
  467.         pos = self.grp.get_cursor()[0]
  468.         try:
  469.             if len(pos) == 1:
  470.                 self.cbutton.hide()
  471.                 self.boxname.set_text('')
  472.                 self.ipaddr.set_text('')
  473.                 self.bipaddr.set_text('')
  474.                 self.su_label.set_text('')
  475.                 self.dev_label.set_text('')
  476.                 self.port_label.set_text('')
  477.                 self.proto_label.set_text('')
  478.                 self.group_label.set_text('')
  479.                 return
  480.             else:
  481.                 print pos[0], pos[1]
  482.                 ln = self.shittyDict[str(pos[0]) + "_" + str(pos[1])]
  483.                 print ln
  484.         except:
  485.             return
  486.  
  487.         self.cbutton.show()
  488.         self.cbutton.set_size_request(250,25)
  489.         self.grp.set_size_request(250,200)
  490.         self.boxname.set_text(ln.strip())
  491.         self.ipaddr.set_text(self.mainDict[ln][0])
  492.         self.bipaddr.set_text(self.mainDict[ln][1])
  493.         self.dev_label.set_text(self.mainDict[ln][4])
  494.         self.port_label.set_text(self.mainDict[ln][9])
  495.         self.proto_label.set_text(self.mainDict[ln][6])
  496.         self.group_label.set_text(self.mainDict[ln][-1].strip())
  497.         if self.mainDict[ln][5].upper() == 'TRUE':
  498.             self.su_label.set_text('Yes')
  499.         else:
  500.             self.su_label.set_text('No')
  501.  
  502.         self.ln = ln
  503.         azz = self.grp.get_selection()
  504.  
  505.     def click_add(self, dummy):
  506.         AddWindow(self)
  507.  
  508.     def click_edit(self, dummy):
  509.         EditWindow(self.ln, self, self.mainDict)
  510.  
  511.     def click_refresh(self, *dummy):
  512.         self.mainDict, self.swList, self.boxList = get_list()
  513.         self.tree()
  514.  
  515.     def clip_me(self, *dummy):
  516.         # set the clipboard text data
  517.         clipboard.set_text(dpswd(self.mainDict[self.ln][3].strip()))
  518.         # make our data available to other applications
  519.         clipboard.store()
  520.  
  521.     def on_quit(self, *dummy):
  522.         self.main.destroy()
  523.  
  524.     def on_conn(self, *dummy):
  525.         try: _cmd = """gnome-terminal -t %s \
  526.                 -e "/opt/gxpqt/xpqt %s %s %s %s %s %s %s %s" & """ % (
  527.                                 self.ln.strip(), self.ipaddr.get_text(),
  528.                                 self.bipaddr.get_text(), self.mainDict[self.ln][2],
  529.                                 self.mainDict[self.ln][3], self.mainDict[self.ln][9],
  530.                                 self.proto_label.get_text(), self.dev_label.get_text(),
  531.                                 self.mainDict[self.ln][7]
  532.                                 )
  533.         except: return
  534.         #print _cmd
  535.         subprocess.call(_cmd, shell=True)
  536.  
  537.     def on_connect(self, *dummy):
  538.         try: _cmd = """gnome-terminal -t %s \
  539.                 -e "/opt/gxpqt/xpqt %s %s %s %s %s %s %s %s" & """ % (
  540.                                 self.ln.strip(), self.ipaddr.get_text(),
  541.                                 self.bipaddr.get_text(), self.mainDict[self.ln][2],
  542.                                 self.mainDict[self.ln][3], self.mainDict[self.ln][9],
  543.                                 self.proto_label.get_text(), self.dev_label.get_text(),
  544.                                 self.mainDict[self.ln][7]
  545.                                 )
  546.         except: return
  547.         #print _cmd
  548.         subprocess.call(_cmd, shell=True)
  549.  
  550.  
  551. class PyApp(gtk.Window):
  552.     def __init__(self):
  553.         super(PyApp, self).__init__()
  554.  
  555.         self.set_size_request(250, 100)
  556.         self.set_position(gtk.WIN_POS_CENTER)
  557.         self.connect("destroy", gtk.main_quit)
  558.         self.set_title("Message dialogs")
  559.  
  560.         erro = gtk.Button("Error")
  561.         erro.connect("clicked", self.on_erro)
  562.         self.show_all()
  563.  
  564.     def on_erro(self, widget):
  565.         md = gtk.MessageDialog(self,
  566.             gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR,
  567.             gtk.BUTTONS_CLOSE, "Error loading file")
  568.         md.run()
  569.         md.destroy()
  570.  
  571.  
  572. class StatusIcc:
  573.     # active callback
  574.     def activate(self, widget, data=None):
  575.         if self.app.get_shown():
  576.             self.app.hide()
  577.         else: self.app.show()
  578.  
  579.     # Show_Hide callback
  580.     def show_hide(self, widget, response_id, data=None):
  581.         if response_id == gtk.RESPONSE_YES:
  582.             widget.hide()
  583.         else:
  584.             widget.hide()
  585.  
  586.     # Destroy callback
  587.     def destroyer(self, widget, response_id, data=None):
  588.         if response_id == gtk.RESPONSE_OK:
  589.             gtk.main_quit()
  590.         else:
  591.             widget.hide()
  592.  
  593.     # POP UP callback
  594.     def popup(self, button, widget, data=None):
  595.         dialog = gtk.MessageDialog(
  596.         parent         = None,
  597.         flags          = gtk.DIALOG_DESTROY_WITH_PARENT,
  598.         type           = gtk.MESSAGE_WARNING,
  599.         buttons        = gtk.BUTTONS_OK_CANCEL,
  600.         message_format = "Do you want to quit GUIxqpt?")
  601.         dialog.set_title('Quit GUIxpqt')
  602.         dialog.connect('response', self.destroyer)
  603.         dialog.show()
  604.  
  605.     # bind hotkey
  606.     def hotkey(self, user_data):
  607.         if self.app.get_shown():
  608.             self.app.hide()
  609.         else: self.app.show()
  610.  
  611.     def __init__(self):
  612.         # create a new Status Icon
  613.         self.app = MainWindow()
  614.         self.shown = False
  615.         self.staticon = gtk.StatusIcon()
  616.         self.staticon.set_from_stock(gtk.STOCK_QUIT)
  617.         self.staticon.set_blinking(False)
  618.         self.staticon.connect("activate", self.activate)
  619.         self.staticon.connect("popup_menu", self.popup)
  620.         self.staticon.set_visible(True)
  621.         self.keystr = '<Super>X'
  622.         keybinder.bind(self.keystr, self.hotkey, 'Keystring %s' % self.keystr)
  623.  
  624.  
  625. def pswd(n):
  626.     if len(n) == 0:
  627.         return ''
  628.     n = n.encode('hex')
  629.     _t = int(len(n) / int('2'))
  630.     _t1 = int(len(n) - int('1'))
  631.     _n1 = n[_t:]
  632.     _n2 = n[:_t]
  633.     n = '%s%s' % (_n1, _n2)
  634.     n = '%s%s' % (n[:_t1], n[_t1])
  635.     return n
  636.  
  637. def dpswd(n):
  638.     try:
  639.         if len(n) == 0:
  640.             return ''
  641.         n = '%s' % n
  642.         _t = int(len(n) / int('2'))
  643.         _t1 = int(len(n) - int('1'))
  644.         _n1 = n[_t:]
  645.         _n2 = n[:_t]
  646.         n = '%s%s' % (_n1, _n2)
  647.         n = '%s%s' % (n[:_t1], n[_t1])
  648.         n = n.decode('hex')
  649.         return n
  650.     except: return n
  651.  
  652.  
  653. def save_backup():
  654.     global mainDict, bfile
  655.  
  656.     try: backf = open(bfile, 'w')
  657.     except:
  658.         print 'Unable to open backup file.'
  659.         return False
  660.     pickle.dump(mainDict, backf)
  661.     backf.close()
  662.     try: save_settings()
  663.     except: False
  664.     return True
  665.  
  666.  
  667. def save_settings():
  668.     global hotkey, bfile, dbname
  669.     global dbhost, dbuser, dbpass
  670.  
  671.     content = """[global]
  672. # Global hotkey
  673. # <Super> - Windows key
  674. # <Ctrl>  - Control key
  675. # <Alt>   - Alt key
  676. hotkey = %s
  677.  
  678. # Load data
  679. # Use:
  680. #  file - to load from file
  681. #  db   - to load from database
  682. load_from = db
  683.  
  684. # Backup file
  685. backup_file = %s
  686. last_backup = %s
  687.  
  688. [database]
  689. # Database connection
  690. name = %s
  691. host = %s
  692. user = %s
  693. pass = %s
  694.  
  695. """ % (hotkey, bfile, str(time.ctime()),
  696.     dbname, dbhost, dbuser, dbpass)
  697.  
  698.     try: cfile = open(confFile, 'w')
  699.     except:
  700.         print 'Unable to open config file!'
  701.         return False
  702.     cfile.write(content)
  703.     cfile.close()
  704.     return True
  705.  
  706. def sqls(mList):
  707.     global dbhost, dbuser
  708.     global dbname, dbpass
  709.  
  710.     try:
  711.         pgconn = pg.connect(
  712.                 dbname=dbname, host=dbhost,
  713.                 user=dbuser, passwd=dbpass
  714.                     )
  715.     except:
  716.         print 'Unable to connect to pgsql'
  717.         return False
  718.  
  719.     for _ in mList:
  720.         pgconn.query(_)
  721.  
  722.     pgconn.close()
  723.     return True
  724.  
  725. def get_flist():
  726.     global bfile, mainDict
  727.     mainDict = dict()
  728.  
  729.     try: of = open(bfile)
  730.     except:
  731.         print 'Unable to open backup file.'
  732.         sys.exit(-1)
  733.     try: mainDict = pickle.load(of)
  734.     except:
  735.         print 'Error while loading data from file.'
  736.         sys.exit(-1)
  737.     of.close()
  738.  
  739.     swList = list()
  740.     boxList = list()
  741.     for _element in mainDict:
  742.         if mainDict[_element][4].strip() == 'server':
  743.             boxList.append(_element)
  744.         elif mainDict[_element][4].strip() == 'switch':
  745.             swList.append(_element)
  746.     return mainDict, swList, boxList
  747.  
  748. def get_list():
  749.     global dbhost, dbname
  750.     global dbuser, dbpass
  751.  
  752.     try:
  753.         pgconn = pg.connect(
  754.                 dbname=dbname, host=dbhost,
  755.                 user=dbuser, passwd=dbpass
  756.             )
  757.     except:
  758.         print 'Unable to connect to pgsql'
  759.         return False
  760.  
  761.     gL = {}; mD = {}
  762.     bL = []; swL = []
  763.  
  764.     for _ in pgconn.query("SELECT * FROM xpqt ORDER BY grp,boxname;").dictresult():
  765.         boxname = '%(boxname)s' % _
  766.         bipaddr = '%(bipaddr)s' % _
  767.         ctype = '%(conntype)s' % _
  768.         ipaddr = '%(ipaddr)s' % _
  769.         dtype = '%(dtype)s' % _
  770.         cport = '%(cport)s' % _
  771.         supas = '%(supas)s' % _
  772.         susr = '%(suusr)s' % _
  773.         usr = '%(usr)s' % _
  774.         pas = '%(pas)s' % _
  775.         grp = '%(grp)s' % _
  776.         su = '%(su)s' % _
  777.  
  778.         if dtype == 'switch':
  779.             swL.append(boxname.strip())
  780.         elif dtype == 'server':
  781.             bL.append(boxname.strip())
  782.         mD[boxname.strip()] = (ipaddr, bipaddr, usr, pas, dtype,
  783.                 su, ctype, supas, dtype, cport, susr, grp)
  784.         if not grp.strip() in gL:
  785.             gL[grp.strip()] = list()
  786.             gL[grp.strip()].append(boxname.strip())
  787.         print _
  788.  
  789.     try:
  790.         pgconn.close()
  791.     except:
  792.         pass
  793.  
  794.     return mD, swL, bL, gL
  795.  
  796. # get the clipboard
  797. clipboard = gtk.clipboard_get()
  798. # Read config file
  799. config = ConfigParser.ConfigParser()
  800. config.read(confFile)
  801. hotkey = config.get("global", "hotkey")
  802. bfile = config.get("global", "backup_file")
  803. lback = config.get("global", "last_backup")
  804. lfrom = config.get("global", "load_from")
  805. dbhost = config.get("database", "host")
  806. dbname = config.get("database", "name")
  807. dbuser = config.get("database", "user")
  808. dbpass = config.get("database", "pass")
  809.  
  810. mainDict = dict()
  811. boxList = list()
  812. swList = list()
  813. grpList = list()
  814.  
  815. if lfrom == 'pgsql':
  816.     lastupdate = time.ctime()
  817.     mainDict, swList, boxList, grpList = get_list()
  818. else:
  819.     lastupdate = '<empty>'
  820.     mainDict, swList, boxList, grpList = get_flist()
  821.  
  822. statusicon = StatusIcc()
  823. gtk.main()
Add Comment
Please, Sign In to add comment