aboutsummaryrefslogtreecommitdiffstats
path: root/scanner/floatapp/process.py
blob: 1bd8db2913356401f33738601d7d898f58b2a8da (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from flask import Response
import subprocess
import os
import sys

class ProcessWrapper(object):
	def __init__(self, process, done):
		self.process = process
		self.done = done
	def close(self):
		self.done()
		if self.process.returncode is not None:
			return
		self.process.stdout.close()
		self.process.terminate()
		self.process.wait()
	def __iter__(self):
		return self
	def __del__(self):
		self.close()
	def next(self):
		try:
			data = self.process.stdout.readline()
		except:
			self.close()
			raise StopIteration()
		if data:
			return data
		self.close()
		raise StopIteration()

def send_process(args, pid_file):
	def setup_proc():
		f = open(pid_file, "w")
		f.write(str(os.getpid()))
		f.close()
		os.close(0)
		os.dup2(1, 2)
	def tear_down_proc():
		try:
			os.unlink(pid_file)
		except:
			pass
	if os.path.exists(pid_file):
		f = open(pid_file, "r")
		pid = f.read()
		f.close()
		if os.path.exists("/proc/%s/status" % pid):
			return Response("Scanner is already running.\n", mimetype="text/plain")
	process = subprocess.Popen(args, close_fds=True, stdout=subprocess.PIPE, preexec_fn=setup_proc)
	response = ProcessWrapper(process, tear_down_proc)
	return Response(response, direct_passthrough=True, mimetype="text/plain")