5 // use futures::sink::With;
6 use listenfd
::ListenFd
;
8 use actix_web
::{ get
, Responder
, middleware
, App
, HttpServer
, web
::Query
};
11 use std
::{ /*sync::Mutex, */fs
::File
, env
::args
, io
::prelude
::* };
12 use ron
::{ de
::from_reader
, ser
::{ to_string_pretty
, PrettyConfig
} };
13 use serde
::{ Deserialize
, Serialize
};
17 mod valheim_controller
;
20 #[template(path = "main.html")]
29 #[derive(Deserialize)]
34 const VALUE_UNKNOWN
: &str = "-";
37 async
fn main_page(/*key_shared: web::Data<Mutex<String>>,*/ query
: Query
<Request
>) -> impl Responder
{
38 //let key = key_shared.lock().unwrap();
40 match valheim_controller
::get_valheim_executable_information() {
43 text_status
: String
::from("Valheim server is up and running :)"),
44 memory
: info
.format_memory(),
45 load_average
: info
.format_load_average(),
46 uptime
: info
.format_uptime(),
47 world_size
: info
.format_world_size()
50 let value_unknown
= String
::from(VALUE_UNKNOWN
);
51 MainTemplate
{ text_status
: String
::from("Valheim server is down :("), memory
: value_unknown
.clone(), load_average
: value_unknown
.clone(), uptime
: value_unknown
.clone(), world_size
: value_unknown
.clone() }
58 if valheim_controller::is_valheim_running() { String::from("Valheim server is up and running") } else { String::from("Valheim server is down :(") };
60 MainTemplate { sentence: m }
64 #[derive(Debug, Deserialize, Serialize)]
69 const DEFAULT_CONFIG
: Config
= Config
{ port
: 8082 };
71 fn get_exe_name() -> String
{
72 let first_arg
= std
::env
::args().next().unwrap();
73 let sep
: &[_
] = &['
\\'
, '
/'
];
74 first_arg
[first_arg
.rfind(sep
).unwrap()+1..].to_string()
77 fn load_config() -> Config
{
78 // unwrap_or_else(|_| panic!("Failed to open configuration file {}", consts::FILE_CONF));
79 match File
::open(consts
::FILE_CONF
) {
80 Ok(file
) => from_reader(file
).unwrap_or_else(|_
| panic!("Failed to open configuration file {}", consts
::FILE_CONF
)),
82 let mut file
= File
::create(consts
::FILE_CONF
) .unwrap();
83 file
.write_all(to_string_pretty(&DEFAULT_CONFIG
, PrettyConfig
::new()).unwrap().as_bytes()).unwrap(); // We do not use 'to_writer' because it can't pretty format the output.
90 async
fn main() -> std
::io
::Result
<()> {
92 if process_args() { return Ok(()) }
94 println!("Starting Valheim Admin as web server...");
96 let config
= load_config();
98 println!("Configuration: {:?}", config
);
100 let mut listenfd
= ListenFd
::from_env();
105 // .app_data(key_shared.clone())
106 .wrap(middleware
::Compress
::default())
107 .wrap(middleware
::Logger
::default())
109 .service(fs
::Files
::new("/static", "static").show_files_listing())
114 if let Some(l
) = listenfd
.take_tcp_listener(0).unwrap() {
115 server
.listen(l
).unwrap()
117 server
.bind(&format!("0.0.0.0:{}", config
.port
)).unwrap()
123 fn process_args() -> bool
{
126 println!(" {} [--help] [--status]", get_exe_name());
129 let args
: Vec
<String
> = args().collect();
131 if args
.iter().any(|arg
| arg
== "--help") {
134 } else if args
.iter().any(|arg
| arg
== "--status") {
135 println!("{:?}", valheim_controller
::get_valheim_executable_information());