source: admin-center/trunk/fuentes/admin-center.install/usr/lib/python2.7/actasks.py @ 1869

Last change on this file since 1869 was 1869, checked in by joamuran, 4 years ago

Fixed release 0.5

File size: 5.7 KB
Line 
1import time
2import threading
3import tempfile
4
5import subprocess
6import os
7import signal
8import datetime
9import shutil
10#import pexpect
11
12from wsmanager import WSManager
13## Crea un swmanager unic, al que li enviaran tots els missatges, etiquetats per l'id del treball
14
15
16#import signal
17#import shutil
18
19
20class Task:
21    def __init__(self, taskid, command):
22        '''
23        It is a task in server, with certain taskid and performing certain command
24        When is created, its status will be "PREPARED"
25        And waits to be run
26        It prepares command and log file in /run
27        '''
28       
29        self.taskid=taskid
30        self.process=None
31        self.status='PREPARED'
32        self.command=command
33        self.logfolder="/run/taskmanager"
34        self.filepipe=''
35        self.locks = {}
36        self.seek=0
37       
38        # Clean log folder and create
39        if (os.path.exists(self.logfolder)):
40            shutil.rmtree(self.logfolder)
41        os.mkdir(self.logfolder)
42   
43        '''
44        'msg':None,
45        'target': target,
46        'command':command,
47        started_by':str(ip),
48        listeners': [],
49        filepipe': '',
50        seek' : 0,
51        method':call_info['method'],
52        class': call_info['class']
53        '''
54
55        pass
56
57    def get(self):
58        '''
59        Returns this task
60        '''
61       
62        return str({"taskid":self.taskid,
63                "process":self.process,
64                "status":self.status,
65                "command": self.command,
66                "logfolder":self.logfolder,
67                "filepipe": self.filepipe});
68       
69
70    def getStatus(self):
71        '''
72        Returns this task status
73        '''
74        return self.status
75
76    def run(self):
77        '''
78        Runs current task
79       
80        it prepares process and temporally log file and runs it
81       
82        '''
83        # locking thread
84        lock = threading.Lock()
85        self.locks[self.taskid]={}
86        self.locks[self.taskid]['lock'] = lock       
87        self.locks[self.taskid]['lock'].acquire()
88       
89        # Create temp logfile
90        temp = tempfile.NamedTemporaryFile(prefix='pipe_', dir=self.logfolder, delete=False)
91        proc = subprocess.Popen([self.command],  shell=True, stdout=temp, preexec_fn=os.setsid)
92        #proc=pexpect.spawn(self.command, logfile=temp)  #
93
94        # Adding process
95        self.process=proc;
96        self.status="RUNNING"
97        self.filepipe=temp.name
98       
99       
100        # Getting process output
101        ret=self.process.poll()
102        print str(ret)
103        while ret is None:
104            #time.sleep(3)
105            ret=self.process.poll()
106           
107        #print str(ret)
108       
109
110        '''
111        # getting proces output with expect
112        while True:
113            ret=0;
114            try:
115                proc.expect("\n")
116                stdout=proc.before
117            except pexpect.EOF:
118                proc.close()
119                ret=proc.exitstatus
120                print "FIN"
121            break
122        '''
123               
124       
125        if (str(ret)=='0'):
126            self.status="DONE"
127        elif (str(ret)=='-9'):                 
128            self.status="CANCELLED"
129        else: # return code 1 when install fails
130            self.status="BROKEN"
131
132
133       
134        print "[TASKMANAGER] END WAIT AT "+str(datetime.datetime.now())
135        print "[TASKMANAGER] FINISHING!!!, return code: "+str(ret)
136       
137        ## Millora: Abans d'enviar que ha acabat que espere a tindre els buffers buits...
138       
139        # Sending last line to log for all listeners
140        line="<b>Finished with status:"+self.status+"</b>\n"
141        aux = open(self.filepipe,'a')
142        aux.writelines(line)
143        aux.close()
144
145
146        # Append result of job and release mutex. Now all inform_me return finish
147        self.locks[self.taskid]['result'] = str(ret)
148        self.locks[self.taskid]['lock'].release()
149               
150        pass
151       
152    def runTask(self):
153        '''
154        runs task in an independent thread
155        '''
156        # Prepare thread       
157        taskthread=threading.Thread(target=self.run, args=())
158        taskthread.daemon = True
159        taskthread.start()
160       
161        return True
162       
163        ### Exec command ###
164       
165       
166        # Prepare file pipe
167        #temp = tempfile.NamedTemporaryFile(prefix='pipe_', dir=self.logfolder, delete=False)
168       
169        # New exec command, ignoring stderr stdin for now
170        #proc = subprocess.Popen([self.command],  shell=True, stdout=temp, preexec_fn=os.setsid)
171       
172        #self.process=proc
173        #self.status="RUNNING"
174        #self.filepipe=temp.name #????
175       
176   
177        '''
178           
179       
180        except Exception as e:
181            job['status']="Error"
182            print '[LmdServer]',e
183            if (ret is None):
184                job['msg']="Err code None (running)"
185            elif (ret<0):
186                job['msg']="Interrupted by signal: "+str(ret)
187            else:
188                job['msg']="Aparently all went well: "+str(ret)
189           
190   
191            # Append result of job and release mutex. Now all inform_me return finish
192            self.locks[job['taskid']]['result'] = str(ret)
193            self.locks[job['taskid']]['lock'].release()
194   
195            return str(e)
196       
197        '''   
198
199       
200        pass
201
202    def stop(self):
203        try:
204            #print "Killing me softly"
205            #msg=self.process.killpg();
206            msg=os.killpg(self.process.pid, signal.SIGTERM)
207           
208            #print "Killing me with this song: ",msg
209            return {"status": True, "msg": str(msg)}
210        except Exception as e:
211            #print "with this song: ", str(e)
212            return {"status": False, "msg": str(e)}
213   
214   
215   
Note: See TracBrowser for help on using the repository browser.