def cli_session(self, username, tty, cmd, fb, img): ttytxt = 'tty{}'.format(tty) if self.settings.logme: self.settings.log.info( "Preparing {}'s default environment".format(username)) usr, env = utils.make_child_env(username) if self.settings.logme: self.settings.log.info("Preparing {} for {}".format( ttytxt, username)) utils.prepare_tty(username, tty) pid = os.fork() if pid == 0: os.setsid() #do a check for fbterm goodiness check_failed = False if fb: try: check_call(['which', 'fbterm']) except CalledProcessError as e: if self.settings.logme: self.settings.log.warning( ('Unable to find fbterm,' ' disabling fbterm support')) check_failed = True try: check_call(['which', 'fbv']) except CalledProcessError as e: if self.settings.logme: self.settings.log.warning( ('Unable to find fbv,' ' disabling fbterm support')) check_failed = True try: check_call(['which', 'fbterm-bi']) except CalledProcessError: if self.settings.logme: self.settings.log.warning( ('Unable to find fbterm-bi,' ' disabling fbterm support')) check_failed = True if not check_failed: check_failed = not os.path.exists(img) if not fb or check_failed: totalcmd = "openvt -ws -- {}".format(cmd).strip() else: env['TERM'] = 'fbterm' #override TERM variable if fbterm support is officially enabled totalcmd = "openvt -ws -- fbterm-bi {} {}".format(img, cmd).strip() if self.settings.logme: self.settings.log.info("Launching {} for {} on {} using {}"\ .format(totalcmd, username, ttytxt, usr.pw_shell)) #don't clutter the UI with output from what we launched #http://dslinux.gits.kiev.ua/trunk/user/console-tools/src/vttools/openvt.c with open(os.devnull, 'rb') as shutup: login_prs = Popen([usr.pw_shell, '--login', '-c', totalcmd], env=env, cwd=usr.pw_dir, close_fds=True, stdout=shutup, stderr=shutup, preexec_fn=utils.drop_privs(username)) if self.settings.logme: self.settings.log.debug("Waiting for process to finish") login_prs.wait() if self.settings.logme: self.settings.log.debug("Finished with {}".format( login_prs.returncode)) #we need to wait for this to finish to log the entry properly #this'll be called after the process is done os._exit(login_prs.returncode) else: if self.settings.logme: self.settings.log.info( ("Registering session" " for {} on {}").format(username, ttytxt)) success = sessions.register_session(username, ttytxt) if self.settings.logme and not success: self.settings.log.error( ("Unable to register session for {} on {}," " active logins display won't work as expected").format( username, ttytxt)) #register now that we have the PID status = os.waitpid(pid, os.P_WAIT)[1] if self.settings.logme: self.settings.log.debug("Restoring tty ownership") utils.restore_tty(tty) if self.settings.logme: self.settings.log.info("Deregistering session " "for {} on {}".format(username, ttytxt)) success = sessions.delete_session(username, ttytxt) if self.settings.logme: if not success: self.settings.log.error( ("Unable to deregister session for {} on {}," " active logins display won't work as expected" ).format(username, ttytxt)) self.settings.log.debug( "Exiting watcher process for {} on {}".format( username, ttytxt)) os._exit(status)
def cli_session(self,username,tty,cmd,fb,img): ttytxt='tty{}'.format(tty) if self.settings.logme: self.settings.log.info("Preparing {}'s default environment".format(username)) usr,env=utils.make_child_env(username) if self.settings.logme: self.settings.log.info("Preparing {} for {}".format(ttytxt,username)) utils.prepare_tty(username,tty) pid = os.fork() if pid == 0: os.setsid() #do a check for fbterm goodiness check_failed=False if fb: try: check_call(['which','fbterm']) except CalledProcessError as e: if self.settings.logme: self.settings.log.warning(('Unable to find fbterm,' ' disabling fbterm support')) check_failed=True try: check_call(['which','fbv']) except CalledProcessError as e: if self.settings.logme: self.settings.log.warning(('Unable to find fbv,' ' disabling fbterm support')) check_failed=True try: check_call(['which','fbterm-bi']) except CalledProcessError: if self.settings.logme: self.settings.log.warning(('Unable to find fbterm-bi,' ' disabling fbterm support')) check_failed=True if not check_failed: check_failed=not os.path.exists(img) if not fb or check_failed: totalcmd="openvt -ws -- {}".format(cmd).strip() else: env['TERM']='fbterm' #override TERM variable if fbterm support is officially enabled totalcmd="openvt -ws -- fbterm-bi {} {}".format(img,cmd).strip() if self.settings.logme: self.settings.log.info("Launching {} for {} on {} using {}"\ .format(totalcmd, username, ttytxt, usr.pw_shell)) #don't clutter the UI with output from what we launched #http://dslinux.gits.kiev.ua/trunk/user/console-tools/src/vttools/openvt.c with open(os.devnull, 'rb') as shutup: login_prs=Popen([usr.pw_shell,'--login','-c',totalcmd], env=env,cwd=usr.pw_dir,close_fds=True, stdout=shutup,stderr=shutup, preexec_fn=utils.drop_privs(username)) if self.settings.logme: self.settings.log.debug("Waiting for process to finish") login_prs.wait() if self.settings.logme: self.settings.log.debug("Finished with {}".format(login_prs.returncode)) #we need to wait for this to finish to log the entry properly #this'll be called after the process is done os._exit(login_prs.returncode) else: if self.settings.logme: self.settings.log.info(("Registering session" " for {} on {}").format(username, ttytxt)) success = sessions.register_session(username,ttytxt) if self.settings.logme and not success: self.settings.log.error(("Unable to register session for {} on {}," " active logins display won't work as expected").format(username,ttytxt)) #register now that we have the PID status=os.waitpid(pid,os.P_WAIT)[1] if self.settings.logme: self.settings.log.debug("Restoring tty ownership") utils.restore_tty(tty) if self.settings.logme: self.settings.log.info("Deregistering session " "for {} on {}".format(username, ttytxt)) success = sessions.delete_session(username,ttytxt) if self.settings.logme: if not success: self.settings.log.error(("Unable to deregister session for {} on {}," " active logins display won't work as expected").format(username,ttytxt)) self.settings.log.debug("Exiting watcher process for {} on {}".format(username,ttytxt)) os._exit(status)
def gui_session(self, username, tty, cmd, ck): ttytxt = 'tty{}'.format(tty) if self.settings.logme: self.settings.log.info( "Preparing {}'s default environment".format(username)) usr, env = utils.make_child_env(username) if self.settings.logme: self.settings.log.info("Checking for next available X display") new_d = ":{}".format(utils.next_x()) if self.settings.logme: self.settings.log.info("Found display {} for using".format(new_d)) env['DISPLAY'] = new_d #we need this only for sessreg purposes env['TERM'] = 'xterm' check_failed = False cookie = '' if ck: if None in (dbus, manager, manager_iface): if self.settings.logme: self.settings.log.warning( ("Unable to connect to ConsoleKit," " disabling consolekit...")) check_failed = True if not check_failed and ck: #open a consolekit sessio if self.settings.logme: self.settings.log.info( "Launching consolekit session for {} on {}".format( username, new_d)) cookie = manager_iface.OpenSessionWithParameters([ ('unix-user', usr.pw_uid), ('x11-display', new_d), ('x11-display-device', os.path.join('/dev', ttytxt)), ('is-local', True), ('display-device', '') ]) env['XDG_SESSION_COOKIE'] = cookie #let startx handle making the authority file totalcmd = 'startx {} -- {}'.format(self.get_xinit(usr, cmd), new_d).strip() if self.settings.logme: self.settings.log.info("Launching {} for {} on {} using {}"\ .format(totalcmd, username, new_d, usr.pw_shell)) #check_call(['startx','/etc/X11/xinitrc', pid = os.fork() if pid == 0: os.setsid() #do a check for consolekit goodiness with open(os.devnull, 'rb') as shutup: login_prs = Popen([usr.pw_shell, '--login', '-c', totalcmd], cwd=usr.pw_dir, env=env, close_fds=True, stdout=shutup, stderr=shutup, preexec_fn=utils.drop_privs(username)) if self.settings.logme: self.settings.log.debug("Waiting for process to finish") login_prs.wait() if self.settings.logme: self.settings.log.debug("Finished with {}".format( login_prs.returncode)) os._exit(login_prs.returncode) else: #this'll be called after the process is done #register here since we have the PID if self.settings.logme: self.settings.log.info("Registering session " "for {} on {}".format(username, new_d)) success = sessions.register_session(username, new_d) if self.settings.logme and not success: self.settings.log.error( ("Unable to register session for {} on {}," " active logins display won't work as expected").format( username, new_d)) #add_utmp_entry(username, new_d, spid) status = os.waitpid(pid, os.P_WAIT)[1] if not check_failed and ck: if self.settings.logme: self.settings.log.info("Cleaning up consolekit " "session for {} on {}".format( username, new_d)) closed = manager_iface.CloseSession(cookie) del env['XDG_SESSION_COOKIE'] #remove_utmp_entry(new_d) if self.settings.logme: self.settings.log.info("Deregistering session " "for {} on {}".format(username, new_d)) success = sessions.delete_session(username, new_d) if self.settings.logme: if not success: self.settings.log.error( ("Unable to deregister session for {} on {}," " active logins display won't work as expected" ).format(username, new_d)) self.settings.log.debug( "Exiting watcher process for {} on {}".format( username, new_d)) os._exit(status)
def gui_session(self,username,tty,cmd,ck): ttytxt='tty{}'.format(tty) if self.settings.logme: self.settings.log.info("Preparing {}'s default environment".format(username)) usr,env=utils.make_child_env(username) if self.settings.logme: self.settings.log.info("Checking for next available X display") new_d=":{}".format(utils.next_x()) if self.settings.logme: self.settings.log.info("Found display {} for using".format(new_d)) env['DISPLAY']=new_d #we need this only for sessreg purposes env['TERM']='xterm' check_failed=False cookie='' if ck: if None in (dbus,manager,manager_iface): if self.settings.logme: self.settings.log.warning(("Unable to connect to ConsoleKit," " disabling consolekit...")) check_failed=True if not check_failed and ck: #open a consolekit sessio if self.settings.logme: self.settings.log.info("Launching consolekit session for {} on {}".format(username, new_d)) cookie = manager_iface.OpenSessionWithParameters([ ('unix-user',usr.pw_uid), ('x11-display',new_d), ('x11-display-device',os.path.join('/dev',ttytxt)), ('is-local',True), ('display-device','') ]) env['XDG_SESSION_COOKIE']=cookie #let startx handle making the authority file totalcmd='startx {} -- {}'.format(self.get_xinit(usr,cmd),new_d).strip() if self.settings.logme: self.settings.log.info("Launching {} for {} on {} using {}"\ .format(totalcmd, username, new_d, usr.pw_shell)) #check_call(['startx','/etc/X11/xinitrc', pid = os.fork() if pid == 0: os.setsid() #do a check for consolekit goodiness with open(os.devnull, 'rb') as shutup: login_prs=Popen([usr.pw_shell,'--login','-c',totalcmd], cwd=usr.pw_dir, env=env, close_fds=True, stdout=shutup,stderr=shutup, preexec_fn=utils.drop_privs(username)) if self.settings.logme: self.settings.log.debug("Waiting for process to finish") login_prs.wait() if self.settings.logme: self.settings.log.debug("Finished with {}".format(login_prs.returncode)) os._exit(login_prs.returncode) else: #this'll be called after the process is done #register here since we have the PID if self.settings.logme: self.settings.log.info("Registering session " "for {} on {}".format(username, new_d)) success=sessions.register_session(username,new_d) if self.settings.logme and not success: self.settings.log.error(("Unable to register session for {} on {}," " active logins display won't work as expected").format(username,new_d)) #add_utmp_entry(username, new_d, spid) status=os.waitpid(pid,os.P_WAIT)[1] if not check_failed and ck: if self.settings.logme: self.settings.log.info("Cleaning up consolekit " "session for {} on {}".format(username, new_d)) closed = manager_iface.CloseSession(cookie) del env['XDG_SESSION_COOKIE'] #remove_utmp_entry(new_d) if self.settings.logme: self.settings.log.info("Deregistering session " "for {} on {}".format(username, new_d)) success=sessions.delete_session(username,new_d) if self.settings.logme: if not success: self.settings.log.error(("Unable to deregister session for {} on {}," " active logins display won't work as expected").format(username,new_d)) self.settings.log.debug("Exiting watcher process for {} on {}".format(username,new_d)) os._exit(status)