cleanup dht stuff and client/server api
This commit is contained in:
@@ -235,6 +235,14 @@ fn get_public_key(text: &str) -> Option<PublicKey> {
|
||||
PublicKey::from_str(text).ok()
|
||||
}
|
||||
|
||||
fn get_crypto_system_version(crypto: Crypto) -> impl FnOnce(&str) -> Option<CryptoSystemVersion> {
|
||||
move |text| {
|
||||
let kindstr = get_string(text)?;
|
||||
let kind = CryptoKind::from_str(&kindstr).ok()?;
|
||||
crypto.get(kind)
|
||||
}
|
||||
}
|
||||
|
||||
fn get_dht_key(
|
||||
routing_table: RoutingTable,
|
||||
) -> impl FnOnce(&str) -> Option<(TypedKey, Option<SafetySelection>)> {
|
||||
@@ -381,10 +389,10 @@ fn get_debug_argument_at<T, G: FnOnce(&str) -> Option<T>>(
|
||||
Ok(val)
|
||||
}
|
||||
|
||||
fn print_data_truncated(data: Vec<u8>) -> String {
|
||||
fn print_data_truncated(data: &[u8]) -> String {
|
||||
// check is message body is ascii printable
|
||||
let mut printable = true;
|
||||
for c in &data {
|
||||
for c in data {
|
||||
if *c < 32 || *c > 126 {
|
||||
printable = false;
|
||||
}
|
||||
@@ -445,6 +453,24 @@ impl VeilidAPI {
|
||||
Ok(routing_table.debug_info_txtrecord().await)
|
||||
}
|
||||
|
||||
async fn debug_keypair(&self, args: String) -> VeilidAPIResult<String> {
|
||||
let args: Vec<String> = args.split_whitespace().map(|s| s.to_owned()).collect();
|
||||
let crypto = self.crypto()?;
|
||||
|
||||
let vcrypto = get_debug_argument_at(
|
||||
&args,
|
||||
0,
|
||||
"debug_keypair",
|
||||
"kind",
|
||||
get_crypto_system_version(crypto.clone()),
|
||||
)
|
||||
.unwrap_or_else(|_| crypto.best());
|
||||
|
||||
// Generate a keypair
|
||||
let out = TypedKeyPair::new(vcrypto.kind(), vcrypto.generate_keypair()).to_string();
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
async fn debug_entries(&self, args: String) -> VeilidAPIResult<String> {
|
||||
let args: Vec<String> = args.split_whitespace().map(|s| s.to_owned()).collect();
|
||||
|
||||
@@ -996,8 +1022,18 @@ impl VeilidAPI {
|
||||
get_dht_key(routing_table),
|
||||
)?;
|
||||
let subkey = get_debug_argument_at(&args, 2, "debug_record_get", "subkey", get_number)?;
|
||||
let force_refresh =
|
||||
get_debug_argument_at(&args, 3, "debug_record_get", "force_refresh", get_string);
|
||||
let force_refresh = if args.len() >= 4 {
|
||||
Some(get_debug_argument_at(
|
||||
&args,
|
||||
3,
|
||||
"debug_record_get",
|
||||
"force_refresh",
|
||||
get_string,
|
||||
)?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let force_refresh = if let Some(force_refresh) = force_refresh {
|
||||
if &force_refresh == "force" {
|
||||
true
|
||||
@@ -1021,7 +1057,7 @@ impl VeilidAPI {
|
||||
};
|
||||
|
||||
// Do a record get
|
||||
let record = match rc.open_dht_record(key, None).await {
|
||||
let _record = match rc.open_dht_record(key, None).await {
|
||||
Err(e) => return Ok(format!("Can't open DHT record: {}", e)),
|
||||
Ok(v) => v,
|
||||
};
|
||||
@@ -1029,7 +1065,18 @@ impl VeilidAPI {
|
||||
.get_dht_value(key, subkey as ValueSubkey, force_refresh)
|
||||
.await
|
||||
{
|
||||
Err(e) => return Ok(format!("Can't get DHT value: {}", e)),
|
||||
Err(e) => {
|
||||
match rc.close_dht_record(key).await {
|
||||
Err(e) => {
|
||||
return Ok(format!(
|
||||
"Can't get DHT value and can't close DHT record: {}",
|
||||
e
|
||||
))
|
||||
}
|
||||
Ok(v) => v,
|
||||
};
|
||||
return Ok(format!("Can't get DHT value: {}", e));
|
||||
}
|
||||
Ok(v) => v,
|
||||
};
|
||||
let out = if let Some(value) = value {
|
||||
@@ -1044,6 +1091,57 @@ impl VeilidAPI {
|
||||
return Ok(out);
|
||||
}
|
||||
|
||||
async fn debug_record_delete(&self, args: Vec<String>) -> VeilidAPIResult<String> {
|
||||
let key = get_debug_argument_at(&args, 1, "debug_record_delete", "key", get_typed_key)?;
|
||||
|
||||
// Do a record delete
|
||||
let rc = self.routing_context();
|
||||
match rc.delete_dht_record(key).await {
|
||||
Err(e) => return Ok(format!("Can't delete DHT record: {}", e)),
|
||||
Ok(v) => v,
|
||||
};
|
||||
Ok(format!("DHT record deleted"))
|
||||
}
|
||||
|
||||
async fn debug_record_info(&self, args: Vec<String>) -> VeilidAPIResult<String> {
|
||||
let netman = self.network_manager()?;
|
||||
let routing_table = netman.routing_table();
|
||||
|
||||
let (key, ss) = get_debug_argument_at(
|
||||
&args,
|
||||
1,
|
||||
"debug_record_info",
|
||||
"key",
|
||||
get_dht_key(routing_table),
|
||||
)?;
|
||||
|
||||
// Get routing context with optional privacy
|
||||
let rc = self.routing_context();
|
||||
let rc = if let Some(ss) = ss {
|
||||
let rcp = match rc.with_custom_privacy(ss) {
|
||||
Err(e) => return Ok(format!("Can't use safety selection: {}", e)),
|
||||
Ok(v) => v,
|
||||
};
|
||||
rcp
|
||||
} else {
|
||||
rc
|
||||
};
|
||||
|
||||
// Do a record get
|
||||
let record = match rc.open_dht_record(key, None).await {
|
||||
Err(e) => return Ok(format!("Can't open DHT record: {}", e)),
|
||||
Ok(v) => v,
|
||||
};
|
||||
|
||||
let out = format!("{:#?}", record);
|
||||
|
||||
match rc.close_dht_record(key).await {
|
||||
Err(e) => return Ok(format!("Can't close DHT record: {}", e)),
|
||||
Ok(v) => v,
|
||||
};
|
||||
return Ok(out);
|
||||
}
|
||||
|
||||
async fn debug_record(&self, args: String) -> VeilidAPIResult<String> {
|
||||
let args: Vec<String> = args.split_whitespace().map(|s| s.to_owned()).collect();
|
||||
|
||||
@@ -1055,57 +1153,63 @@ impl VeilidAPI {
|
||||
self.debug_record_purge(args).await
|
||||
} else if command == "get" {
|
||||
self.debug_record_get(args).await
|
||||
} else if command == "delete" {
|
||||
self.debug_record_delete(args).await
|
||||
} else if command == "info" {
|
||||
self.debug_record_info(args).await
|
||||
} else {
|
||||
Ok(">>> Unknown command\n".to_owned())
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn debug_help(&self, _args: String) -> VeilidAPIResult<String> {
|
||||
Ok(r#">>> Debug commands:
|
||||
help
|
||||
buckets [dead|reliable]
|
||||
dialinfo
|
||||
entries [dead|reliable]
|
||||
entry <node>
|
||||
nodeinfo
|
||||
config [configkey [new value]]
|
||||
txtrecord
|
||||
purge <buckets|connections|routes>
|
||||
attach
|
||||
detach
|
||||
restart network
|
||||
ping <destination>
|
||||
contact <node>[<modifiers>]
|
||||
route allocate [ord|*ord] [rel] [<count>] [in|out]
|
||||
release <route>
|
||||
publish <route> [full]
|
||||
unpublish <route>
|
||||
print <route>
|
||||
list
|
||||
import <blob>
|
||||
test <route>
|
||||
record list <local|remote>
|
||||
purge <local|remote> [bytes]
|
||||
get <dhtkey> <subkey> [force]
|
||||
|
||||
<configkey> is: dot path like network.protocol.udp.enabled
|
||||
<destination> is:
|
||||
* direct: <node>[+<safety>][<modifiers>]
|
||||
* relay: <relay>@<target>[+<safety>][<modifiers>]
|
||||
* private: #<id>[+<safety>]
|
||||
<safety> is:
|
||||
* unsafe: -[ord|*ord]
|
||||
* safe: [route][,ord|*ord][,rel][,<count>]
|
||||
<modifiers> is: [/<protocoltype>][/<addresstype>][/<routingdomain>]
|
||||
<protocoltype> is: udp|tcp|ws|wss
|
||||
<addresstype> is: ipv4|ipv6
|
||||
<routingdomain> is: public|local
|
||||
<dhtkey> is: <key>[+<safety>]
|
||||
<subkey> is: a number: 2
|
||||
<subkeys> is:
|
||||
* a number: 2
|
||||
* a comma-separated inclusive range list: 1..=3,5..=8
|
||||
"#
|
||||
Ok(r#"buckets [dead|reliable]
|
||||
dialinfo
|
||||
entries [dead|reliable]
|
||||
entry <node>
|
||||
nodeinfo
|
||||
config [configkey [new value]]
|
||||
txtrecord
|
||||
keypair
|
||||
purge <buckets|connections|routes>
|
||||
attach
|
||||
detach
|
||||
restart network
|
||||
contact <node>[<modifiers>]
|
||||
ping <destination>
|
||||
route allocate [ord|*ord] [rel] [<count>] [in|out]
|
||||
release <route>
|
||||
publish <route> [full]
|
||||
unpublish <route>
|
||||
print <route>
|
||||
list
|
||||
import <blob>
|
||||
test <route>
|
||||
record list <local|remote>
|
||||
purge <local|remote> [bytes]
|
||||
get <key>[+<safety>] <subkey> [force]
|
||||
delete <key>
|
||||
info <key>
|
||||
--------------------------------------------------------------------
|
||||
<key> is: VLD0:GsgXCRPrzSK6oBNgxhNpm-rTYFd02R0ySx6j9vbQBG4
|
||||
* also <node>, <relay>, <target>, <route>
|
||||
<configkey> is: dot path like network.protocol.udp.enabled
|
||||
<destination> is:
|
||||
* direct: <node>[+<safety>][<modifiers>]
|
||||
* relay: <relay>@<target>[+<safety>][<modifiers>]
|
||||
* private: #<id>[+<safety>]
|
||||
<safety> is:
|
||||
* unsafe: -[ord|*ord]
|
||||
* safe: [route][,ord|*ord][,rel][,<count>]
|
||||
<modifiers> is: [/<protocoltype>][/<addresstype>][/<routingdomain>]
|
||||
<protocoltype> is: udp|tcp|ws|wss
|
||||
<addresstype> is: ipv4|ipv6
|
||||
<routingdomain> is: public|local
|
||||
<subkey> is: a number: 2
|
||||
<subkeys> is:
|
||||
* a number: 2
|
||||
* a comma-separated inclusive range list: 1..=3,5..=8
|
||||
"#
|
||||
.to_owned())
|
||||
}
|
||||
|
||||
@@ -1127,6 +1231,8 @@ impl VeilidAPI {
|
||||
self.debug_dialinfo(rest).await
|
||||
} else if arg == "txtrecord" {
|
||||
self.debug_txtrecord(rest).await
|
||||
} else if arg == "keypair" {
|
||||
self.debug_keypair(rest).await
|
||||
} else if arg == "entries" {
|
||||
self.debug_entries(rest).await
|
||||
} else if arg == "entry" {
|
||||
@@ -1152,7 +1258,7 @@ impl VeilidAPI {
|
||||
} else if arg == "record" {
|
||||
self.debug_record(rest).await
|
||||
} else {
|
||||
Err(VeilidAPIError::generic("Unknown debug command"))
|
||||
Err(VeilidAPIError::generic("Unknown server debug command"))
|
||||
}
|
||||
};
|
||||
res
|
||||
|
@@ -200,7 +200,7 @@ pub enum ResponseOp {
|
||||
VerifySignatures {
|
||||
#[serde(flatten)]
|
||||
#[schemars(with = "ApiResult<Vec<String>>")]
|
||||
result: ApiResultWithVecString<TypedKeySet>,
|
||||
result: ApiResultWithVecString<TypedKeyGroup>,
|
||||
},
|
||||
GenerateSignatures {
|
||||
#[serde(flatten)]
|
||||
|
@@ -112,8 +112,8 @@ pub fn fix_veilidconfiginner() -> VeilidConfigInner {
|
||||
hole_punch_receipt_time_ms: 9000,
|
||||
network_key_password: None,
|
||||
routing_table: VeilidConfigRoutingTable {
|
||||
node_id: TypedKeySet::new(),
|
||||
node_id_secret: TypedSecretSet::new(),
|
||||
node_id: TypedKeyGroup::new(),
|
||||
node_id_secret: TypedSecretGroup::new(),
|
||||
bootstrap: vec!["boots".to_string()],
|
||||
limit_over_attached: 1,
|
||||
limit_fully_attached: 2,
|
||||
|
Reference in New Issue
Block a user