importing new proto file
This commit is contained in:
parent
76c88810a6
commit
8e8e1d1a99
@ -26,3 +26,9 @@ chrono = "0.4.39"
|
|||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
tonic-build = "0.12"
|
tonic-build = "0.12"
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
opt-level = "z"
|
||||||
|
lto = true
|
||||||
|
codegen-units = 1
|
||||||
|
strip = true
|
||||||
|
26
scripts/install_daemon.sh
Executable file
26
scripts/install_daemon.sh
Executable file
@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
echo "Creating folders..."
|
||||||
|
mkdir -p /var/lib/detee/boot/
|
||||||
|
mkdir -p /etc/detee/daemon/vms/
|
||||||
|
mkdir -p /usr/local/bin/detee/
|
||||||
|
mkdir -p /opt/detee_vms/
|
||||||
|
echo "Installing qemu-system-x86..."
|
||||||
|
pacman -S qemu-system-x86 qemu-img --noconfirm
|
||||||
|
|
||||||
|
echo "Downloading detee-snp-daemon, systemd unit file and config..."
|
||||||
|
wget -O /etc/detee/daemon/sample_config.yaml https://registry.detee.ltd/daemon/config.yaml
|
||||||
|
wget -O /usr/local/bin/detee-snp-daemon https://registry.detee.ltd/daemon/detee-snp-daemon
|
||||||
|
chmod +x /usr/local/bin/detee-snp-daemon
|
||||||
|
wget -O /usr/local/bin/detee/start_qemu_vm.sh https://registry.detee.ltd/daemon/start_qemu_vm.sh
|
||||||
|
chmod +x /usr/local/bin/detee/start_qemu_vm.sh
|
||||||
|
wget -O /etc/systemd/system/detee-snp-daemon.service https://registry.detee.ltd/daemon/detee-snp-daemon.service
|
||||||
|
|
||||||
|
echo "Take a look at /etc/detee/daemon/sample_config.yaml"
|
||||||
|
echo "Modify config based on your setup and save it to /etc/detee/daemon/config.yaml"
|
||||||
|
echo "Press enter when done (this will attempt to start the daemon)"
|
||||||
|
read my_var
|
||||||
|
|
||||||
|
echo "Starting detee-snp-daemon..."
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl start detee-snp-daemon.service
|
@ -2,7 +2,8 @@ use anyhow::Result;
|
|||||||
use ed25519_dalek::SigningKey;
|
use ed25519_dalek::SigningKey;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use log::{info, warn};
|
use log::{info, warn};
|
||||||
use std::{fs::File, io::Write};
|
use sha2::{Digest, Sha256};
|
||||||
|
use std::{fs::File, io::Read, io::Write};
|
||||||
|
|
||||||
pub(crate) const VM_BOOT_DIR: &str = "/var/lib/detee/boot/";
|
pub(crate) const VM_BOOT_DIR: &str = "/var/lib/detee/boot/";
|
||||||
pub(crate) const USED_RESOURCES: &str = "/etc/detee/daemon/used_resources.yaml";
|
pub(crate) const USED_RESOURCES: &str = "/etc/detee/daemon/used_resources.yaml";
|
||||||
@ -74,3 +75,18 @@ fn get_ip_info() -> anyhow::Result<IPInfo> {
|
|||||||
info!("Got the following data from ipinfo.io: {body}");
|
info!("Got the following data from ipinfo.io: {body}");
|
||||||
Ok(serde_json::de::from_str(&body)?)
|
Ok(serde_json::de::from_str(&body)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn compute_sha256<P: AsRef<std::path::Path>>(path: P) -> Result<String> {
|
||||||
|
let mut file = File::open(path)?;
|
||||||
|
let mut hasher = Sha256::new();
|
||||||
|
let mut buffer = [0u8; 8192];
|
||||||
|
loop {
|
||||||
|
let bytes_read = file.read(&mut buffer)?;
|
||||||
|
if bytes_read == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
hasher.update(&buffer[..bytes_read]);
|
||||||
|
}
|
||||||
|
let result = hasher.finalize();
|
||||||
|
Ok(format!("{:x}", result))
|
||||||
|
}
|
||||||
|
@ -40,7 +40,7 @@ pub async fn register_node(config: &crate::config::Config) -> Result<Vec<VmContr
|
|||||||
let ip_info = IP_INFO.clone();
|
let ip_info = IP_INFO.clone();
|
||||||
let req = RegisterVmNodeReq {
|
let req = RegisterVmNodeReq {
|
||||||
node_pubkey: PUBLIC_KEY.clone(),
|
node_pubkey: PUBLIC_KEY.clone(),
|
||||||
owner_pubkey: config.owner_wallet.clone(),
|
operator_wallet: config.owner_wallet.clone(),
|
||||||
main_ip: ip_info.ip,
|
main_ip: ip_info.ip,
|
||||||
country: ip_info.country,
|
country: ip_info.country,
|
||||||
region: ip_info.region,
|
region: ip_info.region,
|
||||||
|
32
src/main.rs
32
src/main.rs
@ -5,8 +5,9 @@ mod state;
|
|||||||
|
|
||||||
use crate::global::*;
|
use crate::global::*;
|
||||||
use crate::{config::Config, grpc::snp_proto};
|
use crate::{config::Config, grpc::snp_proto};
|
||||||
use anyhow::Result;
|
use anyhow::{anyhow, Result};
|
||||||
use log::{debug, info, warn};
|
use log::{debug, info, warn};
|
||||||
|
use std::{fs::File, path::Path};
|
||||||
use tokio::{
|
use tokio::{
|
||||||
sync::mpsc::{Receiver, Sender},
|
sync::mpsc::{Receiver, Sender},
|
||||||
time::{sleep, Duration},
|
time::{sleep, Duration},
|
||||||
@ -176,7 +177,7 @@ impl VMHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn run(mut self) {
|
async fn run(mut self) {
|
||||||
sleep(Duration::from_millis(100)).await;
|
sleep(Duration::from_millis(500)).await;
|
||||||
self.send_node_resources().await;
|
self.send_node_resources().await;
|
||||||
while let Some(brain_msg) = self.receiver.recv().await {
|
while let Some(brain_msg) = self.receiver.recv().await {
|
||||||
match brain_msg.msg {
|
match brain_msg.msg {
|
||||||
@ -236,6 +237,10 @@ async fn main() {
|
|||||||
env_logger::builder().filter_level(log::LevelFilter::Debug).init();
|
env_logger::builder().filter_level(log::LevelFilter::Debug).init();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
// This upgrade procedure will get replaced in prod. We need this for the testnet.
|
||||||
|
if let Err(e) = download_and_replace_binary() {
|
||||||
|
log::error!("Failed to upgrade detee-snp-daemon to newer version: {e}");
|
||||||
|
}
|
||||||
let (brain_msg_tx, brain_msg_rx) = tokio::sync::mpsc::channel(6);
|
let (brain_msg_tx, brain_msg_rx) = tokio::sync::mpsc::channel(6);
|
||||||
let (daemon_msg_tx, daemon_msg_rx) = tokio::sync::mpsc::channel(6);
|
let (daemon_msg_tx, daemon_msg_rx) = tokio::sync::mpsc::channel(6);
|
||||||
|
|
||||||
@ -271,3 +276,26 @@ async fn main() {
|
|||||||
sleep(Duration::from_secs(3)).await;
|
sleep(Duration::from_secs(3)).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn download_and_replace_binary() -> Result<()> {
|
||||||
|
use reqwest::blocking::get;
|
||||||
|
use std::os::unix::fs::PermissionsExt;
|
||||||
|
const TMP_DAEMON: &str = "/usr/local/bin/detee/new-daemon";
|
||||||
|
const BINARY: &str = "/usr/local/bin/detee-snp-daemon";
|
||||||
|
let response = get("https://registry.detee.ltd/daemon/detee-snp-daemon")?;
|
||||||
|
if !response.status().is_success() {
|
||||||
|
return Err(anyhow!("Failed to download file: {}", response.status()));
|
||||||
|
}
|
||||||
|
let mut tmp_file = File::create(Path::new(&TMP_DAEMON))?;
|
||||||
|
std::io::copy(&mut response.bytes()?.as_ref(), &mut tmp_file)?;
|
||||||
|
let new_hash = crate::global::compute_sha256(&TMP_DAEMON)?;
|
||||||
|
let old_hash = crate::global::compute_sha256(&BINARY)?;
|
||||||
|
log::debug!("Old binary hash: {old_hash}. New binary hash: {new_hash}");
|
||||||
|
if new_hash != old_hash {
|
||||||
|
std::fs::rename(BINARY, BINARY.to_string() + "_BACKUP")?;
|
||||||
|
std::fs::rename(TMP_DAEMON, BINARY)?;
|
||||||
|
std::fs::set_permissions(BINARY, std::fs::Permissions::from_mode(0o775))?;
|
||||||
|
std::process::exit(0);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
21
src/state.rs
21
src/state.rs
@ -3,13 +3,11 @@ use crate::{config::Config, global::*, grpc::snp_proto};
|
|||||||
use anyhow::{anyhow, Result};
|
use anyhow::{anyhow, Result};
|
||||||
use log::info;
|
use log::info;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use sha2::{Digest, Sha256};
|
|
||||||
use std::{
|
use std::{
|
||||||
collections::{HashMap, HashSet},
|
collections::{HashMap, HashSet},
|
||||||
fs,
|
fs,
|
||||||
fs::{remove_file, File},
|
fs::{remove_file, File},
|
||||||
io::{Read, Write},
|
io::Write,
|
||||||
path::Path,
|
|
||||||
process::Command,
|
process::Command,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -996,7 +994,7 @@ fn download_and_check_sha(url: &str, sha: &str) -> Result<()> {
|
|||||||
}
|
}
|
||||||
let mut file = File::create(Path::new(&save_path))?;
|
let mut file = File::create(Path::new(&save_path))?;
|
||||||
copy(&mut response.bytes()?.as_ref(), &mut file)?;
|
copy(&mut response.bytes()?.as_ref(), &mut file)?;
|
||||||
match compute_sha256(&save_path) {
|
match crate::global::compute_sha256(&save_path) {
|
||||||
Ok(hash) => {
|
Ok(hash) => {
|
||||||
if hash != sha {
|
if hash != sha {
|
||||||
return Err(anyhow!(
|
return Err(anyhow!(
|
||||||
@ -1010,18 +1008,3 @@ fn download_and_check_sha(url: &str, sha: &str) -> Result<()> {
|
|||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compute_sha256<P: AsRef<Path>>(path: P) -> Result<String> {
|
|
||||||
let mut file = fs::File::open(path)?;
|
|
||||||
let mut hasher = Sha256::new();
|
|
||||||
let mut buffer = [0u8; 8192];
|
|
||||||
loop {
|
|
||||||
let bytes_read = file.read(&mut buffer)?;
|
|
||||||
if bytes_read == 0 {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
hasher.update(&buffer[..bytes_read]);
|
|
||||||
}
|
|
||||||
let result = hasher.finalize();
|
|
||||||
Ok(format!("{:x}", result))
|
|
||||||
}
|
|
||||||
|
74
vm.proto
74
vm.proto
@ -55,7 +55,7 @@ message MeasurementIP {
|
|||||||
// This should also include a block hash or similar, for auth
|
// This should also include a block hash or similar, for auth
|
||||||
message RegisterVmNodeReq {
|
message RegisterVmNodeReq {
|
||||||
string node_pubkey = 1;
|
string node_pubkey = 1;
|
||||||
string owner_pubkey = 2;
|
string operator_wallet = 2;
|
||||||
string main_ip = 3;
|
string main_ip = 3;
|
||||||
string country = 4;
|
string country = 4;
|
||||||
string region = 5;
|
string region = 5;
|
||||||
@ -174,15 +174,14 @@ message VmNodeFilters {
|
|||||||
}
|
}
|
||||||
|
|
||||||
message VmNodeListResp {
|
message VmNodeListResp {
|
||||||
string node_pubkey = 1;
|
string operator = 1;
|
||||||
string country = 2;
|
string node_pubkey = 2;
|
||||||
string region = 3;
|
string country = 3;
|
||||||
string city = 4;
|
string region = 4;
|
||||||
string ip = 5; // required for latency test
|
string city = 5;
|
||||||
uint32 server_rating = 6;
|
string ip = 6; // required for latency test
|
||||||
uint32 provider_rating = 7;
|
repeated string reports = 7; // TODO: this will become an enum
|
||||||
// nanoLP per unit per minute
|
uint64 price = 8; // nanoLP per unit per minute
|
||||||
uint64 price = 8;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
message ExtendVmReq {
|
message ExtendVmReq {
|
||||||
@ -196,12 +195,60 @@ message AirdropReq {
|
|||||||
uint64 tokens = 2;
|
uint64 tokens = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message SlashReq {
|
||||||
|
string pubkey = 1;
|
||||||
|
uint64 tokens = 2;
|
||||||
|
}
|
||||||
|
|
||||||
message Account {
|
message Account {
|
||||||
string pubkey = 1;
|
string pubkey = 1;
|
||||||
uint64 balance = 2;
|
uint64 balance = 2;
|
||||||
uint64 tmp_locked = 3;
|
uint64 tmp_locked = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message RegOperatorReq {
|
||||||
|
string pubkey = 1;
|
||||||
|
uint64 escrow = 2;
|
||||||
|
string email = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ListOperatorsResp {
|
||||||
|
string pubkey = 1;
|
||||||
|
uint64 escrow = 2;
|
||||||
|
string email = 3;
|
||||||
|
uint64 app_nodes = 4;
|
||||||
|
uint64 vm_nodes = 5;
|
||||||
|
uint64 reports = 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
message InspectOperatorResp {
|
||||||
|
ListOperatorsResp operator = 1;
|
||||||
|
repeated VmNodeListResp nodes = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ReportNodeReq {
|
||||||
|
string admin_pubkey = 1;
|
||||||
|
string node_pubkey = 2;
|
||||||
|
string contract = 3;
|
||||||
|
string reason = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message KickReq {
|
||||||
|
string operator_wallet = 1;
|
||||||
|
string contract_uuid = 2;
|
||||||
|
string reason = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message BanUserReq {
|
||||||
|
string operator_wallet = 1;
|
||||||
|
string user_wallet = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message KickResp {
|
||||||
|
uint64 nano_lp = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
service BrainCli {
|
service BrainCli {
|
||||||
rpc GetBalance (Pubkey) returns (AccountBalance);
|
rpc GetBalance (Pubkey) returns (AccountBalance);
|
||||||
rpc NewVm (NewVmReq) returns (NewVmResp);
|
rpc NewVm (NewVmReq) returns (NewVmResp);
|
||||||
@ -211,8 +258,15 @@ service BrainCli {
|
|||||||
rpc DeleteVm (DeleteVmReq) returns (Empty);
|
rpc DeleteVm (DeleteVmReq) returns (Empty);
|
||||||
rpc UpdateVm (UpdateVmReq) returns (UpdateVmResp);
|
rpc UpdateVm (UpdateVmReq) returns (UpdateVmResp);
|
||||||
rpc ExtendVm (ExtendVmReq) returns (Empty);
|
rpc ExtendVm (ExtendVmReq) returns (Empty);
|
||||||
|
rpc ReportNode (ReportNodeReq) returns (Empty);
|
||||||
|
rpc ListOperators (Empty) returns (stream ListOperatorsResp);
|
||||||
|
rpc InspectOperator (Pubkey) returns (InspectOperatorResp);
|
||||||
|
rpc RegisterOperator (RegOperatorReq) returns (Empty);
|
||||||
|
rpc KickContract (KickReq) returns (KickResp);
|
||||||
|
rpc BanUser (BanUserReq) returns (Empty);
|
||||||
// admin commands
|
// admin commands
|
||||||
rpc Airdrop (AirdropReq) returns (Empty);
|
rpc Airdrop (AirdropReq) returns (Empty);
|
||||||
|
rpc Slash (SlashReq) returns (Empty);
|
||||||
rpc ListAllVmContracts (Empty) returns (stream VmContract);
|
rpc ListAllVmContracts (Empty) returns (stream VmContract);
|
||||||
rpc ListAccounts (Empty) returns (stream Account);
|
rpc ListAccounts (Empty) returns (stream Account);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user