From 9b3bbe2f7c2310b85b8c872d2d4b5dd691e74ae2 Mon Sep 17 00:00:00 2001 From: Jeremy Tellier - ROG Date: Fri, 5 Jun 2020 16:41:25 +0100 Subject: [PATCH] Ziti Update Service --- ZitiConsoleApp/Program.cs | 33 + ZitiConsoleApp/ZitiConsoleApp.csproj | 9 + ZitiInstaller/Package.appxmanifest | 7 +- ZitiInstaller/ZitiInstaller.wapproj | 21 + ZitiTunneler/App.xaml | 5 +- ZitiTunneler/MainMenu.xaml | 1 - ZitiTunneler/MainMenu.xaml.cs | 16 - ZitiTunneler/MainWindow.xaml.cs | 68 +- ZitiTunneler/ZitiTunneler.csproj | 23 +- ZitiTunneler/app.manifest | 4 +- ZitiTunnelerSetup/ZitiTunnelerSetup.vdproj | 1291 +++++++++++++++++ ZitiTunnelerSetup/ziti-green.ico | Bin 0 -> 33296 bytes ZitiTunnelerSetup/ziti-white.ico | Bin 0 -> 28805 bytes ZitiUWPSolution.sln | 79 +- ZitiUpdateService/App.config | 6 + ZitiUpdateService/Program.cs | 22 + .../ProjectInstaller.Designer.cs | 56 + ZitiUpdateService/ProjectInstaller.cs | 20 + ZitiUpdateService/ProjectInstaller.resx | 129 ++ ZitiUpdateService/Properties/AssemblyInfo.cs | 36 + ZitiUpdateService/Properties/app.manifest | 70 + ZitiUpdateService/UpdateService.Designer.cs | 32 + ZitiUpdateService/UpdateService.cs | 225 +++ ZitiUpdateService/ZitiUpdateService.csproj | 137 ++ ZitiUpdateService/packages.config | 4 + ZitiUpdateService/ziti-white.ico | Bin 0 -> 28805 bytes 26 files changed, 2164 insertions(+), 130 deletions(-) create mode 100644 ZitiConsoleApp/Program.cs create mode 100644 ZitiConsoleApp/ZitiConsoleApp.csproj create mode 100644 ZitiTunnelerSetup/ZitiTunnelerSetup.vdproj create mode 100644 ZitiTunnelerSetup/ziti-green.ico create mode 100644 ZitiTunnelerSetup/ziti-white.ico create mode 100644 ZitiUpdateService/App.config create mode 100644 ZitiUpdateService/Program.cs create mode 100644 ZitiUpdateService/ProjectInstaller.Designer.cs create mode 100644 ZitiUpdateService/ProjectInstaller.cs create mode 100644 ZitiUpdateService/ProjectInstaller.resx create mode 100644 ZitiUpdateService/Properties/AssemblyInfo.cs create mode 100644 ZitiUpdateService/Properties/app.manifest create mode 100644 ZitiUpdateService/UpdateService.Designer.cs create mode 100644 ZitiUpdateService/UpdateService.cs create mode 100644 ZitiUpdateService/ZitiUpdateService.csproj create mode 100644 ZitiUpdateService/packages.config create mode 100644 ZitiUpdateService/ziti-white.ico diff --git a/ZitiConsoleApp/Program.cs b/ZitiConsoleApp/Program.cs new file mode 100644 index 00000000..8fbdbf97 --- /dev/null +++ b/ZitiConsoleApp/Program.cs @@ -0,0 +1,33 @@ +using System; +using System.IO; +using System.Net; +using System.Xml; +using System.Text; + +namespace ZitiConsoleApp { + class Program { + + private static string _versionUrl = "https://netfoundry.jfrog.io/netfoundry/ziti-maven-snapshot/ziti-tunnel-win/amd64/windows/ziti-tunnel-win/maven-metadata.xml"; + private static string _serviceUrl = "https://netfoundry.jfrog.io/netfoundry/ziti-maven-snapshot/ziti-tunnel-win/amd64/windows/ziti-tunnel-win/${version}/ziti-tunnel-win-${version}.zip"; + + static void Main(string[] args) { + var request = WebRequest.Create(_versionUrl) as HttpWebRequest; + var response = request.GetResponse(); + + Stream receiveStream = response.GetResponseStream(); + StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8); + + var result = readStream.ReadToEnd(); + + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(result); + + XmlNode node = xmlDoc.SelectSingleNode("metadata/versioning/release"); + string version = node.InnerText; + Console.WriteLine(version); + + string remoteService = _serviceUrl.Replace("${version}", version); + Console.WriteLine(remoteService); + } + } +} diff --git a/ZitiConsoleApp/ZitiConsoleApp.csproj b/ZitiConsoleApp/ZitiConsoleApp.csproj new file mode 100644 index 00000000..052b6d93 --- /dev/null +++ b/ZitiConsoleApp/ZitiConsoleApp.csproj @@ -0,0 +1,9 @@ + + + + Exe + netcoreapp3.1 + Debug;Release;Releases + + + diff --git a/ZitiInstaller/Package.appxmanifest b/ZitiInstaller/Package.appxmanifest index 274a1d53..ca4464aa 100644 --- a/ZitiInstaller/Package.appxmanifest +++ b/ZitiInstaller/Package.appxmanifest @@ -10,7 +10,7 @@ + Version="0.1.1.0" /> Ziti Tunnel @@ -46,6 +46,11 @@ + + + + + diff --git a/ZitiInstaller/ZitiInstaller.wapproj b/ZitiInstaller/ZitiInstaller.wapproj index ff8c8d26..59db6eb7 100644 --- a/ZitiInstaller/ZitiInstaller.wapproj +++ b/ZitiInstaller/ZitiInstaller.wapproj @@ -8,6 +8,26 @@ Debug x86 + + Releases + AnyCPU + + + Releases + ARM + + + Releases + ARM64 + + + Releases + x64 + + + Releases + x86 + Release x86 @@ -156,6 +176,7 @@ + \ No newline at end of file diff --git a/ZitiTunneler/App.xaml b/ZitiTunneler/App.xaml index 231d8cd0..fa730afb 100644 --- a/ZitiTunneler/App.xaml +++ b/ZitiTunneler/App.xaml @@ -45,7 +45,8 @@ - + + @@ -89,7 +90,7 @@ - + diff --git a/ZitiTunneler/MainMenu.xaml b/ZitiTunneler/MainMenu.xaml index 73fa16c2..2fbe326d 100644 --- a/ZitiTunneler/MainMenu.xaml +++ b/ZitiTunneler/MainMenu.xaml @@ -60,7 +60,6 @@ - diff --git a/ZitiTunneler/MainMenu.xaml.cs b/ZitiTunneler/MainMenu.xaml.cs index d4b04480..04c9d379 100644 --- a/ZitiTunneler/MainMenu.xaml.cs +++ b/ZitiTunneler/MainMenu.xaml.cs @@ -125,22 +125,6 @@ namespace ZitiTunneler Process.Start(new ProcessStartInfo("https://support.netfoundry.io") { UseShellExecute = true }); } - private void RunScript(string scriptText) { - using (PowerShell PowerShellInstance = PowerShell.Create()) { - PowerShellInstance.AddScript(scriptText); - IAsyncResult result = PowerShellInstance.BeginInvoke(); - while (result.IsCompleted==false) { - Console.WriteLine("Waiting for pipeline to finish..."); - Thread.Sleep(1000); - } - System.Windows.MessageBox.Show("Network Reset"); - } - } - - private void ResetNetwork(object sender, MouseButtonEventArgs e) { - RunScript("get-netipinterface|ForEach-Object { Set-DnsClientServerAddress-InterfaceIndex $_.ifIndex-ResetServerAddresses}"); - } - private void DetachWindow(object sender, MouseButtonEventArgs e) { Application.Current.MainWindow.ShowInTaskbar = true; DetachButton.Visibility = Visibility.Collapsed; diff --git a/ZitiTunneler/MainWindow.xaml.cs b/ZitiTunneler/MainWindow.xaml.cs index 64b10746..d496e861 100644 --- a/ZitiTunneler/MainWindow.xaml.cs +++ b/ZitiTunneler/MainWindow.xaml.cs @@ -36,55 +36,10 @@ namespace ZitiTunneler { } } - public static bool IsAdministrator() { - using (WindowsIdentity identity = WindowsIdentity.GetCurrent()) { - WindowsPrincipal principal = new WindowsPrincipal(identity); - return principal.IsInRole(WindowsBuiltInRole.Administrator); - } - } - - private void UpdateServiceFiles() { - if (!Directory.Exists(Path.Combine(Environment.CurrentDirectory, "Service"))) Directory.CreateDirectory(Path.Combine(Environment.CurrentDirectory, "Service")); - string[] files = Directory.GetFiles(Path.Combine(Environment.CurrentDirectory, "Service")); - foreach (string file in files) { - File.Delete(file); - Console.WriteLine($"{file} is deleted."); - } - WebClient webClient = new WebClient(); - webClient.DownloadFile("https://actieve.com/windows-tunneler.zip", Path.Combine(Environment.CurrentDirectory, "Service")+@"\windows-tunneler.zip"); - ZipFile.ExtractToDirectory(Path.Combine(Environment.CurrentDirectory, "Service")+@"\windows-tunneler.zip", Path.Combine(Environment.CurrentDirectory, "Service")); - } - private void LaunchOrInstall() { ServiceController ctl = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName=="ziti"); if (ctl==null) { - if (IsAdministrator()) { - UpdateServiceFiles(); - ProcessStartInfo installService = new ProcessStartInfo(); - installService.CreateNoWindow = true; - installService.UseShellExecute = false; - installService.FileName = Path.Combine(Environment.CurrentDirectory, "Service") + @"\ziti-tunnel.exe"; - installService.WindowStyle = ProcessWindowStyle.Hidden; - installService.Arguments = "install"; - - try { - using (Process exeProcess = Process.Start(installService)) { - exeProcess.WaitForExit(); - ctl = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName == "ziti"); - if (ctl.Status != ServiceControllerStatus.Running) { - try { - ctl.Start(); - } catch (Exception e) { - SetCantDisplay(); - } - } - } - } catch (Exception e) { - ShowError("Error Installing Service", e.ToString()); - } - } else { - ShowError("Admin Account", "Unable to install service, Admin Account required."); - } + SetCantDisplay(); } else { if (ctl.Status!=ServiceControllerStatus.Running) { try { @@ -260,10 +215,8 @@ namespace ZitiTunneler { private void IdentityForgotten(ZitiIdentity forgotten) { ZitiIdentity idToRemove = null; - foreach (var id in identities) - { - if(id.Fingerprint == forgotten.Fingerprint) - { + foreach (var id in identities) { + if(id.Fingerprint == forgotten.Fingerprint) { idToRemove = id; break; } @@ -301,25 +254,20 @@ namespace ZitiTunneler { ConnectButton.Visibility = Visibility.Visible; DisconnectButton.Visibility = Visibility.Collapsed; } - if (!Application.Current.Properties.Contains("ip")) - { + if (!Application.Current.Properties.Contains("ip")) { Application.Current.Properties.Add("ip", status?.IpInfo?.Ip); } - if (!Application.Current.Properties.Contains("subnet")) - { + if (!Application.Current.Properties.Contains("subnet")) { Application.Current.Properties.Add("subnet", status?.IpInfo?.Subnet); } - if (!Application.Current.Properties.Contains("mtu")) - { + if (!Application.Current.Properties.Contains("mtu")) { Application.Current.Properties.Add("mtu", status?.IpInfo?.MTU); } - if (!Application.Current.Properties.Contains("dns")) - { + if (!Application.Current.Properties.Contains("dns")) { Application.Current.Properties.Add("dns", status?.IpInfo?.DNS); } - foreach (var id in status.Identities) - { + foreach (var id in status.Identities) { updateViewWithIdentity(id); } LoadIdentities(); diff --git a/ZitiTunneler/ZitiTunneler.csproj b/ZitiTunneler/ZitiTunneler.csproj index cae95ba7..4d75f041 100644 --- a/ZitiTunneler/ZitiTunneler.csproj +++ b/ZitiTunneler/ZitiTunneler.csproj @@ -50,7 +50,7 @@ 4 - AnyCPU + x64 pdbonly true bin\Release\ @@ -69,7 +69,7 @@ - false + true true @@ -77,6 +77,12 @@ LocalIntranet + + bin\Releases\ + + + Assets\Images\icon.ico + ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll @@ -310,7 +316,9 @@ - + + Always + @@ -325,14 +333,7 @@ false - - - False - Ziti Identity - Ziti - Assets\Images\ziti-white.ico - - + diff --git a/ZitiTunneler/app.manifest b/ZitiTunneler/app.manifest index 7937c16b..bebfd355 100644 --- a/ZitiTunneler/app.manifest +++ b/ZitiTunneler/app.manifest @@ -17,11 +17,11 @@ compatibility. --> - + - + diff --git a/ZitiTunnelerSetup/ZitiTunnelerSetup.vdproj b/ZitiTunnelerSetup/ZitiTunnelerSetup.vdproj new file mode 100644 index 00000000..93654ebf --- /dev/null +++ b/ZitiTunnelerSetup/ZitiTunnelerSetup.vdproj @@ -0,0 +1,1291 @@ +"DeployProject" +{ +"VSVersion" = "3:800" +"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" +"IsWebType" = "8:FALSE" +"ProjectName" = "8:ZitiTunnelerSetup" +"LanguageId" = "3:1033" +"CodePage" = "3:1252" +"UILanguageId" = "3:1033" +"SccProjectName" = "8:" +"SccLocalPath" = "8:" +"SccAuxPath" = "8:" +"SccProvider" = "8:" + "Hierarchy" + { + "Entry" + { + "MsmKey" = "8:_1B500B533148B9BB79AEF46E6F944598" + "OwnerKey" = "8:_D6CD48F4EF21498B9EC75A7FDF5B4559" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1B500B533148B9BB79AEF46E6F944598" + "OwnerKey" = "8:_50597817BB3C4AF79F515907EDF0DD3F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1B500B533148B9BB79AEF46E6F944598" + "OwnerKey" = "8:_BA2D1FFB93DFA96B20BDB20713962934" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_32978CA1373CFEDD759D955C09DB168B" + "OwnerKey" = "8:_D6CD48F4EF21498B9EC75A7FDF5B4559" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_32978CA1373CFEDD759D955C09DB168B" + "OwnerKey" = "8:_50597817BB3C4AF79F515907EDF0DD3F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_375E7C39471F4B0C96A7BD07FF9C0DC1" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3A19D123B76E7211716C85D5D473426D" + "OwnerKey" = "8:_D6CD48F4EF21498B9EC75A7FDF5B4559" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3A19D123B76E7211716C85D5D473426D" + "OwnerKey" = "8:_50597817BB3C4AF79F515907EDF0DD3F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_50597817BB3C4AF79F515907EDF0DD3F" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_652FE5D29FC827A3CC999C3EEE6D4B8E" + "OwnerKey" = "8:_3A19D123B76E7211716C85D5D473426D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_7762155D0F77773FC97C65A65C78943D" + "OwnerKey" = "8:_D6CD48F4EF21498B9EC75A7FDF5B4559" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_7762155D0F77773FC97C65A65C78943D" + "OwnerKey" = "8:_50597817BB3C4AF79F515907EDF0DD3F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AF4FA96205B54EA07F745C1DFF2955FC" + "OwnerKey" = "8:_50597817BB3C4AF79F515907EDF0DD3F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_B80A689EE9414DD69D6FE8850A9C575E" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_BA2D1FFB93DFA96B20BDB20713962934" + "OwnerKey" = "8:_D6CD48F4EF21498B9EC75A7FDF5B4559" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_BA2D1FFB93DFA96B20BDB20713962934" + "OwnerKey" = "8:_50597817BB3C4AF79F515907EDF0DD3F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D3FEA36F3FA75A95B2CB8F7BFCC3794D" + "OwnerKey" = "8:_50597817BB3C4AF79F515907EDF0DD3F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D6CD48F4EF21498B9EC75A7FDF5B4559" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_EF617B01D446B5A22CC7D97D9AAFDE9C" + "OwnerKey" = "8:_50597817BB3C4AF79F515907EDF0DD3F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_7762155D0F77773FC97C65A65C78943D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_50597817BB3C4AF79F515907EDF0DD3F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_EF617B01D446B5A22CC7D97D9AAFDE9C" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_D3FEA36F3FA75A95B2CB8F7BFCC3794D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_AF4FA96205B54EA07F745C1DFF2955FC" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_D6CD48F4EF21498B9EC75A7FDF5B4559" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_BA2D1FFB93DFA96B20BDB20713962934" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_1B500B533148B9BB79AEF46E6F944598" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_32978CA1373CFEDD759D955C09DB168B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_3A19D123B76E7211716C85D5D473426D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_652FE5D29FC827A3CC999C3EEE6D4B8E" + "MsmSig" = "8:_UNDEFINED" + } + } + "Configurations" + { + "Debug" + { + "DisplayName" = "8:Debug" + "IsDebugOnly" = "11:TRUE" + "IsReleaseOnly" = "11:FALSE" + "OutputFilename" = "8:Debug\\ZitiTunnelerSetup.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + } + "Release" + { + "DisplayName" = "8:Release" + "IsDebugOnly" = "11:FALSE" + "IsReleaseOnly" = "11:TRUE" + "OutputFilename" = "8:Release\\ZitiTunnelerSetup.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + } + } + "Deployable" + { + "CustomAction" + { + "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_13BD3CF2A83F4C6DB854F98476FAA80E" + { + "Name" = "8:Primary output from ZitiUpdateService (Active)" + "Condition" = "8:" + "Object" = "8:_D6CD48F4EF21498B9EC75A7FDF5B4559" + "FileType" = "3:2" + "InstallAction" = "3:1" + "Arguments" = "8:" + "EntryPoint" = "8:" + "Sequence" = "3:1" + "Identifier" = "8:_B360FBD8_70A3_420F_98BA_44461B934701" + "InstallerClass" = "11:TRUE" + "CustomActionData" = "8:" + } + "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_BAB8DCA65A6D46C094A74322A56906DB" + { + "Name" = "8:Primary output from ZitiUpdateService (Active)" + "Condition" = "8:" + "Object" = "8:_D6CD48F4EF21498B9EC75A7FDF5B4559" + "FileType" = "3:2" + "InstallAction" = "3:4" + "Arguments" = "8:" + "EntryPoint" = "8:" + "Sequence" = "3:1" + "Identifier" = "8:_B9CEDFA6_611F_48E6_839F_058342051E0C" + "InstallerClass" = "11:TRUE" + "CustomActionData" = "8:" + } + "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_E1B64595A3CA487DA362A98B69A8484C" + { + "Name" = "8:Primary output from ZitiUpdateService (Active)" + "Condition" = "8:" + "Object" = "8:_D6CD48F4EF21498B9EC75A7FDF5B4559" + "FileType" = "3:2" + "InstallAction" = "3:2" + "Arguments" = "8:" + "EntryPoint" = "8:" + "Sequence" = "3:1" + "Identifier" = "8:_38A69FC7_4A1C_4526_B567_79C15BF881A7" + "InstallerClass" = "11:TRUE" + "CustomActionData" = "8:" + } + "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_EDD5EBFAFD934E42A87EAA0010F761E2" + { + "Name" = "8:Primary output from ZitiUpdateService (Active)" + "Condition" = "8:" + "Object" = "8:_D6CD48F4EF21498B9EC75A7FDF5B4559" + "FileType" = "3:2" + "InstallAction" = "3:3" + "Arguments" = "8:" + "EntryPoint" = "8:" + "Sequence" = "3:1" + "Identifier" = "8:_B6BF88E7_4F5B_46EE_AD63_B527C3A6C5DE" + "InstallerClass" = "11:TRUE" + "CustomActionData" = "8:" + } + } + "DefaultFeature" + { + "Name" = "8:DefaultFeature" + "Title" = "8:" + "Description" = "8:" + } + "ExternalPersistence" + { + "LaunchCondition" + { + "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_4F975F9EF42D4EBCAA4029CFEF60926B" + { + "Name" = "8:.NET Framework" + "Message" = "8:[VSDNETMSG]" + "FrameworkVersion" = "8:.NETFramework,Version=v4.8" + "AllowLaterVersions" = "11:FALSE" + "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=863262" + } + } + } + "File" + { + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1B500B533148B9BB79AEF46E6F944598" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Microsoft.Management.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_1B500B533148B9BB79AEF46E6F944598" + { + "Name" = "8:Microsoft.Management.Infrastructure.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.Management.Infrastructure.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_32978CA1373CFEDD759D955C09DB168B" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "ScatterAssemblies" + { + "_32978CA1373CFEDD759D955C09DB168B" + { + "Name" = "8:System.Net.Http.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Net.Http.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_375E7C39471F4B0C96A7BD07FF9C0DC1" + { + "SourcePath" = "8:ziti-white.ico" + "TargetName" = "8:ziti-white.ico" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3A19D123B76E7211716C85D5D473426D" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" + "ScatterAssemblies" + { + "_3A19D123B76E7211716C85D5D473426D" + { + "Name" = "8:System.IO.Compression.FileSystem.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.IO.Compression.FileSystem.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_652FE5D29FC827A3CC999C3EEE6D4B8E" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:System.IO.Compression, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_652FE5D29FC827A3CC999C3EEE6D4B8E" + { + "Name" = "8:System.IO.Compression.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.IO.Compression.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_7762155D0F77773FC97C65A65C78943D" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.IO.Compression, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" + "ScatterAssemblies" + { + "_7762155D0F77773FC97C65A65C78943D" + { + "Name" = "8:System.IO.Compression.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.IO.Compression.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AF4FA96205B54EA07F745C1DFF2955FC" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.Net.NetworkInformation, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "ScatterAssemblies" + { + "_AF4FA96205B54EA07F745C1DFF2955FC" + { + "Name" = "8:System.Net.NetworkInformation.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Net.NetworkInformation.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B80A689EE9414DD69D6FE8850A9C575E" + { + "SourcePath" = "8:ziti-green.ico" + "TargetName" = "8:ziti-green.ico" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_BA2D1FFB93DFA96B20BDB20713962934" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_BA2D1FFB93DFA96B20BDB20713962934" + { + "Name" = "8:System.Management.Automation.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Management.Automation.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D3FEA36F3FA75A95B2CB8F7BFCC3794D" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.Management.Infrastructure.Native, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=AMD64" + "ScatterAssemblies" + { + "_D3FEA36F3FA75A95B2CB8F7BFCC3794D" + { + "Name" = "8:Microsoft.Management.Infrastructure.Native.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.Management.Infrastructure.Native.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_EF617B01D446B5A22CC7D97D9AAFDE9C" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_EF617B01D446B5A22CC7D97D9AAFDE9C" + { + "Name" = "8:Newtonsoft.Json.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Newtonsoft.Json.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + } + "FileType" + { + "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_ABE7792AAA534CDAA6008798002D7833" + { + "Name" = "8:Ziti Identity" + "Description" = "8:Zitit Identity File" + "Extensions" = "8:.ziti" + "MIME" = "8:" + "Icon" = "8:_B80A689EE9414DD69D6FE8850A9C575E" + "IconIndex" = "3:0" + "Command" + { + "Command" = "8:_50597817BB3C4AF79F515907EDF0DD3F" + } + "Verbs" + { + "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_23EB97F365E54E5F8D3CEC68533248DB" + { + "Command" = "8:&Open" + "Verb" = "8:open" + "Arguments" = "8:\"%1\"" + "Order" = "3:0" + } + } + } + } + "Folder" + { + "{1525181F-901A-416C-8A58-119130FE478E}:_2F842114EFAC40E0871CCAA28C0350B9" + { + "Name" = "8:#1919" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:ProgramMenuFolder" + "Folders" + { + } + } + "{1525181F-901A-416C-8A58-119130FE478E}:_BEBBAC3CE69745BCB3D8C64B660AC583" + { + "Name" = "8:#1916" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:DesktopFolder" + "Folders" + { + } + } + "{3C67513D-01DD-4637-8A68-80971EB9504F}:_C4D998AF993A4E24B116091330EFEBDA" + { + "DefaultLocation" = "8:[ProgramFiles64Folder][Manufacturer]\\[ProductName]" + "Name" = "8:#1925" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:TARGETDIR" + "Folders" + { + } + } + } + "LaunchCondition" + { + } + "Locator" + { + } + "MsiBootstrapper" + { + "LangId" = "3:1033" + "RequiresElevation" = "11:FALSE" + } + "Product" + { + "Name" = "8:Microsoft Visual Studio" + "ProductName" = "8:Ziti Tunneler" + "ProductCode" = "8:{BA9C9F1A-83B6-4F8F-ACD3-60209838C5AE}" + "PackageCode" = "8:{00CD5F20-AE85-4888-9C48-2E61C27F253A}" + "UpgradeCode" = "8:{A9CDD816-1B98-4843-AAE6-69BC2B90561B}" + "AspNetVersion" = "8:4.0.30319.0" + "RestartWWWService" = "11:FALSE" + "RemovePreviousVersions" = "11:TRUE" + "DetectNewerInstalledVersion" = "11:TRUE" + "InstallAllUsers" = "11:TRUE" + "ProductVersion" = "8:1.0.0" + "Manufacturer" = "8:JeremyTellier" + "ARPHELPTELEPHONE" = "8:" + "ARPHELPLINK" = "8:https://support.netfoundry.io" + "Title" = "8:ZitiTunnelerSetup" + "Subject" = "8:" + "ARPCONTACT" = "8:NetFoundry" + "Keywords" = "8:" + "ARPCOMMENTS" = "8:" + "ARPURLINFOABOUT" = "8:https://netfoundry.io" + "ARPPRODUCTICON" = "8:_B80A689EE9414DD69D6FE8850A9C575E" + "ARPIconIndex" = "3:0" + "SearchPath" = "8:" + "UseSystemSearchPath" = "11:TRUE" + "TargetPlatform" = "3:1" + "PreBuildEvent" = "8:" + "PostBuildEvent" = "8:" + "RunPostBuildEvent" = "3:0" + } + "Registry" + { + "HKLM" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D51816AFBC0E46D989B00346B7A3F816" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D42ABFE51C084D54A718A2957392D2FE" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCU" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_B5BAC8FF9F324D139994143E9C54957C" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_76948CA454814D938693865C2453BA3D" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCR" + { + "Keys" + { + } + } + "HKU" + { + "Keys" + { + } + } + "HKPU" + { + "Keys" + { + } + } + } + "Sequences" + { + } + "Shortcut" + { + } + "UserInterface" + { + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_17F59C349AE646EEAB190484ABF0FF24" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_4509FE04070A48E59E66490836B68DAD" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A5EA88B12E724AE9BC93957EBF6A8408" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E34E1B827FF444C3A754B704D84CD677" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_3D18FD426677442C94D2DA4E7D28EB7A" + { + "Name" = "8:#1900" + "Sequence" = "3:1" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2A6D0BD2F256448B839AA1DE67A60C56" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "InstallAllUsersVisible" + { + "Name" = "8:InstallAllUsersVisible" + "DisplayName" = "8:#1059" + "Description" = "8:#1159" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A37BC95A6EA14C79A3886F85CDC50858" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D5E7C4DD7C07475E8F0DA8F8CC871063" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_4165E4F1DBCD43DBB484691F70AF1471" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdBasicDialogs.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_49E21B963D7F4F7990AF32FE889A2F40" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_CAABC5F28CB8490B871DF9A128852D4C" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_8E463254A8D940EA9295F5C59CFE8AF5" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdUserInterface.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_A06F0606723C4E29BC4BB2A1D77A3DFB" + { + "Name" = "8:#1901" + "Sequence" = "3:1" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_63BC30BF686E42E194137F3273D65CBD" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_C0C5092D664F4768B9C8569AE714A55E" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_BC8E6A20B4074A769C839981CFE03A85" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_D723E8C1EBED46BA8FE38326C25BF04F" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9F6BEF5AFE98418D9173A610523BD7F5" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "UpdateText" + { + "Name" = "8:UpdateText" + "DisplayName" = "8:#1058" + "Description" = "8:#1158" + "Type" = "3:15" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1258" + "DefaultValue" = "8:#1258" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + } + "MergeModule" + { + } + "ProjectOutput" + { + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_50597817BB3C4AF79F515907EDF0DD3F" + { + "SourcePath" = "8:..\\ZitiTunneler\\obj\\Release\\ZitiTunneler.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{FA4291EA-A97E-4854-959F-91EE7B330B37}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_D6CD48F4EF21498B9EC75A7FDF5B4559" + { + "SourcePath" = "8:..\\ZitiUpdateService\\obj\\Release\\ZitiUpdateService.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_C4D998AF993A4E24B116091330EFEBDA" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{9AB81609-F5DD-40A6-87B5-F3279D48514D}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + } + } +} diff --git a/ZitiTunnelerSetup/ziti-green.ico b/ZitiTunnelerSetup/ziti-green.ico new file mode 100644 index 0000000000000000000000000000000000000000..1773e4e95cd221bbaf3cfd73d26294456a6b9091 GIT binary patch literal 33296 zcmdSB2VBqJ7dZTBZfXi*eNky26-EhTM{_D)vzEz4xqp&ItlRfFME8(ILQ<6Jbk?Kg8=Wpyo29ho3B53{{^;z>s0_V0I;ARR%ehNV=%N0 z1MlIxFW;iT6}H9qgID^!C;?+B7uW>~TeEzNt>;wC%0GR&n8&<8K1e-ALgm(QPi%wbaL7yCE**Fh~ z3-*D1Q@`&E$I=^Q#3X(4Kx+LxucKve?tT8`?bG%KPfhCApjjbsfG5LP(fS1KU+IUmpLs8gN&6g#)&p|@YY6CeKtmdig7w_M2l#b>eZN~j0&L{8G3LtjX)tek zOyVau^s#|WKk5r{z`oz?AD-{v8ian-$E~4i9|3;6jaU5sK^}m7`}G@~$GI^{%**w3 zG}s3Wb2LYb{hkxN-Uz;&U+mDKV&wJnVFYJ%U0dannAFTl@j7C5C#&ZWmp0zWWJ4 z91s^CFTBFF8wBvPK3Krdn4G03bjIh4D5zI#-|zZfJ~sA+xFAl58?G1JpN-$Yxrb|E zG|Y-ATTOy^(NKS9Erz4D1}J~FPOv}332{pU_yFJ=oEx9v+MgfWhkm|#8-09`7ISil z8B?-)7wQN!)EOJwZn%dyA#TXS8+h=4+baY7SEh~8>7Os4p)QBx`Ar-_m#rnEjfXjY zHV23k;(i6-hcv)-f%@nKpgH|>FgkMD1V=A;hXJ+~r>~Pgd7{<&iGSGt3vMWj|MMNr zTX&EF18r5oN-Vkx=uEgqQ0Mwjs-cbz&|*wSxH08xDQJ&z`Jc%IUgp2S57)ru!+!MB z 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�cNSw$CBe|77tRk|tF(LskIgk!G9e>QrgzG8c} zk|vMsJe4BpQ@Kven+Ev{#uUwL(i52O)+&7o_|W3y&mOs*(8XObFQH!V!*TJO8J1Ls zZu;gMUh(rdzB)}8uO(n6S zG%|Vqfp_m|7=CSUD2>r(-ACX$yn(IyvvIs`a@2vl)s#oRxx~JdKTkcF@VKBbA<5ER zTqi-Vp2n>2!0oSxlt<4h__+o-F`bi=ND2tI3EvlTU!7a$-7AqxRwZQ#X>yk z@%ePmaiQSE`IYA@IL5V4HeIMUJPhDY$gp zTF{?+tB-R{ShRG^2g+@E;p$4<-7Y-T6k3JhBd%X-l~m`+KfUjH`^Nc_7QJV?Rn=LS zMmu=wJ!aLlS}M9-^N6SjM{(T4XosF**09DACG7ZV;Q4y`J$A&lSRSZzOeUl&1W9=%7~RlHTz$fQ=NSgk!XIfNGfv6 zR;z`__YW~0`5+eIrO3UMUX>?4S;S87Rz|DVw3hYCy%cU{k?!_^MRoy>?W&6nU0RA{ zZ9>w;Di3*z+}lbeWAZIoX4}n2<9E}uF8g_}J;VB_z2j^4+Nzf?zsZ^8 zEh#ora>dOSdw=h2`bSzE&2(;!HAOnwu3}nTHZ2BwGR9jPq>WP&mvm*_$Y6BdEMOOV z>TImtvIPtoS5`M?$#JK##SEHpq@B81ypERl$`^gN)4>zrR+$mARo^mh)wSM2O4Z#(x))L;RI)h-S4?Q$S`g6GD$+AjeX4?f?OR?qMP^gM=M(k%XYE_x zj-Rl~lo;FVtEbmK`1t;X4ezMeY&M^F)xgETTZ~mTWxVKZUheLrOuWGB=kFV3wdO@v8x91A)mXR!t4~(nW8*09uwJ+98E85+${0*gQ zVA0;z)$%i~UoU-#>gb@qm?>*c#iE_#5!mDw{<@f-G1IM#VSDwwd&jz?Gmoa3rOjjr z)hr$iC>rV+{bnz#*ipry+9j)fxybc|r{Z}jz9d%O^mfy+o+rjhwJ~SM*RbwMK9yqd z{7s;3ASG|sn;ma&oI9pdX;3~dputGoEzNMphqCFsQ2%lBl^e`H*@bdEYF~BmXa~!x zR-?T9_=$oZ&*?5E^$#+@srj_!% z<1AqletjIOZ|n~(vVG(hepH=9wM5pWKgV=m*s^aid|V7R@we~jC7YHRt~sQzJ418+ zvzq4AXLqM_0;DDm9(3-fd?xcGcr~k|_qvo0&OK>c>#Lq8dh?neiIS13Uc$qh8<-=O zJY4E>LM+}VWSQqgK7CS1=K}rA_hyS^6g<3*WN|iaZk(6 zM(=ieyeinM^eMKHlQ%6){mc8Y6OtxZ+Yd}HBvDu!rpQ)++$?M#@qG!{NxE1vuKqC2S(Cn-CR%D zbw%}E6B3enBANAo_K86F_UG4hXKKBq#FEDyO%n~bN88v6$#gos9y#}VTl4W8x}BFJ zRTjt$q4;v(%#&*KO!tY)ze;b=07b>rsq)(C$9un-FdXl=0t9FB6Crqbbg(RzYhJ2?P4v@ zlC-m%eLV6zyH(m06a~~iehX(DN@OY0EMDvymzx|gDA=O**;r$CnPMiT61P5GSD#ex z?RjBE9W0y9sa;8Q)JyYc{=CelIEyvDY4wF1#TN!XKHPdXg%-gb3(7uzUb`x3Yu6jr z)_1Kj0fpD~uFo7iKEWF{_K<67OxnX_M{nEfN?+GxSp|O0^5@iM%Trz&lXIu-&VbpT zR~KGu>@qIce_?#m^va|P745Lr_=#4Ecp3S+(<43ayLWaDp7b7ycq$N}+v05haZSsc z1-UH)3w;LmwK8AK+Ov~O?DR(o!IpX}zV(={An_E@Dd(L1%W z?UT{Mhfh|ks&pL;o7rV^Qt9#Q%-o_KHsL)(d$%V^oYu?XzbWUD@;=-|*?w!fW5q_D zkF`g8lXE@Q=Bc)4u71_(Hq^_a!#A<&IYSEm;CJ$-tIKjuCfytTULWM}N;_3Aa*No9mA6c|W!s2}nL(z@^nQsXe&*Vi)0-U1^nxx)J@0jq$_Ojfy}Ekj zs1!Rp!@z27kB91Ay(u+&m2WZ%d(j;zlIXjpI-r{pJ(<90mnIp%Kf9zeQC@DsgW+N( zQ{CPe0YRCaCgL~N+Sgq-QX8P8%DO~pskidt#h?=t7aP>YbZ&}Ahf&e*zi1IH+b-l} zcSqOo?YGlR+7Fg1)8sc6Kb2c#(=;vlxluJGTi#n>Tz|aVVEjqIiai~jy8}Or$M(En z7xeG6nOSV_S9c^Ve9NLF#_5U=FZ1PE*I3!@0L_P;R^LthY%(~5);>uxc09#y&rr&UPvoYezS>8-QoARl z-f=lJY%Q~S(@C@G+NPJxE_|$^Q_4+~%+q0qOv@>K5)O-KzTvFe?buPnw?f$L>i*;R z%Z{1{tcf{IbHO7@y|-1xR7b{zBFQ}VSSOYD@@)&R514$*{qp9_c|{@Db3MC8HV;Wp zF(!Gp9m_tbZ@8ILb=LO$tkUqgDUYNV#+Jh~T<1U6(& zbn7E}s@9b}U{DI3rHm^Ni;b4M;NkaR=Wdp~4X?UgxWm^ZD6BYEvAtzcF7q3OU2^pO z_9q%6m?sZR)EkUv&l9+6^hq@FPEdE9wusa~#>P(@_npY9Rv%EPz1Arjbe;3~{3L^2 z>+fVXFm8&SjyGK5Z`{$xS(|f$;o_T&XuWeO8p~Zb?=YCZ;AuZ!ub#>0`nsGIGIfzV zqW4=i=pT1zyfB_8ynK~mvUsfSeJ=Zc)eThv;jC@8g*Q`G)q+kPTdqM9IH7XXWXVW*u{_hgkJ)52 zdNLkz@lfm4DA`DvDPF$UHtX<~a7FU*=uJ7Zls5Y()V9ydd16f-#ckSc$dWCiP9a=9 zZrnStfM8@vPaW)J{MLuxjX-g%b@JfB16SLrdO z1cAIK?v)a{8$LzkQPJ%)cs82IvG(RYlQim45yz!n&dn}&7c@)kFh5Dz#B(OuT<}=M z!rpwFwI(4^)xGXR^MfuyJ=2H zM>N_z^=91%QTUmD!APhJ$E9`13)3JSV zqN4LC3*%N^%bd9$tzvifz!tH2HHnA!7Cv5hCoIKlz{i*`am^;i0{)l65z7;!3!96A zCYZOmNvSWeXWBg>Y#_}@y|17#+nnzBrrG9K1Pfz@WU96IWeURC?k!TPGIH#woz2UY z9-#|9ab{ga>S`Y9)>yTq_u^}rg5*0It8(6N^0$rhJsk8QKbAS;{KFJsAEu|?$Ihsj zpS~vZ*ikULQRrKcr>}xKuj91?X;-L}m1Zgnm6`HFHEcrtk3AITp|)S8UtXj=#L}kUNWRG9WnP^s`aR zW&T>p$D+2enhkB-UzqSvk5xrbImA4yjKj@0U74InAcK(vc@>3RDyHtTjF64Qv^Sq+*XgSa@K5u)>0GhK>a})8enz&>JPr z#H?8|Q?i&Rb<}4@gRt*{(-yG{uOg`!CFIJFXnQ*O30A+-*g2COGiy~=Y<*Sil>fCA zj5lA0wwWgiUd%eLs=lI-koRPAfwiz%!sBD-CO%$I+jjgj)V5uaqrhKj4YY%*8X+BTmY8_+0;1lou*A|uyHjcKkseMk0 zYn-VzZjcmTV%K4Dx9!|J!3|YgeGP=e;>5;ZuePvSQm*B_t)w=?a=lXW%1E9Eo@QsA z#+JhJANG=OT2(ILU275gacqO|>wwbtebmdPtSH~5toATq@OymgosJ(bf8JxeXB)Ft zD#;lSIuz!|D%;E4tdkg_KcjM{*1*zf!4tJJz*avbf;C8SGE4+sSDw#&)$+J~L^%B$%^BV9Y7<$ou_dVTx3=*r_&M;<4N zX|nXnTvfOlT~7HvPs-6`GEA~8P4U#7o2_51^x5BfJY%%f zzCfu*ZFR-o=t}=8e!+`=f?Z6^dWSL+&TxnJ1h-MYoA+MIN4Rb&WoRC=c((a6|58h) zZ6>Ui3fo2(>5et_<#oOybop25XD{D9Pl)|gPB2^}Px#v3bK5TKalYcSUV0$!f|q#p z8+Eh&G+oDDQBK5`Du~)Vo|n0;j#bcCJ6o+g-aXW(c$tszlchAx&+?Vu_UbXLDL>5r zs{U9F*R=9Yk+}N#yk%jpQ-^7J?+v$wbb3v7=(tg8e;J^(Xminc=eDlZb@STp*Yg~& zTzR8n?*Aa|qrduKe6$J`z0~9h*`l0Y+x8gOjY{Tv0cA(SPBEUcJ?FHU{o~4+dmHXM z+wGcau(aJWFKl-KQ%EkuQ1ZYc%foEl%bwkNzvl2+r)84Q3;VkGt)#>_EuDqxomi+8 z-qBLVHcFp-A$^T~*tvL!Q$B!(x4WBnho@=faPQRyv4b)j%~PIP!~~Wm`>(cS$fjFc zT$HOnGPwWH(6#yf0~{%qvkb-`-?Odag+EU-ecl!Y8!uyEVg6LQ*Lw=Vlyp2e@6#HJ*$F2-*7WToeBHsOl_ zD+6+F@F#YrK6}oyS4?|NQIvHEjo97-lkj%C(^lCn`HysR=F_DOZc{(MakPQr-m3#| zwXzR)oYj(_aG7xIj!_l04Xj)<+xMRJfRJm%{4LCO@v6aX5$!88-In|0Uuui9)MdW7 zxZHJMzX6}1!zkOtBJDFnw=>%1zZMyb7ty8J=cLRp$>q;U@vU`zsvq7RXsI_a8gH^V zJl7^nyl78Xv@AFLu~3To?v0ygKeSQYQ?(jW6~BFn(8l{sM&p4H+X}<6XC242x-KP% z${2d_UHWuA=$2E3Z`HtVE=RU|3rccs?w4!Y!1>JBUwJ&Lr^%6NtDQ#R*8#`3Le<%g z&!f(WwrtZjol4%>yhmR7Xs`8xdqR5_n{z*E*6AGZlz5iy)v|7E+E*`U#ysYgNGL_U zS=hLs=?3XjW48=^+9c8j`DKfWW;eE*?~9+=cf4u)qY&;>G%}{!1|qe;EV|X;owGaP zT6{{`q66-dHcRRKsxr;#RSEI#mwBEac$(h9?_pa1@v&8U?bT~uQW-T`GzVW(*vZ9< zD=S~?rJeGf$Wh3iZ<`~{C+9DttxeO=OVhnRQCeZiYD(VhE7zin+73VKuR6_`+01fK zF+@+fa$IzW+@qV@xRxED6T7vvQ;A>Z{cQc=bDA87sOe7bc>d_gHP-`+KX1_<6Y}RA zy)~RhLAhV?W?_wr_n6G-s3;eXTkjlm7SP3HSn%+ef{u2 zglfpd-7~k1+RZmi36|Y{cf&Stv}f&WMcuJAhs-x^v$%bLiq=1dhb_qSTat_xfp_;K z*(q8R`RP2rlnZJJ*U!~=PMIihJg7LYHg!L4b7%SGS0*p+Q3O^Uxprlh=J~N_L;Vq| zH58P3b^fLm(yQn1(^Ace-Sj{)_1M{|imux-Dv>Y%foVA$0cGN4DHz(|{Vu9`cJy{I4!EuY!N>ZD}gP+AnuB&;I z8+TOW+;+CUJjwejZnO>P%26IZStfBYcyUxK=a^UTvihF3O`;}cSqH=JpL1{B^I70U zteL~zDK1V?w}(4o)7thg5B6{2T^`}^Rdk!~I#`V-&ubW8tTV{>I$!JE#zS*^qrL;% zvtzD%hnIO*nxA{peM4MPYUhV5OP|b`L_Q$&=C8?MGO!MHxH)aKcqKu@{p_KSStr96 zu2AvRJb8714sl(of7qjfv%DMe8Z}j%K=1E7v5SF6d8+#R7=AEc#;;gZZY-g*` zgwS16N;!Q`n7hA7@h2@1JK%L+;ELpPSsvH*k7-J46xzFdI16@L@#fG*txqm<66CrZ zd}{OXTE`&XcY7XXET*vO+mq98eXy=d?ue^p+E~Wh1^SUH_E#;|xpawC%X1cX-t&J? z6IGb}v~cjXMDZr((esTITGcwY?>a6JBz*Jmt@U`HF;)M;s&J5ZxBbA~WFh~yyvrJ0 zXUYhSuSBaZ?qr%ev!f>e3_*9T?rWBhJONTpZHqYP7uZJ52Kj!{%Dhl|B|oZdpv9tf zYFu{5=9a;{)h;Ds&$oY8(~rJ(+WYFV-g|Es4GpS1$=|AI5o1&GRV+bjyr?JE`FQIH zGppGNr5!9o@(*{m2h!NxRLSy6u4Wv1z1n{l-Nmdmp;a%kT%yZFl`|UR##ff)JlDH3 z$=h3GSeSmdY=NNQ+7E1(4mIx(u=MYtU0st%IFYXGRxWPcep)`vD-wPd7P-{2XT*NP zxZQl&ByME~$pi-0K12J)wcUcsi5nX}y-Vb^;2wx#bdDGuql=W;~(b}8y zR2qy$i+7x9X}QX$Z2}@Eq6MO=knaY0c(<#16WF95AdEe4|)+zy|Biq6r2l|KHa7W~iD0oV=xF6I$*+s{5&s0eIwB!s66_Z4?%Glzk4p$b*j2>o}alR}0 z{GLa^xgx)wI@`07D__0?91=478#%g#38NuGh2nYq>La|Ag^^jI>tdutJz6>C1q*cY@81?XRI|m-$=ATb zHdVFi$~(clRy|%J`BRSt#GcxYQ?f5GI2GW-OT&>v*de172TW2UmC z=k7ONo~*N$r!P93l6J2~s$j$YF%5Tu1dD5}iRYAHz;V|**Pqq|xQE4U(a7&-jq|Hh zluP&`-@N{EhNWXdooqPMp7phbjIIIw;)>0ZV@hkSGC8E%HmU7bU(Xfnhl3R7mf@;)ryUlx zM{OkJlpkA03V&IobMPaz@;(7VTfwD8`A2;Hr)nota(73aK7RTzH}?jH0Y)B6VV^xC zg1UlD=k0h1Gp+Fnazg|P-v?FW52Me=B)c|PRhDxK^Ym%Xc$fE@J(-C}etJVPJ9)S& z=JtsOyI#S_8nqW3p#$uX!e}#C!Y(m7FZEe@{_XpHwVPE4Z%hWhOFuMdwzglF{}vipMZ2}{G5b5J$Ci3q4B0=&trZO}P-Ba@@tC%IR(W*+-Sq~w zBR3j6f^>F7$<$x)-zGpJO@Ml!2x&iWTsdu7p0G?t0$7Ab#Od?1v)apwoW>#n9O zIiEBJGcxoXw|X7Dz~joGbUQMu{`O^45dq4{q63XNC%8oyAd#tv57Bj8aW`Jgyw=+c2yfyqd+xzTJ zhFj{zO-+Z71sU^8L_LAISlzR#mdWSz5)~brxc*hwsNxfxkCz*rRclF8ksdChV`?#| zJvVXp*kR3Ey_026T=#{Cw07RFttyy!xombPv*bRm;w3X(Cm0u|I{AwfJBqqo{p9(9 zYvYMA?N}4DwXZcU@Lz50G#|fWwE1(1>mM9qEh;~JQae9AK0IZIveM3yMjBd~2VRTllEz|R77@yo8DoZV5d;P2DA?o%bQ+p$^jw?&LIi@>eYh)p%TgFx#KC$f#fa;@gSsmmkl3vpM77Ue8O%KsUKl=n;7GFh<#dlj3wL?ORVS{{X_TzgZF-}= z=Ys4*miMb&qh!CHJ7RMzp^u$m$kE>V<~k9gF)3HXc^zAgMr7ILYUCu(!CwJUIGwVv3caOnad%y$KXdP`HOcQL;)PtZ z(=4*vFTQ7v(9ENm$E>Z?WWco5Hz8*k|NN=r_e1s0?Bub$oFeq~Y37ADH+_;AyX-^s zm)ah>x6{T{k449G>pZgyHJK;AFkU=5kt&k&;_Y$%RQL;RleNQ|1}X2uoW|PI=+xp5 zaU|-_a@abx3b3jkAObn2+-P6wX7xUYRR=b zAwt*MGL{;f(CO^3T~Xv4$aspHh56V)(SvKIb1QvUp0%@!5*KH05pQ!ayj+AY2AiiY zcVoH_eBAYxlSL{f;D&3Nh4qj;*WvYgcVy$oYpJ7F)Hx@6dp2GF^46{FhQb+x483he zTqjjmABGFDT#F|Efz-&!gMq4LyB23ZOBFR7IPVrnGbF3A$+1;tWW)p|m zh8$Jf!Q2h%GfnpNyC*}m8qAsP1EOwecTdD?9Td)ABsJg^A=ehUW7|>9a(eTtK_1VG zSHv6|;WHd=k0?po-dX)_E6u?cvHEzW#G0IYEjzrcx7ln-G3^y|%(wDdZ=Anw>`?X% z{>JPVaXZB};onR@DXUu7Ln)Fr zR;grd`7GkILEiMWc~bAK`pZuQb_ylhuBM^9ihorf!E-xD-Fv#b=JND>x7LEiA66OX zJvj$D!ihDj@2Ol>nQbr{X<=1WIxV(a?MCh1<+qCD9tyQ)&9j&3xbnou@cfq5=RfHb z)fI;%HQYMMQ|_bdDCv-tSl2?Sac^C~j?$1RafYPpt22bQWHt%N-oH7xGvvsTNSlj6 zqIbT0l&#&-w{(m4amkURN$k9@PgTXl=c}Ics3@fGKbmpPBRP{oC=H|j$704 zsw-WgRj=mYS#E=-ylo+TT9{^q|aZ08e)Y303zhBwrGno})TbLR{D zM;Q)liX}!*tbFK@X(877#Cx||h*?MCYG+w-MswmXhQ#;X684X^Q%>&A(kpXM*;$eQE8M@RnYIjA>f8=v)lcZTk?%l zvs#3&4+)6)FZArwE*yI^sLcLV`+}R!(8YQyX;tOkiC8!K+ltI@7e6t)eE$Kpsz_&= z@K^8sd^$;vN?)rEHB1GJjA^gE7y7xRO-g#P6YPsg>GcO68LyPU;LDMTi@IOZhMsP8O+J;q zs&~`Q(G9INQb~jx0}sTONt{{0UNzoIC6kvx>*2rYg{=RT<2LRRg+U|w`xWjr@%;H$ z!m8ijKONuk*h1m0&O;x@ODxHLf+CM!YSA1qh!-}@^Vhj%z4AhbHdFq^VGe2)shV`! z2aG+I>dsPu7wsk+ERIS>h<3a>&fYumt@2aieBsHB-N{G!mM+xDNDn>u&T?IGN2S?{ zjFd~BytY!y#eHR(ss%4HIuCBz`&Bwpg)v>}PT!H_b9P|{W-sa6JUEJP1qxUalp|}5 zN^8}|!%_^BFBuQPuP1)muEN35qQ7ZJ@ZgbM3#5cyaLAt2&|XPSzc1Ewx;}Irro^7@J1-t?sCTws#49-l ^m)2S< zoIA`fdcT_8{WQ&yyvSXXC$(mIJ9C`_g*2@tqR&5~_FU>76D~mh^~IUD=ARhoN%^Q^LxvK$vm%U}SX1RwCVAgT#Jn$k%M`!dnrh_3wv9>8 zS6V4~rk+YLhu`aTSrNVdbhB7;R{KH<4KWMZk?S#GhUvP^!I8#ILGa6WI!aYi;ZBT6 zfiY0iOr(a%(b} z7Nb^i9;n;Gm=>^5H&wL5@`1SSPrp6d;yB64$0B#jPf&C1o$>Uz8OB6`;{)19rD_B( zx;F7$Og_Ji*Cz3j+@t0F^FQTXsQ(gL!uM))tnuB$!^do!X@38Eu*$x2pPIM&YGr05 sB``1>sPhD8q{V)1;p^(^nWeJKtLF9`nFs$@Mgn1rn(pQt)qQ^dA9lDbNB{r; literal 0 HcmV?d00001 diff --git a/ZitiUWPSolution.sln b/ZitiUWPSolution.sln index 4e9f0d64..512e9b55 100644 --- a/ZitiUWPSolution.sln +++ b/ZitiUWPSolution.sln @@ -13,18 +13,20 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZitiTunneler", "ZitiTunnele EndProject Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "ZitiInstaller", "ZitiInstaller\ZitiInstaller.wapproj", "{520E523A-1E9B-4983-ABA9-0EB3B27B6420}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZitiUpdateService", "ZitiUpdateService\ZitiUpdateService.csproj", "{9AB81609-F5DD-40A6-87B5-F3279D48514D}" +EndProject +Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "ZitiTunnelerSetup", "ZitiTunnelerSetup\ZitiTunnelerSetup.vdproj", "{6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|ARM = Debug|ARM Debug|ARM64 = Debug|ARM64 - Debug|Default = Debug|Default Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|ARM = Release|ARM Release|ARM64 = Release|ARM64 - Release|Default = Release|Default Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection @@ -35,20 +37,15 @@ Global {FA4291EA-A97E-4854-959F-91EE7B330B37}.Debug|ARM.Build.0 = Debug|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Debug|ARM64.ActiveCfg = Debug|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Debug|ARM64.Build.0 = Debug|Any CPU - {FA4291EA-A97E-4854-959F-91EE7B330B37}.Debug|Default.ActiveCfg = Debug|Any CPU - {FA4291EA-A97E-4854-959F-91EE7B330B37}.Debug|Default.Build.0 = Debug|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Debug|x64.ActiveCfg = Debug|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Debug|x64.Build.0 = Debug|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Debug|x86.ActiveCfg = Debug|Any CPU - {FA4291EA-A97E-4854-959F-91EE7B330B37}.Debug|x86.Build.0 = Debug|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Release|Any CPU.ActiveCfg = Release|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Release|Any CPU.Build.0 = Release|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Release|ARM.ActiveCfg = Release|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Release|ARM.Build.0 = Release|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Release|ARM64.ActiveCfg = Release|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Release|ARM64.Build.0 = Release|Any CPU - {FA4291EA-A97E-4854-959F-91EE7B330B37}.Release|Default.ActiveCfg = Release|Any CPU - {FA4291EA-A97E-4854-959F-91EE7B330B37}.Release|Default.Build.0 = Release|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Release|x64.ActiveCfg = Release|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Release|x64.Build.0 = Release|Any CPU {FA4291EA-A97E-4854-959F-91EE7B330B37}.Release|x86.ActiveCfg = Release|Any CPU @@ -62,15 +59,10 @@ Global {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|ARM64.ActiveCfg = Debug|ARM64 {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|ARM64.Build.0 = Debug|ARM64 {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|ARM64.Deploy.0 = Debug|ARM64 - {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|Default.ActiveCfg = Debug|Any CPU - {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|Default.Build.0 = Debug|Any CPU - {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|Default.Deploy.0 = Debug|Any CPU {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|x64.ActiveCfg = Debug|x64 {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|x64.Build.0 = Debug|x64 {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|x64.Deploy.0 = Debug|x64 - {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|x86.ActiveCfg = Debug|x86 - {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|x86.Build.0 = Debug|x86 - {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|x86.Deploy.0 = Debug|x86 + {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Debug|x86.ActiveCfg = Debug|Any CPU {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|Any CPU.ActiveCfg = Release|Any CPU {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|Any CPU.Build.0 = Release|Any CPU {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|Any CPU.Deploy.0 = Release|Any CPU @@ -80,15 +72,43 @@ Global {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|ARM64.ActiveCfg = Release|ARM64 {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|ARM64.Build.0 = Release|ARM64 {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|ARM64.Deploy.0 = Release|ARM64 - {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|Default.ActiveCfg = Release|Any CPU - {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|Default.Build.0 = Release|Any CPU - {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|Default.Deploy.0 = Release|Any CPU {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|x64.ActiveCfg = Release|x64 {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|x64.Build.0 = Release|x64 {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|x64.Deploy.0 = Release|x64 {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|x86.ActiveCfg = Release|x86 {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|x86.Build.0 = Release|x86 {520E523A-1E9B-4983-ABA9-0EB3B27B6420}.Release|x86.Deploy.0 = Release|x86 + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Debug|Any CPU.ActiveCfg = Release|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Debug|Any CPU.Build.0 = Release|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Debug|ARM.ActiveCfg = Debug|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Debug|ARM.Build.0 = Debug|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Debug|ARM64.Build.0 = Debug|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Debug|x64.ActiveCfg = Debug|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Debug|x64.Build.0 = Debug|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Debug|x86.ActiveCfg = Debug|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Release|Any CPU.Build.0 = Release|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Release|ARM.ActiveCfg = Release|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Release|ARM.Build.0 = Release|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Release|ARM64.ActiveCfg = Release|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Release|ARM64.Build.0 = Release|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Release|x64.ActiveCfg = Release|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Release|x64.Build.0 = Release|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Release|x86.ActiveCfg = Release|Any CPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D}.Release|x86.Build.0 = Release|Any CPU + {6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}.Debug|Any CPU.ActiveCfg = Debug + {6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}.Debug|ARM.ActiveCfg = Debug + {6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}.Debug|ARM64.ActiveCfg = Debug + {6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}.Debug|x64.ActiveCfg = Debug + {6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}.Debug|x86.ActiveCfg = Debug + {6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}.Release|Any CPU.ActiveCfg = Release + {6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}.Release|Any CPU.Build.0 = Release + {6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}.Release|ARM.ActiveCfg = Release + {6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}.Release|ARM64.ActiveCfg = Release + {6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}.Release|x64.ActiveCfg = Release + {6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}.Release|x64.Build.0 = Release + {6ABD9DF3-3298-4038-ABED-B16FFD5FF66D}.Release|x86.ActiveCfg = Release EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -109,6 +129,12 @@ Global Release|Default = Release|Default Release|x64 = Release|x64 Release|x86 = Release|x86 + Releases|Any CPU = Releases|Any CPU + Releases|ARM = Releases|ARM + Releases|ARM64 = Releases|ARM64 + Releases|Default = Releases|Default + Releases|x64 = Releases|x64 + Releases|x86 = Releases|x86 EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -116,27 +142,6 @@ Global Debug|ARM64 = Debug|ARM64 Debug|Default = Debug|Default Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|ARM = Release|ARM - Release|ARM64 = Release|ARM64 - Release|Default = Release|Default - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|ARM = Debug|ARM - Debug|ARM64 = Debug|ARM64 - Debug|Default = Debug|Default - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|ARM = Release|ARM - Release|ARM64 = Release|ARM64 - Release|Default = Release|Default - Release|x64 = Release|x64 - Release|x86 = Release|x86 EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/ZitiUpdateService/App.config b/ZitiUpdateService/App.config new file mode 100644 index 00000000..193aecc6 --- /dev/null +++ b/ZitiUpdateService/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ZitiUpdateService/Program.cs b/ZitiUpdateService/Program.cs new file mode 100644 index 00000000..d9bdd216 --- /dev/null +++ b/ZitiUpdateService/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.ServiceProcess; +using System.Text; +using System.Threading.Tasks; + +namespace ZitiUpdateService { + static class Program { + /// + /// The main entry point for the application. + /// + static void Main() { + ServiceBase[] ServicesToRun; + ServicesToRun = new ServiceBase[] + { + new UpdateService() + }; + ServiceBase.Run(ServicesToRun); + } + } +} diff --git a/ZitiUpdateService/ProjectInstaller.Designer.cs b/ZitiUpdateService/ProjectInstaller.Designer.cs new file mode 100644 index 00000000..8e4eb85a --- /dev/null +++ b/ZitiUpdateService/ProjectInstaller.Designer.cs @@ -0,0 +1,56 @@ +namespace ZitiUpdateService { + partial class ProjectInstaller { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.ZitiUpdateProcessInstaller = new System.ServiceProcess.ServiceProcessInstaller(); + this.ZitiUpdateServiceInstaller = new System.ServiceProcess.ServiceInstaller(); + // + // ZitiUpdateProcessInstaller + // + this.ZitiUpdateProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem; + this.ZitiUpdateProcessInstaller.Password = null; + this.ZitiUpdateProcessInstaller.Username = null; + // + // ZitiUpdateServiceInstaller + // + this.ZitiUpdateServiceInstaller.Description = "Keep Ziti Service Software Up To Date"; + this.ZitiUpdateServiceInstaller.DisplayName = "Ziti Update Service"; + this.ZitiUpdateServiceInstaller.ServiceName = "ZitiUpdateService"; + this.ZitiUpdateServiceInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic; + this.ZitiUpdateServiceInstaller.AfterInstall += new System.Configuration.Install.InstallEventHandler(this.ZitiUpdateServiceInstaller_AfterInstall); + // + // ProjectInstaller + // + this.Installers.AddRange(new System.Configuration.Install.Installer[] { + this.ZitiUpdateProcessInstaller, + this.ZitiUpdateServiceInstaller}); + + } + + #endregion + + private System.ServiceProcess.ServiceProcessInstaller ZitiUpdateProcessInstaller; + private System.ServiceProcess.ServiceInstaller ZitiUpdateServiceInstaller; + } +} \ No newline at end of file diff --git a/ZitiUpdateService/ProjectInstaller.cs b/ZitiUpdateService/ProjectInstaller.cs new file mode 100644 index 00000000..3720deaa --- /dev/null +++ b/ZitiUpdateService/ProjectInstaller.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Configuration.Install; +using System.Linq; +using System.Threading.Tasks; + +namespace ZitiUpdateService { + [RunInstaller(true)] + public partial class ProjectInstaller : System.Configuration.Install.Installer { + public ProjectInstaller() { + InitializeComponent(); + } + + private void ZitiUpdateServiceInstaller_AfterInstall(object sender, InstallEventArgs e) { + + } + } +} diff --git a/ZitiUpdateService/ProjectInstaller.resx b/ZitiUpdateService/ProjectInstaller.resx new file mode 100644 index 00000000..c919b2a9 --- /dev/null +++ b/ZitiUpdateService/ProjectInstaller.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 56 + + + 201, 50 + + + False + + \ No newline at end of file diff --git a/ZitiUpdateService/Properties/AssemblyInfo.cs b/ZitiUpdateService/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..e3ab62af --- /dev/null +++ b/ZitiUpdateService/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ZitiUpdateService")] +[assembly: AssemblyDescription("Ziti Monitor and Update Service")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("NetFoundry")] +[assembly: AssemblyProduct("ZitiUpdateService")] +[assembly: AssemblyCopyright("Copyright © NetFoundry 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9ab81609-f5dd-40a6-87b5-f3279d48514d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ZitiUpdateService/Properties/app.manifest b/ZitiUpdateService/Properties/app.manifest new file mode 100644 index 00000000..3b5ed3da --- /dev/null +++ b/ZitiUpdateService/Properties/app.manifest @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ZitiUpdateService/UpdateService.Designer.cs b/ZitiUpdateService/UpdateService.Designer.cs new file mode 100644 index 00000000..ce06ec11 --- /dev/null +++ b/ZitiUpdateService/UpdateService.Designer.cs @@ -0,0 +1,32 @@ +namespace ZitiUpdateService { + partial class UpdateService { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + components = new System.ComponentModel.Container(); + this.ServiceName = "Ziti Update Service"; + } + + #endregion + } +} diff --git a/ZitiUpdateService/UpdateService.cs b/ZitiUpdateService/UpdateService.cs new file mode 100644 index 00000000..fa622d09 --- /dev/null +++ b/ZitiUpdateService/UpdateService.cs @@ -0,0 +1,225 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Linq; +using System.ServiceProcess; +using System.Text; +using System.Threading; +using System.IO; +using System.IO.Compression; +using System.Net; +using System.Timers; +using System.Management.Automation; +using System.Xml; + +namespace ZitiUpdateService { + public partial class UpdateService : ServiceBase { + + private string _version = ""; + private bool _isNew = true; + private int _majorVersion = 1; + private string _versionUrl = "https://netfoundry.jfrog.io/netfoundry/ziti-maven-snapshot/ziti-tunnel-win/amd64/windows/ziti-tunnel-win/maven-metadata.xml"; + private string _serviceUrl = "https://netfoundry.jfrog.io/netfoundry/ziti-maven-snapshot/ziti-tunnel-win/amd64/windows/ziti-tunnel-win/${version}/ziti-tunnel-win-${version}.zip"; + private System.Timers.Timer _checkTimer = new System.Timers.Timer(); + private System.Timers.Timer _updateTimer = new System.Timers.Timer(); + private string _rootDirectory = ""; + private string _logDirectory = ""; + private bool _isJustStopped = true; + + ServiceController controller; + public UpdateService() { + InitializeComponent(); + } + + protected override void OnStart(string[] args) { + _rootDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "NetFoundry"); + if (!Directory.Exists(_rootDirectory)) Directory.CreateDirectory(_rootDirectory); + _logDirectory = Path.Combine(_rootDirectory, "Logs"); + if (!Directory.Exists(_logDirectory)) Directory.CreateDirectory(_logDirectory); + Log("Setup Watchers"); + SetupServiceWatcher(); + } + + protected override void OnStop() { + Log("Stopping update Service"); + } + + private void SetupServiceWatcher() { + controller = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName == "ziti"); + if (controller==null) { + Log("Get Installation"); + UpdateServiceFiles(); + } else { + Log("Check Version"); + _isNew = false; + if (File.Exists(Path.Combine(_rootDirectory, @"Service\Version.txt"))) { + _version = File.ReadAllText(Path.Combine(_rootDirectory, @"Service\Version.txt")); + Log("Version Found: " + _version); + if (controller.Status==ServiceControllerStatus.Stopped) { + StartZiti(); + } else { + SetupWatcher(); + } + } else { + UpdateServiceFiles(); + } + } + } + + private void SetupWatcher() { + Log("Ziti Update Setting Up Watchers"); +; _checkTimer = new System.Timers.Timer(); + _checkTimer.Elapsed += CheckService; + _checkTimer.Interval = 60000; + _checkTimer.Enabled = true; + _checkTimer.Start(); + _updateTimer = new System.Timers.Timer(); + _updateTimer.Elapsed += CheckUpdate; + _updateTimer.Interval = 600000; + _updateTimer.Enabled = true; + _updateTimer.Start(); + } + + private void CheckUpdate(object sender, ElapsedEventArgs e) { + var request = WebRequest.Create(_versionUrl) as HttpWebRequest; + var response = request.GetResponse(); + Stream receiveStream = response.GetResponseStream(); + StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8); + var result = readStream.ReadToEnd(); + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(result); + XmlNode node = xmlDoc.SelectSingleNode("metadata/versioning/release"); + string version = node.InnerText; + Log("Version Checked: " + version+" on "+_version); + if (version != _version) { + StopZiti(); + UpdateServiceFiles(); + } + } + + private void CheckService(object sender, ElapsedEventArgs e) { + controller = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName == "ziti"); + if (controller.Status == ServiceControllerStatus.Stopped|| controller.Status == ServiceControllerStatus.StopPending) { + if (_isJustStopped) { + _isJustStopped = false; + Log("Ziti Service has been stopped, update Network"); + RunScript(); + } + } else { + if (controller.Status==ServiceControllerStatus.Running) { + _isJustStopped = true; + } + } + } + + private void UpdateServiceFiles() { + if (controller!=null) { + controller.Stop(); + } else { + GetFiles(); + } + } + + private void GetFiles() { + var request = WebRequest.Create(_versionUrl) as HttpWebRequest; + var response = request.GetResponse(); + Stream receiveStream = response.GetResponseStream(); + StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8); + var result = readStream.ReadToEnd(); + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(result); + XmlNode node = xmlDoc.SelectSingleNode("metadata/versioning/release"); + string version = node.InnerText; + Log("Got Version: " + version); + + string remoteService = _serviceUrl.Replace("${version}", version); + + if (!Directory.Exists(Path.Combine(_rootDirectory, "Service"))) Directory.CreateDirectory(Path.Combine(_rootDirectory, "Service")); + string[] files = Directory.GetFiles(Path.Combine(_rootDirectory, "Service")); + foreach (string file in files) { + try { + Log("Delete: " + file); + File.Delete(file); + } catch (Exception e) { + EventLog.WriteEntry("Ziti", e.ToString(), EventLogEntryType.Error); + } + } + WebClient webClient = new WebClient(); + webClient.DownloadFile(remoteService, Path.Combine(_rootDirectory, "Service") + @"\windows-tunneler.zip"); + Log("Zip Downloaded"); + ZipFile.ExtractToDirectory(Path.Combine(_rootDirectory, "Service") + @"\windows-tunneler.zip", Path.Combine(_rootDirectory, "Service")); + + Log("Zip UnZipped"); + File.WriteAllText(Path.Combine(_rootDirectory, @"Service\Version.txt"), version); + _version = version; + + if (_isNew) { + Log("Installing Service " + _version); + ProcessStartInfo installService = new ProcessStartInfo(); + installService.CreateNoWindow = true; + installService.UseShellExecute = true; + installService.FileName = Path.Combine(_rootDirectory, "Service") + @"\ziti-tunnel.exe"; + installService.WindowStyle = ProcessWindowStyle.Hidden; + installService.Arguments = "install"; + Log("Install Using " + installService.FileName + " " + installService.Arguments); + try { + Process exeProcess = Process.Start(installService); + exeProcess.WaitForExit(); + StartZiti(); + Log("Installed " + installService.FileName + " " + installService.Arguments); + + } catch (Exception e) { + Log("Cannot Install Service - " + e.ToString()); + } + } else { + StartZiti(); + } + + } + + private void RunScript() { + string scriptText = "get-netipinterface|ForEach-Object { Set-DnsClientServerAddress-InterfaceIndex $_.ifIndex-ResetServerAddresses}"; + Log("Executing: " + scriptText); + using (PowerShell PowerShellInstance = PowerShell.Create()) { + PowerShellInstance.AddScript(scriptText); + IAsyncResult result = PowerShellInstance.BeginInvoke(); + while (result.IsCompleted == false) { + Thread.Sleep(1000); + } + } + } + + private void StartZiti() { + controller = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName == "ziti"); + if (controller.Status != ServiceControllerStatus.Running) { + try { + Log("Starting Service"); + controller.Start(); + controller.WaitForStatus(ServiceControllerStatus.Running); + SetupWatcher(); + } catch (Exception e) { + Log("Cannot Start Service - " + e.ToString()); + } + } + } + + private void StopZiti() { + controller = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName == "ziti"); + if (controller.Status != ServiceControllerStatus.Stopped) { + try { + controller.Stop(); + controller.WaitForStatus(ServiceControllerStatus.Stopped); + } catch (Exception e) { + Log("Cannot Stop Service - " + e.ToString()); + } + } + } + + private void Log(string message) { + File.AppendAllText(Path.Combine(_logDirectory, @"Log.log"), DateTime.Now.ToString()+" "+message); + EventLog.WriteEntry("Ziti Update Service", message, EventLogEntryType.Information); + } + } +} diff --git a/ZitiUpdateService/ZitiUpdateService.csproj b/ZitiUpdateService/ZitiUpdateService.csproj new file mode 100644 index 00000000..2bc88441 --- /dev/null +++ b/ZitiUpdateService/ZitiUpdateService.csproj @@ -0,0 +1,137 @@ + + + + + Debug + AnyCPU + {9AB81609-F5DD-40A6-87B5-F3279D48514D} + WinExe + ZitiUpdateService + ZitiUpdateService + v4.8 + 512 + true + true + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 1 + 1.0.0.%2a + false + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x64 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + ziti-white.ico + + + 189AAD422A106DC81E8E79C7E0D2118CEB2E6321 + + + + + + + true + + + LocalIntranet + + + Properties\app.manifest + + + true + + + bin\Releases\ + + + + + + + + + + ..\packages\Microsoft.PowerShell.5.ReferenceAssemblies.1.1.0\lib\net4\System.Management.Automation.dll + + + + + + + + + + + + Component + + + ProjectInstaller.cs + + + Component + + + UpdateService.cs + + + + + + + + + + + + + ProjectInstaller.cs + + + + + + + + False + Microsoft .NET Framework 4.8 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + \ No newline at end of file diff --git a/ZitiUpdateService/packages.config b/ZitiUpdateService/packages.config new file mode 100644 index 00000000..d5a74547 --- /dev/null +++ b/ZitiUpdateService/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ZitiUpdateService/ziti-white.ico b/ZitiUpdateService/ziti-white.ico new file mode 100644 index 0000000000000000000000000000000000000000..84992d63705147af46b4a5a0def9337036fc9278 GIT binary patch literal 28805 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�cNSw$CBe|77tRk|tF(LskIgk!G9e>QrgzG8c} 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 ^m)2S< zoIA`fdcT_8{WQ&yyvSXXC$(mIJ9C`_g*2@tqR&5~_FU>76D~mh^~IUD=ARhoN%^Q^LxvK$vm%U}SX1RwCVAgT#Jn$k%M`!dnrh_3wv9>8 zS6V4~rk+YLhu`aTSrNVdbhB7;R{KH<4KWMZk?S#GhUvP^!I8#ILGa6WI!aYi;ZBT6 zfiY0iOr(a%(b} z7Nb^i9;n;Gm=>^5H&wL5@`1SSPrp6d;yB64$0B#jPf&C1o$>Uz8OB6`;{)19rD_B( zx;F7$Og_Ji*Cz3j+@t0F^FQTXsQ(gL!uM))tnuB$!^do!X@38Eu*$x2pPIM&YGr05 sB``1>sPhD8q{V)1;p^(^nWeJKtLF9`nFs$@Mgn1rn(pQt)qQ^dA9lDbNB{r; literal 0 HcmV?d00001