use serde_json::{json, Value};
use tokio::io::{AsyncBufReadExt, BufReader};
-use proxmox::api::router::{Router, SubdirMap};
-use proxmox::api::{
- api, schema::*, ApiHandler, ApiMethod, ApiResponseFuture, Permission, RpcEnvironment,
+use proxmox_sys::{identity, sortable};
+use proxmox_sys::fd::fd_change_cloexec;
+
+use proxmox_router::{
+ ApiHandler, ApiMethod, ApiResponseFuture, Permission, RpcEnvironment, Router, SubdirMap,
};
-use proxmox::list_subdirs_api_method;
+use proxmox_schema::*;
+use proxmox_router::list_subdirs_api_method;
use proxmox_http::websocket::WebSocket;
-use proxmox::{identity, sortable};
-use pbs_tools::auth::private_auth_key;
+use proxmox_rest_server::WorkerTask;
+
+use pbs_api_types::{Authid, NODE_SCHEMA, PRIV_SYS_CONSOLE};
use pbs_tools::ticket::{self, Empty, Ticket};
-use crate::api2::types::*;
-use crate::config::acl::PRIV_SYS_CONSOLE;
-use crate::server::WorkerTask;
use crate::tools;
+use crate::auth_helpers::private_auth_key;
pub mod apt;
pub mod certificates;
pub mod disks;
pub mod dns;
pub mod network;
-pub mod tasks;
pub mod subscription;
+pub mod tasks;
pub(crate) mod rrd;
mod journal;
+mod report;
pub(crate) mod services;
mod status;
mod syslog;
mod time;
-mod report;
pub const SHELL_CMD_SCHEMA: Schema = StringSchema::new("The command to run.")
.format(&ApiStringFormat::Enum(&[
}
)]
/// Call termproxy and return shell ticket
-async fn termproxy(
- cmd: Option<String>,
- rpcenv: &mut dyn RpcEnvironment,
-) -> Result<Value, Error> {
+async fn termproxy(cmd: Option<String>, rpcenv: &mut dyn RpcEnvironment) -> Result<Value, Error> {
// intentionally user only for now
let auth_id: Authid = rpcenv
.get_auth_id()
let listener = TcpListener::bind("localhost:0")?;
let port = listener.local_addr()?.port();
- let ticket = Ticket::new(ticket::TERM_PREFIX, &Empty)?
- .sign(
- private_auth_key(),
- Some(&tools::ticket::term_aad(&userid, &path, port)),
- )?;
+ let ticket = Ticket::new(ticket::TERM_PREFIX, &Empty)?.sign(
+ private_auth_key(),
+ Some(&tools::ticket::term_aad(&userid, &path, port)),
+ )?;
let mut command = Vec::new();
match cmd.as_deref() {
let upid = WorkerTask::spawn(
"termproxy",
None,
- auth_id,
+ auth_id.to_string(),
false,
move |worker| async move {
// move inside the worker so that it survives and does not close the port
// remove CLOEXEC from listenere so that we can reuse it in termproxy
- tools::fd_change_cloexec(listener.as_raw_fd(), false)?;
+ fd_change_cloexec(listener.as_raw_fd(), false)?;
let mut arguments: Vec<&str> = Vec::new();
let fd_string = listener.as_raw_fd().to_string();
let stdout_fut = async move {
let mut reader = BufReader::new(stdout).lines();
while let Some(line) = reader.next_line().await? {
- worker_stdout.log(line);
+ worker_stdout.log_message(line);
}
Ok::<(), Error>(())
};
let stderr_fut = async move {
let mut reader = BufReader::new(stderr).lines();
while let Some(line) = reader.next_line().await? {
- worker_stderr.warn(line);
+ worker_stderr.log_warning(line);
}
Ok::<(), Error>(())
};
let mut needs_kill = false;
- let res = tokio::select!{
+ let res = tokio::select! {
res = child.wait() => {
let exit_code = res?;
if !exit_code.success() {
}
if let Err(err) = child.kill().await {
- worker.warn(format!("error killing termproxy: {}", err));
+ worker.log_warning(format!("error killing termproxy: {}", err));
} else if let Err(err) = child.wait().await {
- worker.warn(format!("error awaiting termproxy: {}", err));
+ worker.log_warning(format!("error awaiting termproxy: {}", err));
}
}
}
let userid = auth_id.user();
- let ticket = tools::required_string_param(¶m, "vncticket")?;
- let port: u16 = tools::required_integer_param(¶m, "port")? as u16;
+ let ticket = pbs_tools::json::required_string_param(¶m, "vncticket")?;
+ let port: u16 = pbs_tools::json::required_integer_param(¶m, "port")? as u16;
// will be checked again by termproxy
- Ticket::<Empty>::parse(ticket)?
- .verify(
- crate::auth_helpers::public_auth_key(),
- ticket::TERM_PREFIX,
- Some(&tools::ticket::term_aad(&userid, "/system", port)),
- )?;
+ Ticket::<Empty>::parse(ticket)?.verify(
+ crate::auth_helpers::public_auth_key(),
+ ticket::TERM_PREFIX,
+ Some(&tools::ticket::term_aad(&userid, "/system", port)),
+ )?;
let (ws, response) = WebSocket::new(parts.headers.clone())?;
- crate::server::spawn_internal_task(async move {
- let conn: Upgraded = match hyper::upgrade::on(Request::from_parts(parts, req_body)).map_err(Error::from).await {
- Ok(upgraded) => upgraded,
+ proxmox_rest_server::spawn_internal_task(async move {
+ let conn: Upgraded = match hyper::upgrade::on(Request::from_parts(parts, req_body))
+ .map_err(Error::from)
+ .await
+ {
+ Ok(upgraded) => upgraded,
_ => bail!("error"),
};
.boxed()
}
+#[api]
+/// List Nodes (only for compatiblity)
+fn list_nodes() -> Result<Value, Error> {
+ Ok(json!([ { "node": proxmox_sys::nodename().to_string() } ]))
+}
+
pub const SUBDIRS: SubdirMap = &[
("apt", &apt::ROUTER),
("certificates", &certificates::ROUTER),
),
];
-pub const ROUTER: Router = Router::new()
+pub const ITEM_ROUTER: Router = Router::new()
.get(&list_subdirs_api_method!(SUBDIRS))
.subdirs(SUBDIRS);
+
+pub const ROUTER: Router = Router::new()
+ .get(&API_METHOD_LIST_NODES)
+ .match_all("node", &ITEM_ROUTER);