public static IOfferRemoteOperations Restart(this IOfferRemoteOperations remote, int delayInSeconds = 10)
        {
            var restartOperation = new RestartComputerOperation(delayInSeconds);

            OperationExecutor.Execute((RemoteBuilder)remote, restartOperation);
            return(remote);
        }
        /// <summary>
        /// Creates a directory, if it not already exists.
        /// </summary>
        /// <param name="remote"></param>
        /// <param name="path">Directory path</param>
        /// <returns></returns>
        public static IOfferRemoteOperations CreateDirectory(this IOfferRemoteOperations remote, string path)
        {
            var operation = new CreateDirectoryOperation(path);

            OperationExecutor.Execute((RemoteBuilder)remote, operation);
            return(remote);
        }
        /// <summary>
        /// Adds user to group
        /// </summary>
        /// <param name="configuration"></param>
        /// <param name="userName">Username</param>
        /// <param name="groupName">Group name</param>
        /// <returns></returns>
        public static IOfferRemoteOperations AddUserToLocalGroup(this IOfferRemoteOperations configuration, string userName, string groupName)
        {
            var operation = new AddUserToLocalGroupOperation(userName, groupName);

            OperationExecutor.Execute((RemoteBuilder)configuration, operation);
            return(configuration);
        }
 public void ConfigureRemoteScripts(IOfferRemoteOperations server, IEnumerable <string> scripts)
 {
     foreach (var script in scripts)
     {
         server.Deploy.File(script, @"%temp%\ConDepPSScripts\" + Path.GetFileName(script));
     }
 }
        private void DeployPsCmdLet(IOfferRemoteOperations server)
        {
            //var condition = WebDeployExecuteCondition<ProvideForInfrastructure>.IsFailure(p => p.PowerShell("import-module ApplicationRequestRouting"));

            var dir = Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), "ArrLoadBalancer");
            server.Deploy.Directory(dir, @"%temp%\ApplicationRequestRouting");
        }
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            var result = Result.SuccessChanged();

            result.Data.HasPrivateKey            = false;
            result.Data.PrivateKeyPermissionsSet = false;

            var path = Path.GetFullPath(_path);
            var cert = string.IsNullOrWhiteSpace(_password) ? new X509Certificate2(path) : new X509Certificate2(path, _password);

            if (cert.HasPrivateKey)
            {
                result.Data.HasPrivateKey = true;

                string psUserArray = "@()";
                if (_certOptions != null && _certOptions.Values.PrivateKeyPermissions.Count > 0)
                {
                    var formattedUserArray = _certOptions.Values.PrivateKeyPermissions.Select(user => "'" + user + "'").ToList();
                    var users = string.Join(",", formattedUserArray);
                    psUserArray = $"@({users})";
                    result.Data.PrivateKeyPermissionsSet = true;
                }

                var destPath = $@"{"%windir%"}\temp\{Guid.NewGuid()}.pfx";
                remote.Deploy.File(path, destPath);
                remote.Execute.PowerShell("$path=\"" + destPath + "\"; $password='******'; $privateKeyUsers = " + psUserArray + "; [ConDep.Dsl.Remote.Helpers.CertificateInstaller]::InstallPfx($path, $password, $privateKeyUsers);", opt => opt.RequireRemoteLib());
            }
            else
            {
                var base64Cert = Convert.ToBase64String(cert.RawData);
                remote.Execute.PowerShell($"[ConDep.Dsl.Remote.Helpers.CertificateInstaller]::InstallCertFromBase64('{base64Cert}');", opt => opt.RequireRemoteLib());
            }
            return(result);
        }
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            var installParams = string.Format("/install /serviceName:\"{0}\" /displayName:\"{0}\" {1}", _serviceName, _profile);

            return(remote.Deploy.WindowsServiceWithInstaller(_serviceName, _serviceName, _sourcePath, _destPath, _serviceInstallerName,
                                                             installParams, _options).Result);
        }
 public void ConfigureRemoteScripts(IOfferRemoteOperations server, IEnumerable<string> scripts)
 {
     foreach (var script in scripts)
     {
         server.Deploy.File(script, @"%temp%\ConDepPSScripts\" + Path.GetFileName(script));
     }
 }
Example #9
0
        public static IOfferRemoteOperations StartConDepNode(this IOfferRemoteOperations remote)
        {
            var op = new StartConDepNodeOperation();

            Configure.Operation(remote, op);
            return(remote);
        }
Example #10
0
        public static IOfferRemoteOperations StartConDepNode(this IOfferRemoteOperations remote)
        {
            var op = new StartConDepNodeOperation();

            OperationExecutor.Execute((RemoteBuilder)remote, op);
            return(remote);
        }
Example #11
0
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            var bindings = _options.Values.HttpBindings.Select(httpBinding => $"@{{protocol='http';bindingInformation='{httpBinding.Ip}:{httpBinding.Port}:{httpBinding.HostName}'}}").ToList();

            foreach (var httpsBinding in _options.Values.HttpsBindings)
            {
                if (httpsBinding.FindType == X509FindType.FindByThumbprint)
                {
                    httpsBinding.FindName = httpsBinding.FindName.Replace(" ", "");
                }
                var type = httpsBinding.FindType.GetType();
                bindings.Add($"@{{protocol='https';bindingInformation='{httpsBinding.BindingOptions.Ip}:{httpsBinding.BindingOptions.Port}:{httpsBinding.BindingOptions.HostName}';findType=[{type.FullName}]::{httpsBinding.FindType};findValue='{httpsBinding.FindName}'}}");
            }

            remote.Execute.PowerShell($@"New-ConDepIisWebSite '{_webSiteName}' {_id} {"@(" + string.Join(",", bindings) + ")"} {
                    (string.IsNullOrWhiteSpace(_options.Values.PhysicalPath)
                        ? "$null"
                        : "'" + _options.Values.PhysicalPath + "'")} '{_options.Values.AppPool}' '{
                    _options.Values.LogDirectory}';");

            foreach (var webApp in _options.Values.WebApps)
            {
                remote.Configure.IISWebApp(webApp.Item1, _webSiteName, webApp.Item2);
            }
            return(Result.SuccessChanged());
        }
Example #12
0
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            var removeFeatures = _featuresToRemove.Count > 0 ? string.Join(",", _featuresToRemove) : "$null";
            var addFeatures    = string.Join(",", _featuresToAdd);

            return(remote.Execute.PowerShell(string.Format("Set-ConDepWindowsFeatures {0} {1}", addFeatures, removeFeatures)).Result);
        }
Example #13
0
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            _api = new Api(new ConDepNodeUrl(server), server.DeploymentUser.UserName, server.DeploymentUser.Password, server.Node.TimeoutInSeconds.Value * 1000);
            var result = _api.SyncDir(_srcDir, _dstDir);

            if (result == null)
            {
                return(Result.SuccessUnChanged());
            }

            if (result.Log.Count > 0)
            {
                foreach (var entry in result.Log)
                {
                    Logger.Info(entry);
                }
            }
            else
            {
                Logger.Info("Nothing to deploy. Everything is in sync.");
                return(Result.SuccessUnChanged());
            }

            return(Result.SuccessChanged());
        }
        /// <summary>
        /// Creates a directory, if it not already exists.
        /// </summary>
        /// <param name="remote"></param>
        /// <param name="path">Directory path</param>
        /// <returns></returns>
        public static IOfferRemoteOperations CreateDirectory(this IOfferRemoteOperations remote, string path)
        {
            var operation = new CreateDirectoryOperation(path);

            Configure.Operation(remote, operation);
            return(remote);
        }
        private void ConfigureCertInstall(IOfferRemoteOperations server, X509Certificate2 cert)
        {
            var certScript = string.Format("[byte[]]$byteArray = {0}; $myCert = new-object System.Security.Cryptography.X509Certificates.X509Certificate2(,$byteArray); ", string.Join(",", cert.GetRawCertData()));

            certScript += string.Format("$store = new-object System.Security.Cryptography.X509Certificates.X509Store('{0}', '{1}'); $store.open(“MaxAllowed”); $store.add($myCert); $store.close();", StoreName.My, StoreLocation.LocalMachine);
            server.Execute.PowerShell(certScript);
        }
        /// <summary>
        /// Adds user to group
        /// </summary>
        /// <param name="configuration"></param>
        /// <param name="userName">Username</param>
        /// <param name="groupName">Group name</param>
        /// <returns></returns>
        public static IOfferRemoteOperations AddUserToLocalGroup(this IOfferRemoteOperations configuration, string userName, string groupName)
        {
            var operation = new AddUserToLocalGroupOperation(userName, groupName);

            Configure.Operation(configuration, operation);
            return(configuration);
        }
        public static IOfferRemoteOperations Restart(this IOfferRemoteOperations remote, int delayInSeconds = 10)
        {
            var restartOperation = new RestartComputerOperation(delayInSeconds);

            Configure.Operation(remote, restartOperation);
            return(remote);
        }
Example #18
0
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            var dest = "$env:temp";

            if (_values != null && !string.IsNullOrWhiteSpace(_values.TargetDir))
            {
                dest = _values.TargetDir;
            }

            var uri      = new Uri(_url);
            var fileName = Path.GetFileName(uri.AbsolutePath);
            var destFile = Path.Combine(dest, fileName);

            string basicAuth = "";

            if (_values.BasicAuth != null)
            {
                basicAuth = string.Format(@"
    $client.Credentials = new-object system.net.networkcredential(""{0}"", ""{1}"")", _values.BasicAuth.Username, _values.BasicAuth.Password);
            }

            return(remote.Execute.PowerShell(string.Format(@"
$path = $ExecutionContext.InvokeCommand.ExpandString(""{1}"")

if((Test-Path $path)) {{
    write-host 'File allready exist. Skipping.'  
}}
else {{
    $client = new-object System.Net.WebClient
{2}
    $client.DownloadFile(""{0}"", $path )
}}", _url, destFile, basicAuth)).Result);
        }
Example #19
0
        protected void ExecuteRemoveService(IOfferRemoteOperations remote)
        {
            var remove = $"Remove-ConDepWinService '{_serviceName}' {_values.TimeOutInSeconds} {"$" + _values.IgnoreFailureOnServiceStartStop}";

            remote.Execute.PowerShell(remove,
                                      o =>
                                      o.ContinueOnError(_values.IgnoreFailureOnServiceStartStop));
        }
Example #20
0
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            var builder = new StringBuilder();

            CreateKeyCmd(builder, _root.ToString(), new WindowsRegistrySubKey(_key, _defaultValue, _values, _keys));

            return(remote.Execute.PowerShell(builder.ToString()).Result);
        }
        private void DeployPsCmdLet(IOfferRemoteOperations server)
        {
            //var condition = WebDeployExecuteCondition<ProvideForInfrastructure>.IsFailure(p => p.PowerShell("import-module ApplicationRequestRouting"));

            var dir = Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), "ArrLoadBalancer");

            server.Deploy.Directory(dir, @"%temp%\ApplicationRequestRouting");
        }
Example #22
0
 public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
 {
     return(remote.Execute.PowerShell(string.Format(@"New-ConDepWebApp '{0}' '{1}' {2} {3};"
                                                    , _webAppName
                                                    , _webSiteName
                                                    , (_options == null || string.IsNullOrWhiteSpace(_options.PhysicalPath)) ? "$null" : "'" + _options.PhysicalPath + "'"
                                                    , (_options == null || string.IsNullOrWhiteSpace(_options.AppPool)) ? "$null" : "'" + _options.AppPool + "'")).Result);
 }
Example #23
0
        protected void ExecuteServiceFailure(IOfferRemoteOperations remote)
        {
            var serviceFailureCommand = _values.GetServiceFailureCommand(_serviceName);

            if (!string.IsNullOrWhiteSpace(serviceFailureCommand))
            {
                remote.Execute.DosCommand(serviceFailureCommand);
            }
        }
Example #24
0
        protected void ExecuteUserRights(IOfferRemoteOperations remote)
        {
            if (string.IsNullOrWhiteSpace(_values.UserName))
            {
                return;
            }

            remote.Execute.PowerShell("$userName=\"" + _values.UserName + "\"; [ConDep.Dsl.Remote.Helpers.LsaWrapperCaller]::AddLogonAsAServiceRights($userName)", opt => opt.RequireRemoteLib());
        }
 private void Execute(LoadBalanceState state, IOfferRemoteOperations server, string serverNameToChangeStateOn)
 {
     server.ExecuteRemote.PowerShell(string.Format(@"import-module $env:temp\ApplicationRequestRouting; Set-WebFarmServerState -State {0} -Name {1} -UseDnsLookup;",
                      state.ToString(),
                      serverNameToChangeStateOn), o =>
                      {
                          o.WaitIntervalInSeconds(10);
                          o.RetryAttempts(20);
                      });
 }
 private void Execute(LoadBalanceState state, IOfferRemoteOperations server, string serverNameToChangeStateOn)
 {
     server.ExecuteRemote.PowerShell(string.Format(@"import-module $env:temp\ApplicationRequestRouting; Set-WebFarmServerState -State {0} -Name {1} -UseDnsLookup;",
                                                   state.ToString(),
                                                   serverNameToChangeStateOn), o =>
     {
         o.WaitIntervalInSeconds(10);
         o.RetryAttempts(20);
     });
 }
Example #27
0
 protected void ExecuteServiceStart(IOfferRemoteOperations remote)
 {
     if (!_values.DoNotStart)
     {
         var start = $"Start-ConDepWinService '{_serviceName}' {_values.TimeOutInSeconds} {"$" + _values.IgnoreFailureOnServiceStartStop}";
         remote.Execute.PowerShell(start,
                                   o => o.ContinueOnError(
                                       _values.IgnoreFailureOnServiceStartStop));
     }
 }
Example #28
0
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            _executor.Execute(server, "Start-ConDepNode", mod =>
            {
                mod.LoadConDepNodeModule = true;
                mod.LoadConDepModule     = false;
            }, logOutput: false);

            return(Result.SuccessChanged());
        }
        private Result InstallMsiFromUrl(IOfferRemoteOperations remote, ServerInfo serverInfo, Uri url)
        {
            var dstPath = $@"$env:temp\{Guid.NewGuid() + ".msi"}";

            if (InstallCondtion(serverInfo))
            {
                remote.Execute.PowerShell($"Install-ConDepMsiFromUri \"{url}\" \"{dstPath}\"", SetPowerShellOptions);
                return(Result.SuccessChanged());
            }
            return(Result.SuccessUnChanged());
        }
        private Result InstallMsiFromFile(IOfferRemoteOperations remote, ServerInfo serverInfo, string src)
        {
            var dstPath = Path.Combine(@"%temp%\", Path.GetFileName(src));

            if (InstallCondtion(serverInfo))
            {
                remote.Deploy.File(src, dstPath);
                remote.Execute.PowerShell($"Install-ConDepMsiFromFile \"{dstPath}\"", SetPowerShellOptions);
                return(Result.SuccessChanged());
            }
            return(Result.SuccessUnChanged());
        }
Example #31
0
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            ExecuteRemoveService(remote);
            ExecuteDeployment(remote);
            ExecuteInstallService(remote);
            ExecuteUserRights(remote);
            ExecuteServiceFailure(remote);
            ExecuteServiceConfig(remote);
            ExecuteServiceStart(remote);

            return(Result.SuccessChanged());
        }
Example #32
0
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            return(remote.Execute.PowerShell(string.Format(@"
$inherit = [system.security.accesscontrol.InheritanceFlags]""{0}""
$propagation = [system.security.accesscontrol.PropagationFlags]""{1}""

$directory = ""{2}""
$acl = Get-Acl $directory
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule(""{3}"", ""{4}"", $inherit, $propagation, ""{5}"")
$acl.AddAccessRule($accessRule)
Set-Acl -aclobject $acl $directory
", _options.Inheritance, _options.Propagation, _fileOrFolder, _user, _accessRights, _options.Type)).Result);
        }
Example #33
0
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            var result = Result.SuccessUnChanged();

            result.Data.CausedRestart = false;

            string uacEnabled = $@"
$regKey = Get-ItemProperty -Path hklm:software\microsoft\windows\currentversion\policies\system -Name ""EnableLUA""
return $regKey.EnableLUA -eq ${!_enabled}";

            const string restartNeeded = @"
$restartEnvVar = [Environment]::GetEnvironmentVariable(""CONDEP_RESTART_NEEDED"",""Machine"")
return $restartEnvVar -eq 'true'
";

            //Assume restart is not necessary.
            remote.Configure.EnvironmentVariable("CONDEP_RESTART_NEEDED", "false", EnvironmentVariableTarget.Machine);

            //Set uac if not set. Set env variable for restarting server necessary.
            var uacExecutionResult = ((Collection <PSObject>)remote.Execute.PowerShell(uacEnabled).Result.Data.PsResult).First().ToString().ToLowerInvariant();
            var uacResult          = Convert.ToBoolean(uacExecutionResult);

            if (uacResult == true)
            {
                result.Changed = true;
                remote.Configure
                .WindowsRegistry(reg =>
                                 reg.SetValue(
                                     WindowsRegistryRoot.HKEY_LOCAL_MACHINE,
                                     @"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System",
                                     "EnableLUA",
                                     _enabled ? "1" : "0",
                                     RegistryValueKind.DWord
                                     )
                                 )
                .EnvironmentVariable("CONDEP_RESTART_NEEDED", "true", EnvironmentVariableTarget.Machine);
            }

            //Restart server and set env variable for restart NOT necessary, since the machine rebooted.
            var restartExecutionResult = ((Collection <PSObject>)remote.Execute.PowerShell(restartNeeded).Result.Data.PsResult).First().ToString().ToLowerInvariant();
            var restartResult          = Convert.ToBoolean(restartExecutionResult);

            if (restartResult == true)
            {
                result.Data.CausedRestart = true;
                remote
                .Restart()
                .Configure.EnvironmentVariable("CONDEP_RESTART_NEEDED", "false", EnvironmentVariableTarget.Machine);
            }
            return(result);
        }
Example #34
0
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            token.ThrowIfCancellationRequested();

            Logger.WithLogSection(string.Format("Stopping ConDepNode on server {0}", server.Name), () =>
            {
                var executor = new PowerShellExecutor();
                executor.Execute(server, "Stop-ConDepNode", mod =>
                {
                    mod.LoadConDepModule = false;
                    mod.LoadConDepNodeModule = true;
                }, logOutput: false);
            });

            return Result.SuccessUnChanged();
        }
Example #35
0
 public static void Operation(IOfferRemoteOperations remote, IExecuteRemotely operation)
 {
     if (remote is RemoteOperationsBuilder)
     {
         var seqContainer = remote as RemoteOperationsBuilder;
         seqContainer.AddOperation(operation);
         return;
     }
     if (remote is RemoteCompositeBuilder)
     {
         var seqContainer = remote as RemoteCompositeBuilder;
         seqContainer.CompositeSequence.Add(operation);
         return;
     }
     throw new Exception(string.Format("Type {0} not currently supported.", remote.GetType().Name));
 }
Example #36
0
        public override Result Execute(IOfferRemoteOperations remote, ServerConfig server, ConDepSettings settings, CancellationToken token)
        {
            token.ThrowIfCancellationRequested();

            Logger.WithLogSection("Pre-Operations", () =>
            {
                server.GetServerInfo().TempFolderDos = string.Format(TMP_FOLDER, "%windir%");
                Logger.Info(string.Format("Dos temp folder is {0}", server.GetServerInfo().TempFolderDos));

                server.GetServerInfo().TempFolderPowerShell = string.Format(TMP_FOLDER, "$env:windir");
                Logger.Info(string.Format("PowerShell temp folder is {0}", server.GetServerInfo().TempFolderPowerShell));

                PublishConDepNode(server, settings);

                var scriptPublisher = new PowerShellScriptPublisher(settings, server);
                Logger.WithLogSection("Copying external scripts", () => scriptPublisher.PublishScripts());
                Logger.WithLogSection("Copying remote helper assembly", () => scriptPublisher.PublishRemoteHelperAssembly());

                InstallChocolatey(server, settings);
            });
            return Result.SuccessUnChanged();
        }
Example #37
0
 public abstract void Configure(IOfferRemoteOperations server, ConDepSettings settings);
 private void ConfigureCertInstall(IOfferRemoteOperations server, X509Certificate2 cert)
 {
     var certScript = string.Format("[byte[]]$byteArray = {0}; $myCert = new-object System.Security.Cryptography.X509Certificates.X509Certificate2(,$byteArray); ", string.Join(",", cert.GetRawCertData()));
     certScript += string.Format("$store = new-object System.Security.Cryptography.X509Certificates.X509Store('{0}', '{1}'); $store.open(“MaxAllowed”); $store.add($myCert); $store.close();", StoreName.My, StoreLocation.LocalMachine);
     server.ExecuteRemote.PowerShell(certScript, o => o.WaitIntervalInSeconds(15).RetryAttempts(3));
 }
Example #39
0
 public static void Operation(IOfferRemoteOperations remote, RemoteCompositeOperation operation)
 {
     var seqContainer = remote as RemoteCompositeBuilder;
     seqContainer.CompositeSequence.NewCompositeSequence(operation);
 }