Skip to content

Commit

Permalink
Upgrade windows server code to make it safe + fixes (#56)
Browse files Browse the repository at this point in the history
* fix-server-code

* ff

* ff

* fix

* TakeLocker + fix log
  • Loading branch information
wiiznokes committed Dec 31, 2023
1 parent a9d54aa commit 8a9481e
Show file tree
Hide file tree
Showing 8 changed files with 208 additions and 99 deletions.
4 changes: 2 additions & 2 deletions data/src/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@ pub struct Args {
#[arg(
long = "debug",
default_value_t = false,
help = "Show debug level of logs"
help = "Access debug level logs"
)]
pub debug: bool,

#[arg(
long = "info",
default_value_t = false,
help = "Show info level of logs"
help = "Access info level logs"
)]
pub info: bool,

Expand Down
8 changes: 4 additions & 4 deletions data/src/update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -284,12 +284,12 @@ impl Node {
let value = match &mut self.node_type {
crate::node::NodeType::Control(control) => {
let input_value = input_values[0];
if self.value == Some(input_value) {
return if self.value == Some(input_value) {
debug!("Control {} already set to {}", control.name, input_value);
Ok(input_value)
Ok(())
} else {
control.set_value(input_value, bridge)
}
control.set_value(input_value, bridge).map(|_| ())
};
}
crate::node::NodeType::Fan(fan) => fan.get_value(bridge),
crate::node::NodeType::Temp(temp) => temp.get_value(bridge),
Expand Down
2 changes: 1 addition & 1 deletion hardware/LibreHardwareMonitorWrapper/HardwareManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public int GetValue(int index)
HardwareType.Control => (hardware as Control)!.Value(),
HardwareType.Fan => (hardware as Sensor)!.Value(),
HardwareType.Temp => (hardware as Sensor)!.Value(),
_ => throw new ArgumentOutOfRangeException(hardware.Type.ToString())
_ => throw new ArgumentOutOfRangeException(nameof(hardware.Type), hardware.Type, "Unknown hardware type")
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,13 @@ public void Start()

public void Stop()
{
Logger.Info("Shutdown Lhm");

if (!_isStarted)
return;

_mComputer.Close();
_isStarted = false;

Logger.Debug("Shutdown Lhm");
}


Expand Down
9 changes: 6 additions & 3 deletions hardware/LibreHardwareMonitorWrapper/Logger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public static string ToString(LogLevel level)
LogLevel.Debug => "DEBUG",
LogLevel.Info => "INFO ",
LogLevel.Error => "ERROR",
_ => throw new ArgumentOutOfRangeException(nameof(level), level, null)
_ => throw new ArgumentOutOfRangeException(nameof(level), level, "Unknown log level")
};
}
}
Expand Down Expand Up @@ -60,7 +60,10 @@ private static void Write(LogLevel level, string log)
var currentTime = DateTime.Now;
var currentTimeString = currentTime.ToString("HH:mm:ss");
var finalLog = "[" + LogLevelManager.ToString(level) + " LHM " + currentTimeString + "] " + log + ".";
if (_filePath != null) File.AppendAllText(_filePath, finalLog + Environment.NewLine);
Console.WriteLine(finalLog);

if (_filePath == null)
Console.WriteLine(finalLog);
else
File.AppendAllText(_filePath, finalLog + Environment.NewLine);
}
}
172 changes: 140 additions & 32 deletions hardware/LibreHardwareMonitorWrapper/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,59 +2,167 @@
using Microsoft.Win32;



HardwareManager hardwareManager = null!;
Server server = null!;

var isServerStarted = false;
var isHardwareManagerStarted = false;


TakeLocker shutDownTakeLocker = new();


SetupLog();


Console.CancelKeyPress += (_, _) =>
{
Logger.Info("On canceled process");
ShutDown();
};

SystemEvents.SessionEnding += (_, _) =>
{
Logger.Info("On disconnected session");
ShutDown();
};


var connectCts = new CancellationTokenSource();
var connectTask = Task.Run(() =>
{
server = new Server();
isServerStarted = true;
}, connectCts.Token);

try
{
var maybeLogFilePath = Environment.GetEnvironmentVariable("FAN_CONTROL_LOG_FILE");
if (maybeLogFilePath != null)
hardwareManager = new HardwareManager();
isHardwareManagerStarted = true;
}
catch (Exception e)
{
Logger.Error("Can't start hardware manager: " + e.Message);
try
{
connectCts.Cancel();
await connectTask;
}
catch (Exception)
{
var logFileNameWithoutExtension = Path.GetFileNameWithoutExtension(maybeLogFilePath);
var logFileName = logFileNameWithoutExtension + "-lhm.txt";
Logger.Error("Cancel server task: " + e.Message);
}
ShutDown();
return 1;
}

var lhmLogFilePath = Path.Combine(Path.GetDirectoryName(maybeLogFilePath) ?? throw new InvalidOperationException(), logFileName);

Logger.LogToFile(lhmLogFilePath);
}

string jsonText;
try
{
jsonText = hardwareManager.ToJson();
}
catch (Exception)
catch (Exception e)
{
// ignored
Logger.Error("Can't serialize hardware to json: " + e.Message);
ShutDown();
return 1;
}

try
{
await connectTask;
}
catch (Exception e)
{
Logger.Error("Can't start server : " + e.Message);
ShutDown();
return 1;
}

if (args.Contains("--log=debug"))
if (!isServerStarted || !isHardwareManagerStarted)
{
Logger.Error("Weird state: server started: " + isServerStarted + ", hardware manager started: " + isHardwareManagerStarted);
ShutDown();
return 1;
}

try
{
Logger.LogLevel = LogLevel.Debug;
server.SendHardware(jsonText);
}
else
if (args.Contains("--log=info"))
catch (Exception e)
{
Logger.LogLevel = LogLevel.Info;
Logger.Error("can't send hardware to the app" + e.Message);
ShutDown();
return 1;
}

var connectTask = Task.Run(() => new Server());
try
{
Logger.Info("start waiting for commands");
server.WaitForCommand(hardwareManager);
}
catch (Exception e)
{
Logger.Error("can't wait for commands" + e.Message);
ShutDown();
return 1;
}

ShutDown();
return 0;

var hardwareManager = new HardwareManager();
var jsonText = hardwareManager.ToJson();

var server = await connectTask;

Console.CancelKeyPress += (sender, e) =>
void ShutDown()
{
Logger.Info("On canceled process");
server.Shutdown();
hardwareManager.Stop();
};
if (!shutDownTakeLocker.SafeTake()) return;

Logger.Debug("Shutdown");

SystemEvents.SessionEnding += (sender, e) =>
if (isServerStarted)
server.Shutdown();

// the warning is because Console.CancelKeyPress use this function
// but this seems to works as expected
if (isHardwareManagerStarted)
hardwareManager.Stop();
}


void SetupLog()
{
Logger.Info("On disconnected session");
server.Shutdown();
hardwareManager.Stop();
};
LogToFile();

if (args.Contains("--log=debug"))
{
Logger.LogLevel = LogLevel.Debug;
}
else
if (args.Contains("--log=info"))
{
Logger.LogLevel = LogLevel.Info;
}

server.SendHardware(jsonText);
return;

server.WaitForCommand(hardwareManager);
server.Shutdown();
hardwareManager.Stop();
void LogToFile()
{
try
{
var maybeLogFilePath = Environment.GetEnvironmentVariable("FAN_CONTROL_LOG_FILE");
if (maybeLogFilePath == null) return;
var logFileNameWithoutExtension = Path.GetFileNameWithoutExtension(maybeLogFilePath);
var logFileName = logFileNameWithoutExtension + "-lhm.txt";
var lhmLogFilePath = Path.Combine(Path.GetDirectoryName(maybeLogFilePath) ?? throw new InvalidOperationException(), logFileName);
Logger.LogToFile(lhmLogFilePath);
}
catch (Exception)
{
// ignored
}
}
}
Loading

0 comments on commit 8a9481e

Please sign in to comment.