예제 #1
0
        public DtoDownloadConnectionResult CreateDownloadConnection(DtoDownloadConRequest conRequest)
        {
            var result = new DtoDownloadConnectionResult();

            var guid          = ConfigurationManager.AppSettings["ComServerUniqueId"];
            var thisComServer = new ServiceClientComServer().GetServerByGuid(guid);

            if (thisComServer == null)
            {
                Logger.Error($"Com Server With Guid {guid} Not Found");
                result.ErrorMessage = $"Com Server With Guid {guid} Not Found";
                return(result);
            }


            if (!int.TryParse(thisComServer.EmMaxClients.ToString(), out var maxClientConnections))
            {
                result.ErrorMessage = "Could Not Determine The MaxClientConnections For The Com Server: " +
                                      conRequest.ComServer;
                return(result);
            }

            if (maxClientConnections == 0) // zero is unlimited
            {
                result.Success     = true;
                result.QueueIsFull = false;
                return(result);
            }

            var client = new ServiceComputer().GetByGuid(conRequest.ComputerGuid);

            if (client == null)
            {
                result.ErrorMessage = "Could Not Find Computer With Guid: " + RequestContext.Principal.Identity.Name;
                return(result);
            }



            var serviceCurrentDownloads = new ServiceCurrentDownload();
            var currentConnections      = serviceCurrentDownloads.TotalCount(conRequest.ComServer);
            var activeClient            = serviceCurrentDownloads.GetByClientId(client.Id, conRequest.ComServer);

            if (activeClient == null && (currentConnections >= maxClientConnections))
            {
                var activeCountAfterExpire = serviceCurrentDownloads.ExpireOldConnections();
                if (activeCountAfterExpire >= maxClientConnections)
                {
                    result.Success     = true;
                    result.QueueIsFull = true;
                    return(result);
                }
            }

            //add new download connection for this client
            if (activeClient == null)
            {
                var currentDownload = new EntityCurrentDownload();
                currentDownload.ComputerId = client.Id;
                currentDownload.ComServer  = conRequest.ComServer;
                serviceCurrentDownloads.Add(currentDownload);
                result.Success     = true;
                result.QueueIsFull = false;
            }
            //update time for existing download connection
            else
            {
                activeClient.LastRequestTimeLocal = DateTime.Now;
                serviceCurrentDownloads.Update(activeClient);
                result.Success     = true;
                result.QueueIsFull = false;
            }

            return(result);
        }
예제 #2
0
        public bool Run(DtoClientPolicy singleModulePolicy = null)
        {
            if (singleModulePolicy == null)
            {
                _policiesToRun = _trigger == EnumPolicy.Trigger.Login
                    ? new APICall().LocalApi.GetLoginPolicies(Environment.UserDomainName + "\\" + Environment.UserName)
                    : new PolicySelector(_trigger, Environment.UserDomainName + "\\" + Environment.UserName).GetPoliciesToExecute();
            }
            else
            {
                _policiesToRun = new DtoTriggerResponse();
                _policiesToRun.Policies.Add(singleModulePolicy);
            }

            if (_policiesToRun == null)
            {
                Logger.Error("Error Trying To Parse Policies. Aborting Trigger: " + _trigger);
                return(false);
            }

            if (_policiesToRun.Policies.Count == 0)
            {
                Logger.Info(string.Format("No Policies For Trigger {0} Were Found For This Computer", _trigger));
                return(true);
            }

            DtoGobalSettings.PolicyIsRunning = true;
            bool cacheFailedWithTriggerStop = false;

            //Check for any conditions that will need cached
            var conditionNeedsCached = false;

            if (_policiesToRun.Policies.Any(x => x.MessageModules.Any()))
            {
                foreach (var messageModule in _policiesToRun.Policies.Select(x => x.MessageModules))
                {
                    if (messageModule.Any(x => x.Condition.Guid != null))
                    {
                        conditionNeedsCached = true;
                        break;
                    }
                }
            }
            if (_policiesToRun.Policies.Any(x => x.PrinterModules.Any()) && !conditionNeedsCached)
            {
                foreach (var printerModule in _policiesToRun.Policies.Select(x => x.PrinterModules))
                {
                    if (printerModule.Any(x => x.Condition.Guid != null))
                    {
                        conditionNeedsCached = true;
                        break;
                    }
                }
            }

            //Check if install of remote access needs cached
            var remotelyNeedsCached = false;

            if (_policiesToRun.Policies.Any(x => x.RemoteAccess == EnumPolicy.RemoteAccess.ForceReinstall))
            {
                remotelyNeedsCached = true;
            }
            else if (new ServiceSystemService().IsRemotelyInstalled())
            {
                remotelyNeedsCached = false;
            }
            else if (_policiesToRun.Policies.Any(x => x.RemoteAccess == EnumPolicy.RemoteAccess.Enabled))
            {
                remotelyNeedsCached = true;
            }

            //cache all policies first if any need cached
            if (_policiesToRun.Policies.Any(x =>
                                            x.SoftwareModules.Any() || x.FileCopyModules.Any() || x.WuModules.Any() || x.ScriptModules.Any() || x.CommandModules.Any()) || conditionNeedsCached || _policiesToRun.Policies.Any(x => x.Condition.Guid != null) || remotelyNeedsCached)
            {
                //grab a download slot
                Logger.Debug("Obtaining A Download Connection.");
                var downloadConRequest = new DtoDownloadConRequest();
                downloadConRequest.ComputerGuid = DtoGobalSettings.ClientIdentity.Guid;
                downloadConRequest.ComputerName = DtoGobalSettings.ClientIdentity.Name;
                downloadConRequest.ComServer    = DtoGobalSettings.ComServer;

                var downloadConnection = new DtoDownloadConnectionResult();
                if (_trigger == EnumPolicy.Trigger.Login)
                {
                    downloadConnection = new APICall().LocalApi.CreateDownloadConnection(downloadConRequest);
                }
                else
                {
                    downloadConnection = new APICall().PolicyApi.CreateDownloadConnection(downloadConRequest);
                }
                var conAttempCounter = 0;
                while (downloadConnection.QueueIsFull || !downloadConnection.Success)
                {
                    if (!downloadConnection.Success)
                    {
                        Logger.Error("Could Not Obtain Download Connection. " + downloadConnection.ErrorMessage);
                        DtoGobalSettings.PolicyIsRunning = false;
                        return(true);
                    }
                    if (downloadConnection.QueueIsFull && conAttempCounter == 0)
                    {
                        Logger.Debug("Download Connections Are Full.  Will Retry Continuously Every 1 Minute For The Next 10 Minutes.");
                    }

                    Task.Delay(60 * 1000).Wait();
                    conAttempCounter++;
                    if (conAttempCounter == 10)
                    {
                        Logger.Debug("Download Connections Remain Filled.  Giving Up.  Will Retry At Next Checkin.");
                        return(true);
                    }
                    if (_trigger == EnumPolicy.Trigger.Login)
                    {
                        downloadConnection = new APICall().LocalApi.CreateDownloadConnection(downloadConRequest);
                    }
                    else
                    {
                        downloadConnection = new APICall().PolicyApi.CreateDownloadConnection(downloadConRequest);
                    }
                }

                foreach (var policy in _policiesToRun.Policies)
                {
                    SetPolicyLogLevel(policy);

                    var cacheResult = new PolicyCacher(policy).Cache();
                    if (policy.SkipServerResult)
                    {
                        cacheResult.SkipServerResult = true;
                    }

                    if (policy.ExecutionType == EnumPolicy.ExecutionType.Cache)
                    {
                        _policyResults.Add(cacheResult);
                    }
                    if (cacheResult.PolicyResult != EnumPolicy.Result.Success)
                    {
                        if (IsTriggerStopError(policy))
                        {
                            cacheFailedWithTriggerStop = true;
                            break;
                        }
                    }
                }
                //release the download slot
                Logger.Debug("Releasing The Download Connection.");
                if (_trigger == EnumPolicy.Trigger.Login)
                {
                    new APICall().LocalApi.RemoveDownloadConnection(downloadConRequest);
                }
                else
                {
                    new APICall().PolicyApi.RemoveDownloadConnection(downloadConRequest);
                }
            }

            if (!cacheFailedWithTriggerStop)
            {
                foreach (var policy in _policiesToRun.Policies)
                {
                    SetPolicyLogLevel(policy);

                    if (policy.ExecutionType == EnumPolicy.ExecutionType.Cache)
                    {
                        Logger.Debug("Policy's Execution Type Is Cache Only And Will Not Install");
                        continue;
                    }

                    var policyResult = new PolicyExecutor(policy).Execute();
                    if (policy.SkipServerResult)
                    {
                        policyResult.SkipServerResult = true;
                    }
                    _policyResults.Add(policyResult);

                    if (policyResult.PolicyResult == EnumPolicy.Result.Failed)
                    {
                        if (IsTriggerStopError(policy))
                        {
                            break;
                        }
                    }

                    else if (policyResult.PolicyResult == EnumPolicy.Result.Success &&
                             policy.CompletedAction == EnumPolicy.CompletedAction.Reboot)
                    {
                        _reboot = true;
                        break;
                    }
                    else if (policyResult.PolicyResult == EnumPolicy.Result.Success &&
                             policy.CompletedAction == EnumPolicy.CompletedAction.RebootIfNoLogins)
                    {
                        _rebootNoLogins = true;
                        break;
                    }
                }
            }

            Logger.Info("Policies Complete.  Starting Policy Cleanup.");
            DtoGobalSettings.PolicyIsRunning = false;
            RecordResults();

            CleanupCache();

            //restore global log level
            ((Hierarchy)LogManager.GetRepository()).Root.Level = DtoGobalSettings.LogLevel;
            ((Hierarchy)LogManager.GetRepository()).RaiseConfigurationChanged(
                EventArgs.Empty);

            if (_reboot)
            {
                Logger.Info("Policy Initiated Reboot.  Rebooting Now.");
                if (_trigger == EnumPolicy.Trigger.Login)
                {
                    new APICall().LocalApi.LogoutAllUsers();
                }
                else
                {
                    new ServiceUserTracker().LogoutAllUsers();
                }
                Process.Start("shutdown.exe", "/r /t " + DtoGobalSettings.ShutdownDelay);
            }

            if (_rebootNoLogins)
            {
                Logger.Info("Policy Initiated Reboot If No Users Are Logged In.");
                Logger.Info("Checking For Any Logged In Users.");
                if (_trigger != EnumPolicy.Trigger.Login)
                {
                    var users = new ServiceUserLogins().GetUsersLoggedIn();
                    if (users.Count > 0)
                    {
                        Logger.Info("User Found, Reboot Skipped.");
                    }
                    else
                    {
                        Logger.Info("No Users Found, Issuing Reboot Command.");
                        Process.Start("shutdown.exe", "/r /t " + DtoGobalSettings.ShutdownDelay);
                    }
                }
                else
                {
                    Logger.Info("User Found, Policy Is A Login Policy, Reboot Skipped.");
                }
            }
            return(true);
        }