Package iceprod :: Package client :: Package gtk :: Module gtkicetray
[hide private]
[frames] | no frames]

Source Code for Module iceprod.client.gtk.gtkicetray

   1  #!/bin/env python 
   2  # 
   3   
   4  """ 
   5   Main window for GtkIcetraConfig application 
   6   
   7   copyright (c) 2005 the icecube collaboration 
   8   
   9   @version: $Revision: $ 
  10   @date: 2006-02-07T13:17:44 
  11   @author: Juan Carlos Diaz Velez <juancarlos@icecube.wisc.edu> 
  12  """ 
  13   
  14  import sys,os 
  15  import pygtk 
  16  pygtk.require('2.0') 
  17  import gtk 
  18  import gtk.gdk 
  19  import getpass 
  20  import getopt 
  21  import logging 
  22  import cPickle 
  23  import threading 
  24  import logo 
  25  from os.path import expandvars 
  26  from GtkProjects import GtkProjects 
  27  from GtkServices import GtkServices  
  28  from GtkModules  import GtkModules 
  29  from GtkIceProdPre import GtkIceProdPre 
  30  from GtkIceProdPost import GtkIceProdPost 
  31  from GtkFileChooser import * 
  32  from GtkSteering import GtkSteering 
  33  from GtkOFilter import GtkOFilter 
  34  from GtkDAGRel import GtkDAGRel 
  35  from GtkExtern import GtkExtern 
  36  from GtkSteerBatchOpt import GtkSteerBatchOpt 
  37  from GtkSteerDepend import GtkSteerDepend 
  38  from GtkInput import GtkInput 
  39  from gtkrunlist import GtkRunList 
  40  from gtkmetaprojectlist import GtkMetaProjectList 
  41  from iceprod.core.xmlwriter import IceTrayXMLWriter 
  42  from iceprod.core.xmlparser import IceTrayXMLParser 
  43  from iceprod.core.dataclasses import * 
  44  from iceprod.core.paramdb import * 
  45  from iceprod.core.configuration import Config 
  46  from iceprod.client.soaptrayclient import i3SOAPClient 
  47   
  48  logger = logging.getLogger('gtkicetray') 
  49   
  50  #counter to keep track of howmany windows are open 
  51  instances = 0 
  52   
  53   
54 -class GtkConfig:
55 56 _paramuser = None 57 _parampasswd = None 58 _produser = None 59 _prodpasswd = None 60 resume_action = None 61 _windowminwidth = 750 62 _windowminheight = 600 63 _windowmaxwidth = 1150 64 _windowmaxheight = 1000 65 _trayminwidth = 400 66 _trayminheight = 250 67 _traymaxwidth = 800 68 _traymaxheight = 650 69
70 - def RunTest(self):
71 self.test = True
72
73 - def _getprodurl(self):
74 75 if not self.url: 76 if self.cfg.GetValue('URL'): 77 self.url = self.cfg.GetValue('URL').split(',') 78 else: 79 self.url = ['https://condor.icecube.wisc.edu:9080'] 80 return self.url
81
82 - def _setprodurl(self,url):
83 while len(self.url) > 10: self.url.pop() 84 if url in self.url: 85 self.url.pop(self.url.index(url)) 86 self.url.insert(0,url) 87 self.cfg.SetValue('URL',','.join(self.url)) 88 return url
89
90 - def _getproduser(self):
91 if not self._produser: 92 self._produser = self.cfg.GetValue('ConfigDatabaseUser') 93 if not self._produser: 94 self._produser = getpass.getuser() 95 return self._produser
96
97 - def _setproduser(self,user):
98 self._produser = user 99 self.cfg.SetValue('ConfigDatabaseUser',user) 100 return self._produser
101
102 - def _getprodpass(self,reset=False):
103 if reset or not self._prodpasswd: 104 self._prodpasswd = getpass.getpass("Password for '%s': " % self._getproduser() ) 105 return self._prodpasswd
106
107 - def _hasprodpass(self):
108 return self._prodpasswd
109
110 - def _setprodpass(self,passwd):
111 self._prodpasswd = passwd 112 return self._prodpasswd
113
114 - def _getparamserver(self):
115 if not self.pdb_server: 116 self.pdb_server = self.cfg.GetValue('ParameterDatabaseServer') 117 return self.pdb_server
118
119 - def _setparamserver(self,server):
120 self.pdb_server = server 121 self.cfg.SetValue('ParameterDatabaseServer',server) 122 return self.pdb_server
123
124 - def _getprodserver(self):
125 if not self.cdb_server: 126 self.cdb_server = self.parent.cfg.GetValue('ConfigDatabaseServer') 127 return self.cdb_server
128 129
130 - def _setprodserver(self,server):
131 self.cdb_server = server 132 self.cfg.SetValue('ConfigDatabaseServer',server) 133 return self.cdb_server
134 135
136 - def _getparamdb(self):
137 if not self.pdb_name: 138 self.pdb_name = self.cfg.GetValue('ParameterDatabase') 139 return self.pdb_name
140
141 - def _setparamdb(self,db):
142 self.pdb_name=db 143 self.cfg.SetValue('ParameterDatabase',db) 144 return self.pdb_name
145
146 - def _getproddb(self):
147 if not self.cdb_name: 148 self.cdb_name = self.cfg.GetValue('ConfigDatabase') 149 return self.cdb_name
150
151 - def _setproddb(self,db):
152 self.cdb_name=db 153 self.cfg.SetValue('ConfigDatabase',db) 154 return self.cdb_name
155 156
157 - def _getparamuser(self):
158 if not self._paramuser: 159 self._paramuser = self.cfg.GetValue('ParameterDatabaseUser') 160 if not self._paramuser: 161 self._paramuser = getpass.getuser() 162 return self._paramuser
163
164 - def _setparamuser(self,user):
165 self._paramuser = user 166 self.cfg.SetValue('ParameterDatabaseUser',user) 167 return self._paramuser
168
169 - def _getparampass(self,reset=False):
170 if reset or not self._parampasswd: 171 self._parampasswd = getpass.getpass("Password for '%s': " % self._getparamuser() ) 172 return self._parampasswd
173
174 - def _setparampass(self,passwd):
175 self._parampasswd = passwd 176 return self._parampasswd
177
178 - def set_resume_action(self,action):
179 self.resume_action = action
180
181 - def resume_action_callback(self):
182 if self.resume_action: 183 self.resume_action() 184 self.resume_action = None
185
186 - def rotate_book(self, button, notebook):
187 """ 188 This method rotates the position of the tabs 189 """ 190 191 notebook.set_tab_pos((notebook.get_tab_pos()+1) %4) 192 return
193
194 - def tabsborder_book(self, button, notebook):
195 """ 196 Add/Remove the page tabs and the borders 197 """ 198 199 tval = False 200 bval = False 201 if self.show_tabs == False: 202 tval = True 203 if self.show_border == False: 204 bval = True 205 206 notebook.set_show_tabs(tval) 207 self.show_tabs = tval 208 notebook.set_show_border(bval) 209 self.show_border = bval 210 return
211
212 - def remove_book(self, button, notebook):
213 """ 214 Remove a page from the notebook 215 """ 216 page = notebook.get_current_page() 217 notebook.remove_page(page) 218 # Need to refresh the widget -- 219 # This forces the widget to redraw itself. 220 notebook.queue_draw_area(0,0,-1,-1)
221
222 - def delete(self, widget, event=None):
223 self.SaveCookies() 224 self.cfg.Write() 225 self.config = None 226 global instances 227 instances -= 1 228 if instances < 1: gtk.main_quit() 229 return False
230
231 - def GetPathPrefix(self):
232 """ 233 Get prefix path from entry 234 """ 235 if self.steering.GetOF(): 236 self.steering.GetOF().SetPrefix(self.prefixentry.get_text()) 237 return self.steering.GetOF().GetPrefix()
238 239
240 - def saveas(self,widget):
241 """ 242 menu item - Save configuration to file and prompt for filename 243 """ 244 self.savefilechooser = GtkSaveFileChooser(self)
245 246
247 - def savefile(self,widget,configfile=None):
248 """ 249 menu item - Save configuration to file 250 @param widget: gtk widget 251 @param configfile: current name of file 252 """ 253 if not configfile: 254 configfile = self.configfile 255 for tray in self.trays: 256 tray.GetEvents() 257 tray.GetIterations() 258 self.GetPathPrefix() 259 writer = IceTrayXMLWriter(self.steering,add_descriptions=self.showdefaults) 260 writer.write_to_file(configfile)
261
262 - def addtray(self,widget):
263 """ 264 menu item - Add new IceTrayConfig object 265 """ 266 self.steering.AddTray(IceTrayConfig()) 267 self.ReloadWidgets()
268 269
270 - def deltray(self,widget):
271 """ 272 menu item - delete IceTrayConfig object 273 """ 274 # self.steering.AddTray(IceTrayConfig()) 275 page = self.notebook.get_current_page() 276 print page 277 if page > 0: 278 self.steering.RemoveTray(page-1) 279 del self.trays[page-1] 280 self.notebook.remove_page(page) 281 self.ReloadWidgets() 282 else: 283 self.PrintText("No IceTray selected.")
284
285 - def addof(self,widget):
286 """ 287 menu item - Add new OfflineFilter object 288 """ 289 if not self.steering.GetOF(): 290 self.steering.SetOF(OfflineFilter()) 291 self.ReloadWidgets()
292
293 - def addextern(self,widget):
294 """ 295 menu item - Add new External object 296 """ 297 if not self.steering.GetExterns(): 298 self.steering.AddExtern(Extern()) 299 self.ReloadWidgets()
300
301 - def delof(self,widget):
302 """ 303 menu item - delete OfflineFilter object 304 """ 305 if self.steering.GetOF(): 306 self.steering.SetOF(None) 307 self.ReloadWidgets() 308 page = self.steernote.get_current_page() 309 page = self.steernote.get_nth_page(4) 310 self.steernote.remove_page(4) 311 else: 312 self.PrintText("Nothing to remove.")
313
314 - def enable_dragndrop(self,widget):
315 self.dragndrop = not self.dragndrop 316 for tray in self.trays: 317 for widget in tray.mywidgets: 318 print widget, 'dragndrop' 319 widget.SetDragNDrop(self.dragndrop)
320
321 - def enable_defaults(self,widget):
322 self.showdefaults = not self.showdefaults
323 324
325 - def switchversion(self,widget):
326 """ 327 menu item - globally switch metaprojects 328 """ 329 try: 330 self.ReloadWidgets() 331 mlist = GtkMetaProjectList(self.pdb,self) 332 except Exception,e: 333 logger.error(e) 334 pass
335
336 - def open(self,widget):
337 """ 338 menu item - Display Filechooser dialog to load configuration file 339 """ 340 self.openfilechooser = GtkOpenFileChooser(self,self.configfile)
341
342 - def close(self,widget):
343 """ 344 menu item - remove config file 345 """ 346 self.CloseConfig()
347
348 - def new(self,widget):
349 """ 350 menu item - start new config 351 """ 352 if not self.steering: 353 steering = Steering() 354 steering.AddTray(IceTrayConfig()) 355 self.LoadConfig(steering) 356 else: 357 newconfig = GtkConfig(self._produser,self.prodflag,True) 358 newconfig.LoadConfig(Steering())
359 360
361 - def PrintText(self,text,append=True):
362 """ 363 Write text to console window and automatically scroll to end 364 @param text: Text to append to message area 365 """ 366 367 buffer = self.consoletv.get_buffer() 368 if append: 369 try: 370 buffer.insert(buffer.get_end_iter(),text+'\n') 371 self.consoletv.scroll_mark_onscreen(buffer.get_insert()) 372 except Exception,e : 373 logger.error(str(e)) 374 else: 375 try: 376 buffer.set_text(text+'\n') 377 self.consoletv.scroll_mark_onscreen(buffer.get_insert()) 378 except Exception,e : 379 logger.error(str(e)) 380 381 return True
382 383
384 - def submit_form(self,widget):
385 for tray in self.trays: 386 tray.GetEvents() 387 tray.GetIterations() 388 self.GetPathPrefix() 389 check,str = self.steering.CheckConfig() 390 if not check: 391 self.PrintText('Configuration error: %s' % str) 392 return 393 394 if self.prodflag: # Get DIF_Plus metadata info 395 gtkinputwindow = GtkInput(self,self.test,self.templateflag) 396 else: 397 self.submit_auth(self.submit) 398 return
399
400 - def check_server(self,widget):
401 client = i3SOAPClient(geturl=self.geturl) 402 client.SetPrinter(self.PrintText) 403 try: 404 self.PrintText(client.check_server(),append=False) 405 except Exception,e: 406 self.PrintText("failed to connect to server: %s" % e)
407 408
409 - def submit(self):
410 client = i3SOAPClient(geturl=self.geturl) 411 client.SetPrinter(self.PrintText) 412 self.PrintText("submitting request...") 413 414 passwd = self._getprodpass() 415 416 i3q = client.submit( 417 self.steering, 418 self._getproduser(), 419 passwd, 420 self.prodflag) 421 422 if i3q: 423 self.add_job_to_menu(i3q) 424 del client
425 426
427 - def submit_auth(self,func):
428 429 auth_func = lambda x: ( 430 (i3SOAPClient(geturl=self.geturl).authenticate( 431 self._setproduser(username_entry.get_text()), 432 self._setprodpass(password_entry.get_text())) \ 433 and (func(), auth_dialog.destroy() ) 434 or error_label.set_text("Failed.."))) 435 436 auth_dialog = gtk.Dialog(title='authentication', parent=None, flags=0 ); 437 error_label = gtk.Label() 438 error_label.show() 439 440 username_label = gtk.Label("Username:") 441 username_label.show() 442 443 username_entry = gtk.Entry() 444 username_entry.set_text(self._getproduser()) 445 username_entry.show() 446 447 password_label = gtk.Label("Password:") 448 password_label.show() 449 450 password_entry = gtk.Entry() 451 password_entry.set_visibility(False) 452 if self._hasprodpass(): 453 password_entry.set_text(self._getprodpass()) 454 password_entry.show() 455 password_entry.connect("activate", auth_func) 456 457 cancel_button = gtk.Button('Cancel') 458 cancel_button.show() 459 cancel_button.connect("clicked", lambda widget: \ 460 self.PrintText("cancelled.") and auth_dialog.destroy()) 461 462 submit_button = gtk.Button('Submit') 463 submit_button.show() 464 submit_button.connect("clicked", auth_func) 465 466 auth_dialog.vbox.pack_start(error_label, True, True, 0) 467 auth_dialog.vbox.pack_start(username_label, True, True, 0) 468 auth_dialog.vbox.pack_start(username_entry, True, True, 0) 469 auth_dialog.vbox.pack_start(password_label, True, True, 0) 470 auth_dialog.vbox.pack_start(password_entry, True, True, 0) 471 auth_dialog.action_area.pack_start(cancel_button, True, True, 0) 472 auth_dialog.action_area.pack_start(submit_button, True, True, 0) 473 auth_dialog.show()
474 475
476 - def pdbauth(self,db,onfailure=None,args=()):
477 478 auth_dialog = gtk.Dialog(title='authentication', parent=None, flags=0 ); 479 480 username_label = gtk.Label("Username:") 481 username_label.show() 482 483 username_entry = gtk.Entry() 484 username_entry.set_text(self._getparamuser()) 485 username_entry.show() 486 487 password_label = gtk.Label("Password:") 488 password_label.show() 489 490 password_entry = gtk.Entry() 491 password_entry.set_visibility(False) 492 password_entry.show() 493 494 server_label = gtk.Label("Server:") 495 server_entry = gtk.Entry() 496 if self._getparamserver(): 497 server_entry.set_text(self._getparamserver()) 498 server_label.show() 499 server_entry.show() 500 501 database_label = gtk.Label("Database:") 502 database_entry = gtk.Entry() 503 if self._getparamdb(): 504 database_entry.set_text(self._getparamdb()) 505 database_label.show() 506 database_entry.show() 507 508 cancel_button = gtk.Button('Cancel') 509 cancel_button.show() 510 cancel_button.connect("clicked", lambda widget: auth_dialog.destroy()) 511 512 submit_button = gtk.Button('OK') 513 submit_button.show() 514 515 authfunc = lambda x: (db.authenticate( 516 self._setparamserver(server_entry.get_text()), 517 self._setparamuser(username_entry.get_text()), 518 self._setparampass(password_entry.get_text()), 519 self._setparamdb(database_entry.get_text()), 520 True) , 521 auth_dialog.destroy(), 522 self.resume_action_callback(), 523 onfailure and apply(onfailure,args)) 524 525 username_entry.connect("activate", authfunc) 526 password_entry.connect("activate", authfunc) 527 server_entry.connect("activate", authfunc) 528 database_entry.connect("activate", authfunc) 529 submit_button.connect("clicked", authfunc) 530 531 532 auth_dialog.vbox.pack_start(username_label, True, True, 0) 533 auth_dialog.vbox.pack_start(username_entry, True, True, 0) 534 auth_dialog.vbox.pack_start(password_label, True, True, 0) 535 auth_dialog.vbox.pack_start(password_entry, True, True, 0) 536 auth_dialog.vbox.pack_start(server_label, True, True, 0) 537 auth_dialog.vbox.pack_start(server_entry, True, True, 0) 538 auth_dialog.vbox.pack_start(database_label, True, True, 0) 539 auth_dialog.vbox.pack_start(database_entry, True, True, 0) 540 auth_dialog.action_area.pack_start(cancel_button, True, True, 0) 541 auth_dialog.action_area.pack_start(submit_button, True, True, 0) 542 auth_dialog.show()
543
544 - def add_job_to_menu(self,job):
545 jobs_item = gtk.MenuItem("Run " + str(job.GetClusterId())) 546 new_job_menu = gtk.Menu() 547 jobs_item.set_submenu(new_job_menu) 548 549 check_job_item = gtk.MenuItem("Check status") 550 check_job_item.connect("activate",self.check_job,job) 551 new_job_menu.append(check_job_item) 552 check_job_item.show() 553 554 terminate_job_item = gtk.MenuItem("Terminate") 555 terminate_job_item.connect("activate",self.remove_job,job) 556 new_job_menu.append(terminate_job_item) 557 terminate_job_item.show() 558 559 clear_job_item = gtk.MenuItem("Clear job") 560 clear_job_item.connect("activate",self.clear_job,job) 561 new_job_menu.append(clear_job_item) 562 clear_job_item.show() 563 564 jobs_item.show() 565 self.jobs_menu.prepend(jobs_item) 566 self.job_q_list.append((job,jobs_item))
567 568
569 - def run(self,widget,data=None):
570 """ 571 Run job on local computer (where client is running). This 572 requires that your I3_WORK environment is set. 573 """ 574 self.PrintText('Running IceTray on local computer in %s' % os.getenv('I3_WORK') ) 575 self.PrintText('Output is printed to stdout (for now)') 576 self.PrintText('-'*40) 577 threading.Thread(target=self.run_thread).start()
578
579 - def run_thread(self):
580 IceTrayXMLWriter(self.GetSteering()).write_to_file('.tmp.xml') 581 path = expandvars('$I3_BUILD/bin/runconfig.py') 582 cmd = '%s .tmp.xml 2>&1' % path 583 print cmd 584 cout = os.popen(cmd,'r') 585 eline = cout.readline() 586 line = 0 587 buff = "" 588 while eline: 589 if line%30 == 0: 590 self.PrintText(buff) 591 buff = "" 592 buff += "\n" + eline.strip() 593 eline = cout.readline() 594 line += 1 595 cout.close() 596 return
597 598
599 - def clear_jobs(self,widget):
600 for job in self.job_q_list: 601 self.jobs_menu.remove(job[1]) 602 del job 603 self.job_q_list = []
604
605 - def check_job(self,widget,job):
606 """ 607 Request status of job from server 608 @todo: deal with proxy option 609 Note: This might seem like a security risk. One might hack the local 610 version of an I3Queue object to run a different command on the 611 server. However, the the server uses the class definitions from it's 612 own libraries and does not care about the client implementation of 613 this class. 614 """ 615 logger.debug("checking status of job from on host %s" % \ 616 job.url or job.GetHost() ) 617 618 client = i3SOAPClient(geturl=self.geturl) 619 client.SetPrinter(self.PrintText) 620 check_q = lambda:client.check_q(job,self._getproduser(),self._getprodpass()) 621 self.submit_auth(check_q)
622
623 - def remove_job(self,widget,job):
624 """ 625 Request removal of job from queue 626 @todo: deal with proxy option 627 """ 628 logger.info("requesting removal of job from queue on host %s" % \ 629 job.url or job.GetHost() ) 630 631 client = i3SOAPClient(geturl=self.geturl) 632 client.SetPrinter(self.PrintText) 633 q_remove = lambda:client.q_remove(job,self._getproduser(),self._getprodpass()) 634 self.submit_auth(q_remove)
635
636 - def clear_job(self,widget,job):
637 638 for j in range(len(self.job_q_list)): 639 if self.job_q_list[j][0].GetClusterId() == job.GetClusterId(): 640 self.jobs_menu.remove(self.job_q_list[j][1]) 641 del self.job_q_list[j] 642 return
643 644 645 646
647 - def getconfig(self,filename):
648 try: 649 steering = Steering() 650 self.configfile = filename 651 self.parser = IceTrayXMLParser(steering) 652 self.parser.ParseFile(filename,validate=self.validatexml) 653 self.LoadConfig(steering) 654 self.ReloadWidgets() 655 except Exception,e: 656 sys.excepthook(sys.exc_type,sys.exc_value,sys.exc_traceback) 657 logger.error(e)
658
659 - def loadpdbfile(self,widget):
660 try: 661 opendbfilechooser = GtkOpenDBFileChooser(self) 662 except Exception,e: logger.error(e)
663
664 - def updatedb(self,widget):
665 try: 666 self.pdb.download() 667 savedbfilechooser = GtkSaveDBFileChooser(self) 668 except Exception,e: 669 logger.debug(e) 670 pass
671
672 - def docupage(self,widget):
673 try: 674 import webbrowser 675 webbrowser.open("http://wiki.icecube.wisc.edu/index.php/IceProd") 676 except Exception,e: 677 logger.debug(e) 678 pass
679
680 - def download(self,widget):
681 try: 682 client = i3SOAPClient(geturl=self.geturl) 683 client.SetPrinter(self.PrintText) 684 self.runlist = GtkRunList(client,self) 685 except Exception,e: 686 logger.error(e) 687 sys.excepthook(sys.exc_type,sys.exc_value,sys.exc_traceback) 688 pass
689
690 - def SetConfigFile(self,cfile):
691 self.configfile = cfile
692
693 - def GetConfigFile(self):
694 return self.configfile
695
696 - def SetSteering(self,steering):
697 self.steering = steering
698 699
700 - def GetIceTrayConfig(self,index=0):
701 return self.steering.GetTrays()[index]
702
703 - def GetSteering(self):
704 return self.steering
705
706 - def reload_widget(self,tab,event,widget):
707 widget.reload(self.steering)
708
709 - def ReloadWidgets(self):
710 for w in self.mywidgets: 711 w.reload(self.steering) 712 713 for t in range(max(0,len(self.steering.GetTrays())), 714 max(0,len(self.trays))): 715 self.notebook.remove_page(t+1) 716 717 for t in range(len(self.steering.GetTrays())): 718 if t < len(self.trays): 719 self.trays[t].reload(self.steering.GetTray(t)) 720 if len(self.trays) > 1: 721 self.notebook.set_tab_label_text(self.trays[t], 722 "IceTray[%d]" % t ) 723 else: 724 self.notebook.set_tab_label_text(self.trays[t], "IceTray") 725 else: 726 self.AddTrayTab(self.steering.GetTray(t)) 727 728 if self.steering.GetOF(): 729 self.AddFilterTab(self.steering)
730 731 732
733 - def LoadCookies(self,cfg=os.path.join(os.getenv('HOME'),".gtkicetray_cookies")):
734 try: 735 cfile = open(cfg); 736 joblist = cPickle.load(cfile) 737 738 for job in joblist: 739 self.add_job_to_menu(job) 740 except Exception, e: 741 self.PrintText(str(e)) 742 pass # don't care if there aren't any cookies
743
744 - def SaveCookies(self,cfg=os.path.join(os.getenv('HOME'),".gtkicetray_cookies")):
745 try: 746 jobs = [job for job,job_entry in self.job_q_list] 747 cfile = open(cfg,'w'); 748 cPickle.dump(jobs,cfile) 749 except Exception,e: 750 logger.warn("could not save cookies: %s" % e)
751
752 - def SaveXMLpdb(self):
753 try: 754 self.pdb.savefile(expandvars("$HOME/.gtktray-paramdb")) 755 except Exception,e: 756 logger.warn("could not save parameter db: %s" % e)
757
758 - def MakeToolbar(self):
759 toolbar = gtk.Toolbar() 760 toolbar.set_orientation(gtk.ORIENTATION_HORIZONTAL) 761 toolbar.set_style(gtk.TOOLBAR_ICONS) 762 763 run_icon = gtk.Image() 764 run_icon.set_from_stock(gtk.STOCK_EXECUTE,gtk.ICON_SIZE_SMALL_TOOLBAR) 765 toolbar.append_element( 766 gtk.TOOLBAR_CHILD_RADIOBUTTON, # type of element 767 None, # widget 768 "Run","Run","",run_icon, 769 self.run, # signal 770 toolbar) # data for signal 771 772 stop_icon = gtk.Image() 773 stop_icon.set_from_stock(gtk.STOCK_STOP,gtk.ICON_SIZE_SMALL_TOOLBAR) 774 toolbar.append_element( 775 gtk.TOOLBAR_CHILD_RADIOBUTTON, # type of element 776 None, # widget 777 "Stop","Stop","",stop_icon, 778 None, # signal 779 toolbar) # data for signal 780 781 toolbar.show() 782 handlebox = gtk.HandleBox() 783 handlebox.add(toolbar) 784 785 return handlebox
786
787 - def MakeMenu(self):
788 """ 789 Create menubar and add menu items 790 """ 791 792 menu_bar = gtk.MenuBar() 793 794 file_menu = gtk.Menu() 795 file_menu.show() 796 797 file_menu_item = gtk.MenuItem("_File") 798 file_menu_item.show() 799 file_menu_item.set_submenu(file_menu) 800 menu_bar.append(file_menu_item) 801 802 edit_menu = gtk.Menu() 803 edit_menu.show() 804 self.edit_menu = edit_menu 805 806 edit_menu_item = gtk.MenuItem("_Edit") 807 edit_menu_item.show() 808 edit_menu_item.set_submenu(edit_menu) 809 menu_bar.append(edit_menu_item) 810 811 addtray_item = gtk.MenuItem("add tray") 812 addtray_item.connect("activate",self.addtray) 813 addtray_item.show() 814 edit_menu.append(addtray_item) 815 816 deltray_item = gtk.MenuItem("remove tray") 817 deltray_item.connect("activate",self.deltray) 818 deltray_item.show() 819 edit_menu.append(deltray_item) 820 821 addof_item = gtk.MenuItem("add filter description") 822 addof_item.connect("activate",self.addof) 823 addof_item.show() 824 edit_menu.append(addof_item) 825 826 delof_item = gtk.MenuItem("remove filter description") 827 delof_item.connect("activate",self.delof) 828 delof_item.show() 829 edit_menu.append(delof_item) 830 831 jobs_menu = gtk.Menu() 832 jobs_menu.show() 833 self.jobs_menu = jobs_menu 834 835 jobs_menu_item = gtk.MenuItem("_Jobs") 836 jobs_menu_item.show() 837 jobs_menu_item.set_submenu(jobs_menu) 838 menu_bar.append(jobs_menu_item) 839 self.LoadCookies() 840 841 tools_menu = gtk.Menu() 842 tools_menu.show() 843 self.tools_menu = tools_menu 844 845 tools_menu_item = gtk.MenuItem("_Tools") 846 tools_menu_item.show() 847 tools_menu_item.set_submenu(tools_menu) 848 menu_bar.append(tools_menu_item) 849 850 help_menu = gtk.Menu() 851 help_menu.show() 852 self.help_menu = help_menu 853 854 help_menu_item = gtk.MenuItem("_Help") 855 help_menu_item.show() 856 help_menu_item.set_submenu(help_menu) 857 menu_bar.append(help_menu_item) 858 859 documentation_item = gtk.MenuItem("IceProd _Documentation") 860 documentation_item.connect("activate",self.docupage) 861 documentation_item.show() 862 help_menu.append(documentation_item) 863 864 open_item = gtk.MenuItem("_Open...") 865 open_item.connect("activate",self.open) 866 open_item.show() 867 file_menu.append(open_item) 868 869 new_item = gtk.MenuItem("_New") 870 new_item.connect("activate",self.new) 871 new_item.show() 872 file_menu.append(new_item) 873 874 close_item = gtk.MenuItem("_Close") 875 close_item.connect("activate",self.close) 876 close_item.show() 877 file_menu.append(close_item) 878 879 download_item = gtk.MenuItem("_Download...") 880 download_item.connect("activate",self.download) 881 download_item.show() 882 file_menu.append(download_item) 883 884 save_item = gtk.MenuItem("_Save") 885 save_item.connect("activate",self.savefile) 886 save_item.show() 887 file_menu.append(save_item) 888 889 saveas_item = gtk.MenuItem("Save _As...") 890 saveas_item.connect("activate",self.saveas) 891 saveas_item.show() 892 file_menu.append(saveas_item) 893 894 submit_item = gtk.MenuItem("Submit _Dataset") 895 submit_item.connect("activate",self.submit_form) 896 submit_item.show() 897 file_menu.append(submit_item) 898 899 run_item = gtk.MenuItem("_Run (local)") 900 run_item.connect("activate",self.run) 901 run_item.show() 902 file_menu.append(run_item) 903 904 quit_item = gtk.MenuItem("_Quit") 905 quit_item.connect("activate",self.delete) 906 quit_item.show() 907 file_menu.append(quit_item) 908 909 clear_jobs_item = gtk.MenuItem("_Clear jobs") 910 clear_jobs_item.connect("activate",self.clear_jobs) 911 clear_jobs_item.show() 912 jobs_menu.append(clear_jobs_item) 913 914 updatedb_item = gtk.MenuItem("_Download Parameter DB...") 915 updatedb_item.connect("activate",self.updatedb) 916 updatedb_item.show() 917 tools_menu.append(updatedb_item) 918 919 loadpdb_item = gtk.MenuItem("_Load Parameter DB File...") 920 loadpdb_item.connect("activate",self.loadpdbfile) 921 loadpdb_item.show() 922 tools_menu.append(loadpdb_item) 923 924 upgrade_item = gtk.MenuItem("_Upgrade Metaprojects...") 925 upgrade_item.connect("activate",self.switchversion) 926 upgrade_item.show() 927 tools_menu.append(upgrade_item) 928 929 drag_item = gtk.CheckMenuItem("_Enable drag & drop") 930 drag_item.connect("activate",self.enable_dragndrop) 931 drag_item.show() 932 tools_menu.append(drag_item) 933 934 desc_item = gtk.CheckMenuItem("_Enable Defaults") 935 desc_item.connect("activate",self.enable_defaults) 936 desc_item.show() 937 tools_menu.append(desc_item) 938 939 return menu_bar
940
941 - def get_i3config(self):
942 return self.steering
943
944 - def geturl(self):
945 return self._setprodurl(self.url_entry.get_child().get_text())
946
947 - def __init__(self, user=None,prod=False,auth=True):
948 self.steering = None 949 self.dragndrop = False 950 self.showdefaults = False 951 self.configfile = "newconfig.xml" 952 self.host = None 953 self.url = [] 954 self.job_q_list = [] 955 self._user = user 956 self.prodflag = prod 957 self.templateflag= False 958 self.test = False 959 self.trays = [] 960 self.child_pid = 0 961 self.validatexml = True 962 gtk.gdk.threads_init() 963 964 self.cfg = Config(os.path.join(os.getenv('HOME'),".gtkicetrayrc")) 965 try: 966 self.cfg.Read() 967 except Exception,e: 968 print >> sys.stderr, "Could not find configuration" 969 970 if self.cfg.GetValue('URL'): 971 self.url = self.cfg.GetValue('URL').split(',') 972 else: 973 self.url = [] 974 self.pdb = RPCParamDB(geturl=self.geturl) 975 self.pdb.SetPrinter(self.PrintText) 976 self.mywidgets = [] 977 978 self.consoletv = gtk.TextView() 979 self.consoletv.set_cursor_visible(False) 980 self.consoletv.set_wrap_mode(gtk.WRAP_NONE) 981 self.consoletv.set_editable(False) 982 983 table = gtk.Table(3,6,False) 984 consolesw = gtk.ScrolledWindow() 985 self.vbox = gtk.VBox(False,0) 986 self.vpane = gtk.VPaned() 987 menu_bar = self.MakeMenu() 988 menu_bar.show() 989 self.vbox.pack_start(menu_bar,False,False,2) 990 991 hbox = gtk.HBox(False,1) 992 self.url_entry = gtk.combo_box_entry_new_text() 993 urlframe = gtk.Frame("URL") 994 for url in self._getprodurl(): 995 self.url_entry.append_text(url) 996 self.url_entry.set_active(0) 997 998 urlframe.add(self.url_entry) 999 urlframe.show() 1000 1001 run_icon = gtk.Image() 1002 pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(logo.xpm_image_data) 1003 run_icon.set_from_stock(gtk.STOCK_EXECUTE,gtk.ICON_SIZE_SMALL_TOOLBAR) 1004 #run_icon.set_from_pixbuf(pixbuf.scale_simple(30,30,gtk.gdk.INTERP_TILES)) 1005 run_icon.show() 1006 run_button = gtk.Button('',stock=gtk.STOCK_NETWORK) 1007 #run_button.set_image(run_icon) 1008 run_button.show() 1009 run_button.connect("clicked", self.check_server) 1010 hbox.pack_start(urlframe,True,True,2) 1011 hbox.pack_start(run_button,False,False,2) 1012 hbox.show() 1013 1014 self.url_entry.show() 1015 self.vbox.pack_start(hbox,False,False,2) 1016 1017 self.vbox.pack_end(self.vpane,True,True,2) 1018 self.vpane.pack1(table,True,True) 1019 self.vpane.pack2(consolesw,True,True) 1020 self.vbox.show() 1021 self.vpane.show() 1022 1023 #consolesw.set_size_request(100, 140) 1024 consolesw.add(self.consoletv) 1025 consolesw.show() 1026 self.consoletv.show() 1027 1028 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 1029 global instances 1030 instances += 1 1031 window = self.window 1032 1033 # get screen size 1034 screen = window.get_screen() 1035 screenwidth = screen.get_width() 1036 screenheight = screen.get_height() 1037 if (screenwidth > self._windowmaxwidth+200): 1038 self.windowwidth = self._windowmaxwidth 1039 elif (screenwidth < self._windowminwidth+200): 1040 self.windowwidth = self._windowminwidth 1041 else: 1042 self.windowwidth = screenwidth-200 1043 if (screenheight > self._windowmaxheight+200): 1044 self.windowheight = self._windowmaxheight 1045 elif (screenheight < self._windowminheight+200): 1046 self.windowheight = self._windowminheight 1047 else: 1048 self.windowheight = screenheight-200 1049 self.traywidth = self.windowwidth-350 1050 self.trayheight = self.windowheight-350 1051 1052 # make window 1053 window.connect("delete_event", self.delete) 1054 window.set_border_width(10) 1055 window.set_default_size(self.windowwidth, self.windowheight) 1056 window.add(self.vbox) 1057 window.set_resizable(True) 1058 window.set_position(gtk.WIN_POS_CENTER_ALWAYS) 1059 window.show() 1060 icon = window.render_icon(gtk.STOCK_DIALOG_INFO, gtk.ICON_SIZE_BUTTON) 1061 pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(logo.xpm_image_data) 1062 window.set_icon(pixbuf) 1063 window.show() 1064 1065 # Create a new notebook, place the position of the tabs 1066 self.notebook = gtk.Notebook() 1067 self.notebook.set_tab_pos(gtk.POS_TOP) 1068 table.attach(self.notebook, 0,6,0,1) 1069 self.notebook.show() 1070 self.show_tabs = True 1071 self.show_border = True 1072 table.show()
1073
1074 - def CloseConfig(self):
1075 self.steering = None 1076 for w in self.mywidgets: del w 1077 self.mywidgets = [] 1078 self.trays = [] 1079 while self.notebook.get_current_page() >= 0: 1080 self.notebook.remove_page(self.notebook.get_current_page())
1081
1082 - def LoadConfig(self,steering):
1083 # Steering 1084 self.CloseConfig() 1085 self.steering = steering 1086 label = gtk.Label("Steering") 1087 self.steernote = gtk.Notebook() 1088 self.steernote.show() 1089 self.notebook.append_page(self.steernote, label) 1090 1091 frame = gtk.Frame("Steering") 1092 frame.set_border_width(10) 1093 #frame.set_size_request(self.traywidth, self.trayheight) 1094 frame.show() 1095 1096 label = gtk.Label("Parameters") 1097 label.show() 1098 gtksteering = GtkSteering(self.steering) 1099 frame.add(gtksteering) 1100 self.mywidgets.append(gtksteering) 1101 self.steernote.append_page(frame, label) 1102 1103 # Steering - batch options 1104 frame = gtk.Frame("Archive Dependencies") 1105 frame.set_border_width(10) 1106 #frame.set_size_request(self.traywidth, self.trayheight) 1107 frame.show() 1108 1109 label = gtk.Label("Dependencies") 1110 label.show() 1111 gtksteerdepend = GtkSteerDepend(self.steering) 1112 frame.add(gtksteerdepend) 1113 self.mywidgets.append(gtksteerdepend) 1114 self.steernote.append_page(frame, label) 1115 1116 # Steering - batch options 1117 frame = gtk.Frame("Batch System Options") 1118 frame.set_border_width(10) 1119 #frame.set_size_request(self.traywidth, self.trayheight) 1120 frame.show() 1121 1122 label = gtk.Label("BatchOpts") 1123 label.show() 1124 gtkbatchopts = GtkSteerBatchOpt(self.steering) 1125 frame.add(gtkbatchopts) 1126 self.mywidgets.append(gtkbatchopts) 1127 self.steernote.append_page(frame, label) 1128 1129 # Steering - Externs 1130 frame = gtk.Frame("Externals") 1131 frame.set_border_width(10) 1132 #frame.set_size_request(self.traywidth, self.trayheight) 1133 frame.show() 1134 label = gtk.Label("Externals") 1135 label.show() 1136 gtkextern = GtkExtern(self.steering) 1137 frame.add(gtkextern) 1138 self.mywidgets.append(gtkextern) 1139 self.steernote.append_page(frame, label) 1140 1141 if self.steering.GetOF(): 1142 self.AddFilterTab(self.steering) 1143 1144 for tray in self.steering.GetTrays(): 1145 self.AddTrayTab(tray) 1146 1147 #if steering.GetTaskDefinitions(): 1148 # self.AddTaskTab(self.steering) 1149 1150 # Set what page to start at (page 0) 1151 self.notebook.set_current_page(0) 1152 1153 # Create a bunch of buttons 1154 button = gtk.Button("close") 1155 button.connect("clicked", self.delete) 1156 button.show()
1157 1158
1159 - def AddTrayTab(self,tray):
1160 """ 1161 Add a new icetray configuration tab 1162 @param tray: the new IceTrayConfig object 1163 """ 1164 # Tray 1165 gtktray = GtkIceTray(tray,self.pdb,self.traywidth, 1166 self.trayheight,self.windowwidth-100, 1167 self.windowheight-100) 1168 gtktray.SetPrinter(self.PrintText) 1169 gtktray.show() 1170 label = gtk.Label() 1171 self.notebook.append_page(gtktray, label) 1172 label.set_text("IceTray[%d]" % len(self.trays) ) 1173 label.show() 1174 self.trays.append(gtktray)
1175
1176 - def AddFilterTab(self,steering):
1177 hbox = gtk.HBox() 1178 fbox = gtk.VBox() 1179 self.prefixentry = EventEntry("Prefix") 1180 label = gtk.Label("Prefix") 1181 self.prefixentry.set_reload_function(steering.GetOF().GetPrefix) 1182 self.prefixentry.set_text(str(steering.GetOF().GetPrefix())) 1183 self.prefixentry.show() 1184 hbox.pack_start(self.prefixentry,False,False,2) 1185 fbox.pack_start(hbox,False,False,2) 1186 hbox.show() 1187 1188 frame = gtk.Frame("OfflineFilter") 1189 frame.set_border_width(10) 1190 #frame.set_size_request(self.traywidth, self.trayheight) 1191 frame.show() 1192 fbox.pack_start(frame) 1193 fbox.show() 1194 1195 if not steering.GetOF(): steering.SetOF(OfflineFilter()) 1196 label = gtk.Label("OfflineFilter") 1197 label.show() 1198 gtkof = GtkOFilter(steering) 1199 frame.add(gtkof) 1200 self.mywidgets.append(gtkof) 1201 self.steernote.append_page(fbox, label)
1202
1203 - def AddTaskTab(self,steering):
1204 fbox = gtk.VBox() 1205 frame = gtk.Frame("TaskRel") 1206 frame.set_border_width(10) 1207 #frame.set_size_request(self.traywidth, self.trayheight) 1208 frame.show() 1209 fbox.pack_start(frame) 1210 fbox.show() 1211 1212 label = gtk.Label("TaskRel") 1213 label.show() 1214 gtk_tasks = GtkDAGRel(steering) 1215 frame.add(gtk_tasks) 1216 self.mywidgets.append(gtk_tasks) 1217 self.steernote.append_page(fbox, label)
1218 1219 1220
1221 -class GtkIceTray(gtk.VBox):
1222 1223 _traywidth = 400 1224 _trayheight = 250 1225
1226 - def reload(self,tray):
1227 self.tray = tray 1228 self.evententry.set_text(self.tray.GetEvents()) 1229 self.iterentry.set_text(self.tray.GetIterations()) 1230 1231 for widget in self.mywidgets: 1232 widget.reload(tray)
1233
1234 - def reload_widget(self,tab,event,widget):
1235 widget.reload(self.tray)
1236
1237 - def SetPrinter(self,printer):
1238 for widget in self.mywidgets: 1239 widget.SetPrinter(printer)
1240
1241 - def GetEvents(self):
1242 self.tray.SetEvents(int(self.evententry.get_text())) 1243 return self.tray.GetEvents()
1244
1245 - def GetIterations(self):
1246 self.tray.SetIterations(int(self.iterentry.get_text())) 1247 return self.tray.GetIterations()
1248
1249 - def __init__(self,tray,database,traywidth=_traywidth, 1250 trayheight=_trayheight,windowwidth=750,windowheight=600):
1251 gtk.VBox.__init__(self) 1252 self.tray = tray 1253 self.pdb = database 1254 self.mywidgets = [] 1255 hbox = gtk.HBox() 1256 self.evententry=EventEntry() 1257 self.evententry.set_text(str(self.tray.GetEvents())) 1258 self.evententry.show() 1259 self.iterentry=EventEntry("Iterations") 1260 self.iterentry.set_reload_function(IceTrayConfig.GetIterations) 1261 self.iterentry.set_text(str(self.tray.GetIterations())) 1262 self.iterentry.show() 1263 hbox.pack_start(self.evententry,False,False,2) 1264 hbox.pack_start(self.iterentry,False,False,2) 1265 hbox.show() 1266 1267 self.pack_start(hbox,False,False,2) 1268 1269 self.notebook = gtk.Notebook() 1270 1271 # IceProdPre 1272 frame = gtk.Frame("IceProdPre") 1273 frame.set_border_width(10) 1274 #frame.set_size_request(traywidth, trayheight) 1275 frame.show() 1276 1277 label = gtk.Label("IceProdPre") 1278 label.show() 1279 gtkpres = GtkIceProdPre(self.tray,self.pdb, 1280 windowwidth,windowheight) 1281 frame.add(gtkpres) 1282 self.mywidgets.append(gtkpres) 1283 self.notebook.append_page(frame, label) 1284 1285 # Modules 1286 frame = gtk.Frame("Modules") 1287 frame.set_border_width(10) 1288 #frame.set_size_request(traywidth, trayheight) 1289 frame.show() 1290 1291 label = gtk.Label("Modules") 1292 label.show() 1293 gtkmodules = GtkModules(self.tray,self.pdb) 1294 frame.add(gtkmodules) 1295 self.mywidgets.append(gtkmodules) 1296 self.notebook.append_page(frame, label) 1297 1298 # Services 1299 frame = gtk.Frame("Services") 1300 frame.set_border_width(10) 1301 #frame.set_size_request(traywidth, trayheight) 1302 frame.show() 1303 1304 label = gtk.Label("Services") 1305 label.show() 1306 gtkservices = GtkServices(self.tray,self.pdb) 1307 frame.add(gtkservices) 1308 self.mywidgets.append(gtkservices) 1309 self.notebook.append_page(frame, label) 1310 1311 # IceProdPost 1312 frame = gtk.Frame("IceProdPost") 1313 frame.set_border_width(10) 1314 #frame.set_size_request(traywidth, trayheight) 1315 frame.show() 1316 1317 label = gtk.Label("IceProdPost") 1318 label.show() 1319 gtkposts = GtkIceProdPost(self.tray,self.pdb) 1320 frame.add(gtkposts) 1321 self.mywidgets.append(gtkposts) 1322 self.notebook.append_page(frame, label) 1323 1324 1325 # Projects 1326 vbox = gtk.VBox() 1327 frame = gtk.Frame() 1328 frame.set_border_width(10) 1329 #frame.set_size_request(traywidth+100, trayheight) 1330 frame.show() 1331 1332 gtkprojects = GtkProjects(tray,self.pdb) 1333 self.mywidgets.append(gtkprojects) 1334 1335 tab = gtkTab("Projects") 1336 tab.connect('button_press_event',self.reload_widget,gtkprojects) 1337 tab.show() 1338 self.notebook.append_page(gtkprojects, tab) 1339 self.pack_start(self.notebook,True,True,2) 1340 self.notebook.show() 1341 1342 self.notebook.set_current_page(1)
1343 1344 1345 1346 # Connections 1347 # frame = gtk.Frame("Connections") 1348 # frame.set_border_width(10) 1349 # frame.set_default_size(traywidth, trayheight) 1350 # frame.show() 1351 1352 # label = gtk.Label("Connections") 1353 # label.show() 1354 # gtkconnections = GtkConnections(self.tray) 1355 # frame.add(gtkconnections) 1356 # self.mywidgets.append(gtkconnections) 1357 # self.notebook.append_page(frame, label) 1358 1359
1360 -class gtkTab(gtk.EventBox):
1361
1362 - def __init__(self,label_text):
1363 gtk.EventBox.__init__(self) 1364 self.set_events(gtk.gdk.BUTTON_PRESS_MASK) 1365 self.label = gtk.Label(label_text) 1366 self.add(self.label)
1367
1368 - def show(self):
1369 gtk.EventBox.show(self) 1370 self.label.show()
1371 1372
1373 -class EventEntry(gtk.Frame):
1374
1375 - def __init__(self,title="Events"):
1376 gtk.Frame.__init__(self,title) 1377 self.evententry = gtk.Entry() 1378 self.add(self.evententry) 1379 self.reload_func = IceTrayConfig.GetEvents
1380
1381 - def set_reload_function(self,func):
1382 self.reload_func = func
1383
1384 - def reload(self,tray):
1385 self.evententry.set_text(str(self.reload_func(tray)))
1386
1387 - def show(self):
1388 gtk.Frame.show(self) 1389 self.evententry.show()
1390
1391 - def get_text(self):
1392 return self.evententry.get_text()
1393
1394 - def set_text(self,txt):
1395 self.evententry.set_text(str(txt))
1396
1397 -def main():
1398 GtkConfig() 1399 return 0
1400 1401 if __name__ == "__main__": 1402 main() 1403