]>
git.proxmox.com Git - proxmox-backup.git/blob - src/api2/node/dns.rs
6 use crate::api_schema
::*;
7 //use crate::api_schema::router::*;
8 use crate::api2
::types
::*;
10 use lazy_static
::lazy_static
;
12 use std
::sync
::{Arc, Mutex}
;
16 use serde_json
::{json, Value}
;
18 static RESOLV_CONF_FN
: &str = "/etc/resolv.conf";
20 fn read_etc_resolv_conf() -> Result
<Value
, Error
> {
22 let mut result
= json
!({}
);
26 let raw
= tools
::file_get_contents(RESOLV_CONF_FN
)?
;
28 result
["digest"] = Value
::from(tools
::digest_to_hex(&sha
::sha256(&raw
)));
30 let data
= String
::from_utf8(raw
)?
;
33 static ref DOMAIN_REGEX
: Regex
= Regex
::new(r
"^\s*(?:search|domain)\s+(\S+)\s*").unwrap();
34 static ref SERVER_REGEX
: Regex
= Regex
::new(
35 concat
!(r
"^\s*nameserver\s+(", IPRE
!(), r
")\s*")).unwrap();
38 for line
in data
.lines() {
40 if let Some(caps
) = DOMAIN_REGEX
.captures(&line
) {
41 result
["search"] = Value
::from(&caps
[1]);
42 } else if let Some(caps
) = SERVER_REGEX
.captures(&line
) {
44 if nscount
> 3 { continue }
;
45 let nameserver
= &caps
[1];
46 let id
= format
!("dns{}", nscount
);
47 result
[id
] = Value
::from(nameserver
);
57 _rpcenv
: &mut dyn RpcEnvironment
,
58 ) -> Result
<Value
, Error
> {
61 static ref MUTEX
: Arc
<Mutex
<usize>> = Arc
::new(Mutex
::new(0));
64 let _guard
= MUTEX
.lock();
66 let search
= tools
::required_string_param(¶m
, "search")?
;
68 let raw
= tools
::file_get_contents(RESOLV_CONF_FN
)?
;
69 let old_digest
= tools
::digest_to_hex(&sha
::sha256(&raw
));
71 if let Some(digest
) = param
["digest"].as_str() {
72 tools
::assert_if_modified(&old_digest
, &digest
)?
;
75 let old_data
= String
::from_utf8(raw
)?
;
77 let mut data
= format
!("search {}\n", search
);
79 for opt
in &["dns1", "dns2", "dns3"] {
80 if let Some(server
) = param
[opt
].as_str() {
81 data
.push_str(&format
!("nameserver {}\n", server
));
87 static ref SKIP_REGEX
: Regex
= Regex
::new(r
"^(search|domain|nameserver)\s+").unwrap();
89 for line
in old_data
.lines() {
90 if SKIP_REGEX
.is_match(line
) { continue; }
95 tools
::file_set_contents(RESOLV_CONF_FN
, data
.as_bytes(), None
)?
;
103 _rpcenv
: &mut dyn RpcEnvironment
,
104 ) -> Result
<Value
, Error
> {
106 read_etc_resolv_conf()
109 pub fn router() -> Router
{
111 let route
= Router
::new()
115 ObjectSchema
::new("Read DNS settings.")
116 .required("node", NODE_SCHEMA
.clone())
118 ObjectSchema
::new("Returns DNS server IPs and sreach domain.")
119 .required("digest", PVE_CONFIG_DIGEST_SCHEMA
.clone())
120 .optional("search", SEARCH_DOMAIN_SCHEMA
.clone())
121 .optional("dns1", FIRST_DNS_SERVER_SCHEMA
.clone())
122 .optional("dns2", SECOND_DNS_SERVER_SCHEMA
.clone())
123 .optional("dns3", THIRD_DNS_SERVER_SCHEMA
.clone())
129 ObjectSchema
::new("Returns DNS server IPs and sreach domain.")
130 .required("node", NODE_SCHEMA
.clone())
131 .required("search", SEARCH_DOMAIN_SCHEMA
.clone())
132 .optional("dns1", FIRST_DNS_SERVER_SCHEMA
.clone())
133 .optional("dns2", SECOND_DNS_SERVER_SCHEMA
.clone())
134 .optional("dns3", THIRD_DNS_SERVER_SCHEMA
.clone())
135 .optional("digest", PVE_CONFIG_DIGEST_SCHEMA
.clone())