public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            var configFile = Path.Combine(fileSystem.ElasticsearchHome, "config", "elasticsearch.yml");
            var lines      = File.ReadAllLines(configFile).ToList();
            var saveFile   = false;

            // set up for Watcher HipChat action
            if (!lines.Any(line => line.Contains("file1")))
            {
                lines.AddRange(new[]
                {
                    string.Empty,
                    "xpack:",
                    "  security:",
                    "    authc:",
                    "      realms:",
                    $"        {SecurityRealms.FileRealm}:",
                    "          type: file",
                    "          order: 0",
                    $"        {SecurityRealms.PkiRealm}:",
                    "          type: pki",
                    "          order: 1",
                    string.Empty
                });
                saveFile = true;
            }

            if (saveFile)
            {
                File.WriteAllLines(configFile, lines);
            }
        }
Beispiel #2
0
 public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
 {
     if (!Directory.Exists(fileSystem.RoamingFolder))
     {
         Directory.CreateDirectory(fileSystem.RoamingFolder);
     }
 }
Beispiel #3
0
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            var to = Path.Combine(config.FileSystem.RoamingFolder, "server_metrics.tar.gz");

            if (!File.Exists(to))
            {
                var from = "https://download.elasticsearch.org/demos/machine_learning/gettingstarted/server_metrics.tar.gz";
                Console.WriteLine($"Download machine learning sample data from: {from}");
                this.DownloadFile(from, to);
                Console.WriteLine($"Downloaded machine learning sample data to: {to}");
            }

            var directoryTarget = Path.Combine(config.FileSystem.RoamingFolder, "server_metrics");

            if (Directory.Exists(directoryTarget))
            {
                return;
            }

            Directory.CreateDirectory(directoryTarget);
            Console.WriteLine($"Unzipping machine learning sample data: {to} ...");
            using (var inStream = File.OpenRead(to))
                using (var gzipStream = new GZipInputStream(inStream))
                    using (var tarArchive = TarArchive.CreateInputTarArchive(gzipStream))
                    {
                        tarArchive.ExtractContents(directoryTarget);
                        tarArchive.Close();
                    }
        }
        private string DownloadSnapshotIfNeeded(NodeFileSystem fileSystem, ElasticsearchPluginConfiguration plugin, ElasticsearchVersion v)
        {
            var downloadLocation = Path.Combine(fileSystem.RoamingFolder, plugin.SnapshotZip(v));

            this.DownloadPluginSnapshot(downloadLocation, plugin, v);
            //transform downloadLocation to file uri and use that to install from
            return(new Uri(downloadLocation).AbsoluteUri);
        }
        private static bool AlreadyInstalled(ElasticsearchPlugin plugin, NodeFileSystem fileSystem)
        {
            var folder       = plugin.Moniker;
            var pluginFolder = Path.Combine(fileSystem.ElasticsearchHome, "plugins", folder);

            // assume plugin already installed
            return(Directory.Exists(pluginFolder));
        }
Beispiel #6
0
        private string UseHttpPluginLocation(NodeFileSystem fileSystem, ElasticsearchPluginConfiguration plugin, ElasticsearchVersion v)
        {
            var downloadLocation = Path.Combine(fileSystem.RoamingFolder, $"{plugin.Moniker}-{v}.zip");

            this.DownloadPluginSnapshot(downloadLocation, plugin, v);
            //transform downloadLocation to file uri and use that to install from
            return(new Uri(downloadLocation).AbsoluteUri);
        }
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            var javaHome = Environment.GetEnvironmentVariable("JAVA_HOME");

            if (string.IsNullOrWhiteSpace(javaHome))
            {
                throw new Exception("The elasticsearch bat files are resillient to JAVA_HOME not being set, however the shield tooling is not");
            }
        }
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            var v = config.ElasticsearchVersion;

            if (Directory.Exists(fileSystem.ElasticsearchHome))
            {
                return;
            }
            Console.WriteLine($"Unzipping elasticsearch: {v} ...");
            ZipFile.ExtractToDirectory(fileSystem.DownloadZipLocation, fileSystem.RoamingFolder);
        }
Beispiel #9
0
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
#if DOTNETCORE
            var javaHome = Environment.GetEnvironmentVariable("JAVA_HOME");
#else
            var javaHome = Environment.GetEnvironmentVariable("JAVA_HOME", EnvironmentVariableTarget.Machine)
                           ?? Environment.GetEnvironmentVariable("JAVA_HOME", EnvironmentVariableTarget.User);
#endif
            if (string.IsNullOrWhiteSpace(javaHome))
            {
                throw new Exception("The elasticsearch bat files are resillient to JAVA_HOME not being set, however the shield tooling is not");
            }
        }
Beispiel #10
0
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            var v      = config.ElasticsearchVersion;
            var folder = v.Major >= 5 ? "x-pack" : "shield";
            var plugin = v.Major >= 5 ? "users" : "esusers";

            var pluginBat = Path.Combine(fileSystem.ElasticsearchHome, "bin", folder, plugin) + ".bat";

            foreach (var cred in ShieldInformation.AllUsers)
            {
                this.ExecuteBinary(pluginBat, $"adding user {cred.Username}", $"useradd {cred.Username} -p {cred.Password} -r {cred.Role}");
            }
        }
Beispiel #11
0
        private void AddClientCertificateUser(NodeFileSystem fileSystem, ElasticsearchVersion version)
        {
            var file = Path.Combine(fileSystem.ConfigPath, "x-pack", "role_mapping") + ".yml";
            var name = fileSystem.ClientCertificateName;

            if (!File.Exists(file) || !File.ReadAllLines(file).Any(f => f.Contains(name)))
            {
                File.WriteAllLines(file, new []
                {
                    "admin:",
                    $"    - \"{name}\""
                });
            }
        }
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            var analysisPath = fileSystem.AnalysisFolder;

            if (!Directory.Exists(analysisPath))
            {
                Directory.CreateDirectory(analysisPath);
            }
            SetupHunspellFiles(fileSystem.ConfigPath);
            SetupIcuFiles(fileSystem.ConfigPath);
            SetupCompoundTokenFilterFopFile(analysisPath);
            SetupCustomStemming(analysisPath);
            SetupStopwordsFile(analysisPath);
        }
Beispiel #13
0
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            var v    = config.ElasticsearchVersion;
            var from = v.ElasticsearchDownloadUrl;
            var to   = fileSystem.DownloadZipLocation;

            if (File.Exists(to))
            {
                return;
            }
            Console.WriteLine($"Download elasticsearch: {v} from {from}");
            this.DownloadFile(from, to);
            Console.WriteLine($"Downloaded elasticsearch: {v}");
        }
        public override void Run(NodeConfiguration config, NodeFileSystem fs, string[] serverSettings)
        {
            var clusterMoniker = config.ClusterMoniker;
            var v          = config.ElasticsearchVersion;
            var easyRunBat = Path.Combine(fs.RoamingFolder, $"run-{clusterMoniker}.bat");

            if (File.Exists(easyRunBat))
            {
                return;
            }
            var badSettings = new[] { "node.name", "cluster.name" };
            var batSettings = string.Join(" ", serverSettings.Where(s => !badSettings.Any(s.Contains)));

            File.WriteAllText(easyRunBat, $@"elasticsearch-{v}\bin\elasticsearch.bat {batSettings}");
        }
Beispiel #15
0
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            var v       = config.ElasticsearchVersion;
            var plugins =
                from plugin in ElasticsearchPluginCollection.Supported
                let validForCurrentVersion = plugin.IsValid(v)
                                             let alreadyInstalled = AlreadyInstalled(plugin, fileSystem)
                                                                    where !alreadyInstalled && validForCurrentVersion
                                                                    select plugin;

            foreach (var plugin in plugins)
            {
                var installParameter = v.State == ElasticsearchVersion.ReleaseState.Released ? plugin.Moniker : this.UseHttpPluginLocation(fileSystem, plugin, v);
                this.ExecuteBinary(fileSystem.PluginBinary, $"install elasticsearch plugin: {plugin.Moniker}", "install --batch", installParameter);
            }
        }
Beispiel #16
0
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            var v      = config.ElasticsearchVersion;
            var folder = v.Major >= 5 ? "x-pack" : "shield";
            var plugin = v.Major >= 5 ? "users" : "esusers";

            if (v.Major == 6 && !File.Exists(fileSystem.XPackEnvBinary))
            {
                File.WriteAllText(fileSystem.XPackEnvBinary, "set ES_CLASSPATH=!ES_CLASSPATH!;!ES_HOME!/plugins/x-pack/*");
            }

            var pluginBat = Path.Combine(fileSystem.ElasticsearchHome, "bin", folder, plugin) + BinarySuffix;

            foreach (var cred in ShieldInformation.AllUsers)
            {
                this.ExecuteBinary(pluginBat, $"adding user {cred.Username}", $"useradd {cred.Username} -p {cred.Password} -r {cred.Role}");
            }
        }
Beispiel #17
0
        private void GenerateUnusedCertificates(NodeFileSystem fileSystem, string silentModeConfigFile, ElasticsearchVersion version)
        {
            var name        = fileSystem.UnusedCertificateFolderName;
            var zipLocation = Path.Combine(fileSystem.ConfigPath, "x-pack", name) + ".zip";
            var @out        = version.Major < 6 ? $"{name}.zip" : zipLocation;

            if (!File.Exists(fileSystem.UnusedCaCertificate))
            {
                this.ExecuteBinary(fileSystem.CertGenBinary, "generating ssl certificates for this session",
                                   "-in", silentModeConfigFile, "-out", @out);
            }

            if (Directory.Exists(fileSystem.UnusedCertificatesPath))
            {
                return;
            }
            Directory.CreateDirectory(fileSystem.UnusedCertificatesPath);
            ZipFile.ExtractToDirectory(zipLocation, fileSystem.UnusedCertificatesPath);
        }
        private void GenerateCertificates(NodeFileSystem fileSystem, string silentModeConfigFile)
        {
            var name = fileSystem.CertificateFolderName;

            if (!File.Exists(fileSystem.CaCertificate))
            {
                this.ExecuteBinary(fileSystem.CertGenBinary, "generating ssl certificates for this session",
                                   "-in", silentModeConfigFile, "-out", $"{name}.zip");
            }

            if (Directory.Exists(fileSystem.CertificatesPath))
            {
                return;
            }
            Directory.CreateDirectory(fileSystem.CertificatesPath);
            var zipLocation = Path.Combine(fileSystem.ConfigPath, "x-pack", name) + ".zip";

            ZipFile.ExtractToDirectory(zipLocation, fileSystem.CertificatesPath);
        }
Beispiel #19
0
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            if (config.ElasticsearchVersion < _sixTwoZero || config.ElasticsearchVersion >= _sixThreeZero)
            {
                return;
            }

            var batFile  = Path.Combine(fileSystem.ElasticsearchHome, "bin", "elasticsearch.bat");
            var contents = File.ReadAllLines(batFile);

            for (var i = 0; i < contents.Length; i++)
            {
                if (contents[i] == "cd \"%ES_HOME%\"")
                {
                    contents[i] = "cd /d \"%ES_HOME%\"";
                    break;
                }
            }

            File.WriteAllLines(batFile, contents);
        }
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            var v = config.ElasticsearchVersion;

            //on 2.x we so not support tests requiring plugins for 2.x since we can not reliably install them
            if (v.IsSnapshot && v.Major == 2)
            {
                return;
            }
            var plugins =
                from plugin in ElasticsearchPluginCollection.Supported
                let validForCurrentVersion = plugin.IsValid(v)
                                             let alreadyInstalled = AlreadyInstalled(plugin, fileSystem)
                                                                    where !alreadyInstalled && validForCurrentVersion
                                                                    select plugin;

            foreach (var plugin in plugins)
            {
                var installParameter = !v.IsSnapshot ? plugin.Moniker : this.DownloadSnapshotIfNeeded(fileSystem, plugin, v);
                this.ExecuteBinary(fileSystem.PluginBinary, $"install elasticsearch plugin: {plugin.Moniker}", "install --batch", installParameter);
            }
        }
Beispiel #21
0
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            //due to a bug in certgen this file needs to live in two places
            var silentModeConfigFile          = Path.Combine(fileSystem.ElasticsearchHome, "certgen") + ".yml";
            var silentModeConfigFileDuplicate = Path.Combine(fileSystem.ConfigPath, "x-pack", "certgen") + ".yml";

            foreach (var file in new [] { silentModeConfigFile, silentModeConfigFileDuplicate })
            {
                if (!File.Exists(file))
                {
                    File.WriteAllLines(file, new []
                    {
                        "instances:",
                        $"    - name : \"{fileSystem.CertificateNodeName}\"",
                        $"    - name : \"{fileSystem.ClientCertificateName}\"",
                        $"      filename : \"{fileSystem.ClientCertificateFilename}\"",
                    });
                }
            }

            this.GenerateCertificates(fileSystem, silentModeConfigFile, config.ElasticsearchVersion);
            this.GenerateUnusedCertificates(fileSystem, silentModeConfigFile, config.ElasticsearchVersion);
            this.AddClientCertificateUser(fileSystem, config.ElasticsearchVersion);
        }
Beispiel #22
0
        public override void Run(NodeConfiguration config, NodeFileSystem fs)
        {
            if (Directory.Exists(fs.DataPath))
            {
                Console.WriteLine($"attempting to delete cluster data: {fs.DataPath}");
                Directory.Delete(fs.DataPath, true);
            }

            if (Directory.Exists(fs.LogsPath))
            {
                var files = Directory.GetFiles(fs.LogsPath, config.ClusterName + "*.log");
                foreach (var f in files)
                {
                    Console.WriteLine($"attempting to delete log file: {f}");
                    File.Delete(f);
                }
            }

            if (Directory.Exists(fs.RepositoryPath))
            {
                Console.WriteLine("attempting to delete repositories");
                Directory.Delete(fs.RepositoryPath, true);
            }
        }
Beispiel #23
0
 public abstract void Run(NodeConfiguration config, NodeFileSystem fileSystem);
Beispiel #24
0
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            var rolesConfig = Path.Combine(fileSystem.ElasticsearchHome, "config", "elasticsearch.yml");
            var lines       = File.ReadAllLines(rolesConfig).ToList();
            var saveFile    = false;

            var prefix  = config.ElasticsearchVersion.Major >= 5 ? "xpack.notification" : "watcher.actions";
            var postfix = config.ElasticsearchVersion.Major >= 5 ? string.Empty : ".service";

            // set up for Watcher HipChat action
            if (!lines.Any(line => line.StartsWith($"{prefix}.hipchat{postfix}:")))
            {
                lines.AddRange(new[]
                {
                    string.Empty,
                    $"{prefix}.hipchat{postfix}:",
                    "  account:",
                    "    notify-monitoring:",
                    "      profile: user",
                    "      auth_token: hipchat_auth_token",
                    string.Empty
                });

                saveFile = true;
            }

            // set up for Watcher Slack action
            if (!lines.Any(line => line.StartsWith($"{prefix}.slack{postfix}:")))
            {
                lines.AddRange(new[]
                {
                    string.Empty,
                    $"{prefix}.slack{postfix}:",
                    "  account:",
                    "    monitoring:",
                    "      url: https://hooks.slack.com/services/foo/bar/baz",
                    string.Empty
                });

                saveFile = true;
            }

            // set up for Watcher PagerDuty action
            if (!lines.Any(line => line.StartsWith($"{prefix}.pagerduty{postfix}:")))
            {
                lines.AddRange(new[]
                {
                    string.Empty,
                    $"{prefix}.pagerduty{postfix}:",
                    "  account:",
                    "    my_pagerduty_account:",
                    "      service_api_key: pager_duty_service_api_key",
                    string.Empty
                });

                saveFile = true;
            }

            if (saveFile)
            {
                File.WriteAllLines(rolesConfig, lines);
            }
        }
 public override void Run(NodeConfiguration config, NodeFileSystem fileSystem) =>
 WriteFileIfNotExist(Path.Combine(fileSystem.ElasticsearchHome, "run.bat"), @"bin\elasticsearch.bat");
Beispiel #26
0
        public override void Run(NodeConfiguration config, NodeFileSystem fileSystem)
        {
            //2.x tests only use prebaked roles
            if (config.ElasticsearchVersion.Major < 5)
            {
                return;
            }
            var folder      = config.ElasticsearchVersion.Major >= 5 ? "x-pack" : "shield";
            var rolesConfig = Path.Combine(fileSystem.ElasticsearchHome, "config", folder, "roles.yml");

            if (!File.Exists(rolesConfig))
            {
                Directory.CreateDirectory(Path.Combine(fileSystem.ElasticsearchHome, "config", folder));
                File.WriteAllText(rolesConfig, string.Empty);
            }

            var lines    = File.ReadAllLines(rolesConfig).ToList();
            var saveFile = false;

            if (!lines.Any(line => line.StartsWith("user:"******"# Read-only operations on indices",
                    "user:"******"  indices:",
                    "    - names: '*'",
                    "      privileges:",
                    "        - read",
                    string.Empty
                });

                saveFile = true;
            }

            if (!lines.Any(line => line.StartsWith("power_user:"******"# monitoring cluster privileges",
                    "# All operations on all indices",
                    "power_user:"******"  cluster:",
                    "    - monitor",
                    "  indices:",
                    "    - names: '*'",
                    "      privileges:",
                    "        - all",
                    string.Empty
                });

                saveFile = true;
            }

            if (!lines.Any(line => line.StartsWith("admin:")))
            {
                lines.InsertRange(0, new []
                {
                    "# All cluster rights",
                    "# All operations on all indices",
                    "admin:",
                    "  cluster:",
                    "    - all",
                    "  indices:",
                    "    - names: '*'",
                    "      privileges:",
                    "        - all",
                    string.Empty
                });

                saveFile = true;
            }

            if (saveFile)
            {
                File.WriteAllLines(rolesConfig, lines);
            }
        }
 public abstract void Run(NodeConfiguration config, NodeFileSystem fileSystem, string[] serverSettings);