use std::sync::Arc;
use serde::Deserialize;
use trusty_common::uds::server::{RpcRouter, request_peer};
use crate::core::compress::CompressionLevel;
use crate::daemon::state::DaemonState;
use super::core::NoParams;
use super::sessions_legacy_ops as ops;
#[cfg(test)]
#[path = "sessions_legacy_tests.rs"]
mod tests;
pub const METHODS: &[&str] = &[
"mpm.sessions.list",
"mpm.sessions.register",
"mpm.sessions.connect",
"mpm.sessions.discover",
"mpm.sessions.reap",
"mpm.sessions.get",
"mpm.sessions.delete",
"mpm.sessions.pause",
"mpm.sessions.resume",
"mpm.sessions.command",
"mpm.sessions.output",
"mpm.sessions.pane",
"mpm.sessions.set_pid",
"mpm.sessions.events_poll",
"mpm.events.poll",
"mpm.hooks.ingest",
];
#[derive(Deserialize)]
pub struct SessionIdParams {
pub id: String,
}
#[derive(Deserialize)]
pub struct PauseParams {
pub id: String,
#[serde(default)]
pub summary: Option<String>,
}
#[derive(Deserialize)]
pub struct SetPidParams {
pub id: String,
pub pid: u32,
}
#[derive(Deserialize)]
pub struct CommandParams {
pub id: String,
pub command: String,
#[serde(default)]
pub compress: Option<CompressionLevel>,
}
#[derive(Deserialize)]
pub struct OutputParams {
pub id: String,
#[serde(default)]
pub lines: Option<u32>,
#[serde(default)]
pub compress: Option<CompressionLevel>,
}
pub fn register(router: RpcRouter, state: &Arc<DaemonState>) -> RpcRouter {
macro_rules! ok {
($router:expr, $name:literal, $req:ty, $resp:ty, |$s:ident, $r:ident| $call:expr) => {{
let held = Arc::clone(state);
$router.typed::<$req, $resp, _, _>($name, move |$r| {
let $s = Arc::clone(&held);
async move { Ok($call) }
})
}};
}
macro_rules! fallible {
($router:expr, $name:literal, $req:ty, $resp:ty, |$s:ident, $r:ident| $call:expr) => {{
let held = Arc::clone(state);
$router.typed::<$req, $resp, _, _>($name, move |$r| {
let $s = Arc::clone(&held);
async move { $call.map_err(Into::into) }
})
}};
}
use crate::daemon::api::types as t;
use crate::daemon::api::{HookPost, RegisterSession, SessionQuery};
let r = router;
let r = ok!(
r,
"mpm.sessions.list",
Option<SessionQuery>,
t::SessionsResponse,
|s, p| ops::list_sessions(&s, p.unwrap_or_default())
);
let r = fallible!(
r,
"mpm.sessions.register",
RegisterSession,
t::RegisterSessionResponse,
|s, p| ops::register_session(&s, p)
);
let r = fallible!(
r,
"mpm.sessions.connect",
RegisterSession,
t::RegisterSessionResponse,
|s, p| ops::register_session(&s, p)
);
let r = ok!(
r,
"mpm.sessions.discover",
NoParams,
t::DiscoverResponse,
|s, _p| ops::discover_sessions(&s).await
);
let r = ok!(
r,
"mpm.sessions.reap",
NoParams,
t::ReapResponse,
|s, _p| ops::reap_sessions(&s)
);
let r = fallible!(
r,
"mpm.sessions.get",
SessionIdParams,
crate::core::session::Session,
|s, p| ops::get_session(&s, &p.id)
);
let r = fallible!(
r,
"mpm.sessions.delete",
SessionIdParams,
t::RemoveSessionResponse,
|s, p| ops::remove_session(&s, &p.id).await
);
let r = fallible!(
r,
"mpm.sessions.pause",
PauseParams,
t::PauseResponse,
|s, p| ops::pause_session(&s, &p.id, p.summary)
);
let r = fallible!(
r,
"mpm.sessions.resume",
SessionIdParams,
t::ResumeResponse,
|s, p| ops::resume_session(&s, &p.id)
);
let r = fallible!(
r,
"mpm.sessions.command",
CommandParams,
t::CommandResponse,
|s, p| ops::send_command(&s, &p.id, &p.command, p.compress).await
);
let r = fallible!(
r,
"mpm.sessions.output",
OutputParams,
t::OutputResponse,
|s, p| ops::get_output(&s, &p.id, p.lines, p.compress)
);
let r = fallible!(
r,
"mpm.sessions.pane",
OutputParams,
t::OutputResponse,
|s, p| ops::get_output(&s, &p.id, p.lines, p.compress)
);
let r = fallible!(
r,
"mpm.sessions.set_pid",
SetPidParams,
t::SetPidResponse,
|s, p| ops::set_session_pid(&s, &p.id, p.pid)
);
let r = fallible!(
r,
"mpm.sessions.events_poll",
SessionIdParams,
t::EventsResponse,
|s, p| ops::session_events(&s, &p.id)
);
let r = ok!(
r,
"mpm.events.poll",
NoParams,
t::EventsResponse,
|s, _p| ops::recent_events(&s)
);
fallible!(
r,
"mpm.hooks.ingest",
HookPost,
t::HookAcceptedResponse,
|s, p| ops::ingest_hook_from_socket(&s, p, request_peer()).await
)
}