From da5a0d622beb23d69ef9de481327d88a1d32248e Mon Sep 17 00:00:00 2001 From: Keagan McClelland Date: Thu, 19 Aug 2021 11:42:17 -0600 Subject: [PATCH] adds avahi base service to init function of mdns controller (#407) * adds avahi base service to init function of mdns controller * Apply suggestions from code review * adds hostname set to startup sequence * Apply suggestions from code review Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com> --- appmgr/Cargo.lock | 1 + appmgr/Cargo.toml | 1 + appmgr/src/bin/embassy-init.rs | 3 +++ appmgr/src/hostname.rs | 36 ++++++++++++++++++++++++++++++++++ appmgr/src/lib.rs | 1 + appmgr/src/net/mdns.rs | 17 ++++++++++++++-- 6 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 appmgr/src/hostname.rs diff --git a/appmgr/Cargo.lock b/appmgr/Cargo.lock index 05b9e4607..f7b465b72 100644 --- a/appmgr/Cargo.lock +++ b/appmgr/Cargo.lock @@ -798,6 +798,7 @@ dependencies = [ "fd-lock-rs", "futures", "git-version", + "hex", "http", "hyper-ws-listener", "indexmap", diff --git a/appmgr/Cargo.toml b/appmgr/Cargo.toml index 83eeb47e8..26a325f36 100644 --- a/appmgr/Cargo.toml +++ b/appmgr/Cargo.toml @@ -61,6 +61,7 @@ emver = { version = "0.1.2", features = ["serde"] } fd-lock-rs = "0.1.3" futures = "0.3.8" git-version = "0.3.4" +hex = "0.4.3" http = "0.2.3" hyper-ws-listener = { git = "https://github.com/Start9Labs/hyper-ws-listener.git", branch = "main" } indexmap = { version = "1.6.2", features = ["serde"] } diff --git a/appmgr/src/bin/embassy-init.rs b/appmgr/src/bin/embassy-init.rs index f92097a52..8d48cbfd4 100644 --- a/appmgr/src/bin/embassy-init.rs +++ b/appmgr/src/bin/embassy-init.rs @@ -4,6 +4,9 @@ async fn inner_main() -> Result<(), Error> { // os sync embassy::volume::disk::mount("/dev/sda", "/mnt/embassy-os-crypt").await?; + // hostname-set + embassy::hostname::sync_hostname().await?; + Ok(()) } diff --git a/appmgr/src/hostname.rs b/appmgr/src/hostname.rs new file mode 100644 index 000000000..3e5cc7005 --- /dev/null +++ b/appmgr/src/hostname.rs @@ -0,0 +1,36 @@ +use digest::Digest; +use tokio::process::Command; + +use crate::util::Invoke; +use crate::{Error, ErrorKind}; + +pub async fn get_hostname() -> Result { + let out = Command::new("hostname") + .invoke(ErrorKind::ParseSysInfo) + .await?; + let out_string = String::from_utf8(out)?; + Ok(out_string.trim().to_owned()) +} + +pub async fn set_hostname(hostname: &str) -> Result<(), Error> { + let _out = Command::new("hostnamectl") + .arg("set-hostname") + .arg(hostname) + .invoke(ErrorKind::ParseSysInfo) + .await?; + Ok(()) +} + +pub async fn get_product_key() -> Result { + let out = tokio::fs::read_to_string("/boot/product_key.txt").await?; + Ok(out.trim().to_owned()) +} + +pub async fn sync_hostname() -> Result<(), Error> { + let key = get_product_key().await?; + let mut hasher = sha2::Sha256::new(); + hasher.update(key.as_bytes()); + let res = hasher.finalize(); + set_hostname(&format!("start9-{}", hex::encode(&res[0..4]))).await?; + Ok(()) +} diff --git a/appmgr/src/lib.rs b/appmgr/src/lib.rs index 04ad4d4d7..379cccdec 100644 --- a/appmgr/src/lib.rs +++ b/appmgr/src/lib.rs @@ -26,6 +26,7 @@ pub mod db; pub mod dependencies; pub mod developer; pub mod error; +pub mod hostname; pub mod id; pub mod inspect; pub mod install; diff --git a/appmgr/src/net/mdns.rs b/appmgr/src/net/mdns.rs index 00fff5acf..400f246c4 100644 --- a/appmgr/src/net/mdns.rs +++ b/appmgr/src/net/mdns.rs @@ -1,8 +1,8 @@ use std::collections::HashMap; use avahi_sys::{ - self, avahi_entry_group_commit, avahi_entry_group_free, avahi_entry_group_reset, avahi_free, - AvahiEntryGroup, + self, avahi_entry_group_add_service, avahi_entry_group_commit, avahi_entry_group_free, + avahi_entry_group_reset, avahi_free, AvahiEntryGroup, }; use libc::c_void; use patch_db::{DbHandle, OptionModel}; @@ -93,6 +93,19 @@ impl MdnsControllerInner { let hostname_raw = avahi_sys::avahi_client_get_host_name_fqdn(avahi_client); hostname_buf .extend_from_slice(std::ffi::CStr::from_ptr(hostname_raw).to_bytes_with_nul()); + let http_tcp_cstr = std::ffi::CString::new("_http._tcp") + .expect("Could not cast _http._tcp to c string"); + avahi_entry_group_add_service( + group, + avahi_sys::AVAHI_IF_UNSPEC, + avahi_sys::AVAHI_PROTO_UNSPEC, + avahi_sys::AvahiPublishFlags_AVAHI_PUBLISH_USE_MULTICAST, + hostname_raw, + http_tcp_cstr.as_ptr(), + std::ptr::null(), + std::ptr::null(), + 443, + ); avahi_free(hostname_raw as *mut c_void); } let buflen = hostname_buf.len();