8e5e37106c9779b8e555b9032b126354fb56940b
[sface.git] / sface / sfiprocess.py
1
2 import os
3 import sys
4 import time
5
6 from PyQt4.QtCore import *
7 from sface.config import config
8
9 def find_executable(exec_name):
10     """find the given executable in $PATH"""
11     paths = os.getenv("PATH").split(':')
12     for p in paths:
13         exec_path = os.path.join(p, exec_name)
14         if os.path.exists(exec_path):
15             return exec_path
16     return None
17
18
19 class SfiProcess(QObject):
20     def __init__(self, parent=None):
21         QObject.__init__(self, parent)
22
23         self.process = QProcess()
24         self.connect(self.process, SIGNAL("finished(int, QProcess::ExitStatus)"),
25                      self.processFinished)
26         self.connect(self.process, SIGNAL("readyReadStandardOutput()"),
27                      self.processStandardOutput)
28         self.connect(self.process, SIGNAL("readyReadStandardError()"),
29                      self.processStandardError)
30
31     def __init_command(self, args):
32         self.args = QStringList()
33         for arg in args:
34             self.args << QString(arg)
35
36         self.exe = find_executable("sfi.py")
37         if not self.exe:
38             print "FATAL.. Could not locate binary sfi.py - not much we can do without that"
39
40     def isRunning(self):
41         return self.process.state() != QProcess.NotRunning
42
43     def processStandardOutput(self):
44         output = self.process.readAllStandardOutput()
45         if config.debug:
46             print output
47
48     def processStandardError(self):
49         print self.process.readAllStandardError()
50
51     def processFinished(self):
52         if self.process.exitStatus() == QProcess.CrashExit:
53             print self.readOutput()
54             print "Process exited with errors:",
55             err = self.process.error()
56             if err == QProcess.FailedToStart:
57                 print "FailedToStart"
58             elif err == QProcess.Crashed:
59                 print "Crashed"
60             elif err == QProcess.Timedout:
61                 print "Timedout"
62             elif err == QProcess.WriteError:
63                 print "WriteError"
64             elif err == QProcess.ReadError:
65                 print "ReadError"
66             elif err == QProcess.UnknownError:
67                 print "UnknownError"
68         self.trace_end()
69         self.emit(SIGNAL("finished()"))
70
71     def __getRSpec(self, mgr):
72         slice = config.getSlice()
73         # Write RSpec to file for testing.
74         filename = os.path.expanduser("~/.sfi/" + slice + ".rspec")
75         try:
76             os.remove(filename)
77         except:
78             pass
79         args = ["-u", config.getUser(), "-a", config.getAuthority(), 
80                 "-r", config.getRegistry(), "-s", mgr, "resources", 
81                 "-o", filename, slice]
82
83         self.__init_command(args)
84         self.start()
85         return filename
86
87     def getRSpecFromSM(self):
88         return self.__getRSpec(config.getSlicemgr())
89
90     def getRSpecFromAM(self):
91         return self.__getRSpec(config.getAggmgr())
92
93     def getRecord(self, hrn):
94         args = ["-u", config.getUser(), "-a", config.getAuthority(), 
95                 "-r", config.getRegistry(), "-s", config.getSlicemgr(), "show", hrn]
96         self.__init_command(args)
97         self.start()
98
99     def applyRSpec(self, rspec):
100         filename = config.getSliceRSpecFile() + "_new"
101         rspec.save(filename)
102         args = ["-u", config.getUser(), "-a", config.getAuthority(), 
103                 "-r", config.getRegistry(), "-s", config.getSlicemgr(), "create", 
104                 config.getSlice(), filename]
105         self.__init_command(args)
106         self.start()
107         return filename
108
109     def start(self):
110         self.trace_command()
111         self.process.start(self.exe, self.args)
112
113     def readOutput(self):
114         if self.process.state() == QProcess.NotRunning:
115             return self.process.readAll()
116
117     def trace_command (self):
118         if config.verbose:
119             self._trace=time.time()
120             command = "%s %s" % (self.exe, self.args.join(" "))
121             print time.strftime('%M:%S'),'Invoking',command
122
123     def trace_end (self):
124         if config.verbose:
125             command = "%s %s" % (self.exe, self.args.join(" "))
126             print time.strftime('%M:%S'),"[%.3f s]"%(time.time()-self._trace),command,'Done'