FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Debian > Debian User

 
 
LinkBack Thread Tools
 
Old 04-01-2011, 10:05 AM
Martin Gracik
 
Default Rewritten frontend

---
firstboot/frontend.py | 146 ++++++++++++++++++++++++++++++++++++++++++++++++
firstboot/xfrontend.py | 146 ------------------------------------------------
2 files changed, 146 insertions(+), 146 deletions(-)
create mode 100644 firstboot/frontend.py
delete mode 100644 firstboot/xfrontend.py

diff --git a/firstboot/frontend.py b/firstboot/frontend.py
new file mode 100644
index 0000000..1d6d93d
--- /dev/null
+++ b/firstboot/frontend.py
@@ -0,0 +1,146 @@
+#
+# frontend.py
+#
+# Copyright (C) 2011 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Red Hat Author(s): Martin Gracik <mgracik@redhat.com>
+#
+
+import logging
+import os
+import shlex
+import signal
+import subprocess
+
+from .constants import *
+
+from system_config_keyboard import keyboard
+
+
+# set up logging
+logging.basicConfig(level=logging.DEBUG)
+log = logging.getLogger('firstboot.frontend')
+
+
+class Frontend:
+
+ def __init__(self):
+ self.x = None
+ self.wm_pid = None
+
+ def set_lang(self):
+ i18n = shlex.split(open(I18N).read())
+ i18n = dict(item.split('=') for item in i18n)
+ if 'LANG' in i18n:
+ log.info('setting LANG to %s', i18n['LANG'])
+ os.environ['LANG'] = i18n['LANG']
+
+ def startx(self):
+ def sigusr1_handler(num, frame):
+ pass
+
+ def sigchld_handler(num, frame):
+ raise OSError
+
+ def preexec_fn():
+ signal.signal(signal.SIGUSR1, signal.SIG_IGN)
+
+ old_sigusr1 = signal.signal(signal.SIGUSR1, sigusr1_handler)
+ old_sigchld = signal.signal(signal.SIGCHLD, sigchld_handler)
+
+ os.environ['DISPLAY'] = DISPLAY
+ cmd = ['Xorg', os.environ['DISPLAY'],
+ '-ac', '-nolisten', 'tcp', VT]
+
+ devnull = os.open('/dev/null', os.O_RDWR)
+
+ try:
+ log.info('starting the Xorg server')
+ self.x = subprocess.Popen(cmd, stdout=devnull, stderr=devnull,
+ preexec_fn=preexec_fn)
+
+ except OSError as e:
+ err = 'Xorg server failed to start: %s' % e
+ log.critical(err)
+ raise RuntimeError(err)
+
+ signal.pause()
+ signal.signal(signal.SIGUSR1, old_sigusr1)
+ signal.signal(signal.SIGCHLD, old_sigchld)
+
+ log.info('Xorg server started successfully')
+
+ # XXX no need to close devnull?
+
+ def init_gtk(self):
+ rd, wr = os.pipe()
+ pid = os.fork()
+ if not pid:
+ import gtk
+ os.write(wr, '#')
+
+ kbd = keyboard.Keyboard()
+ kbd.read()
+ kbd.activate()
+
+ gtk.main()
+ os._exit(0)
+
+ os.read(rd, 1)
+ os.close(rd)
+ os.close(wr)
+
+ def start_wm(self):
+ path = os.environ['PATH'].split(':')
+ wms = [os.path.join(p, wm) for wm in WMS for p in path]
+ available = [wm for wm in wms if os.access(wm, os.X_OK)]
+ if not available:
+ err = 'no window manager available'
+ log.critical(err)
+ raise RuntimeError(err)
+
+ wm = available[0]
+ cmd = [wm, '--display', os.environ['DISPLAY']]
+
+ self.wm_pid = os.fork()
+ if not self.wm_pid:
+ log.info('starting the window manager')
+ os.execvp(wm, cmd)
+
+ try:
+ pid, status = os.waitpid(self.wm_pid, os.WNOHANG)
+ except OSError as e:
+ err = 'window manager failed to start: %s' % e
+ log.critical(err)
+ raise RuntimeError(err)
+
+ log.info('window manager started successfully')
+
+ def merge_xres(self):
+ if os.access(XRES, os.R_OK):
+ log.info('merging the Xresources')
+ p = subprocess.Popen(['xrdb', '--merge', XRES])
+ p.wait()
+
+ def kill(self):
+ if self.wm_pid:
+ log.info('killing the window manager')
+ os.kill(self.wm_pid, 15)
+
+ if self.x:
+ log.info('killing the Xorg server')
+ os.kill(self.x.pid, 15)
+ self.x.wait()
diff --git a/firstboot/xfrontend.py b/firstboot/xfrontend.py
deleted file mode 100644
index d796fbc..0000000
--- a/firstboot/xfrontend.py
+++ /dev/null
@@ -1,146 +0,0 @@
-#
-# Chris Lumens <clumens@redhat.com>
-#
-# Copyright 2007, 2008 Red Hat, Inc.
-#
-# This copyrighted material is made available to anyone wishing to use, modify,
-# copy, or redistribute it subject to the terms and conditions of the GNU
-# General Public License v.2. This program is distributed in the hope that it
-# will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the
-# implied warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc., 51
-# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Any Red Hat
-# trademarks that are incorporated in the source code or documentation are not
-# subject to the GNU General Public License and may only be used or replicated
-# with the express permission of Red Hat, Inc.
-#
-import logging
-import os, string, subprocess, sys, signal, shlex
-
-##
-## I18N
-##
-import gettext
-_ = lambda x: gettext.ldgettext("firstboot", x)
-
-class XFrontEnd:
- def __init__(self):
- self._wm_pid = None
- self.x = None
-
- def _mergeXresources(self):
- path = "/etc/X11/Xresources"
- if os.access(path, os.R_OK):
- os.system("xrdb -merge %s" % path)
-
- # Attempt to start up the window manager. Check the value of self.wm_pid
- # afterwards to see if this succeeded.
- def _startWindowManager(self):
- self._wm_pid = os.fork()
-
- if not self._wm_pid:
- paths = ["/usr/bin/metacity", "/usr/bin/kwin", "/usr/bin/xfwm4",
- "/usr/bin/openbox"]
- for path in paths:
- if os.access(path, os.X_OK):
- break
-
- args = [path, "--display", os.environ["DISPLAY"]]
- os.execvp(path, args)
-
- status = 0
- try:
- (pid, status) = os.waitpid (self._wm_pid, os.WNOHANG)
- except OSError, (errno, msg):
- logging.error ("starting window manager failed: %s" % msg)
-
- if status:
- raise RuntimeError, "Window manager failed to start."
-
- # Initializes the UI for firstboot by starting up an X server and
- # window manager, but returns control to the caller to proceed.
- def start(self):
- os.environ["DISPLAY"] = ":9"
-
- # set up the lang variable according to what's set in i18n
- with open("/etc/sysconfig/i18n", "r") as f:
- data = f.read()
- for line in shlex.split(data):
- key, value = line.split("=")
- if key == "LANG":
- os.environ[key] = value
- break
-
- try:
- args = [":9", "-ac", "-nolisten", "tcp", "vt1"]
- noOutput = os.open("/dev/null", os.O_RDWR)
-
- def sigchld_handler(num, frame):
- raise OSError
-
- def sigusr1_handler(num, frame):
- pass
-
- def preexec_fn():
- signal.signal(signal.SIGUSR1, signal.SIG_IGN)
-
- old_sigusr1 = signal.signal(signal.SIGUSR1, sigusr1_handler)
- old_sigchld = signal.signal(signal.SIGCHLD, sigchld_handler)
- self.x = subprocess.Popen(["/usr/bin/Xorg"] + args,
- stdout=noOutput, stderr=noOutput,
- preexec_fn=preexec_fn)
- signal.pause()
- signal.signal(signal.SIGUSR1, old_sigusr1)
- signal.signal(signal.SIGCHLD, old_sigchld)
-
- except OSError:
- logging.error("X server failed to start")
- raise RuntimeError, "X server failed to start"
- except:
- import traceback
- (ty, value, tb) = sys.exc_info()
- lst = traceback.format_exception (ty, value, tb)
- text = string.joinfields (lst, "")
- print text
-
- logging.error("X server failed to start")
- raise RuntimeError, "X server failed to start"
-
- logging.info("X server started successfully.")
-
- # Init GTK to connect to the X server, then write a token on a pipe to
- # tell our parent process that we're ready to start metacity.
- (rd, wr) = os.pipe()
- pid = os.fork()
- if not pid:
- import gtk
- os.write(wr, "#")
-
- # Set up the keyboard.
- import system_config_keyboard.keyboard as keyboard
- kbd = keyboard.Keyboard()
- kbd.read()
- kbd.activate()
-
- # Block until the X server is killed.
- gtk.main()
- os._exit(0)
-
- # Block on read of token
- os.read(rd, 1)
- os.close(rd)
- os.close(wr)
-
- self._wm_pid = self._startWindowManager()
- self._mergeXresources()
-
- def stop(self):
- if self._wm_pid:
- os.kill(self._wm_pid, 15)
-
- if self.x:
- os.kill(self.x.pid, 15)
- self.x.wait()
--
1.7.3.2

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 

Thread Tools




All times are GMT. The time now is 07:35 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org