Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
	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)
Ejemplo n.º 4
0
#!/usr/bin/python3
#
# Signs out the user
#
# @author Brian Hession
# @email [email protected]
#

from env import *
import datetime
import sessions, sshttp

try:
    sessions.delete_session()

    args = sshttp.get_parameters()
    redirect = sshttp.get_redirect()

    if redirect:
        sshttp.send302(redirect,
                       headers={
                           'Set-Cookie':
                           'ssid=expired; Secure; Expires="{}"'.format(
                               datetime.datetime.utcfromtimestamp(0))
                       })
    else:
        sshttp.send302('/',
                       headers={
                           'Set-Cookie':
                           'ssid=expired; Secure; Expires="{}"'.format(
                               datetime.datetime.utcfromtimestamp(0))
Ejemplo n.º 5
0
	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)