Add --pidfile support, and output error properly if XMPP_JID or XMPP_PASSWORD aren't set
This commit is contained in:
parent
579078edf0
commit
430b5082dd
1 changed files with 51 additions and 4 deletions
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using S22.Xmpp;
|
using S22.Xmpp;
|
||||||
|
@ -15,6 +16,7 @@ namespace RhinoReminds
|
||||||
public string Jid = null;
|
public string Jid = null;
|
||||||
|
|
||||||
public string AvatarFilepath = string.Empty;
|
public string AvatarFilepath = string.Empty;
|
||||||
|
public string PidFile = null;
|
||||||
|
|
||||||
public string Password = null;
|
public string Password = null;
|
||||||
}
|
}
|
||||||
|
@ -48,6 +50,7 @@ namespace RhinoReminds
|
||||||
Console.WriteLine($" -f --file Specify where to save reminders (default: {settings.Filepath})");
|
Console.WriteLine($" -f --file Specify where to save reminders (default: {settings.Filepath})");
|
||||||
Console.WriteLine(" --domain {domain} Set the domain users are allowed to originate at. Defaults to any domain.");
|
Console.WriteLine(" --domain {domain} Set the domain users are allowed to originate at. Defaults to any domain.");
|
||||||
Console.WriteLine(" --avatar Update the XMPP account's avatar to the specified image. By default the avatar is not updated.");
|
Console.WriteLine(" --avatar Update the XMPP account's avatar to the specified image. By default the avatar is not updated.");
|
||||||
|
Console.WriteLine(" --pidfile Save our process ID to the specified file, and delete it on exit");
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
Console.WriteLine("Environment Variables:");
|
Console.WriteLine("Environment Variables:");
|
||||||
Console.WriteLine(" XMPP_JID The JID to login to");
|
Console.WriteLine(" XMPP_JID The JID to login to");
|
||||||
|
@ -67,18 +70,53 @@ namespace RhinoReminds
|
||||||
case "--avatar":
|
case "--avatar":
|
||||||
settings.AvatarFilepath = args[++i];
|
settings.AvatarFilepath = args[++i];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "--pidfile":
|
||||||
|
settings.PidFile = args[++i];
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.Jid = Environment.GetEnvironmentVariable("XMPP_JID");
|
settings.Jid = Environment.GetEnvironmentVariable("XMPP_JID");
|
||||||
settings.Password = Environment.GetEnvironmentVariable("XMPP_PASSWORD");
|
settings.Password = Environment.GetEnvironmentVariable("XMPP_PASSWORD");
|
||||||
|
|
||||||
Run();
|
if (settings.Jid == null) {
|
||||||
|
Console.Error.WriteLine("Error: No JID specified to login with.");
|
||||||
|
Console.Error.WriteLine("Do so with the XMPP_JID environment variable!");
|
||||||
|
return 15;
|
||||||
|
}
|
||||||
|
if (settings.Password == null) {
|
||||||
|
Console.Error.WriteLine("Error: No password specified to login with.");
|
||||||
|
Console.Error.WriteLine("Do so with the XMPP_PASSWORD environment variable!");
|
||||||
|
return 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.PidFile != null)
|
||||||
|
setupPidFile();
|
||||||
|
|
||||||
|
run();
|
||||||
|
// We shouldn't ever end up here, but just in case.....
|
||||||
|
cleanupPidFile();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Run()
|
private static void setupPidFile()
|
||||||
|
{
|
||||||
|
File.WriteAllText(settings.PidFile, Process.GetCurrentProcess().Id.ToString());
|
||||||
|
AppDomain.CurrentDomain.ProcessExit += (object sender, EventArgs e) => cleanupPidFile();
|
||||||
|
AppDomain.CurrentDomain.DomainUnload += (object sender, EventArgs e) => cleanupPidFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void cleanupPidFile() {
|
||||||
|
// Make sure we only do cleanup once
|
||||||
|
if (settings.PidFile == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
File.Delete(settings.PidFile);
|
||||||
|
settings.PidFile = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void run()
|
||||||
{
|
{
|
||||||
ClientListener client = new ClientListener(settings.Jid, settings.Password) {
|
ClientListener client = new ClientListener(settings.Jid, settings.Password) {
|
||||||
ReminderFilePath = settings.Filepath
|
ReminderFilePath = settings.Filepath
|
||||||
|
@ -96,7 +134,16 @@ namespace RhinoReminds
|
||||||
}
|
}
|
||||||
// Connect to the server & start listening
|
// Connect to the server & start listening
|
||||||
// Make sure the program doesn't exit whilst we're connected
|
// Make sure the program doesn't exit whilst we're connected
|
||||||
|
try
|
||||||
|
{
|
||||||
client.Start().Wait();
|
client.Start().Wait();
|
||||||
|
} catch (Exception) {
|
||||||
|
// Ensure we tidy up after ourselves by deleting the PID file
|
||||||
|
if (settings.PidFile != null)
|
||||||
|
cleanupPidFile();
|
||||||
|
// Re-throw the error
|
||||||
|
throw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue