api2/node/time.rs: implement set timezone

This commit is contained in:
Dietmar Maurer 2019-01-24 12:05:06 +01:00
parent cd8b91f78c
commit e6ffeb918c
1 changed files with 43 additions and 9 deletions

View File

@ -28,13 +28,40 @@ fn get_time(_param: Value, _info: &ApiMethod) -> Result<Value, Error> {
}))
}
extern "C" { fn tzset(); }
// Note:: this needs root rights ??
fn set_timezone(param: Value, _info: &ApiMethod) -> Result<Value, Error> {
let timezone = tools::required_string_param(&param, "timezone")?;
let path = std::path::PathBuf::from(format!("/usr/share/zoneinfo/{}", timezone));
if !path.exists() {
bail!("No such timezone.");
}
tools::file_set_contents("/etc/timezone", timezone.as_bytes(), None);
let _ = std::fs::remove_file("/etc/localtime");
use std::os::unix::fs::symlink;
symlink(path, "/etc/localtime")?;
unsafe { tzset() };
Ok(Value::Null)
}
pub fn router() -> Router {
let route = Router::new()
.get(
ApiMethod::new(
get_time, ObjectSchema::new("Read server time and time zone settings."))
.returns(
get_time,
ObjectSchema::new("Read server time and time zone settings.")
).returns(
ObjectSchema::new("Returns server time and timezone.")
.required("timezone", StringSchema::new("Time zone"))
.required("time", IntegerSchema::new("Seconds since 1970-01-01 00:00:00 UTC.")
@ -42,6 +69,13 @@ pub fn router() -> Router {
.required("localtime", IntegerSchema::new("Seconds since 1970-01-01 00:00:00 UTC. (local time)")
.minimum(1297163644))
)
)
.put(
ApiMethod::new(
set_timezone,
ObjectSchema::new("Set time zone.")
.required("timezone", StringSchema::new("Time zone. The file '/usr/share/zoneinfo/zone.tab' contains the list of valid names."))
)
);