mirror of
https://github.com/ZeroTier/ZeroTierOne
synced 2025-07-16 10:03:14 -07:00
Some work on background service that runs the actual zerotier-one process.
This commit is contained in:
parent
7a49d50187
commit
a154d660d9
2 changed files with 99 additions and 5 deletions
|
@ -4,6 +4,7 @@ using System.Collections.Generic;
|
|||
using System.Data;
|
||||
using System.Diagnostics;
|
||||
using System.ServiceProcess;
|
||||
using System.Threading;
|
||||
|
||||
namespace ZeroTierOneService
|
||||
{
|
||||
|
@ -18,24 +19,68 @@ namespace ZeroTierOneService
|
|||
this.ztBinary = this.ztHome + Path.DirectorySeparatorChar + (Environment.Is64BitOperatingSystem ? "zerotier-one_x64.exe" : "zerotier-one_x86.exe");
|
||||
|
||||
this.ztService = null;
|
||||
this.ztKiller = null;
|
||||
}
|
||||
|
||||
protected override void OnStart(string[] args)
|
||||
{
|
||||
startZeroTierService();
|
||||
startZeroTierDaemon();
|
||||
}
|
||||
|
||||
protected override void OnStop()
|
||||
{
|
||||
stopZeroTierService();
|
||||
stopZeroTierDaemon();
|
||||
}
|
||||
|
||||
private void startZeroTierService()
|
||||
private void startZeroTierDaemon()
|
||||
{
|
||||
if (ztService != null)
|
||||
return;
|
||||
ztService = new Process();
|
||||
try
|
||||
{
|
||||
ztService.StartInfo.UseShellExecute = false;
|
||||
ztService.StartInfo.FileName = ztBinary;
|
||||
ztService.StartInfo.Arguments = "";
|
||||
ztService.StartInfo.CreateNoWindow = true;
|
||||
ztService.Exited += ztService_Exited;
|
||||
ztService.Start();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.ToString());
|
||||
ztService = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void stopZeroTierService()
|
||||
private void stopZeroTierDaemon()
|
||||
{
|
||||
while (ztKiller != null)
|
||||
Thread.Sleep(250);
|
||||
|
||||
ztKiller = new Process();
|
||||
try
|
||||
{
|
||||
ztKiller.StartInfo.UseShellExecute = false;
|
||||
ztKiller.StartInfo.FileName = ztBinary;
|
||||
ztKiller.StartInfo.Arguments = "-q terminate ServiceShutdown";
|
||||
ztKiller.StartInfo.CreateNoWindow = true;
|
||||
ztKiller.Exited += ztKiller_Exited;
|
||||
ztKiller.Start();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
ztKiller = null;
|
||||
}
|
||||
|
||||
int waited = 0;
|
||||
while (ztKiller != null)
|
||||
{
|
||||
Thread.Sleep(250);
|
||||
if (++waited > 100)
|
||||
break;
|
||||
}
|
||||
|
||||
if (ztService != null)
|
||||
{
|
||||
ztService.Kill();
|
||||
|
@ -43,15 +88,23 @@ namespace ZeroTierOneService
|
|||
}
|
||||
}
|
||||
|
||||
// Event generated when ztService exits
|
||||
private void ztService_Exited(object sender, System.EventArgs e)
|
||||
{
|
||||
ztService = null;
|
||||
}
|
||||
|
||||
// Event generated when ztKiller is done
|
||||
private void ztKiller_Exited(object sender, System.EventArgs e)
|
||||
{
|
||||
ztKiller = null;
|
||||
}
|
||||
|
||||
private string ztHome;
|
||||
private string ztUpdatesFolder;
|
||||
private string ztBinary;
|
||||
|
||||
private Process ztService;
|
||||
private volatile Process ztService;
|
||||
private volatile Process ztKiller;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue