Exemplo n.º 1
0
        public async Task <PalaceServer.Models.AvailablePackage> GetAvailablePackage(Models.MicroServiceSettings microServiceSettings)
        {
            var httpClient = HttpClientFactory.CreateClient("PalaceServer");

            var url = $"{PalaceSettings.UpdateServerUrl}/api/microservices/info/{microServiceSettings.PackageFileName}";
            HttpResponseMessage response = null;

            try
            {
                response = await httpClient.GetAsync(url);
            }
            catch (Exception ex)
            {
                ex.Data.Add("url", url);
                Logger.LogError(ex, ex.Message);
            }

            if (response == null ||
                response.StatusCode != System.Net.HttpStatusCode.OK)
            {
                return(null);
            }

            var remoteServiceInfo = await response.Content.ReadFromJsonAsync <PalaceServer.Models.AvailablePackage>();

            return(remoteServiceInfo);
        }
Exemplo n.º 2
0
        public async Task <PalaceServer.Models.NextActionResult> GetNextAction(Models.MicroServiceSettings microServiceSettings)
        {
            var httpClient = HttpClientFactory.CreateClient("PalaceServer");

            httpClient.BaseAddress = new Uri(PalaceSettings.UpdateServerUrl);
            HttpResponseMessage response = null;

            try
            {
                var url = $"/api/microservices/getnextaction/{microServiceSettings.ServiceName}";
                response = await httpClient.GetAsync(url);
            }
            catch (Exception ex)
            {
                Logger.LogError(ex, ex.Message);
                return(null);
            }

            if (response.StatusCode != System.Net.HttpStatusCode.OK)
            {
                Logger.LogWarning($"get nextaction for {microServiceSettings.ServiceName} return bad status code {response.StatusCode}");
                return(null);
            }

            var result = await response.Content.ReadFromJsonAsync <PalaceServer.Models.NextActionResult>();

            Logger.LogDebug($"Next action for {microServiceSettings.ServiceName} : {result.Action}");
            return(result);
        }
        public async Task <PalaceClient.StopResult> StopRunningMicroService(Models.MicroServiceSettings microServiceSettings)
        {
            HttpResponseMessage response = null;

            try
            {
                Logger.LogInformation("Try to stop service {0}", microServiceSettings.ServiceName);
                var httpClient = CreateHttpClient(microServiceSettings);
                var url        = $"{microServiceSettings.AdminServiceUrl}/api/palace/stop";
                response = await httpClient.GetAsync(url);
            }
            catch (Exception ex)
            {
                ex.Data.Add("url", microServiceSettings.AdminServiceUrl);
                ex.Data.Add("certificate", microServiceSettings.SSLCertificate);
                Logger.LogError(ex, ex.Message);
                return(null);
            }

            if (response.StatusCode != System.Net.HttpStatusCode.OK)
            {
                Logger.LogWarning("Stop service {0} failed", microServiceSettings.ServiceName);
                return(null);
            }

            var result = await response.Content.ReadFromJsonAsync <PalaceClient.StopResult>();

            return(result);
        }
Exemplo n.º 4
0
        public Models.MicroServiceInfo GetLocallyInstalledMicroServiceInfo(Models.MicroServiceSettings microServiceSettings)
        {
            Models.MicroServiceInfo result = null;
            var directoryName        = System.IO.Path.Combine(PalaceSettings.InstallationDirectory, microServiceSettings.ServiceName);
            var mainAssemblyFileName = System.IO.Path.Combine(directoryName, microServiceSettings.MainAssembly.Replace(@".\", ""));

            var fileInfo = new System.IO.FileInfo(mainAssemblyFileName);

            if (!fileInfo.Exists)
            {
                return(null);
            }

            result = new Models.MicroServiceInfo
            {
                InstallationFolder = directoryName,
                MainFileName       = microServiceSettings.MainAssembly,
                Arguments          = microServiceSettings.Arguments,
                Name = microServiceSettings.ServiceName,
                LocalInstallationExists = true,
                LastWriteTime           = fileInfo.LastWriteTime
            };

            return(result);
        }
        public async Task AddOrUpdateService(Models.MicroServiceSettings serviceSettings)
        {
            var httpClient = HttpClientFactory.CreateClient("PalaceServer");

            var response = await httpClient.PostAsJsonAsync("/api/microservices/addorupdateservicesettings", serviceSettings);

            response.EnsureSuccessStatusCode();
        }
Exemplo n.º 6
0
        public Task <bool> UninstallMicroService(Models.MicroServiceSettings microServiceSettings)
        {
            bool uninstallSuccess = true;
            var  directory        = System.IO.Path.Combine(PalaceSettings.InstallationDirectory, microServiceSettings.ServiceName);
            var  fileList         = System.IO.Directory.GetFiles(directory, "*.*", System.IO.SearchOption.AllDirectories);
            var  directoryList    = System.IO.Directory.GetDirectories(directory, "*.*", SearchOption.AllDirectories);

            Logger.LogInformation($"try to remove {fileList.Count()} files from {microServiceSettings.InstallationFolder}");

            foreach (var removeFile in fileList)
            {
                try
                {
                    System.IO.File.Delete(removeFile);
                }
                catch (Exception ex)
                {
                    Logger.LogError(ex, ex.Message);
                    uninstallSuccess = false;
                }
            }
            foreach (var removeDirectory in directoryList)
            {
                try
                {
                    System.IO.Directory.Delete(removeDirectory);
                }
                catch (Exception ex)
                {
                    Logger.LogError(ex, ex.Message);
                    uninstallSuccess = false;
                }
            }

            try
            {
                System.IO.Directory.Delete(directory, true);
            }
            catch (Exception ex)
            {
                ex.Data.Add("Directory", directory);
                Logger.LogError(ex, ex.Message);
                uninstallSuccess = false;
            }

            return(Task.FromResult(uninstallSuccess));
        }
Exemplo n.º 7
0
    public IActionResult AddService([FromHeader] string authorization, Models.MicroServiceSettings serviceSettings)
    {
        EnsureGoodAuthorization(authorization);

        var palaceInfo = PalaceInfoManager.GetOrCreatePalaceInfo(HttpContext.GetUserAgent(), HttpContext.GetUserHostAddress());

        if (palaceInfo == null)
        {
            return(NoContent());
        }

        var result = PalaceInfoManager.SaveMicroServiceSettings(palaceInfo, serviceSettings);

        if (result.Count > 0)
        {
            BadRequest(result);
        }
        return(Ok());
    }
Exemplo n.º 8
0
        public bool KillProcess(Models.MicroServiceSettings settings)
        {
            return(true);

            var processList = Process.GetProcesses();

            if (!processList.Any())
            {
                Logger.LogWarning("Could not find any dotnet.exe process in this machine");
                return(false);
            }
            try
            {
                foreach (var p in processList)
                {
                    if (p.ProcessName.IndexOf("dotnet") != -1)
                    {
                        string arguments = null;
                        try
                        {
                            arguments = p.StartInfo.Arguments;
                        }
                        catch
                        {
                        }
                        Logger.LogWarning("Try to kill process {0}", p.Id);
                    }
                    Logger.LogDebug(p.ProcessName);
                }
                var process = processList.FirstOrDefault(p => p.StartInfo.Arguments.Contains(settings.MainAssembly));
                process.Kill(true);
                Logger.LogWarning("Try to kill service {0} on processId {1}", settings.ServiceName, process.Id);
                process.Kill(true);
                return(true);
            }
            catch (Exception ex)
            {
                Logger.LogError(ex, ex.Message);
            }
            return(false);
        }
        public HttpClient CreateHttpClient(Models.MicroServiceSettings microServiceSettings)
        {
            var     handler     = new HttpClientHandler();
            Version httpVersion = null;

            if (microServiceSettings.AdminServiceUrl.StartsWith("https") &&
                !string.IsNullOrWhiteSpace(microServiceSettings.SSLCertificate))
            {
                if (System.IO.File.Exists(microServiceSettings.SSLCertificate))
                {
                    var certificate = new X509Certificate2(microServiceSettings.SSLCertificate);
                    handler.ClientCertificates.Add(certificate);
                    handler.ServerCertificateCustomValidationCallback = (sender, certificate, chain, errors) =>
                    {
                        if (errors == System.Net.Security.SslPolicyErrors.RemoteCertificateNotAvailable)
                        {
                            return(false);
                        }
                        return(true);
                    };
                }
                else
                {
                    Logger.LogWarning("SSLCertifiate filename does not exists {0}", microServiceSettings.SSLCertificate);
                }
                httpVersion = new Version(2, 0);
            }
            var httpClient = new HttpClient(handler);

            if (httpVersion != null)
            {
                httpClient.DefaultRequestVersion = httpVersion;
            }
            httpClient.DefaultRequestHeaders.Add("Authorization", $"Basic {microServiceSettings.PalaceApiKey}");
            return(httpClient);
        }
Exemplo n.º 10
0
    private Dictionary <string, List <string> > UpdateMicroServiceSettings(Models.PalaceInfo palaceInfo, Models.MicroServiceSettings settings)
    {
        var existing = palaceInfo.MicroServiceSettingsList.FirstOrDefault(i => i.ServiceName == settings.ServiceName);

        bool isDirty = false;

        if (existing.AdminServiceUrl != settings.AdminServiceUrl)
        {
            isDirty = true;
        }
        existing.AdminServiceUrl = settings.AdminServiceUrl;
        if (existing.AlwaysStarted != settings.AlwaysStarted)
        {
            isDirty = true;
        }
        existing.AlwaysStarted = settings.AlwaysStarted;
        if (existing.Arguments != settings.Arguments)
        {
            isDirty = true;
        }
        existing.Arguments = settings.Arguments;
        if (existing.InstallationFolder != settings.InstallationFolder)
        {
            isDirty = true;
        }
        existing.InstallationFolder = settings.InstallationFolder;
        if (existing.MainAssembly != settings.MainAssembly)
        {
            isDirty = true;
        }
        existing.MainAssembly = settings.MainAssembly;
        if (existing.PackageFileName != settings.PackageFileName)
        {
            isDirty = true;
        }
        existing.PackageFileName = settings.PackageFileName;
        if (existing.PalaceApiKey != settings.PalaceApiKey)
        {
            isDirty = true;
        }
        existing.PalaceApiKey = settings.PalaceApiKey;
        if (existing.ServiceName != settings.ServiceName)
        {
            isDirty = true;
        }
        existing.ServiceName = settings.ServiceName;

        if (existing.SSLCertificate != settings.SSLCertificate)
        {
            isDirty = true;
        }
        existing.SSLCertificate = settings.SSLCertificate;

        if (existing.InstanceCount != settings.InstanceCount)
        {
            isDirty = true;
        }
        existing.InstanceCount = settings.InstanceCount;

        if (existing.MaxWorkingSetLimitBeforeAlert != settings.MaxWorkingSetLimitBeforeAlert)
        {
            isDirty = true;
        }
        existing.MaxWorkingSetLimitBeforeAlert = settings.MaxWorkingSetLimitBeforeAlert;

        if (existing.MaxWorkingSetLimitBeforeRestart != settings.MaxWorkingSetLimitBeforeRestart)
        {
            isDirty = true;
        }
        existing.MaxWorkingSetLimitBeforeRestart = settings.MaxWorkingSetLimitBeforeRestart;

        if (existing.ThreadLimitBeforeAlert != settings.ThreadLimitBeforeAlert)
        {
            isDirty = true;
        }
        existing.ThreadLimitBeforeAlert = settings.ThreadLimitBeforeAlert;

        if (existing.ThreadLimitBeforeRestart != settings.ThreadLimitBeforeRestart)
        {
            isDirty = true;
        }
        existing.ThreadLimitBeforeRestart = settings.ThreadLimitBeforeRestart;

        if (existing.NotRespondingCountBeforeAlert != settings.NotRespondingCountBeforeAlert)
        {
            isDirty = true;
        }
        existing.NotRespondingCountBeforeAlert = settings.NotRespondingCountBeforeAlert;

        if (existing.NotRespondingCountBeforeRestart != settings.NotRespondingCountBeforeRestart)
        {
            isDirty = true;
        }
        existing.NotRespondingCountBeforeRestart = settings.NotRespondingCountBeforeRestart;

        if (isDirty)
        {
            palaceInfo.LastConfigurationUpdate = DateTime.Now;
            SaveConfiguration(palaceInfo);
        }
        return(new Dictionary <string, List <string> >());
    }
Exemplo n.º 11
0
 private Dictionary <string, List <string> > AddMicroServiceSettings(Models.PalaceInfo palaceInfo, Models.MicroServiceSettings settings)
 {
     ((List <Models.MicroServiceSettings>)palaceInfo.MicroServiceSettingsList).Add(settings);
     palaceInfo.LastConfigurationUpdate = DateTime.Now;
     SaveConfiguration(palaceInfo);
     return(new Dictionary <string, List <string> >());
 }
Exemplo n.º 12
0
    internal Dictionary <string, List <string> > SaveMicroServiceSettings(Models.PalaceInfo palaceInfo, Models.MicroServiceSettings settings)
    {
        var validation = Validate(settings);

        if (!validation.IsValid)
        {
            return(validation.BrokenRules);
        }

        Dictionary <string, List <string> > result = null;
        var existing = palaceInfo.MicroServiceSettingsList.FirstOrDefault(i => i.ServiceName == settings.ServiceName);

        if (existing == null)
        {
            result = AddMicroServiceSettings(palaceInfo, settings);
        }
        else
        {
            result = UpdateMicroServiceSettings(palaceInfo, settings);
        }
        return(result);
    }
Exemplo n.º 13
0
    internal (bool IsValid, Dictionary <string, List <string> > BrokenRules) Validate(Models.MicroServiceSettings mss)
    {
        var result      = true;
        var brokenRules = new Dictionary <string, List <string> >();

        if (string.IsNullOrWhiteSpace(mss.ServiceName))
        {
            brokenRules.Add("ServiceName", new List <string>
            {
                { "Service name is null or empty" }
            });
            result = false;
        }

        if (string.IsNullOrWhiteSpace(mss.MainAssembly))
        {
            brokenRules.Add(nameof(mss.MainAssembly), new List <string>
            {
                { "MainAssembly is null or empty" }
            });
            result = false;
        }
        if (string.IsNullOrWhiteSpace(mss.PackageFileName))
        {
            brokenRules.Add(nameof(mss.PackageFileName), new List <string>
            {
                { "PackageFileName is null or empty" }
            });
            result = false;
        }
        else if (!mss.PackageFileName.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
        {
            brokenRules.Add(nameof(mss.PackageFileName), new List <string>
            {
                { "PackageFileName is not zip file" }
            });
            result = false;
        }
        if (string.IsNullOrWhiteSpace(mss.AdminServiceUrl))
        {
            brokenRules.Add(nameof(mss.AdminServiceUrl), new List <string>
            {
                { "AdminServiceUrl is null or empty" }
            });
            result = false;
        }
        else
        {
            try
            {
                new Uri(mss.AdminServiceUrl);
            }
            catch
            {
                brokenRules.Add(nameof(mss.AdminServiceUrl), new List <string>
                {
                    { "AdminServiceUrl is not valid uri" }
                });
                result = false;
            }
        }


        return(result, brokenRules);
    }
 public void Remove(Models.MicroServiceSettings item)
 {
     _list.TryRemove(item.ServiceName, out var removed);
 }
Exemplo n.º 15
0
        public async Task <bool> InstallMicroService(Models.MicroServiceInfo microServiceInfo, Models.MicroServiceSettings serviceSettings)
        {
            microServiceInfo.InstallationFolder = System.IO.Path.Combine(PalaceSettings.InstallationDirectory, serviceSettings.ServiceName);
            microServiceInfo.MainFileName       = serviceSettings.MainAssembly;
            microServiceInfo.Arguments          = serviceSettings.Arguments;

            Logger.LogInformation("Try to install MicroService{0} in {1}", microServiceInfo.MainFileName, microServiceInfo.InstallationFolder);
            // On recupere le zip sur le serveur
            var zipFileInfo = await DownloadPackage(serviceSettings.PackageFileName);

            if (zipFileInfo == null)
            {
                Logger.LogWarning("Download zipfile for service {0} failed", microServiceInfo.Name);
                return(false);
            }

            var    version          = 1;
            string extractDirectory = null;

            while (true)
            {
                // Dezip dans son répertoire avec la bonne version
                extractDirectory = System.IO.Path.Combine(PalaceSettings.DownloadDirectory, microServiceInfo.Name, $"v{version}");
                if (Directory.Exists(extractDirectory))
                {
                    version++;
                    continue;
                }
                break;
            }
            Logger.LogWarning("Extact zipfile {0} for service {1} in directory {2}", zipFileInfo.ZipFileName, microServiceInfo.Name, extractDirectory);
            if (!System.IO.Directory.Exists(extractDirectory))
            {
                System.IO.Directory.CreateDirectory(extractDirectory);
            }
            System.IO.Compression.ZipFile.ExtractToDirectory(zipFileInfo.ZipFileName, extractDirectory, true);

            // Deploy dans son repertoire d'installation
            var deploySuccess = await DeployMicroService(microServiceInfo, extractDirectory);

            return(deploySuccess);
        }