示例#1
0
文件: host.py 项目: ahedlund/raptz
	def setup(self):
		self._log = open(config.logfile, "w")
		if config.ui == "term":
			self._ui = UiTerm()
			self.redirout()
		else:
			self._ui = UiLog()

		if config.mode == "fake":
			self.runner = FakeRoot(self)
			self.fs = FakeFs(self)
		else:
			self.runner = ChRoot(self)
			if os.getuid() != 0:
				raise RaptzException("You shall be root to run in root mode")
			self.fs = RootFs(self)
示例#2
0
文件: host.py 项目: ahedlund/raptz
class Host():
	_stdoutfd = sys.stdout.fileno()
	_stderrfd = sys.stderr.fileno()
	_outcb = {}
	_errcb = {}
	_outline = ""
	_errline = ""
	poller = CbPoller()
	def __init__(self):
		pass

	def setup(self):
		self._log = open(config.logfile, "w")
		if config.ui == "term":
			self._ui = UiTerm()
			self.redirout()
		else:
			self._ui = UiLog()

		if config.mode == "fake":
			self.runner = FakeRoot(self)
			self.fs = FakeFs(self)
		else:
			self.runner = ChRoot(self)
			if os.getuid() != 0:
				raise RaptzException("You shall be root to run in root mode")
			self.fs = RootFs(self)

	def redirout(self):
		pin, self._stdoutfd = os.pipe()
		self.poller.add(pin, self._stdout)
		pin, self._stderrfd = os.pipe()
		self.poller.add(pin, self._stderr)

	def set_parts(self, parts):
		self._ui._parts = parts

	def add_outcb(self, cb, *kargs):
		if cb:
			self._outcb[cb] = kargs	
	def add_errcb(self, cb, *kargs):
		if cb:
			self._errcb[cb] = kargs

	def remove_outcb(self, cb):
		if cb and cb in self._outcb:
			del self._outcb[cb]

	def remove_errcb(self, cb):
		if cb and cb in self._errcb:
			del self._errcb[cb]

	ENDMARKERS = ["\n", "\r"]
	def _stderr(self, fd, ev):
		if ev != select.POLLIN:
			return True
		ch = os.read(fd,1)
		self._log.write(ch)
		if ch not in self.ENDMARKERS:
			self._errline += ch
			return True
		self._log.flush()
		for cb, kargs in self._errcb.items():
			if not cb(self._errline, *kargs):
				self.remove_errcb(cb)
		self._errline=""
		return True

	def _stdout(self, fd, ev):
		if ev != select.POLLIN:
			return True
		ch = os.read(fd,1)
		self._log.write(ch)
		if ch not in self.ENDMARKERS:
			self._outline += ch
			return True
		self._log.flush()
		self._ui.text(self._outline)
		for cb, kargs in self._outcb.items():
			if not cb(self._outline, *kargs):
				self.remove_outcb(cb)
		self._outline=""
		return True

	def stdoutfd(self):
		return self._stdoutfd

	def stderrfd(self):
		return self._stderrfd

	def start(self, name):
		self._ui.start(name)
		self._log.write("*** " + name + " ***\n")
		return self

	def warn(self, text):
		self._ui.warn(text)

	def dbg(self, text):
		if config.args.debug:
			self._ui.dbg(text)

	def progress(self, prog, text=None):
		self._ui.progress(prog)

	def text(self, text):
		self._log.write("** " + text + "\n")
		self._ui.text(text)

	def done(self):
		self._ui.done()