agent: register agent to backend
This commit is contained in:
parent
a8699035d8
commit
40be58f9c6
5 changed files with 68 additions and 17 deletions
32
agent/Cargo.lock
generated
32
agent/Cargo.lock
generated
|
@ -592,6 +592,15 @@ version = "2.5.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
|
||||
|
||||
[[package]]
|
||||
name = "memoffset"
|
||||
version = "0.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mime"
|
||||
version = "0.3.17"
|
||||
|
@ -633,6 +642,20 @@ dependencies = [
|
|||
"tempfile",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nix"
|
||||
version = "0.26.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"memoffset",
|
||||
"pin-utils",
|
||||
"static_assertions",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ntapi"
|
||||
version = "0.4.1"
|
||||
|
@ -857,9 +880,10 @@ version = "0.1.0"
|
|||
dependencies = [
|
||||
"anyhow",
|
||||
"clap",
|
||||
"libc",
|
||||
"nix",
|
||||
"prost",
|
||||
"reqwest",
|
||||
"serde_json",
|
||||
"sysinfo",
|
||||
"tokio",
|
||||
"tokio-stream",
|
||||
|
@ -1099,6 +1123,12 @@ dependencies = [
|
|||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "static_assertions"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.10.0"
|
||||
|
|
|
@ -6,9 +6,10 @@ edition = "2021"
|
|||
[dependencies]
|
||||
anyhow = "1.0.71"
|
||||
clap = { version = "4.3.9" }
|
||||
libc = "0.2.147"
|
||||
nix = "0.26.2"
|
||||
prost = "0.11.9"
|
||||
reqwest = { version = "0.11.18", features = ["blocking"] }
|
||||
serde_json = "1.0.99"
|
||||
sysinfo = { version = "0.29.2", default-features = false }
|
||||
tokio = { version = "1.28.2", features = ["rt-multi-thread", "io-util", "process", "macros", "signal"] }
|
||||
tokio-stream = { version = "0.1.14", features = ["net"] }
|
||||
|
|
|
@ -28,7 +28,7 @@ main() {
|
|||
ensure chmod u+x "$file"
|
||||
|
||||
# Run the installer
|
||||
"$file" --install
|
||||
"$file" --install "$@"
|
||||
local ret=$?
|
||||
|
||||
rm "${file}"
|
||||
|
|
|
@ -12,25 +12,17 @@ fn main() -> anyhow::Result<()> {
|
|||
let command = clap::Command::new(env!("CARGO_BIN_NAME"))
|
||||
.version(env!("CARGO_PKG_VERSION"))
|
||||
.arg(arg!(-d --daemon "Run agent as daemon").exclusive(true))
|
||||
.arg(arg!(--install "Install this agent binary to the system").exclusive(true))
|
||||
.arg(arg!(--update "Download updated agent version and install it").exclusive(true))
|
||||
.arg(arg!(--install <TOKEN> "Install this agent binary to the system").exclusive(true))
|
||||
.arg_required_else_help(true)
|
||||
.try_get_matches()
|
||||
.unwrap_or_else(|e| e.exit());
|
||||
|
||||
let is_daemon = command.get_flag("daemon");
|
||||
let is_install = command.get_flag("install");
|
||||
let is_update = command.get_flag("update");
|
||||
|
||||
if is_daemon {
|
||||
if command.get_flag("daemon") {
|
||||
tracing::info!("running as daemon");
|
||||
server::main()
|
||||
} else if is_install {
|
||||
} else if let Some(token) = command.get_one::<String>("install") {
|
||||
tracing::info!("running install mode");
|
||||
self_update::install()
|
||||
} else if is_update {
|
||||
tracing::info!("running update mode");
|
||||
self_update::update()
|
||||
self_update::install(token)
|
||||
} else {
|
||||
unreachable!()
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use std::{os::unix::prelude::PermissionsExt, path::Path};
|
||||
|
||||
use anyhow::{anyhow, Context};
|
||||
use reqwest::Url;
|
||||
|
||||
const GET_PRYMN_URL: &str = "todo";
|
||||
|
@ -13,11 +14,15 @@ pub fn update() -> anyhow::Result<()> {
|
|||
todo!();
|
||||
}
|
||||
|
||||
pub fn install() -> anyhow::Result<()> {
|
||||
pub fn install(token: &str) -> anyhow::Result<()> {
|
||||
let this_exe = std::env::current_exe()?;
|
||||
let prymn_path = Path::new("/usr/local/bin/prymn_agent");
|
||||
|
||||
copy_binary(&this_exe, prymn_path)
|
||||
copy_binary(&this_exe, prymn_path)?;
|
||||
register_agent(token).context("while registering the agent")?;
|
||||
install_service()?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn copy_binary(src: impl AsRef<Path>, dest: impl AsRef<Path>) -> anyhow::Result<()> {
|
||||
|
@ -38,3 +43,26 @@ fn copy_binary(src: impl AsRef<Path>, dest: impl AsRef<Path>) -> anyhow::Result<
|
|||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn register_agent(token: &str) -> anyhow::Result<()> {
|
||||
let client = reqwest::blocking::Client::new();
|
||||
|
||||
let res = client
|
||||
.post("http://localhost:4000/api/v1/servers/register")
|
||||
.body(serde_json::json!({"token": token}).to_string())
|
||||
.send()?;
|
||||
|
||||
if !res.status().is_success() {
|
||||
// TODO: Make better error message
|
||||
return Err(anyhow!(
|
||||
"register request returned an error: {}",
|
||||
res.text()?
|
||||
));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn install_service() -> anyhow::Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue