PK ;g;43bV0!!SharedGrass.pyUT 2C*CUx#!/usr/bin/python2.3 import os import sys import socket import threading import time import select import logging import getopt if sys.platform == "darwin": import pyGlobus.ioc from AccessGrid import Platform from wxPython.wx import * from AccessGrid import Log from AccessGrid.SharedAppClient import SharedAppClient from AccessGrid.Platform.Config import UserConfig from AccessGrid.ClientProfile import ClientProfile from AccessGrid import icons from AccessGrid import Toolkit from AccessGrid.Platform.ProcessManager import ProcessManager MAX_CONN = 100 TYPE_LEN = 2 MAX_RECEPT = 640 INTERP = "wish" D_M = "d.m.tcl" NVIZ = "nviz" AG_SOCK_S = "/tmp/ag_grass_socket_server" AG_SOCK_C = "/tmp/ag_grass_socket_client" GRASS_PATH = "grass60_AG" TERM = "xterm" class SharedGrass: def __init__(self, venueUrl, name): try: mode_c = os.stat(AG_SOCK_C)[ST_MODE] print("Already in a shared app") except: self.pm = ProcessManager() self.InitSharedApp(venueUrl, name) self.RegisterCallbackEvent() self.leading = 0 self.StartGrass() self.InitGrassCom() def InitSharedApp(self, venueUrl, name): self.sharedAppClient = SharedAppClient(name) self.userName = "Unknown" self.log = self.sharedAppClient.InitLogging(0, None) try: clientProfileFile = os.path.join(UserConfig.instance().GetConfigDir(), "profile") clientProfile = ClientProfile(clientProfileFile) if not clientProfile.IsDefault(): self.userName = clientProfile.GetName() except: log.exception("Could not load profile") clientProfile = None self.sharedAppClient.Join(venueUrl, clientProfile) self.publicId = self.sharedAppClient.GetPublicId() def RegisterCallbackEvent(self): self.sharedAppClient.RegisterEventCallback("newcomm", self.TransferGrassCommand) self.sharedAppClient.RegisterEventCallback("TakeLead", self.RemoteTakeLead) self.sharedAppClient.RegisterEventCallback("RelinquishLead", self.RemoteRelinquishLead) def TransferGrassCommand(self, event): (senderId, data) = event.data if not senderId == self.publicId: self.rm.SendGrassCommand(data) def RemoteTakeLead(self, event): if event.data[0] == self.publicId: return leader = event.data[1] if self.leading: self.RelinquishLead(0) self.gui.SetLeaderName(leader) def RemoteRelinquishLead(self, event): if event.data[0] == self.publicId: return self.gui.SetLeaderName("") def OnGUIChangeLead(self): if self.leading: self.RelinquishLead(1) self.gui.SetLeaderName("") else: self.TakeLead(1) self.gui.SetLeaderName(self.userName) def StartGrass(self): self.grassPID = self.pm.StartProcess(TERM, ["-e", GRASS_PATH]) def InitGrassCom(self): self.rm = GrassComm(self) def RecieveGrassCommand(self, cmd): self.sharedAppClient.SendEvent("newcomm", (self.publicId, cmd)) def Shutdown(self): if self.leading: self.RelinquishLead(1) self.leading = 0 log.info("Closing all connections...") self.rm.grassServerSocket.close() log.info("Cleaning temp file..."); self.pm.StartProcess("rm", [AG_SOCK_S, AG_SOCK_C]) log.info("Killing all process..."); self.rm.SendInterp() self.pm.StartProcess("/bin/sh", ["-c", "./runkill"]) self.pm.TerminateAllProcesses() def SetGUI(self, gui): self.gui = gui def SyncLeadState(self): leader = self.sharedAppClient.GetData("leader") if leader: self.gui.SetLeaderName(leader) def TakeLead(self, notify): self.leading = 1 self.gui.SetLead(self.leading) if notify: self.sharedAppClient.SetData("leader", self.userName) self.sharedAppClient.SendEvent("TakeLead", [self.publicId, self.userName]) def RelinquishLead(self, notify): self.leading = 0 self.gui.SetLead(self.leading) if notify: self.sharedAppClient.SetData("leader", "") self.sharedAppClient.SendEvent("RelinquishLead", [self.publicId, self.userName]) class GrassFrame(wxFrame): FILE_EXIT = wxNewId() def __init__(self, parent, app): wxFrame.__init__(self, parent, -1, "Shared GRASS", size = wxSize(200,100)) self.parent = parent self.app = app self.panel = GrassPanel(self, -1, app) menubar = wxMenuBar() fileMenu = wxMenu() fileMenu.Append(self.FILE_EXIT,"&Exit", "Exit sharedGRASS") menubar.Append(fileMenu, "&File") self.SetMenuBar(menubar) EVT_MENU(self, self.FILE_EXIT, self.OnClose) EVT_CLOSE(self, self.OnClose) def OnClose(self, event): self.app.Shutdown() log.info("Close down") self.Destroy() class GrassPanel(wxPanel): def __init__(self, parent, id, app): wxPanel.__init__(self, parent, id) self.app = app self.sizer = wxBoxSizer(wxVERTICAL) self.leaderText = wxStaticText(self, -1, "Leader: ") self.sizer.Add(self.leaderText, 0, wxEXPAND|wxALL, 4) self.leadControlButton = wxButton(self, -1, "Take lead") self.sizer.Add(self.leadControlButton, 0, wxEXPAND|wxALL, 0) EVT_BUTTON(self, self.leadControlButton.GetId(), self.OnChangeLead) self.SetSizer(self.sizer) self.SetAutoLayout(1) self.Fit() self.SetLead(self.app.leading) def OnChangeLead(self, event): self.app.OnGUIChangeLead() def SetLeaderName(self, name): self.leaderText.SetLabel("Leader: " + name) def SetLead(self, amLeading): if amLeading: self.leadControlButton.SetLabel("Relinquish Lead") else: self.leadControlButton.SetLabel("Take Lead") class GrassComm: def __init__(self, parent): self.parent = parent self.grassServerSocket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.grassComThread = threading.Thread(target=self.ListenForGrass, args=(self, parent)) self.grassComThread.setDaemon(1) self.grassComThread.start() self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.connected = 0 threading.Thread(target=self.connectToGrass).start() def connectToGrass(self): while not self.connected: try: self.sock.connect(AG_SOCK_S) self.connected = 1 except: log.exception("Cannot connect to GRASS " + AG_SOCK_S); time.sleep(0.3) def SendGrassCommand(self, command): if self.connected == 1: sent = self.sock.send(command, 0) if sent == 0: log.exception("socket connection broken") #self.sock.close() def SendInterp(self, command="exit", app=NVIZ): self.pipe = os.popen(INTERP, "w") if command == "exit": self.pipe.write("send "+app+" "+command+"\n") self.pipe.write("send "+D_M+" "+command+"\n") self.pipe.write("exit\n") else: self.pipe.write("send "+app+" "+command+"\n") self.pipe.write("exit\n") self.pipe.flush() self.pipe.close() def ListenForGrass(self, parent, Parent): binded = 0 while not binded: try: parent.grassServerSocket.bind(AG_SOCK_C) binded = 1 except: log.exception("Cannot create server " + AG_SOCK_C) time.sleep(0.3) parent.grassServerSocket.listen(100) while(1): conn, addr = parent.grassServerSocket.accept() threading.Thread(target=self.newThread, args=(conn, Parent)).start() def newThread(self, conn, Parent): exit = 0 while not exit: data = conn.recv(MAX_RECEPT, 0) if data != "": if Parent.leading: Parent.RecieveGrassCommand(data) else: exit = 1 conn.close() if __name__ == "__main__": if len(sys.argv) != 2: print "Usage: %s venueURL" % (sys.argv[0]) sys.exit(1) name = "SharedGRASS" wxapp = wxPySimpleApp() venueURL = sys.argv[1] app = Toolkit.CmdlineApplication.instance() app.Initialize(name) log = app.GetLog() grassApp = SharedGrass(venueURL, name) guiFrame = GrassFrame(None, grassApp) grassApp.SetGUI(guiFrame.panel) grassApp.SyncLeadState() guiFrame.Show(1) wxapp.SetTopWindow(guiFrame) wxapp.MainLoop() os._exit(0) PK sg;4*gPSharedGrass.appUT CCUx[application] name = Shared GRASS mimetype = application/x-ag-shared-grass extension = sharedgrass files = SharedGrass.py runkill [commands] Open = %(python)s SharedGrass.py %(appUrl)s PK h;4G==runkillUT CCUx#!/bin/bash # Just in case... kill -9 `pgrep -U ${UID} run` PK ;g;43bV0!! SharedGrass.pyUT2CUxPK sg;4*gP )"SharedGrass.appUTCUxPK h;4G== &#runkillUTCUxPK#