Add support to option enable_multiple_session
This commit is contained in:
@@ -21,6 +21,11 @@ default_session_command = "/usr/bin/diyac -x /usr/bin/diya-login-shell"
|
|||||||
# if this setting is not set
|
# if this setting is not set
|
||||||
default_session_user = "xdg"
|
default_session_user = "xdg"
|
||||||
|
|
||||||
|
# if false keep only one session at a time
|
||||||
|
# open a new session will close any previously opened session
|
||||||
|
# default true, optional
|
||||||
|
enable_multiple_session = false
|
||||||
|
|
||||||
# User session command
|
# User session command
|
||||||
# The command to run to start a user session after the
|
# The command to run to start a user session after the
|
||||||
# login session is successful
|
# login session is successful
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ pub struct Configuration {
|
|||||||
default_session_user: String, // optional (default root)
|
default_session_user: String, // optional (default root)
|
||||||
/// The command to execute for user sessions (required).
|
/// The command to execute for user sessions (required).
|
||||||
user_session_command: String,
|
user_session_command: String,
|
||||||
|
/// flag to enable multiple session
|
||||||
|
enable_multiple_session: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Configuration {
|
impl Configuration {
|
||||||
@@ -71,6 +73,10 @@ impl Configuration {
|
|||||||
.and_then(Value::as_str)
|
.and_then(Value::as_str)
|
||||||
.ok_or("Missing user session command")?
|
.ok_or("Missing user session command")?
|
||||||
.to_string(),
|
.to_string(),
|
||||||
|
enable_multiple_session: table
|
||||||
|
.get("enable_multiple_session")
|
||||||
|
.and_then(Value::as_bool)
|
||||||
|
.unwrap_or(true),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,6 +112,14 @@ impl Configuration {
|
|||||||
pub fn user_session_command(&self) -> &str {
|
pub fn user_session_command(&self) -> &str {
|
||||||
&self.user_session_command
|
&self.user_session_command
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Is multiple session enabled
|
||||||
|
///
|
||||||
|
/// # Returns
|
||||||
|
/// * bool value
|
||||||
|
pub fn enable_multiple_session(&self) -> bool {
|
||||||
|
self.enable_multiple_session
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for Configuration {
|
impl fmt::Display for Configuration {
|
||||||
@@ -122,6 +136,11 @@ impl fmt::Display for Configuration {
|
|||||||
)?;
|
)?;
|
||||||
writeln!(f, " - Default Session User: {}", self.default_session_user)?;
|
writeln!(f, " - Default Session User: {}", self.default_session_user)?;
|
||||||
writeln!(f, " - User Session Command: {}", self.user_session_command)?;
|
writeln!(f, " - User Session Command: {}", self.user_session_command)?;
|
||||||
|
writeln!(
|
||||||
|
f,
|
||||||
|
" - Enable multiple session: {}",
|
||||||
|
self.enable_multiple_session
|
||||||
|
)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -402,7 +402,11 @@ impl SessionManager {
|
|||||||
};
|
};
|
||||||
match session.authenticate() {
|
match session.authenticate() {
|
||||||
Ok(()) => {
|
Ok(()) => {
|
||||||
|
DEBUG!("Authenticate success");
|
||||||
invocation.return_value(Some(&Variant::tuple_from_iter([true.to_variant()])));
|
invocation.return_value(Some(&Variant::tuple_from_iter([true.to_variant()])));
|
||||||
|
if ! self.config.enable_multiple_session() {
|
||||||
|
self.drop_all_sessions();
|
||||||
|
}
|
||||||
match self.open_session(self.config.user_session_command(), &session) {
|
match self.open_session(self.config.user_session_command(), &session) {
|
||||||
Ok(pid) => self.pids.push(pid),
|
Ok(pid) => self.pids.push(pid),
|
||||||
Err(error) => CRITICAL!("Failed to run user session: {}", error),
|
Err(error) => CRITICAL!("Failed to run user session: {}", error),
|
||||||
@@ -485,11 +489,26 @@ impl SessionManager {
|
|||||||
Err(error) => {
|
Err(error) => {
|
||||||
CRITICAL!("Unable to get session PID={} status: {}", pid, error);
|
CRITICAL!("Unable to get session PID={} status: {}", pid, error);
|
||||||
let _ = kill(*pid, Signal::SIGKILL);
|
let _ = kill(*pid, Signal::SIGKILL);
|
||||||
let _ = waitpid(*pid, Some(WaitPidFlag::WNOHANG));
|
let _ = waitpid(*pid, None);
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Drop all opened session (including the default one)
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// - `&mut self` (`SessionManager`) - SessionManager
|
||||||
|
///
|
||||||
|
fn drop_all_sessions(&mut self) {
|
||||||
|
DEBUG!("Dropping all running sessions");
|
||||||
|
// kill all running session
|
||||||
|
for pid in self.pids.drain(..) {
|
||||||
|
let _ = kill(pid, Signal::SIGKILL);
|
||||||
|
let _ = waitpid(pid, None);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for SessionManager {
|
impl Drop for SessionManager {
|
||||||
@@ -509,10 +528,7 @@ impl Drop for SessionManager {
|
|||||||
DEBUG!("Releasing acquired D-Bus name");
|
DEBUG!("Releasing acquired D-Bus name");
|
||||||
gio::bus_unown_name(bus_owner_id);
|
gio::bus_unown_name(bus_owner_id);
|
||||||
}
|
}
|
||||||
// kill all running session
|
self.drop_all_sessions();
|
||||||
for pid in self.pids.drain(..) {
|
|
||||||
let _ = kill(pid, Signal::SIGINT);
|
|
||||||
}
|
|
||||||
DEBUG!("Removing signal handlers");
|
DEBUG!("Removing signal handlers");
|
||||||
for signal_id in self.signals.drain(..) {
|
for signal_id in self.signals.drain(..) {
|
||||||
signal_id.remove();
|
signal_id.remove();
|
||||||
|
|||||||
@@ -19,4 +19,5 @@ fn test_configuration_loading() {
|
|||||||
config.user_session_command(),
|
config.user_session_command(),
|
||||||
"/usr/bin/diyac -x /usr/bin/diya-shell"
|
"/usr/bin/diyac -x /usr/bin/diya-shell"
|
||||||
);
|
);
|
||||||
|
assert_eq!(config.enable_multiple_session(), false);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user