exhibitor: drop
This commit is contained in:
parent
f4cb534254
commit
e9b4c2b8f2
6 changed files with 2 additions and 462 deletions
|
@ -625,7 +625,6 @@
|
|||
./services/misc/etcd.nix
|
||||
./services/misc/etebase-server.nix
|
||||
./services/misc/etesync-dav.nix
|
||||
./services/misc/exhibitor.nix
|
||||
./services/misc/felix.nix
|
||||
./services/misc/freeswitch.nix
|
||||
./services/misc/fstrim.nix
|
||||
|
|
|
@ -55,6 +55,7 @@ in
|
|||
(mkRemovedOptionModule [ "services" "couchpotato" ] "The corresponding package was removed from nixpkgs.")
|
||||
(mkRemovedOptionModule [ "services" "dd-agent" ] "dd-agent was removed from nixpkgs in favor of the newer datadog-agent.")
|
||||
(mkRemovedOptionModule [ "services" "dnscrypt-proxy" ] "Use services.dnscrypt-proxy2 instead")
|
||||
(mkRemovedOptionModule [ "services" "exhibitor" ] "The corresponding package was removed from nixpkgs.")
|
||||
(mkRemovedOptionModule [ "services" "firefox" "syncserver" ] "The corresponding package was removed from nixpkgs.")
|
||||
(mkRemovedOptionModule [ "services" "flashpolicyd" ] "The flashpolicyd module has been removed. Adobe Flash Player is deprecated.")
|
||||
(mkRemovedOptionModule [ "services" "fourStore" ] "The fourStore module has been removed")
|
||||
|
|
|
@ -1,417 +0,0 @@
|
|||
{ config, lib, options, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.services.exhibitor;
|
||||
opt = options.services.exhibitor;
|
||||
exhibitorConfig = ''
|
||||
zookeeper-install-directory=${cfg.baseDir}/zookeeper
|
||||
zookeeper-data-directory=${cfg.zkDataDir}
|
||||
zookeeper-log-directory=${cfg.zkLogDir}
|
||||
zoo-cfg-extra=${cfg.zkExtraCfg}
|
||||
client-port=${toString cfg.zkClientPort}
|
||||
connect-port=${toString cfg.zkConnectPort}
|
||||
election-port=${toString cfg.zkElectionPort}
|
||||
cleanup-period-ms=${toString cfg.zkCleanupPeriod}
|
||||
servers-spec=${concatStringsSep "," cfg.zkServersSpec}
|
||||
auto-manage-instances=${toString cfg.autoManageInstances}
|
||||
${cfg.extraConf}
|
||||
'';
|
||||
# NB: toString rather than lib.boolToString on cfg.autoManageInstances is intended.
|
||||
# Exhibitor tests if it's an integer not equal to 0, so the empty string (toString false)
|
||||
# will operate in the same fashion as a 0.
|
||||
configDir = pkgs.writeTextDir "exhibitor.properties" exhibitorConfig;
|
||||
cliOptionsCommon = {
|
||||
configtype = cfg.configType;
|
||||
defaultconfig = "${configDir}/exhibitor.properties";
|
||||
port = toString cfg.port;
|
||||
hostname = cfg.hostname;
|
||||
headingtext = if (cfg.headingText != null) then (lib.escapeShellArg cfg.headingText) else null;
|
||||
nodemodification = lib.boolToString cfg.nodeModification;
|
||||
configcheckms = toString cfg.configCheckMs;
|
||||
jquerystyle = cfg.jqueryStyle;
|
||||
loglines = toString cfg.logLines;
|
||||
servo = lib.boolToString cfg.servo;
|
||||
timeout = toString cfg.timeout;
|
||||
};
|
||||
s3CommonOptions = { s3region = cfg.s3Region; s3credentials = cfg.s3Credentials; };
|
||||
cliOptionsPerConfig = {
|
||||
s3 = {
|
||||
s3config = "${cfg.s3Config.bucketName}:${cfg.s3Config.objectKey}";
|
||||
s3configprefix = cfg.s3Config.configPrefix;
|
||||
};
|
||||
zookeeper = {
|
||||
zkconfigconnect = concatStringsSep "," cfg.zkConfigConnect;
|
||||
zkconfigexhibitorpath = cfg.zkConfigExhibitorPath;
|
||||
zkconfigpollms = toString cfg.zkConfigPollMs;
|
||||
zkconfigretry = "${toString cfg.zkConfigRetry.sleepMs}:${toString cfg.zkConfigRetry.retryQuantity}";
|
||||
zkconfigzpath = cfg.zkConfigZPath;
|
||||
zkconfigexhibitorport = toString cfg.zkConfigExhibitorPort; # NB: This might be null
|
||||
};
|
||||
file = {
|
||||
fsconfigdir = cfg.fsConfigDir;
|
||||
fsconfiglockprefix = cfg.fsConfigLockPrefix;
|
||||
fsConfigName = fsConfigName;
|
||||
};
|
||||
none = {
|
||||
noneconfigdir = configDir;
|
||||
};
|
||||
};
|
||||
cliOptions = concatStringsSep " " (mapAttrsToList (k: v: "--${k} ${v}") (filterAttrs (k: v: v != null && v != "") (cliOptionsCommon //
|
||||
cliOptionsPerConfig.${cfg.configType} //
|
||||
s3CommonOptions //
|
||||
optionalAttrs cfg.s3Backup { s3backup = "true"; } //
|
||||
optionalAttrs cfg.fileSystemBackup { filesystembackup = "true"; }
|
||||
)));
|
||||
in
|
||||
{
|
||||
options = {
|
||||
services.exhibitor = {
|
||||
enable = mkEnableOption (lib.mdDoc "exhibitor server");
|
||||
|
||||
# See https://github.com/soabase/exhibitor/wiki/Running-Exhibitor for what these mean
|
||||
# General options for any type of config
|
||||
port = mkOption {
|
||||
type = types.port;
|
||||
default = 8080;
|
||||
description = lib.mdDoc ''
|
||||
The port for exhibitor to listen on and communicate with other exhibitors.
|
||||
'';
|
||||
};
|
||||
baseDir = mkOption {
|
||||
type = types.str;
|
||||
default = "/var/exhibitor";
|
||||
description = lib.mdDoc ''
|
||||
Baseline directory for exhibitor runtime config.
|
||||
'';
|
||||
};
|
||||
configType = mkOption {
|
||||
type = types.enum [ "file" "s3" "zookeeper" "none" ];
|
||||
description = lib.mdDoc ''
|
||||
Which configuration type you want to use. Additional config will be
|
||||
required depending on which type you are using.
|
||||
'';
|
||||
};
|
||||
hostname = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
description = lib.mdDoc ''
|
||||
Hostname to use and advertise
|
||||
'';
|
||||
default = null;
|
||||
};
|
||||
nodeModification = mkOption {
|
||||
type = types.bool;
|
||||
description = lib.mdDoc ''
|
||||
Whether the Explorer UI will allow nodes to be modified (use with caution).
|
||||
'';
|
||||
default = true;
|
||||
};
|
||||
configCheckMs = mkOption {
|
||||
type = types.int;
|
||||
description = lib.mdDoc ''
|
||||
Period (ms) to check for shared config updates.
|
||||
'';
|
||||
default = 30000;
|
||||
};
|
||||
headingText = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
description = lib.mdDoc ''
|
||||
Extra text to display in UI header
|
||||
'';
|
||||
default = null;
|
||||
};
|
||||
jqueryStyle = mkOption {
|
||||
type = types.enum [ "red" "black" "custom" ];
|
||||
description = lib.mdDoc ''
|
||||
Styling used for the JQuery-based UI.
|
||||
'';
|
||||
default = "red";
|
||||
};
|
||||
logLines = mkOption {
|
||||
type = types.int;
|
||||
description = lib.mdDoc ''
|
||||
Max lines of logging to keep in memory for display.
|
||||
'';
|
||||
default = 1000;
|
||||
};
|
||||
servo = mkOption {
|
||||
type = types.bool;
|
||||
description = lib.mdDoc ''
|
||||
ZooKeeper will be queried once a minute for its state via the 'mntr' four
|
||||
letter word (this requires ZooKeeper 3.4.x+). Servo will be used to publish
|
||||
this data via JMX.
|
||||
'';
|
||||
default = false;
|
||||
};
|
||||
timeout = mkOption {
|
||||
type = types.int;
|
||||
description = lib.mdDoc ''
|
||||
Connection timeout (ms) for ZK connections.
|
||||
'';
|
||||
default = 30000;
|
||||
};
|
||||
autoManageInstances = mkOption {
|
||||
type = types.bool;
|
||||
description = lib.mdDoc ''
|
||||
Automatically manage ZooKeeper instances in the ensemble
|
||||
'';
|
||||
default = false;
|
||||
};
|
||||
zkDataDir = mkOption {
|
||||
type = types.str;
|
||||
default = "${cfg.baseDir}/zkData";
|
||||
defaultText = literalExpression ''"''${config.${opt.baseDir}}/zkData"'';
|
||||
description = lib.mdDoc ''
|
||||
The Zookeeper data directory
|
||||
'';
|
||||
};
|
||||
zkLogDir = mkOption {
|
||||
type = types.path;
|
||||
default = "${cfg.baseDir}/zkLogs";
|
||||
defaultText = literalExpression ''"''${config.${opt.baseDir}}/zkLogs"'';
|
||||
description = lib.mdDoc ''
|
||||
The Zookeeper logs directory
|
||||
'';
|
||||
};
|
||||
extraConf = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = lib.mdDoc ''
|
||||
Extra Exhibitor configuration to put in the ZooKeeper config file.
|
||||
'';
|
||||
};
|
||||
zkExtraCfg = mkOption {
|
||||
type = types.str;
|
||||
default = "initLimit=5&syncLimit=2&tickTime=2000";
|
||||
description = lib.mdDoc ''
|
||||
Extra options to pass into Zookeeper
|
||||
'';
|
||||
};
|
||||
zkClientPort = mkOption {
|
||||
type = types.int;
|
||||
default = 2181;
|
||||
description = lib.mdDoc ''
|
||||
Zookeeper client port
|
||||
'';
|
||||
};
|
||||
zkConnectPort = mkOption {
|
||||
type = types.int;
|
||||
default = 2888;
|
||||
description = lib.mdDoc ''
|
||||
The port to use for followers to talk to each other.
|
||||
'';
|
||||
};
|
||||
zkElectionPort = mkOption {
|
||||
type = types.int;
|
||||
default = 3888;
|
||||
description = lib.mdDoc ''
|
||||
The port for Zookeepers to use for leader election.
|
||||
'';
|
||||
};
|
||||
zkCleanupPeriod = mkOption {
|
||||
type = types.int;
|
||||
default = 0;
|
||||
description = lib.mdDoc ''
|
||||
How often (in milliseconds) to run the Zookeeper log cleanup task.
|
||||
'';
|
||||
};
|
||||
zkServersSpec = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
description = lib.mdDoc ''
|
||||
Zookeeper server spec for all servers in the ensemble.
|
||||
'';
|
||||
example = [ "S:1:zk1.example.com" "S:2:zk2.example.com" "S:3:zk3.example.com" "O:4:zk-observer.example.com" ];
|
||||
};
|
||||
|
||||
# Backup options
|
||||
s3Backup = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = lib.mdDoc ''
|
||||
Whether to enable backups to S3
|
||||
'';
|
||||
};
|
||||
fileSystemBackup = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = lib.mdDoc ''
|
||||
Enables file system backup of ZooKeeper log files
|
||||
'';
|
||||
};
|
||||
|
||||
# Options for using zookeeper configType
|
||||
zkConfigConnect = mkOption {
|
||||
type = types.listOf types.str;
|
||||
description = lib.mdDoc ''
|
||||
The initial connection string for ZooKeeper shared config storage
|
||||
'';
|
||||
example = ["host1:2181" "host2:2181"];
|
||||
};
|
||||
zkConfigExhibitorPath = mkOption {
|
||||
type = types.str;
|
||||
description = lib.mdDoc ''
|
||||
If the ZooKeeper shared config is also running Exhibitor, the URI path for the REST call
|
||||
'';
|
||||
default = "/";
|
||||
};
|
||||
zkConfigExhibitorPort = mkOption {
|
||||
type = types.nullOr types.int;
|
||||
description = lib.mdDoc ''
|
||||
If the ZooKeeper shared config is also running Exhibitor, the port that
|
||||
Exhibitor is listening on. IMPORTANT: if this value is not set it implies
|
||||
that Exhibitor is not being used on the ZooKeeper shared config.
|
||||
'';
|
||||
};
|
||||
zkConfigPollMs = mkOption {
|
||||
type = types.int;
|
||||
description = lib.mdDoc ''
|
||||
The period in ms to check for changes in the config ensemble
|
||||
'';
|
||||
default = 10000;
|
||||
};
|
||||
zkConfigRetry = {
|
||||
sleepMs = mkOption {
|
||||
type = types.int;
|
||||
default = 1000;
|
||||
description = lib.mdDoc ''
|
||||
Retry sleep time connecting to the ZooKeeper config
|
||||
'';
|
||||
};
|
||||
retryQuantity = mkOption {
|
||||
type = types.int;
|
||||
default = 3;
|
||||
description = lib.mdDoc ''
|
||||
Retries connecting to the ZooKeeper config
|
||||
'';
|
||||
};
|
||||
};
|
||||
zkConfigZPath = mkOption {
|
||||
type = types.str;
|
||||
description = lib.mdDoc ''
|
||||
The base ZPath that Exhibitor should use
|
||||
'';
|
||||
example = "/exhibitor/config";
|
||||
};
|
||||
|
||||
# Config options for s3 configType
|
||||
s3Config = {
|
||||
bucketName = mkOption {
|
||||
type = types.str;
|
||||
description = lib.mdDoc ''
|
||||
Bucket name to store config
|
||||
'';
|
||||
};
|
||||
objectKey = mkOption {
|
||||
type = types.str;
|
||||
description = lib.mdDoc ''
|
||||
S3 key name to store the config
|
||||
'';
|
||||
};
|
||||
configPrefix = mkOption {
|
||||
type = types.str;
|
||||
description = lib.mdDoc ''
|
||||
When using AWS S3 shared config files, the prefix to use for values such as locks
|
||||
'';
|
||||
default = "exhibitor-";
|
||||
};
|
||||
};
|
||||
|
||||
# The next two are used for either s3backup or s3 configType
|
||||
s3Credentials = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
description = lib.mdDoc ''
|
||||
Optional credentials to use for s3backup or s3config. Argument is the path
|
||||
to an AWS credential properties file with two properties:
|
||||
com.netflix.exhibitor.s3.access-key-id and com.netflix.exhibitor.s3.access-secret-key
|
||||
'';
|
||||
default = null;
|
||||
};
|
||||
s3Region = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
description = lib.mdDoc ''
|
||||
Optional region for S3 calls
|
||||
'';
|
||||
default = null;
|
||||
};
|
||||
|
||||
# Config options for file config type
|
||||
fsConfigDir = mkOption {
|
||||
type = types.path;
|
||||
description = lib.mdDoc ''
|
||||
Directory to store Exhibitor properties (cannot be used with s3config).
|
||||
Exhibitor uses file system locks so you can specify a shared location
|
||||
so as to enable complete ensemble management.
|
||||
'';
|
||||
};
|
||||
fsConfigLockPrefix = mkOption {
|
||||
type = types.str;
|
||||
description = lib.mdDoc ''
|
||||
A prefix for a locking mechanism used in conjunction with fsconfigdir
|
||||
'';
|
||||
default = "exhibitor-lock-";
|
||||
};
|
||||
fsConfigName = mkOption {
|
||||
type = types.str;
|
||||
description = lib.mdDoc ''
|
||||
The name of the file to store config in
|
||||
'';
|
||||
default = "exhibitor.properties";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
systemd.services.exhibitor = {
|
||||
description = "Exhibitor Daemon";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "network.target" ];
|
||||
environment = {
|
||||
ZOO_LOG_DIR = cfg.baseDir;
|
||||
};
|
||||
serviceConfig = {
|
||||
/***
|
||||
Exhibitor is a bit un-nixy. It wants to present to you a user interface in order to
|
||||
mutate the configuration of both itself and ZooKeeper, and to coordinate changes
|
||||
among the members of the Zookeeper ensemble. I'm going for a different approach here,
|
||||
which is to manage all the configuration via nix and have it write out the configuration
|
||||
files that exhibitor will use, and to reduce the amount of inter-exhibitor orchestration.
|
||||
***/
|
||||
ExecStart = ''
|
||||
${pkgs.exhibitor}/bin/startExhibitor.sh ${cliOptions}
|
||||
'';
|
||||
User = "zookeeper";
|
||||
PermissionsStartOnly = true;
|
||||
};
|
||||
# This is a bit wonky, but the reason for this is that Exhibitor tries to write to
|
||||
# ${cfg.baseDir}/zookeeper/bin/../conf/zoo.cfg
|
||||
# I want everything but the conf directory to be in the immutable nix store, and I want defaults
|
||||
# from the nix store
|
||||
# If I symlink the bin directory in, then bin/../ will resolve to the parent of the symlink in the
|
||||
# immutable nix store. Bind mounting a writable conf over the existing conf might work, but it gets very
|
||||
# messy with trying to copy the existing out into a mutable store.
|
||||
# Another option is to try to patch upstream exhibitor, but the current package just pulls down the
|
||||
# prebuild JARs off of Maven, rather than building them ourselves, as Maven support in Nix isn't
|
||||
# very mature. So, it seems like a reasonable compromise is to just copy out of the immutable store
|
||||
# just before starting the service, so we're running binaries from the immutable store, but we work around
|
||||
# Exhibitor's desire to mutate its current installation.
|
||||
preStart = ''
|
||||
mkdir -m 0700 -p ${cfg.baseDir}/zookeeper
|
||||
# Not doing a chown -R to keep the base ZK files owned by root
|
||||
chown zookeeper ${cfg.baseDir} ${cfg.baseDir}/zookeeper
|
||||
cp -Rf ${pkgs.zookeeper}/* ${cfg.baseDir}/zookeeper
|
||||
chown -R zookeeper ${cfg.baseDir}/zookeeper/conf
|
||||
chmod -R u+w ${cfg.baseDir}/zookeeper/conf
|
||||
replace_what=$(echo ${pkgs.zookeeper} | sed 's/[\/&]/\\&/g')
|
||||
replace_with=$(echo ${cfg.baseDir}/zookeeper | sed 's/[\/&]/\\&/g')
|
||||
sed -i 's/'"$replace_what"'/'"$replace_with"'/g' ${cfg.baseDir}/zookeeper/bin/zk*.sh
|
||||
'';
|
||||
};
|
||||
users.users.zookeeper = {
|
||||
uid = config.ids.uids.zookeeper;
|
||||
description = "Zookeeper daemon user";
|
||||
home = cfg.baseDir;
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
{ lib, fetchFromGitHub, maven, makeWrapper, jdk }:
|
||||
|
||||
maven.buildMavenPackage rec {
|
||||
pname = "exhibitor";
|
||||
version = "1.5.6";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "soabase";
|
||||
repo = "exhibitor";
|
||||
rev = "v${version}";
|
||||
hash = "sha256-PZRT2C4CfYCbaHE9tEnwpyzEsJ6ZaS//zUDweR4YKrI=";
|
||||
};
|
||||
|
||||
# The purpose of this is to fetch the jar file out of public Maven and use Maven
|
||||
# to build a monolithic, standalone jar, rather than build everything from source
|
||||
# (given the state of Maven support in Nix). We're not actually building any java
|
||||
# source here.
|
||||
sourceRoot = "source/exhibitor-standalone/src/main/resources/buildscripts/standalone/maven";
|
||||
mvnFetchExtraArgs = {
|
||||
inherit sourceRoot;
|
||||
};
|
||||
mvnHash = "sha256-xhLnjtaF5eFUuBo5aHdp0j2sPfxYhFEZYJwVQlkqARs=";
|
||||
|
||||
nativeBuildInputs = [ maven makeWrapper ];
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/bin
|
||||
mkdir -p $out/share/java
|
||||
filename=$(basename target/*.jar)
|
||||
mv target/$filename $out/share/java/
|
||||
makeWrapper ${jdk}/bin/java $out/bin/startExhibitor.sh --add-flags "-jar $out/share/java/$filename" --suffix PATH : ${lib.makeBinPath [ jdk ]}
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "ZooKeeper co-process for instance monitoring, backup/recovery, cleanup and visualization";
|
||||
homepage = "https://github.com/soabase/exhibitor";
|
||||
sourceProvenance = with sourceTypes; [ binaryBytecode ];
|
||||
license = licenses.asl20;
|
||||
mainProgram = "startExhibitor.sh";
|
||||
platforms = platforms.unix;
|
||||
};
|
||||
}
|
|
@ -479,6 +479,7 @@ mapAliases ({
|
|||
euca2tools = throw "euca2ools has been removed because it is unmaintained upstream and still uses python2"; # Added 2022-01-01
|
||||
evilvte = throw "evilvte has been removed from nixpkgs for being unmaintained with security issues and dependant on an old version of vte which was removed"; # Added 2022-01-14
|
||||
evolution_data_server = throw "'evolution_data_server' has been renamed to/replaced by 'evolution-data-server'"; # Converted to throw 2022-02-22
|
||||
exhibitor = throw "'exhibitor' has been removed because it is unmaintained upstream"; # Added 2023-06-20
|
||||
exfat-utils = throw "'exfat-utils' has been renamed to/replaced by 'exfat'"; # Converted to throw 2022-02-22
|
||||
|
||||
### F ###
|
||||
|
|
|
@ -25576,8 +25576,6 @@ with pkgs;
|
|||
|
||||
exhaustive = callPackage ../development/tools/exhaustive { };
|
||||
|
||||
exhibitor = callPackage ../servers/exhibitor { };
|
||||
|
||||
hyp = callPackage ../servers/http/hyp { };
|
||||
|
||||
peering-manager = callPackage ../servers/web-apps/peering-manager { };
|
||||
|
|
Loading…
Reference in a new issue