diff --git a/.gitignore b/.gitignore index b06e864..4d31097 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs - +*.pem # Build results [Dd]ebug/ [Dd]ebugPublic/ diff --git a/QuikPak/Config.cs b/QuikPak/Config.cs index de6caeb..88e8d24 100644 --- a/QuikPak/Config.cs +++ b/QuikPak/Config.cs @@ -16,7 +16,7 @@ namespace QuikPak public string ManagedPipelineMode { get; set; } = "Integrated"; public string ManagedRuntimeVersion { get; set; } = "v4.0"; - public IEnumerable Certs { get; set; } + public IEnumerable Certificates { get; set; } } public class Endpoint @@ -29,8 +29,8 @@ namespace QuikPak public class Cert { public string Name { get; set; } - public string CertificatePath { get; set; } + public string Path { get; set; } public string Password { get; set; } } -} \ No newline at end of file +} diff --git a/QuikPak/Config.json b/QuikPak/Config.json index fa1aa6a..352fbfa 100644 --- a/QuikPak/Config.json +++ b/QuikPak/Config.json @@ -1,12 +1,19 @@ { - "UpgradeCode": "317e4313-2314-46e9-ae7e-6cdfee60c05d", - "Name": "MyWebsite", - "Version": "1.0.0.0", - "Endpoints": [ - { - "port": 80, - "DnsName": "*", - "Secure": false - } - ] -} \ No newline at end of file + "UpgradeCode": "317e4313-2314-46e9-ae7e-6cdfee60c05d", + "Name": "terribled", + "Version": "1.0.0.0", + "Endpoints": [ + { + "port": 10000, + "DnsName": "terribledev.io", + "Secure": true + } + ], + "Certificates": [ + { + "Name": "terribledev.io", + "Path": "c:/projects/quikpak/mycert.pfx", + "Password": "awesome" + } + ] +} diff --git a/QuikPak/Options.cs b/QuikPak/Options.cs index 93aeadc..3f4f6bc 100644 --- a/QuikPak/Options.cs +++ b/QuikPak/Options.cs @@ -18,4 +18,4 @@ namespace QuikPak return HelpText.AutoBuild(this); } } -} \ No newline at end of file +} diff --git a/QuikPak/Program.cs b/QuikPak/Program.cs index e8c7037..be12579 100644 --- a/QuikPak/Program.cs +++ b/QuikPak/Program.cs @@ -78,7 +78,7 @@ namespace QuikPak OutFileName = config.Name, PreserveTempFiles = true, UpgradeCode = new Guid(config.UpgradeCode), - Certificates = config.Certs.Select(a => new Certificate { PFXPassword = a.Password, CertificatePath = a.CertificatePath, Request = false, StoreName = StoreName.personal, StoreLocation = StoreLocation.localMachine, Name = a.Name}).ToArray() + Certificates = config.Certificates?.Select(a => new Certificate { PFXPassword = a.Password, CertificatePath = a.Path, Request = false, StoreName = StoreName.personal, StoreLocation = StoreLocation.localMachine, Name = a.Name}).ToArray() ?? new Certificate[0] }; project.Properties.Add(new Property("REINSTALLMODE", "dmus")); project.MajorUpgrade = new MajorUpgrade() { AllowDowngrades = true, Schedule = UpgradeSchedule.afterInstallInitialize }; @@ -96,19 +96,49 @@ namespace QuikPak project.IncludeWixExtension(WixExtension.IIs); Compiler.WixSourceGenerated += (document) => { - document.Descendants().Where(a => a.Name.ToString().EndsWith("WebVirtualDir", true)).ToList().ForEach(a=>a.Remove()); - var appPool = document.Descendants().Where(a => a.Name.ToString().EndsWith("WebAppPool", true)); - var certs = document.Descendants().Where(a => a.Name.ToString().EndsWith("Certificate", true)); - var res = document.Descendants().First(a=>a.Name.ToString().EndsWith("WebSite", true)); - // - //var website = document.DescendantNodes(); + string appPoolId = string.Empty; + var certs = new List(); + XElement website = null; + foreach(var node in document.Descendants().ToList()) + { + if(node == null || node.Name == null) continue; + var nodeName = node.Name.ToString(); + if(nodeName.EndsWith("WebVirtualDir", true)) + { + //remove virdir's as we should just use sites + node.Remove(); + } + if(nodeName.EndsWith("WebAppPool", true)) + { + appPoolId = node.Attributes().First(a => a.Name == "Id").Value; + } + if(nodeName.EndsWith("Certificate", true)) + { + certs.Add(node); + } + if(nodeName.EndsWith("WebSite", true)) + { + website = node; + } + } + if(string.IsNullOrWhiteSpace(appPoolId)) + { + Console.Error.WriteLine("App pool unable to be identified. A major problem has occured"); + Environment.Exit(1); + } + if(website == null) + { + Console.Error.WriteLine("website unable to be identified. A major problem has occured"); + Environment.Exit(1); + } + XNamespace name = "http://schemas.microsoft.com/wix/IIsExtension"; foreach(var cert in certs) { - res.Add(new XElement(name+"CertificateRef", new XAttribute("Id", cert.Attribute("Id").Value))); + website.Add(new XElement(name+"CertificateRef", new XAttribute("Id", cert.Attribute("Id").Value))); } - res.Add(new XElement(name + "WebApplication", new XAttribute("Id", config.Name + "webapp"), new XAttribute("Name", config.Name + "webapp"), new XAttribute("WebAppPool", appPool.Attributes().First(a=>a.Name == "Id").Value))); + website.Add(new XElement(name + "WebApplication", new XAttribute("Id", config.Name + "webapp"), new XAttribute("Name", config.Name + "webapp"), new XAttribute("WebAppPool", appPoolId))); }; Compiler.BuildMsi(project); diff --git a/QuikPak/choco/quikpak.nuspec b/QuikPak/choco/quikpak.nuspec index d6581fa..2273a7a 100644 --- a/QuikPak/choco/quikpak.nuspec +++ b/QuikPak/choco/quikpak.nuspec @@ -5,29 +5,27 @@ quikpak QuikPak (Install) - 0.7.1 + $version$ Tommy Parnell Tommy Parnell quickly pack directory's as IIS websites quickly pack directory's as IIS websites - https://github.com/tparnell8/QuikPak - https://github.com/tparnell8/QuikPak + https://github.com/terribledev/QuikPak + https://github.com/terribledev/QuikPak MSI creation IIS - https://github.com/tparnell8/QuikPak/blob/master/LICENSE.md + https://github.com/terribledev/QuikPak/blob/master/LICENSE.md false - - - + diff --git a/QuikPak/choco/tools/ReadMe.md b/QuikPak/choco/tools/ReadMe.md deleted file mode 100644 index 1c90512..0000000 --- a/QuikPak/choco/tools/ReadMe.md +++ /dev/null @@ -1,91 +0,0 @@ -## Summary -How do I create packages? See https://github.com/chocolatey/choco/wiki/CreatePackages - -If you are submitting packages to the community feed (https://chocolatey.org) -always try to ensure you have read, understood and adhere to the create -packages wiki link above. - -## Automatic Packages? -Consider making this package an automatic package, for the best -maintainability over time. Read up at https://github.com/chocolatey/choco/wiki/AutomaticPackages - -## Shim Generation -Any executables you include in the package or download (but don't call -install against using the built-in functions) will be automatically shimmed. - -This means those executables will automatically be included on the path. -Shim generation runs whether the package is self-contained or uses automation -scripts. - -By default, these are considered console applications. - -If the application is a GUI, you should create an empty file next to the exe -named 'name.exe.gui' e.g. 'bob.exe' would need a file named 'bob.exe.gui'. -See https://github.com/chocolatey/choco/wiki/CreatePackages#how-do-i-set-up-batch-redirects-for-applications-that-have-a-gui - -If you want to ignore the executable, create an empty file next to the exe -named 'name.exe.ignore' e.g. 'bob.exe' would need a file named -'bob.exe.ignore'. -See https://github.com/chocolatey/choco/wiki/CreatePackages#how-do-i-exclude-executables-from-getting-batch-redirects - -## Self-Contained? -If you have a self-contained package, you can remove the automation scripts -entirely and just include the executables, they will automatically get shimmed, -which puts them on the path. Ensure you have the legal right to distribute -the application though. See https://github.com/chocolatey/choco/wiki/Legal. - -You should read up on the Shim Generation section to familiarize yourself -on what to do with GUI applications and/or ignoring shims. - -## Automation Scripts -You have a powerful use of Chocolatey, as you are using PowerShell. So you -can do just about anything you need. Choco has some very handy built-in -functions that you can use, these are sometimes called the helpers. - -### Built-In Functions -https://github.com/chocolatey/choco/wiki/HelpersReference - -A note about a couple: -* Get-BinRoot - this is a horribly named function that doesn't do what new folks think it does. It gets you the 'tools' root, which by default is set to 'c:\tools', not the chocolateyInstall bin folder. -* Install-BinFile - used for non-exe files - executables are automatically shimmed... -* Uninstall-BinFile - used for non-exe files - executables are automatically shimmed - -### Getting package specific information -Use the package parameters pattern - see https://github.com/chocolatey/choco/wiki/How-To-Parse-PackageParameters-Argument - -### Need to mount an ISO? -https://github.com/chocolatey/choco/wiki/How-To-Mount-An-Iso-In-Chocolatey-Package - - -### Environment Variables -Chocolatey makes a number of environment variables available (You can access any of these with $env:TheVariableNameBelow): - - * TEMP = Overridden to the CacheLocation, but may be the same as the original TEMP folder - * ChocolateyInstall = Top level folder where Chocolatey is installed - * chocolateyPackageName = The name of the package, equivalent to the id in the nuspec (0.9.9+) - * chocolateyPackageVersion = The version of the package, equivalent to the version in the nuspec (0.9.9+) - * chocolateyPackageFolder = The top level location of the package folder - -#### Advanced Environment Variables -The following are more advanced settings: - - * chocolateyPackageParameters = (0.9.8.22+) - * CHOCOLATEY_VERSION = The version of Choco you normally see. Use if you are 'lighting' things up based on choco version. (0.9.9+) - - Otherwise take a dependency on the specific version you need. - * chocolateyForceX86 = If available and set to 'true', then user has requested 32bit version. (0.9.9+) - - Automatically handled in built in Choco functions. - * OS_PLATFORM = Like Windows, OSX, Linux. (0.9.9+) - * OS_VERSION = The version of OS, like 6.1 something something for Windows. (0.9.9+) - * OS_NAME = The reported name of the OS. (0.9.9+) - * IS_PROCESSELEVATED = Is the process elevated? (0.9.9+) - -#### Experimental Environment Variables -The following are experimental or use not recommended: - - * OS_IS64BIT = This may not return correctly - it may depend on the process the app is running under (0.9.9+) - * CHOCOLATEY_VERSION_PRODUCT = the version of Choco that may match CHOCOLATEY_VERSION but may be different (0.9.9+) - - it's based on git describe - * IS_ADMIN = Is the user an administrator? But doesn't tell you if the process is elevated. (0.9.9+) - * chocolateyInstallOverride = Not for use in package automation scripts. (0.9.9+) - * chocolateyInstallArguments = the installer arguments meant for the native installer. You should use chocolateyPackageParameters intead. (0.9.9+) - diff --git a/Readme.md b/Readme.md index 94409f4..8c7c404 100644 --- a/Readme.md +++ b/Readme.md @@ -30,8 +30,11 @@ Create a json config file that looks something like this ``` -then call QuikPak.exe -c path\to\your\config.json -x path\to\your\web\content +then call QuikPak.exe -c path\to\your\config.jsondfsa -x path\to\your\web\content -## TODO +## Certificates -Allow someone to include a certificate optionally for secure bindings +You can also add certificates to your json bindings. + + +....f.dfa. diff --git a/config.json b/config.json index 40bdfd7..017e9f9 100644 --- a/config.json +++ b/config.json @@ -1,12 +1,19 @@ { - "UpgradeCode": "317e4313-2314-46e9-ae7e-6cdfee60c05d", - "Name": "MyWebsite", - "Version": "1.0.0", - "Endpoints": [ - { - "port": 80, - "DnsName": "mywebsite.com", - "Secure": false - } - ] + "UpgradeCode": "317e4313-2314-46e9-ae7e-6cdfee60c05d", + "Name": "terribled", + "Version": "1.0.0.0", + "Endpoints": [ + { + "port": 10000, + "DnsName": "terribledev.io", + "Secure": true + } + ], + "Certificates": [ + { + "Name": "terribledev.io", + "Path": "c:/projects/quikpak/mycert.pfx", + "Password": "awesome" + } + ] }