about summary refs log tree commit diff
path: root/nixpkgs/pkgs/tools/admin
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/tools/admin')
-rw-r--r--nixpkgs/pkgs/tools/admin/acme.sh/default.nix36
-rw-r--r--nixpkgs/pkgs/tools/admin/adtool/default.nix39
-rw-r--r--nixpkgs/pkgs/tools/admin/amazon-ecr-credential-helper/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/admin/analog/default.nix38
-rw-r--r--nixpkgs/pkgs/tools/admin/ansible/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/admin/aws-env/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/admin/aws-env/deps.nix12
-rw-r--r--nixpkgs/pkgs/tools/admin/aws-google-auth/default.nix62
-rw-r--r--nixpkgs/pkgs/tools/admin/aws-rotate-key/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/admin/aws-rotate-key/deps.nix29
-rw-r--r--nixpkgs/pkgs/tools/admin/aws-vault/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/admin/awscli/default.nix65
-rw-r--r--nixpkgs/pkgs/tools/admin/awscli2/default.nix86
-rw-r--r--nixpkgs/pkgs/tools/admin/awslogs/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/admin/awsweeper/default.nix30
-rw-r--r--nixpkgs/pkgs/tools/admin/azure-cli/default.nix253
-rw-r--r--nixpkgs/pkgs/tools/admin/azure-cli/python-packages.nix416
-rw-r--r--nixpkgs/pkgs/tools/admin/bash-my-aws/default.nix71
-rw-r--r--nixpkgs/pkgs/tools/admin/berglas/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/admin/bluemix-cli/default.nix39
-rw-r--r--nixpkgs/pkgs/tools/admin/boulder/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/admin/bubblewrap/default.nix21
-rw-r--r--nixpkgs/pkgs/tools/admin/certigo/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/admin/chamber/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/admin/chkcrontab/default.nix20
-rw-r--r--nixpkgs/pkgs/tools/admin/clair/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/admin/cli53/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/admin/daemontools/default.nix44
-rw-r--r--nixpkgs/pkgs/tools/admin/daemontools/fix-nix-usernamespace-build.patch10
-rw-r--r--nixpkgs/pkgs/tools/admin/dehydrated/default.nix35
-rw-r--r--nixpkgs/pkgs/tools/admin/docker-credential-gcr/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/admin/docker-credential-helpers/default.nix49
-rw-r--r--nixpkgs/pkgs/tools/admin/eksctl/default.nix41
-rw-r--r--nixpkgs/pkgs/tools/admin/elasticsearch-curator/default.nix83
-rw-r--r--nixpkgs/pkgs/tools/admin/exoscale-cli/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/admin/fastlane/Gemfile2
-rw-r--r--nixpkgs/pkgs/tools/admin/fastlane/Gemfile.lock179
-rw-r--r--nixpkgs/pkgs/tools/admin/fastlane/default.nix36
-rw-r--r--nixpkgs/pkgs/tools/admin/fastlane/gemset.nix738
-rw-r--r--nixpkgs/pkgs/tools/admin/fbvnc/default.nix30
-rw-r--r--nixpkgs/pkgs/tools/admin/gixy/default.nix43
-rwxr-xr-xnixpkgs/pkgs/tools/admin/google-cloud-sdk/alpha__init__.py23
-rwxr-xr-xnixpkgs/pkgs/tools/admin/google-cloud-sdk/beta__init__.py23
-rw-r--r--nixpkgs/pkgs/tools/admin/google-cloud-sdk/default.nix105
-rw-r--r--nixpkgs/pkgs/tools/admin/google-cloud-sdk/gcloud-path.patch47
-rw-r--r--nixpkgs/pkgs/tools/admin/google-cloud-sdk/gsutil-disable-updates.patch50
-rw-r--r--nixpkgs/pkgs/tools/admin/gtk-vnc/default.nix78
-rw-r--r--nixpkgs/pkgs/tools/admin/iamy/default.nix28
-rw-r--r--nixpkgs/pkgs/tools/admin/intecture/agent.nix29
-rw-r--r--nixpkgs/pkgs/tools/admin/intecture/auth.nix29
-rw-r--r--nixpkgs/pkgs/tools/admin/intecture/cli.nix32
-rw-r--r--nixpkgs/pkgs/tools/admin/lego/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/admin/lexicon/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/admin/lxd/default.nix72
-rw-r--r--nixpkgs/pkgs/tools/admin/mycli/default.nix42
-rw-r--r--nixpkgs/pkgs/tools/admin/nomachine-client/default.nix96
-rw-r--r--nixpkgs/pkgs/tools/admin/oxidized/Gemfile5
-rw-r--r--nixpkgs/pkgs/tools/admin/oxidized/Gemfile.lock80
-rw-r--r--nixpkgs/pkgs/tools/admin/oxidized/default.nix20
-rw-r--r--nixpkgs/pkgs/tools/admin/oxidized/gemset.nix304
-rw-r--r--nixpkgs/pkgs/tools/admin/pebble/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/admin/procs/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/admin/pulumi/data.nix179
-rw-r--r--nixpkgs/pkgs/tools/admin/pulumi/default.nix37
-rwxr-xr-xnixpkgs/pkgs/tools/admin/pulumi/update.sh77
-rw-r--r--nixpkgs/pkgs/tools/admin/s3bro/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/admin/salt/default.nix47
-rw-r--r--nixpkgs/pkgs/tools/admin/salt/fix-libcrypto-loading.patch13
-rw-r--r--nixpkgs/pkgs/tools/admin/salt/pepper/default.nix26
-rw-r--r--nixpkgs/pkgs/tools/admin/scaleway-cli/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/admin/sec/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/admin/sewer/default.nix20
-rw-r--r--nixpkgs/pkgs/tools/admin/simp_le/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/admin/ssh-import-id/default.nix36
-rw-r--r--nixpkgs/pkgs/tools/admin/ssl-cert-check/default.nix57
-rw-r--r--nixpkgs/pkgs/tools/admin/swiftclient/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/admin/tigervnc/default.nix107
-rw-r--r--nixpkgs/pkgs/tools/admin/tigervnc/u_xorg-server-1.20.7-ddxInputThreadInit.patch21
-rw-r--r--nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-15678.patch18
-rw-r--r--nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-15679.patch19
-rw-r--r--nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-15680.patch16
-rw-r--r--nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-8287.patch14
-rw-r--r--nixpkgs/pkgs/tools/admin/tightvnc/default.nix85
-rw-r--r--nixpkgs/pkgs/tools/admin/virtscreen/default.nix39
-rw-r--r--nixpkgs/pkgs/tools/admin/vncdo/default.nix33
85 files changed, 5055 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/tools/admin/acme.sh/default.nix b/nixpkgs/pkgs/tools/admin/acme.sh/default.nix
new file mode 100644
index 000000000000..30badb175a96
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/acme.sh/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, lib, fetchFromGitHub, makeWrapper, curl, openssl, socat, iproute, unixtools, dnsutils }:
+stdenv.mkDerivation rec {
+  pname = "acme.sh";
+  version = "2.8.7";
+
+  src = fetchFromGitHub {
+    owner = "Neilpang";
+    repo = "acme.sh";
+    rev = version;
+    sha256 = "0bwzrrm07v2lpsja0r0z7nj3jrf814w57mmk8lbdk9dsb3i07x4w";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    mkdir -p $out $out/bin $out/libexec
+    cp -R $src/* $_
+    makeWrapper $out/libexec/acme.sh $out/bin/acme.sh \
+      --prefix PATH : "${
+        lib.makeBinPath [
+          socat
+          openssl
+          curl
+          dnsutils
+          (if stdenv.isLinux then iproute else unixtools.netstat)
+        ]
+      }"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "A pure Unix shell script implementing ACME client protocol";
+    homepage = "https://acme.sh/";
+    license = licenses.gpl3;
+    maintainers = [ maintainers.yorickvp ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/adtool/default.nix b/nixpkgs/pkgs/tools/admin/adtool/default.nix
new file mode 100644
index 000000000000..f239b18aec9f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/adtool/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, openldap }:
+
+stdenv.mkDerivation rec {
+  pname = "adtool";
+  version = "1.3.3";
+
+  src = fetchurl {
+    url = "https://gp2x.org/adtool/${pname}-${version}.tar.gz";
+    sha256  = "1awmpjamrwivi69i0j2fyrziy9s096ckviqd9c4llc3990mfsn4n";
+  };
+
+  configureFlags = [
+    "--sysconfdir=/etc"
+  ];
+
+  installFlags = [
+    "sysconfdir=$(out)/etc"
+  ];
+
+  buildInputs = [ openldap ];
+
+  enableParallelBuilding = true;
+
+  postInstall = ''
+    mkdir -p $out/share/doc/adtool
+    mv $out/etc/* $out/share/doc/adtool
+    rmdir $out/etc
+  '';
+
+  # It requires an LDAP server for tests
+  doCheck = false;
+
+  meta = with stdenv.lib; {
+    description = "Active Directory administration utility for Unix";
+    homepage = "https://gp2x.org/adtool";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/amazon-ecr-credential-helper/default.nix b/nixpkgs/pkgs/tools/admin/amazon-ecr-credential-helper/default.nix
new file mode 100644
index 000000000000..30d74c14ce5e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/amazon-ecr-credential-helper/default.nix
@@ -0,0 +1,23 @@
+{ buildGoPackage, fetchFromGitHub, lib, ... }:
+
+buildGoPackage rec {
+  pname = "amazon-ecr-credential-helper";
+  version = "0.4.0";
+
+  goPackagePath = "github.com/awslabs/amazon-ecr-credential-helper";
+
+  src = fetchFromGitHub {
+    owner = "awslabs";
+    repo = "amazon-ecr-credential-helper";
+    rev = "v${version}";
+    sha256 = "1whwxjzlyzyvrf2mzbd7my2kdz5fdbr79g18g9h4xrg8xyzk1k5q";
+  };
+
+  meta = with lib; {
+    description = "The Amazon ECR Docker Credential Helper is a credential helper for the Docker daemon that makes it easier to use Amazon Elastic Container Registry";
+    homepage = "https://github.com/awslabs/amazon-ecr-credential-helper";
+    license = licenses.asl20 ;
+    maintainers = with maintainers; [ kalbasit ];
+    platforms = platforms.linux ++ platforms.darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/analog/default.nix b/nixpkgs/pkgs/tools/admin/analog/default.nix
new file mode 100644
index 000000000000..68046be2eeea
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/analog/default.nix
@@ -0,0 +1,38 @@
+{ stdenv, lib, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "analog";
+  version = "6.0.16";
+
+  src = fetchFromGitHub {
+    owner = "c-amie";
+    repo = "analog-ce";
+    rev = version;
+    sha256 = "15hi8kfknldwpvm885r9s7zd5h7cirs7x0zazx2nnz62xvz3iymk";
+  };
+
+  configurePhase = ''
+    sed -i src/anlghead.h \
+      -e "s|#define DEFAULTCONFIGFILE .*|#define DEFAULTCONFIGFILE \"$out/etc/analog.cfg\"|g" \
+      -e "s|#define LANGDIR .*|#define LANGDIR \"$out/share/$pname}/lang/\"|g"
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin $out/etc $out/share/doc/$pname $out/share/man/man1 $out/share/$pname
+    mv analog $out/bin/
+    cp examples/big.cfg $out/etc/analog.cfg
+    mv analog.man $out/share/man/man1/analog.1
+    mv docs $out/share/doc/$pname/manual
+    mv how-to $out/share/doc/$pname/
+    mv lang images examples $out/share/$pname/
+  '';
+
+  meta = {
+    homepage = "https://www.c-amie.co.uk/software/analog/";
+    license = lib.licenses.gpl2;
+    description = "Powerful tool to generate web server statistics";
+    maintainers = [ lib.maintainers.peti ];
+    platforms = lib.platforms.linux;
+  };
+
+}
diff --git a/nixpkgs/pkgs/tools/admin/ansible/default.nix b/nixpkgs/pkgs/tools/admin/ansible/default.nix
new file mode 100644
index 000000000000..58b2852baca3
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/ansible/default.nix
@@ -0,0 +1,32 @@
+{ python3Packages, fetchurl, fetchFromGitHub }:
+
+rec {
+  ansible = ansible_2_10;
+
+  # The python module stays at v2.9.x until the related package set has caught up. Therefore v2.10 gets an override
+  # for now.
+  ansible_2_10 = python3Packages.toPythonApplication (python3Packages.ansible.overridePythonAttrs (old: rec {
+    pname = "ansible";
+    version = "2.10.0";
+
+    # TODO: migrate to fetchurl, when release becomes available on releases.ansible.com
+    src = fetchFromGitHub {
+      owner = pname;
+      repo = pname;
+      rev = "v${version}";
+      sha256 = "0k9rs5ajx0chaq0xr1cj4x7fr5n8kd4y856miss6k01iv2m7yx42";
+    };
+  }));
+
+  ansible_2_9 = python3Packages.toPythonApplication python3Packages.ansible;
+
+  ansible_2_8 = python3Packages.toPythonApplication (python3Packages.ansible.overridePythonAttrs (old: rec {
+    pname = "ansible";
+    version = "2.8.14";
+
+    src = fetchurl {
+      url = "https://releases.ansible.com/ansible/${pname}-${version}.tar.gz";
+      sha256 = "19ga0c9qs2b216qjg5k2yknz8ksjn8qskicqspg2d4b8x2nr1294";
+    };
+  }));
+}
diff --git a/nixpkgs/pkgs/tools/admin/aws-env/default.nix b/nixpkgs/pkgs/tools/admin/aws-env/default.nix
new file mode 100644
index 000000000000..dff375207976
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/aws-env/default.nix
@@ -0,0 +1,25 @@
+{ buildGoPackage, fetchFromGitHub, lib }:
+
+buildGoPackage rec {
+  pname = "aws-env";
+  version = "0.4";
+  rev = "v${version}";
+
+  goPackagePath = "github.com/Droplr/aws-env";
+
+  src = fetchFromGitHub {
+    owner = "Droplr";
+    repo = pname;
+    inherit rev;
+    sha256 = "0pw1qz1nn0ig90p8d8c1qcwsdz0m9w63ib07carhh86gw55425j7";
+  };
+
+  goDeps = ./deps.nix;
+
+  meta = with lib; {
+    description = "Secure way to handle environment variables in Docker and envfile with AWS Parameter Store";
+    homepage = "https://github.com/Droplr/aws-env";
+    license = licenses.mit;
+    maintainers = with maintainers; [ srhb ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/aws-env/deps.nix b/nixpkgs/pkgs/tools/admin/aws-env/deps.nix
new file mode 100644
index 000000000000..891a6ecb5962
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/aws-env/deps.nix
@@ -0,0 +1,12 @@
+# This file was generated by https://github.com/kamilchm/go2nix v1.2.1
+[
+  {
+    goPackagePath = "github.com/aws/aws-sdk-go";
+    fetch = {
+      type = "git";
+      url = "https://github.com/aws/aws-sdk-go";
+      rev = "5f03c87445c9dcd6aa831a76a77170919265aa97";
+      sha256 = "146rwinw2x4r0f2pixv62b7mmhvnnfvvjmfaj6dqjxrhp0imcxdi";
+    };
+  }
+]
diff --git a/nixpkgs/pkgs/tools/admin/aws-google-auth/default.nix b/nixpkgs/pkgs/tools/admin/aws-google-auth/default.nix
new file mode 100644
index 000000000000..d96eadf0eab5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/aws-google-auth/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, beautifulsoup4
+, boto3
+, configparser
+, keyring
+, keyrings-alt
+, lxml
+, pillow
+, requests
+, six
+, tabulate
+, tzlocal
+, nose
+, mock
+, withU2F ? false, python-u2flib-host
+}:
+
+buildPythonApplication rec {
+  pname = "aws-google-auth";
+  version = "0.0.34";
+
+  # Pypi doesn't ship the tests, so we fetch directly from GitHub
+  # https://github.com/cevoaustralia/aws-google-auth/issues/120
+  src = fetchFromGitHub {
+    owner = "cevoaustralia";
+    repo = "aws-google-auth";
+    rev = version;
+    sha256 = "12c5ssdy870szrizhs4d7dzcpq3hvszjvl8ba60qf1ak5jsr1ay4";
+  };
+
+  propagatedBuildInputs = [ 
+    beautifulsoup4
+    boto3
+    configparser
+    keyring
+    keyrings-alt
+    lxml
+    pillow
+    requests
+    six
+    tabulate
+    tzlocal
+  ] ++ lib.optional withU2F python-u2flib-host;
+  
+  checkInputs = [ 
+    mock
+    nose 
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  meta = with lib; {
+    description = "Acquire AWS STS (temporary) credentials via Google Apps SAML Single Sign On";
+    homepage = "https://github.com/cevoaustralia/aws-google-auth";
+    maintainers = [ maintainers.marsam ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/aws-rotate-key/default.nix b/nixpkgs/pkgs/tools/admin/aws-rotate-key/default.nix
new file mode 100644
index 000000000000..9c2f747e1558
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/aws-rotate-key/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, buildGoPackage, fetchFromGitHub }:
+
+buildGoPackage rec {
+  pname = "aws-rotate-key";
+  version = "1.0.6";
+
+  goPackagePath = "github.com/Fullscreen/aws-rotate-key";
+
+  src = fetchFromGitHub {
+    rev = "v${version}";
+    owner = "Fullscreen";
+    repo = "aws-rotate-key";
+    sha256 = "1w9704g1l2b0y6g6mk79g28kk0yaswpgljkk85d0i10wyxq4icby";
+  };
+
+  goDeps = ./deps.nix;
+
+  meta = with stdenv.lib; {
+    description = "Easily rotate your AWS key";
+    homepage = "https://github.com/Fullscreen/aws-rotate-key";
+    license = licenses.mit;
+    maintainers = [maintainers.mbode];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/aws-rotate-key/deps.nix b/nixpkgs/pkgs/tools/admin/aws-rotate-key/deps.nix
new file mode 100644
index 000000000000..680a18e7e2d3
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/aws-rotate-key/deps.nix
@@ -0,0 +1,29 @@
+[
+  {
+    goPackagePath = "github.com/go-ini/ini";
+    fetch = {
+      type = "git";
+      url = "https://github.com/go-ini/ini";
+      rev = "af26abd521cd7697481572fdbc4a53cbea3dde1b";
+      sha256 = "1yribbqy9i4i70dfg3yrjhkn3n0fywpr3kismn2mvi882mm01pxz";
+    };
+  }
+  {
+    goPackagePath = "github.com/jmespath/go-jmespath";
+    fetch = {
+      type = "git";
+      url = "https://github.com/jmespath/go-jmespath";
+      rev = "c2b33e8439af944379acbdd9c3a5fe0bc44bd8a5";
+      sha256 = "1r6w7ydx8ydryxk3sfhzsk8m6f1nsik9jg3i1zhi69v4kfl4d5cz";
+    };
+  }
+  {
+    goPackagePath = "github.com/aws/aws-sdk-go";
+    fetch = {
+      type = "git";
+      url = "https://github.com/aws/aws-sdk-go";
+      rev = "f844700ba2a387dfee7ab3679e7544b5dbd6d394";
+      sha256 = "0s9100bzqj58nnax3dxfgi5qr4rbaa53cb0cj3s58k9jc9z6270m";
+    };
+  }
+]
diff --git a/nixpkgs/pkgs/tools/admin/aws-vault/default.nix b/nixpkgs/pkgs/tools/admin/aws-vault/default.nix
new file mode 100644
index 000000000000..d55b90f3b84d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/aws-vault/default.nix
@@ -0,0 +1,32 @@
+{ buildGoModule, lib, fetchFromGitHub }:
+buildGoModule rec {
+  pname = "aws-vault";
+  version = "6.2.0";
+
+  src = fetchFromGitHub {
+    owner = "99designs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0892fhjmxnms09bfbjnngnnnli2d4nkwq44fw98yb3d5lbpa1j1j";
+  };
+
+  vendorSha256 = "18lmxx784377x1v0gr6fkdx5flhcajsqlzyjx508z0kih6ammc0z";
+
+  doCheck = false;
+
+  subPackages = [ "." ];
+
+  # set the version. see: aws-vault's Makefile
+  buildFlagsArray = ''
+    -ldflags=
+    -X main.Version=v${version}
+  '';
+
+  meta = with lib; {
+    description =
+      "A vault for securely storing and accessing AWS credentials in development environments";
+    homepage = "https://github.com/99designs/aws-vault";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zimbatm ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/awscli/default.nix b/nixpkgs/pkgs/tools/admin/awscli/default.nix
new file mode 100644
index 000000000000..6bc329628916
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/awscli/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, python3
+, groff
+, less
+}:
+
+let
+  py = python3.override {
+    packageOverrides = self: super: {
+      rsa = super.rsa.overridePythonAttrs (oldAttrs: rec {
+        version = "3.4.2";
+        src = oldAttrs.src.override {
+          inherit version;
+          sha256 = "25df4e10c263fb88b5ace923dd84bf9aa7f5019687b5e55382ffcdb8bede9db5";
+        };
+      });
+    };
+  };
+
+in with py.pkgs; buildPythonApplication rec {
+  pname = "awscli";
+  version = "1.18.137"; # N.B: if you change this, change botocore to a matching version too
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0g745lvmi30di3bbpbca2bkqqzk7g6l3ssmbpi8pvgy0wrfhij69";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "docutils>=0.10,<0.16" "docutils>=0.10"
+  '';
+
+  # No tests included
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    botocore
+    bcdoc
+    s3transfer
+    six
+    colorama
+    docutils
+    rsa
+    pyyaml
+    groff
+    less
+  ];
+
+  postInstall = ''
+    mkdir -p $out/etc/bash_completion.d
+    echo "complete -C $out/bin/aws_completer aws" > $out/etc/bash_completion.d/awscli
+    mkdir -p $out/share/zsh/site-functions
+    mv $out/bin/aws_zsh_completer.sh $out/share/zsh/site-functions
+    rm $out/bin/aws.cmd
+  '';
+
+  passthru.python = py; # for aws_shell
+
+  meta = with lib; {
+    homepage = "https://aws.amazon.com/cli/";
+    description = "Unified tool to manage your AWS services";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ muflax ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/awscli2/default.nix b/nixpkgs/pkgs/tools/admin/awscli2/default.nix
new file mode 100644
index 000000000000..471034fa51a8
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/awscli2/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, python3
+, groff
+, less
+, fetchFromGitHub
+}:
+let
+  py = python3.override {
+    packageOverrides = self: super: {
+      botocore = super.botocore.overridePythonAttrs (oldAttrs: rec {
+        version = "2.0.0dev52";
+        src = fetchFromGitHub {
+          owner = "boto";
+          repo = "botocore";
+          rev = "f115f16d8130957776f232bbb7505ff6c4f18e8c";
+          hash = "sha256-wi9ezv6uIvCNFYJX6z0zQO7/VREhe1Sn/CakIgDRp1c=";
+        };
+      });
+      prompt_toolkit = super.prompt_toolkit.overridePythonAttrs (oldAttrs: rec {
+        version = "2.0.10";
+        src = oldAttrs.src.override {
+          inherit version;
+          sha256 = "1nr990i4b04rnlw1ghd0xmgvvvhih698mb6lb6jylr76cs7zcnpi";
+        };
+      });
+    };
+  };
+
+in
+with py.pkgs; buildPythonApplication rec {
+  pname = "awscli2";
+  version = "2.0.48"; # N.B: if you change this, change botocore to a matching version too
+
+  src = fetchFromGitHub {
+    owner = "aws";
+    repo = "aws-cli";
+    rev = version;
+    hash = "sha256-83EKaKv3ZKOD2hzdsJO7/djbzr4V8LpHxqBl9HFhk1U=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "cryptography>=2.8.0,<=2.9.0" "cryptography>=2.8.0"
+    substituteInPlace setup.py --replace "docutils>=0.10,<0.16" "docutils>=0.10"
+    substituteInPlace setup.py --replace "ruamel.yaml>=0.15.0,<0.16.0" "ruamel.yaml>=0.15.0"
+    substituteInPlace setup.py --replace "wcwidth<0.2.0" "wcwidth"
+  '';
+
+  # No tests included
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    bcdoc
+    botocore
+    colorama
+    cryptography
+    distro
+    docutils
+    groff
+    less
+    prompt_toolkit
+    pyyaml
+    rsa
+    ruamel_yaml
+    s3transfer
+    six
+    wcwidth
+  ];
+
+  postInstall = ''
+    mkdir -p $out/etc/bash_completion.d
+    echo "complete -C $out/bin/aws_completer aws" > $out/etc/bash_completion.d/awscli
+    mkdir -p $out/share/zsh/site-functions
+    mv $out/bin/aws_zsh_completer.sh $out/share/zsh/site-functions
+    rm $out/bin/aws.cmd
+  '';
+
+  passthru.python = py; # for aws_shell
+
+  meta = with lib; {
+    homepage = "https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html";
+    changelog = "https://github.com/aws/aws-cli/blob/${version}/CHANGELOG.rst";
+    description = "Unified tool to manage your AWS services";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bhipple davegallant ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/awslogs/default.nix b/nixpkgs/pkgs/tools/admin/awslogs/default.nix
new file mode 100644
index 000000000000..4a33d7420765
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/awslogs/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchFromGitHub, python3Packages }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "awslogs";
+  version = "0.11.0";
+
+  src = fetchFromGitHub {
+    owner = "jorgebastida";
+    repo = "awslogs";
+    rev = version;
+    sha256 = "0vdpld7r7y78x1lcd5z3qsx047dwichxb8f3447yzl75fnsm75dc";
+  };
+
+  doCheck = false;
+
+  propagatedBuildInputs = with python3Packages; [
+    boto3 termcolor dateutil docutils setuptools
+  ];
+
+  meta = with stdenv.lib; {
+    homepage = "https://github.com/jorgebastida/awslogs";
+    description = "AWS CloudWatch logs for Humans";
+    maintainers = with maintainers; [ dbrock ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/awsweeper/default.nix b/nixpkgs/pkgs/tools/admin/awsweeper/default.nix
new file mode 100644
index 000000000000..2417854fcad9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/awsweeper/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildGoModule, fetchurl, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "awsweeper";
+  version = "0.7.0";
+
+  # Requires go generate to be run with mockgen, but doesn't check in the results.
+  patches = fetchurl {
+    url = "https://raw.githubusercontent.com/c00w/patches/master/awskeeper.patch";
+    sha256 = "0dz553ffxc37m2iwygrbhxf7pm91hxdriic8a1gjf8q3nyn13npl";
+  };
+
+  src = fetchFromGitHub {
+    owner = "cloudetc";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1ybrrpnp6rh7rcwihww43cvhfhzzyy51rdk1hwy9ljpkg37k4y28";
+  };
+
+  vendorSha256 = "0hnpb1xp135z2qpn1b6xad59739hffhs8dfpr3n5drmrvajpn4xp";
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A tool to clean out your AWS account";
+    homepage = "https://github.com/cloudetc/awsweeper/";
+    license = licenses.mpl20;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/azure-cli/default.nix b/nixpkgs/pkgs/tools/admin/azure-cli/default.nix
new file mode 100644
index 000000000000..3743cad11a30
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/azure-cli/default.nix
@@ -0,0 +1,253 @@
+{ stdenv, lib, python, fetchFromGitHub, installShellFiles }:
+
+let
+  version = "2.11.1";
+  src = fetchFromGitHub {
+    owner = "Azure";
+    repo = "azure-cli";
+    rev = "azure-cli-${version}";
+    sha256 = "11jmgc73b0w725rq89j6hk6gh67nfdbzp3rmywmrnah683d6xbpx";
+  };
+
+  # put packages that needs to be overriden in the py package scope
+  py = import ./python-packages.nix { inherit stdenv python lib src version; };
+in
+py.pkgs.toPythonApplication (py.pkgs.buildAzureCliPackage {
+  pname = "azure-cli";
+  inherit version src;
+  disabled = python.isPy27; # namespacing assumes PEP420, which isn't compat with py2
+
+  sourceRoot = "source/src/azure-cli";
+
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace "javaproperties==0.5.1" "javaproperties" \
+      --replace "pytz==2019.1" "pytz" \
+      --replace "mock~=4.0" "mock"
+
+    # remove namespace hacks
+    # remove urllib3 because it was added as 'urllib3[secure]', which doesn't get handled well
+    sed -i setup.py \
+      -e '/azure-cli-command_modules-nspkg/d' \
+      -e '/azure-cli-nspkg/d' \
+      -e '/urllib3/d'
+  '';
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  propagatedBuildInputs = with py.pkgs; [
+    azure-batch
+    azure-cli-core
+    azure-cli-telemetry
+    azure-cosmos
+    azure-datalake-store
+    azure-functions-devops-build
+    azure-graphrbac
+    azure-keyvault
+    azure-loganalytics
+    azure-mgmt-advisor
+    azure-mgmt-apimanagement
+    azure-mgmt-applicationinsights
+    azure-mgmt-appconfiguration
+    azure-mgmt-authorization
+    azure-mgmt-batch
+    azure-mgmt-batchai
+    azure-mgmt-billing
+    azure-mgmt-botservice
+    azure-mgmt-cdn
+    azure-mgmt-cognitiveservices
+    azure-mgmt-compute
+    azure-mgmt-consumption
+    azure-mgmt-containerinstance
+    azure-mgmt-containerregistry
+    azure-mgmt-containerservice
+    azure-mgmt-cosmosdb
+    azure-mgmt-datalake-analytics
+    azure-mgmt-datalake-store
+    azure-mgmt-datamigration
+    azure-mgmt-deploymentmanager
+    azure-mgmt-devtestlabs
+    azure-mgmt-dns
+    azure-mgmt-eventgrid
+    azure-mgmt-eventhub
+    azure-mgmt-hdinsight
+    azure-mgmt-imagebuilder
+    azure-mgmt-iotcentral
+    azure-mgmt-iothub
+    azure-mgmt-iothubprovisioningservices
+    azure-mgmt-keyvault
+    azure-mgmt-kusto
+    azure-mgmt-loganalytics
+    azure-mgmt-managedservices
+    azure-mgmt-managementgroups
+    azure-mgmt-maps
+    azure-mgmt-marketplaceordering
+    azure-mgmt-media
+    azure-mgmt-monitor
+    azure-mgmt-msi
+    azure-mgmt-network
+    azure-mgmt-netapp
+    azure-mgmt-policyinsights
+    azure-mgmt-privatedns
+    azure-mgmt-rdbms
+    azure-mgmt-recoveryservices
+    azure-mgmt-recoveryservicesbackup
+    azure-mgmt-redhatopenshift
+    azure-mgmt-redis
+    azure-mgmt-relay
+    azure-mgmt-reservations
+    azure-mgmt-resource
+    azure-mgmt-search
+    azure-mgmt-security
+    azure-mgmt-servicebus
+    azure-mgmt-servicefabric
+    azure-mgmt-signalr
+    azure-mgmt-sql
+    azure-mgmt-sqlvirtualmachine
+    azure-mgmt-storage
+    azure-mgmt-synapse
+    azure-mgmt-trafficmanager
+    azure-mgmt-web
+    azure-multiapi-storage
+    azure-storage-blob
+    azure-synapse-accesscontrol
+    azure-synapse-spark
+    colorama
+    cryptography
+    Fabric
+    jsmin
+    knack
+    mock
+    paramiko
+    pydocumentdb
+    pygments
+    pyopenssl
+    pytz
+    pyyaml
+    psutil
+    requests
+    scp
+    six
+    sshtunnel
+    urllib3
+    vsts-cd-manager
+    websocket_client
+    xmltodict
+    javaproperties
+    jsondiff
+    # urllib3[secure]
+    ipaddress
+    # shell completion
+    argcomplete
+  ];
+
+  # TODO: make shell completion actually work
+  # uses argcomplete, so completion needs PYTHONPATH to work
+  postInstall = ''
+    installShellCompletion --bash --name az.bash az.completion.sh
+    installShellCompletion --zsh --name _az az.completion.sh
+
+    # remove garbage
+    rm $out/bin/az.bat
+    rm $out/bin/az.completion.sh
+  '';
+
+  # wrap the executable so that the python packages are available
+  # it's just a shebang script which calls `python -m azure.cli "$@"`
+  postFixup = ''
+    wrapProgram $out/bin/az \
+      --set PYTHONPATH $PYTHONPATH
+  '';
+
+  # almost the entire test suite requires an azure account setup and networking
+  # ensure that the azure namespaces are setup correctly and that azure.cli can be accessed
+  checkPhase = ''
+    cd azure # avoid finding local copy
+    ${py.interpreter} -c 'import azure.cli.core; assert "${version}" == azure.cli.core.__version__'
+    HOME=$TMPDIR ${py.interpreter} -m azure.cli --help
+  '';
+
+  # ensure these namespaces are able to be accessed
+  pythonImportsCheck = [
+    "azure.batch"
+    "azure.cli.core"
+    "azure.cli.telemetry"
+    "azure.cosmos"
+    "azure.datalake.store"
+    "azure_functions_devops_build"
+    "azure.graphrbac"
+    "azure.keyvault"
+    "azure.loganalytics"
+    "azure.mgmt.advisor"
+    "azure.mgmt.apimanagement"
+    "azure.mgmt.applicationinsights"
+    "azure.mgmt.appconfiguration"
+    "azure.mgmt.authorization"
+    "azure.mgmt.batch"
+    "azure.mgmt.batchai"
+    "azure.mgmt.billing"
+    "azure.mgmt.botservice"
+    "azure.mgmt.cdn"
+    "azure.mgmt.cognitiveservices"
+    "azure.mgmt.compute"
+    "azure.mgmt.consumption"
+    "azure.mgmt.containerinstance"
+    "azure.mgmt.containerregistry"
+    "azure.mgmt.containerservice"
+    "azure.mgmt.cosmosdb"
+    "azure.mgmt.datalake.analytics"
+    "azure.mgmt.datalake.store"
+    "azure.mgmt.datamigration"
+    "azure.mgmt.deploymentmanager"
+    "azure.mgmt.devtestlabs"
+    "azure.mgmt.dns"
+    "azure.mgmt.eventgrid"
+    "azure.mgmt.eventhub"
+    "azure.mgmt.hdinsight"
+    "azure.mgmt.imagebuilder"
+    "azure.mgmt.iotcentral"
+    "azure.mgmt.iothub"
+    "azure.mgmt.iothubprovisioningservices"
+    "azure.mgmt.keyvault"
+    "azure.mgmt.kusto"
+    "azure.mgmt.loganalytics"
+    "azure.mgmt.managedservices"
+    "azure.mgmt.managementgroups"
+    "azure.mgmt.maps"
+    "azure.mgmt.marketplaceordering"
+    "azure.mgmt.media"
+    "azure.mgmt.monitor"
+    "azure.mgmt.msi"
+    "azure.mgmt.network"
+    "azure.mgmt.netapp"
+    "azure.mgmt.policyinsights"
+    "azure.mgmt.privatedns"
+    "azure.mgmt.rdbms"
+    "azure.mgmt.recoveryservices"
+    "azure.mgmt.recoveryservicesbackup"
+    "azure.mgmt.redis"
+    "azure.mgmt.relay"
+    "azure.mgmt.reservations"
+    "azure.mgmt.resource"
+    "azure.mgmt.search"
+    "azure.mgmt.security"
+    "azure.mgmt.servicebus"
+    "azure.mgmt.servicefabric"
+    "azure.mgmt.signalr"
+    "azure.mgmt.sql"
+    "azure.mgmt.sqlvirtualmachine"
+    "azure.mgmt.storage"
+    "azure.mgmt.trafficmanager"
+    "azure.mgmt.web"
+    "azure.storage.blob"
+    "azure.storage.common"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Azure/azure-cli";
+    description = "Next generation multi-platform command line experience for Azure";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+})
+
diff --git a/nixpkgs/pkgs/tools/admin/azure-cli/python-packages.nix b/nixpkgs/pkgs/tools/admin/azure-cli/python-packages.nix
new file mode 100644
index 000000000000..8d17c9ff2017
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/azure-cli/python-packages.nix
@@ -0,0 +1,416 @@
+{ stdenv, python, lib, src, version }:
+
+let
+  buildAzureCliPackage = with py.pkgs; attrs: buildPythonPackage (attrs // {
+    # Remove overly restrictive version contraints and obsolete namespace setup
+    prePatch = (attrs.prePatch or "") + ''
+      rm -f azure_bdist_wheel.py tox.ini
+      substituteInPlace setup.py \
+        --replace "wheel==0.30.0" "wheel"
+      sed -i "/azure-namespace-package/c\ " setup.cfg
+    '';
+
+    # Prevent these __init__'s from violating PEP420, only needed for python2
+    pythonNamespaces = [ "azure.cli" ];
+
+    checkInputs = [ mock pytest ] ++ (attrs.checkInputs or []);
+    checkPhase = attrs.checkPhase or ''
+      cd azure
+      HOME=$TMPDIR pytest
+    '';
+  });
+
+  overrideAzureMgmtPackage = package: version: extension: sha256:
+    # check to make sure overriding is even necessary
+    if version == package.version then
+      package
+    else package.overrideAttrs(oldAttrs: rec {
+      inherit version;
+
+      src = py.pkgs.fetchPypi {
+        inherit (oldAttrs) pname;
+        inherit version sha256 extension;
+      };
+
+      preBuild = ''
+        rm -f azure_bdist_wheel.py
+        substituteInPlace setup.cfg \
+          --replace "azure-namespace-package = azure-mgmt-nspkg" ""
+      '';
+
+      # force PEP420
+      pythonNamespaces = [ "azure.mgmt" ];
+    });
+
+  py = python.override {
+    packageOverrides = self: super: {
+      inherit buildAzureCliPackage;
+
+      # core and the actual application are highly coupled
+      azure-cli-core = buildAzureCliPackage {
+        pname = "azure-cli-core";
+        inherit version src;
+
+        sourceRoot = "source/src/azure-cli-core";
+
+        propagatedBuildInputs = with self; [
+          adal
+          argcomplete
+          azure-common
+          azure-cli-telemetry
+          azure-mgmt-core
+          azure-mgmt-resource
+          colorama
+          humanfriendly
+          jmespath
+          knack
+          msal
+          msal-extensions
+          msrest
+          msrestazure
+          paramiko
+          pkginfo
+          psutil
+          pygments
+          pyjwt
+          pyopenssl
+          pyperclip
+          pyyaml
+          requests
+          six
+          tabulate
+        ]
+        ++ lib.optionals isPy3k [ antlr4-python3-runtime ]
+        ++ lib.optionals (!isPy3k) [ enum34 futures antlr4-python2-runtime ndg-httpsclient ];
+
+        doCheck = stdenv.isLinux;
+        # ignore test that does network call
+        checkPhase = ''
+          rm azure/{,cli/}__init__.py
+          python -c 'import azure.common; print(azure.common)'
+          PYTHONPATH=$PWD:$PYTHONPATH HOME=$TMPDIR pytest \
+            --ignore=azure/cli/core/tests/test_profile.py \
+            --ignore=azure/cli/core/tests/test_generic_update.py
+        '';
+
+        pythonImportsCheck = [
+          "azure.cli.telemetry"
+          "azure.cli.core"
+        ];
+      };
+
+      azure-cli-telemetry = buildAzureCliPackage {
+        pname = "azure-cli-telemetry";
+        version = "1.0.4"; # might be wrong, but doesn't really matter
+        inherit src;
+
+        sourceRoot = "source/src/azure-cli-telemetry";
+
+        propagatedBuildInputs = with super; [
+          applicationinsights
+          portalocker
+        ];
+
+        # ignore flaky test
+        checkPhase = ''
+          cd azure
+          HOME=$TMPDIR pytest -k 'not test_create_telemetry_note_file_from_scratch'
+        '';
+      };
+
+      azure-batch = overrideAzureMgmtPackage super.azure-batch "9.0.0" "zip"
+        "112d73gxjqng348mcvi36ska6pxyg8qc3qswvhf5x4a0lr86zjj7";
+
+      azure-mgmt-apimanagement = overrideAzureMgmtPackage super.azure-mgmt-apimanagement "0.1.0" "zip"
+        "06bqqkn5mx127x1z7ycm6rl8ajxlrmrm2kcdpgkbl4baii1x6iax";
+
+      azure-mgmt-batch = overrideAzureMgmtPackage super.azure-mgmt-batch "9.0.0" "zip"
+        "1zn3yqwvm2f3sy8v0xvj4yb7m8kxxm1wpcaccxp91b0zzbn7wh83";
+
+      azure-mgmt-policyinsights = overrideAzureMgmtPackage super.azure-mgmt-policyinsights "0.5.0" "zip"
+        "1wxh7mgrknnhqyafdd7sbwx8plx0zga2af21vs6yhxy48lw9w8pd";
+
+      azure-mgmt-rdbms = overrideAzureMgmtPackage super.azure-mgmt-rdbms "2.2.0" "zip"
+        "1iz1pf28ajrzbq8nab1jbjbgfbv0g6ni036xayy6xylvga4l8czr";
+
+      azure-mgmt-recoveryservices = overrideAzureMgmtPackage super.azure-mgmt-recoveryservices "0.4.0" "zip"
+        "0v0ycyjnnx09jqf958hj2q6zfpsn80bxxm98jf59y8rj09v99rz1";
+
+      azure-mgmt-recoveryservicesbackup = overrideAzureMgmtPackage super.azure-mgmt-recoveryservicesbackup "0.6.0" "zip"
+        "13s2k4jl8570bj6jkqzm0w29z29rl7h5i7czd3kr6vqar5wj9xjd";
+
+      azure-mgmt-resource = overrideAzureMgmtPackage super.azure-mgmt-resource "10.2.0" "zip"
+        "ddfe4c0c55f0e3fd1f66dd82c1d4a3d872ce124639b9a77fcd172daf464438a5";
+
+      azure-mgmt-appconfiguration = overrideAzureMgmtPackage super.azure-mgmt-appconfiguration "0.5.0" "zip"
+        "1nh626jg459p9f96glv74dph3vmpybm5cs8rrj1s65kn3m8jf591";
+
+      azure-mgmt-cognitiveservices = overrideAzureMgmtPackage super.azure-mgmt-cognitiveservices "6.2.0" "zip"
+        "1khk9jdfx7706xsqpwrnfsplv6p6wracvpyk9ki8zhc7p83kal4k";
+
+      azure-mgmt-compute = overrideAzureMgmtPackage super.azure-mgmt-compute "13.0.0" "zip"
+        "17ik8lfd74ki57rml2piswcanzbladsqy0s2m9jmvwpdrfpincvz";
+
+      azure-mgmt-consumption = overrideAzureMgmtPackage super.azure-mgmt-consumption "2.0.0" "zip"
+        "12ai4qps73ivawh0yzvgb148ksx02r30pqlvfihx497j62gsi1cs";
+
+      azure-mgmt-containerinstance = overrideAzureMgmtPackage super.azure-mgmt-containerinstance "1.4.0" "zip"
+        "1qw6228bia5pimcijr755npli2l33jyfka1s2bzgl1w4h3prsji7";
+
+      azure-mgmt-containerservice = overrideAzureMgmtPackage super.azure-mgmt-containerservice "9.0.1" "zip"
+        "11nqjpi9qypb0xvfy63l98q5m5jfv5iqx15mliksm96vkdkmji3y";
+
+      azure-mgmt-core = overrideAzureMgmtPackage super.azure-mgmt-core "1.2.0" "zip"
+        "8fe3b59446438f27e34f7b24ea692a982034d9e734617ca1320eedeee1939998";
+
+      azure-mgmt-cosmosdb = overrideAzureMgmtPackage super.azure-mgmt-cosmosdb "0.15.0" "zip"
+        "03ysr8kx0gavjrxsi9wqrgxpg3g17nvii7z68qfm0k2mv6ryj3z7";
+
+      azure-mgmt-deploymentmanager = overrideAzureMgmtPackage super.azure-mgmt-deploymentmanager "0.2.0" "zip"
+        "0c6pyr36n9snx879vas5r6l25db6nlp2z96xn759mz4kg4i45qs6";
+
+      azure-mgmt-eventgrid = overrideAzureMgmtPackage super.azure-mgmt-eventgrid "3.0.0rc7" "zip"
+        "1m5905mn362pn03sf89zsnylkrbgs4p1lkafrw3nxa2gnwcfpyb8";
+
+      azure-mgmt-imagebuilder = overrideAzureMgmtPackage super.azure-mgmt-imagebuilder "0.4.0" "zip"
+        "0cqpjnkpid6a34ifd4vk4fn1h57pa1bg3r756wv082xl2szr34jc";
+
+      azure-mgmt-iothub = overrideAzureMgmtPackage super.azure-mgmt-iothub "0.12.0" "zip"
+        "187z0w5by7d9a2zsz3kidmzjw591akpc6dwhps4jyb4skcmyw86s";
+
+      azure-mgmt-iotcentral = overrideAzureMgmtPackage super.azure-mgmt-iotcentral "3.0.0" "zip"
+        "0iq04hvivq3fvg2lhax95gx0x35avk5hps42227z3qna5i2cznpn";
+
+      azure-mgmt-kusto = overrideAzureMgmtPackage super.azure-mgmt-kusto "0.3.0" "zip"
+        "1pmcdgimd66h964a3d5m2j2fbydshcwhrk87wblhwhfl3xwbgf4y";
+
+      azure-mgmt-devtestlabs = overrideAzureMgmtPackage super.azure-mgmt-devtestlabs "4.0.0" "zip"
+        "1397ksrd61jv7400mgn8sqngp6ahir55fyq9n5k69wk88169qm2r";
+
+      azure-mgmt-netapp = overrideAzureMgmtPackage super.azure-mgmt-netapp "0.12.0" "zip"
+        "7d773119bc02e3d6f9d7cffb7effc17e85676d5c5b1f656d05abc4489e472c76";
+
+      azure-mgmt-dns = overrideAzureMgmtPackage super.azure-mgmt-dns "2.1.0" "zip"
+        "1l55py4fzzwhxlmnwa41gpmqk9v2ncc79w7zq11sm9a5ynrv2c1p";
+
+      azure-mgmt-loganalytics = overrideAzureMgmtPackage super.azure-mgmt-loganalytics "0.7.0" "zip"
+        "18n2lqvrhq40gdqhlzzg8mc03571i02c7qq7jv771lc58rqpzysh";
+
+      azure-mgmt-network = overrideAzureMgmtPackage super.azure-mgmt-network "11.0.0" "zip"
+        "1g39rl4p88bzhqbn1gi2nn8jyx77idxvpaw8xqz1gjv0qqqwdpvz";
+
+      azure-mgmt-media = overrideAzureMgmtPackage super.azure-mgmt-media "2.1.0" "zip"
+        "1py0hch0wghzfxazdrrs7p0kln2zn9jh3fmkzwd2z8qggj38q6gm";
+
+      azure-mgmt-msi = overrideAzureMgmtPackage super.azure-mgmt-msi "0.2.0" "zip"
+        "0rvik03njz940x2hvqg6iiq8k0d88gyygsr86w8s0sa12sdbq8l6";
+
+      azure-mgmt-web = overrideAzureMgmtPackage super.azure-mgmt-web "0.47.0" "zip"
+        "1s6c477q2kpyiqkisw6l70ydyjkv3ay6zjjj4jl4ipv05a7356kq";
+
+      azure-mgmt-redhatopenshift = overrideAzureMgmtPackage super.azure-mgmt-redhatopenshift "0.1.0" "zip"
+        "1g65lbia1i1jw6qkyjz2ldyl3p90rbr78l8kfryg70sj7z3gnnjn";
+
+      azure-mgmt-redis = overrideAzureMgmtPackage super.azure-mgmt-redis "7.0.0rc1" "zip"
+        "086wk31wsl8dx14qpd0g1bly8i9a8fix007djlj9cybva2f2bk6k";
+
+      azure-mgmt-reservations = overrideAzureMgmtPackage super.azure-mgmt-reservations "0.6.0" "zip"
+        "16ycni3cjl9c0mv419gy5rgbrlg8zp0vnr6aj8z8p2ypdw6sgac3";
+
+      azure-mgmt-security = overrideAzureMgmtPackage super.azure-mgmt-security "0.4.1" "zip"
+        "08gf401d40bd1kn9wmpxcjxqdh84cd9hxm8rdjd0918483sqs71r";
+
+      azure-mgmt-signalr = overrideAzureMgmtPackage super.azure-mgmt-signalr "0.4.0" "zip"
+        "09n12ligh301z4xwixl50n8f1rgd2k6lpsxqzr6n6jvgkpdds0v5";
+
+      azure-mgmt-sql = overrideAzureMgmtPackage super.azure-mgmt-sql "0.19.0" "zip"
+        "1iiqc0kh5hygcvr3x1653cpjnf5na3j11v137xa9xy65r7a4jik9";
+
+      azure-mgmt-sqlvirtualmachine = overrideAzureMgmtPackage super.azure-mgmt-sqlvirtualmachine "0.5.0" "zip"
+        "1b9am8raa17hxnz7d5pk2ix0309wsnhnchq1mi22icd728sl5adm";
+
+      azure-mgmt-synapse = overrideAzureMgmtPackage super.azure-mgmt-synapse "0.3.0" "zip"
+        "0sa12s5af9xl1wnblilswxc6ydr2anm9an000iz3ks54pydby2vy";
+
+      azure-mgmt-datamigration = overrideAzureMgmtPackage super.azure-mgmt-datamigration "0.1.0" "zip"
+        "1pq5rn32yvrf5kqjafnj0kc92gpfg435w2l0k7cm8gvlja4r4m77";
+
+      azure-mgmt-relay = overrideAzureMgmtPackage super.azure-mgmt-relay "0.1.0" "zip"
+        "1jss6qhvif8l5s0lblqw3qzijjf0h88agciiydaa7f4q577qgyfr";
+
+      azure-mgmt-eventhub = overrideAzureMgmtPackage super.azure-mgmt-eventhub "4.0.0" "zip"
+        "1qisnwn0gqfsa3h5x0fdbsgdjwn92hdbg71gdijrja0kryb328k5";
+
+      azure-mgmt-keyvault = overrideAzureMgmtPackage super.azure-mgmt-keyvault "7.0.0b2" "zip"
+        "10kpfzgsyh648a9z194vysgfl5887qwwamyd1r32zfqi9fr4js5l";
+
+      azure-mgmt-cdn = overrideAzureMgmtPackage super.azure-mgmt-cdn "5.0.0" "zip"
+        "0y1bq6lirwx4n8zydi49jx72xfc7dppzhy82x22sx98id8lxgcwm";
+
+      azure-mgmt-containerregistry = overrideAzureMgmtPackage super.azure-mgmt-containerregistry "3.0.0rc14" "zip"
+        "0w9hnxvk5pcsa21g3xrr089rfwgldghrbj8akzvh0gchqlzfjg6j";
+
+      azure-mgmt-monitor = overrideAzureMgmtPackage super.azure-mgmt-monitor "0.11.0" "zip"
+        "05jhn66d4sl1qi6w34rqd8wl500jndismiwhdmzzmprdvn1zxqf6";
+
+      azure-mgmt-advisor =  overrideAzureMgmtPackage super.azure-mgmt-advisor "2.0.1" "zip"
+        "1wsfkprdrn22mwm24y2zlcms8ppp7jwq3s86r3ymbl29pbaxca8r";
+
+      azure-mgmt-applicationinsights = overrideAzureMgmtPackage super.azure-mgmt-applicationinsights "0.1.1" "zip"
+        "16raxr5naszrxmgbfhsvh7rqcph5cx6x3f480790m79ykvmjj0pi";
+
+      azure-mgmt-authorization = overrideAzureMgmtPackage super.azure-mgmt-authorization "0.52.0" "zip"
+        "0357laxgldb7lvvws81r8xb6mrq9dwwnr1bnwdnyj4bw6p21i9hn";
+
+      azure-mgmt-storage = overrideAzureMgmtPackage super.azure-mgmt-storage "11.1.0" "zip"
+        "073zybsxk70vg02bflbrx97pwzsxl0xyi48fpxp8dh3d3dy5h8zg";
+
+      azure-mgmt-servicefabric = overrideAzureMgmtPackage super.azure-mgmt-servicefabric "0.4.0" "zip"
+        "1x18grkjf2p2r1ihlwv607sna9yjvsr2jwnkjc55askrgrwx5jx2";
+
+      azure-mgmt-hdinsight = overrideAzureMgmtPackage super.azure-mgmt-hdinsight "1.7.0" "zip"
+        "004q3d2kj1i1cx3sad1544n3pkindfm255sw19gdlhbw61wn5l5a";
+
+      azure-multiapi-storage = overrideAzureMgmtPackage super.azure-multiapi-storage "0.4.1" "zip"
+        "0h7bzaqwyl3j9xqzjbnwxp59kmg6shxk76pml9kvvqbwsq9w6fx3";
+
+      azure-graphrbac = super.azure-graphrbac.overrideAttrs(oldAttrs: rec {
+        version = "0.60.0";
+
+        src = super.fetchPypi {
+          inherit (oldAttrs) pname;
+          inherit version;
+          sha256 = "1zna5vb887clvpyfp5439vhlz3j4z95blw9r7y86n6cfpzc65fyh";
+          extension = "zip";
+        };
+      });
+
+      azure-storage-blob = super.azure-storage-blob.overrideAttrs(oldAttrs: rec {
+        version = "1.5.0";
+        src = super.fetchPypi {
+          inherit (oldAttrs) pname;
+          inherit version;
+          sha256 = "0b15dzy75fml994gdfmaw5qcyij15gvh968mk3hg94d1wxwai1zi";
+        };
+      });
+
+      azure-storage-common = super.azure-storage-common.overrideAttrs(oldAttrs: rec {
+        version = "1.4.2";
+        src = super.fetchPypi {
+          inherit (oldAttrs) pname;
+          inherit version;
+          sha256 = "00g41b5q4ijlv02zvzjgfwrwy71cgr3lc3if4nayqmyl6xsprj2f";
+        };
+      });
+
+      azure-synapse-accesscontrol = super.azure-synapse-accesscontrol.overrideAttrs(oldAttrs: rec {
+        version = "0.2.0";
+        src = super.fetchPypi {
+          inherit (oldAttrs) pname;
+          inherit version;
+          sha256 = "1rsdqrhrgy09kbw6c7krb4hlaxs1ldb6lilwrbxgp3zqybxxnh5b";
+          extension = "zip";
+        };
+      });
+
+      azure-synapse-spark = super.azure-synapse-spark.overrideAttrs(oldAttrs: rec {
+        version = "0.2.0";
+        src = super.fetchPypi {
+          inherit (oldAttrs) pname;
+          inherit version;
+          sha256 = "1qijqp6llshqas422lnqvpv45iv99n7f13v86znql40y3jp5n3ir";
+          extension = "zip";
+        };
+      });
+
+      azure-keyvault = super.azure-keyvault.overrideAttrs(oldAttrs: rec {
+        version = "1.1.0";
+        src = super.fetchPypi {
+          inherit (oldAttrs) pname;
+          inherit version;
+          extension = "zip";
+          sha256 = "0jfxm8lx8dzs3v2b04ljizk8gfckbm5l2v86rm7k0npbfvryba1p";
+        };
+
+        propagatedBuildInputs = with self; [
+          azure-common azure-nspkg msrest msrestazure cryptography
+        ];
+        pythonNamespaces = [ "azure" ];
+        pythonImportsCheck = [ ];
+      });
+
+      # part of azure.mgmt.datalake namespace
+      azure-mgmt-datalake-analytics = super.azure-mgmt-datalake-analytics.overrideAttrs(oldAttrs: rec {
+        version = "0.2.1";
+
+        src = super.fetchPypi {
+          inherit (oldAttrs) pname;
+          inherit version;
+          sha256 = "192icfx82gcl3igr18w062744376r2ivh63c8nd7v17mjk860yac";
+          extension = "zip";
+        };
+
+        preBuild = ''
+          rm azure_bdist_wheel.py
+          substituteInPlace setup.cfg \
+            --replace "azure-namespace-package = azure-mgmt-datalake-nspkg" ""
+        '';
+      });
+
+      cryptography = super.cryptography.overridePythonAttrs(oldAttrs: rec {
+        version = "2.9.2";
+
+        src = super.fetchPypi {
+          inherit (oldAttrs) pname;
+          inherit version;
+          sha256 = "0af25w5mkd6vwns3r6ai1w5ip9xp0ms9s261zzssbpadzdr05hx0";
+        };
+
+        # prevent cycle with cryptography-vectors
+        doCheck = false;
+      });
+
+      knack = super.knack.overridePythonAttrs(oldAttrs: rec {
+        version = "0.7.2";
+
+        src = super.fetchPypi {
+          inherit (oldAttrs) pname;
+          inherit version;
+          sha256 = "1jh81xyri7wb7vqa049imf6dfy3nc501bq3p0miaka8ffvvaxinz";
+        };
+      });
+
+      msal = super.msal.overridePythonAttrs(oldAttrs: rec {
+        version = "1.0.0";
+
+        src = super.fetchPypi {
+          inherit (oldAttrs) pname;
+          inherit version;
+          sha256 = "0h33wayvakggr684spdyhiqvrwraavcbk3phmcbavb3zqxd3zgpc";
+        };
+      });
+
+      msal-extensions = super.msal-extensions.overridePythonAttrs(oldAttrs: rec {
+        version = "0.1.3";
+
+        src = super.fetchPypi {
+          inherit (oldAttrs) pname;
+          inherit version;
+          sha256 = "1p05cbfksnhijx1il7s24js2ydzgxbpiasf607qdpb5sljlp3qar";
+        };
+      });
+
+      websocket_client = super.websocket_client.overridePythonAttrs(oldAttrs: rec {
+        version = "0.56.0";
+
+        src = super.fetchPypi {
+          inherit (oldAttrs) pname;
+          inherit version;
+          sha256 = "0fpxjyr74klnyis3yf6m54askl0h5dchxcwbfjsq92xng0455m8z";
+        };
+      });
+
+    };
+  };
+in
+  py
diff --git a/nixpkgs/pkgs/tools/admin/bash-my-aws/default.nix b/nixpkgs/pkgs/tools/admin/bash-my-aws/default.nix
new file mode 100644
index 000000000000..b99f031f4165
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/bash-my-aws/default.nix
@@ -0,0 +1,71 @@
+{ stdenv
+, awscli
+, jq
+, fetchgit
+, installShellFiles
+, bashInteractive
+}:
+
+stdenv.mkDerivation rec {
+  pname = "bash-my-aws";
+  version = "20200111";
+
+  src = fetchgit {
+    url = "https://github.com/bash-my-aws/bash-my-aws";
+    rev = "5a97ce2c22affca1299022a5afa109d7b62242ba";
+    sha256 = "459bda8b244af059d96c7c8b916cf956b01cb2732d1c2888a3ae06a4d660bea6";
+  };
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  propagatedBuildInputs = [
+    awscli
+    jq
+    bashInteractive
+  ];
+  nativeBuildInputs = [ installShellFiles ];
+
+  checkPhase = ''
+    pushd test
+    ./shared-spec.sh
+    ./stack-spec.sh
+    popd
+  '';
+  installPhase=''
+    mkdir -p $out
+    cp -r . $out
+  '';
+  postFixup = ''
+    pushd $out
+    substituteInPlace scripts/build \
+        --replace '~/.bash-my-aws' $out
+    substituteInPlace scripts/build-completions \
+        --replace "{HOME}" $out \
+        --replace '~/.bash-my-aws' $out
+    ./scripts/build
+    ./scripts/build-completions
+    substituteInPlace bash_completion.sh \
+        --replace "{HOME}" $out \
+        --replace .bash-my-aws ""
+    substituteInPlace bin/bma \
+        --replace '~/.bash-my-aws' $out
+    installShellCompletion --bash --name bash-my-aws.bash bash_completion.sh
+    chmod +x $out/lib/*
+    patchShebangs --host $out/lib
+    installShellCompletion --bash --name bash-my-aws.bash bash_completion.sh
+    cat > $out/bin/bma-init <<EOF
+    echo source $out/aliases
+    echo source $out/bash_completion.sh
+    EOF
+    chmod +x $out/bin/bma-init
+    popd
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = "https://bash-my-aws.org";
+    description = "CLI commands for AWS";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tomberek ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/berglas/default.nix b/nixpkgs/pkgs/tools/admin/berglas/default.nix
new file mode 100644
index 000000000000..050ad9db75db
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/berglas/default.nix
@@ -0,0 +1,24 @@
+{ stdenv, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "berglas";
+  version = "0.5.1";
+
+  src = fetchFromGitHub {
+    owner = "GoogleCloudPlatform";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0y393g36h35zzqyf5b10j6qq2jhvz83j17cmasnv6wbyrb3vnn0n";
+  };
+
+  vendorSha256 = null;
+
+  doCheck = false;
+
+  meta = with stdenv.lib; {
+    description = "A tool for managing secrets on Google Cloud";
+    homepage = "https://github.com/GoogleCloudPlatform/berglas";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/bluemix-cli/default.nix b/nixpkgs/pkgs/tools/admin/bluemix-cli/default.nix
new file mode 100644
index 000000000000..f97a6e5df891
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/bluemix-cli/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  pname = "bluemix-cli";
+  version = "0.8.0";
+
+  src =
+    if stdenv.hostPlatform.system == "i686-linux" then
+      fetchurl {
+        name = "linux32-${version}.tar.gz";
+        url = "https://clis.ng.bluemix.net/download/bluemix-cli/${version}/linux32";
+        sha256 = "1ryngbjlw59x33rfd32bcz49r93a1q1g92jh7xmi9vydgqnzsifh";
+      }
+    else
+      fetchurl {
+        name = "linux64-${version}.tar.gz";
+        url = "https://clis.ng.bluemix.net/download/bluemix-cli/${version}/linux64";
+        sha256 = "056zbaca430ldcn0s86vy40m5abvwpfrmvqybbr6fjwfv9zngywx";
+      }
+    ;
+
+  installPhase = ''
+    install -m755 -D -t $out/bin bin/ibmcloud bin/ibmcloud-analytics
+    install -m755 -D -t $out/bin/cfcli bin/cfcli/cf
+    ln -sv $out/bin/ibmcloud $out/bin/bx
+    ln -sv $out/bin/ibmcloud $out/bin/bluemix
+    install -D -t "$out/etc/bash_completion.d" bx/bash_autocomplete
+    install -D -t "$out/share/zsh/site-functions" bx/zsh_autocomplete
+  '';
+
+  meta = with lib; {
+    description  = "Administration CLI for IBM BlueMix";
+    homepage     = "https://console.bluemix.net/docs/cli/index.html";
+    downloadPage = "https://console.bluemix.net/docs/cli/reference/bluemix_cli/download_cli.html#download_install";
+    license      = licenses.unfree;
+    maintainers  = [ maintainers.tazjin maintainers.jensbin ];
+    platforms    = [ "x86_64-linux" "i686-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/boulder/default.nix b/nixpkgs/pkgs/tools/admin/boulder/default.nix
new file mode 100644
index 000000000000..a21a3ebdde11
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/boulder/default.nix
@@ -0,0 +1,33 @@
+{ buildGoPackage
+, libtool
+, fetchFromGitHub
+, lib
+}:
+
+let
+  version = "release-2019-10-13";
+
+in buildGoPackage {
+
+  pname = "boulder";
+  inherit version;
+
+  goPackagePath = "github.com/letsencrypt/boulder";
+
+  buildInputs = [ libtool ];
+
+  src = fetchFromGitHub {
+    owner = "letsencrypt";
+    repo = "boulder";
+    rev = version;
+    sha256 = "0kis23dnjja6jp192rjpv2m9m2zmzfwhs93440nxg354k6fp8jdg";
+  };
+
+  meta = {
+    homepage = "https://github.com/letsencrypt/boulder";
+    description = "An ACME-based CA, written in Go";
+    license = [ lib.licenses.mpl20 ];
+    maintainers = [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/tools/admin/bubblewrap/default.nix b/nixpkgs/pkgs/tools/admin/bubblewrap/default.nix
new file mode 100644
index 000000000000..b98cadd57d11
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/bubblewrap/default.nix
@@ -0,0 +1,21 @@
+{ stdenv, fetchurl, libxslt, docbook_xsl, libcap }:
+
+stdenv.mkDerivation rec {
+  pname = "bubblewrap";
+  version = "0.4.1";
+
+  src = fetchurl {
+    url = "https://github.com/containers/bubblewrap/releases/download/v${version}/${pname}-${version}.tar.xz";
+    sha256 = "00ycgi6q2yngh06bnz50wkvar6r2jnjf3j158grhi9k13jdrpimr";
+  };
+
+  nativeBuildInputs = [ libxslt docbook_xsl ];
+  buildInputs = [ libcap ];
+
+  meta = with stdenv.lib; {
+    description = "Unprivileged sandboxing tool";
+    homepage = "https://github.com/containers/bubblewrap";
+    license = licenses.lgpl2Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/certigo/default.nix b/nixpkgs/pkgs/tools/admin/certigo/default.nix
new file mode 100644
index 000000000000..e363df04556e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/certigo/default.nix
@@ -0,0 +1,24 @@
+{ stdenv, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "certigo";
+  version = "1.12.1";
+
+  src = fetchFromGitHub {
+    owner = "square";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0siwbxxzknmbsjy23d0lvh591ngabqhr2g8mip0siwa7c1y7ivv4";
+  };
+
+  vendorSha256 = "1l6ajfl04rfbssvijgd5jrppmqc5svfrswdx01x007lr8rvdfd94";
+
+  doCheck = false;
+
+  meta = with stdenv.lib; {
+    description = "A utility to examine and validate certificates in a variety of formats";
+    homepage = "https://github.com/square/certigo";
+    license = licenses.asl20;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/chamber/default.nix b/nixpkgs/pkgs/tools/admin/chamber/default.nix
new file mode 100644
index 000000000000..fb21bda41505
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/chamber/default.nix
@@ -0,0 +1,28 @@
+{ buildGoModule, lib, fetchFromGitHub }:
+buildGoModule rec {
+  pname = "chamber";
+  version = "2.8.2";
+
+  src = fetchFromGitHub {
+    owner = "segmentio";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-7L9RaE4LvHRR6MUimze5QpbnfasWJdY4arfS/Usy2q0=";
+  };
+
+  vendorSha256 = null;
+
+  # set the version. see: chamber's Makefile
+  buildFlagsArray = ''
+    -ldflags=
+    -X main.Version=v${version}
+  '';
+
+  meta = with lib; {
+    description =
+      "Chamber is a tool for managing secrets by storing them in AWS SSM Parameter Store.";
+    homepage = "https://github.com/segmentio/chamber";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kalekseev ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/chkcrontab/default.nix b/nixpkgs/pkgs/tools/admin/chkcrontab/default.nix
new file mode 100644
index 000000000000..0740b0c1be60
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/chkcrontab/default.nix
@@ -0,0 +1,20 @@
+{ python, stdenv }:
+
+with python.pkgs;
+
+buildPythonApplication rec {
+  pname = "chkcrontab";
+  version = "1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0gmxavjkjkvjysgf9cf5fcpk589gb75n1mn20iki82wifi1pk1jn";
+  };
+
+  meta = with stdenv.lib; {
+    description = "A tool to detect crontab errors";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ma27 ];
+    homepage = "https://github.com/lyda/chkcrontab";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/clair/default.nix b/nixpkgs/pkgs/tools/admin/clair/default.nix
new file mode 100644
index 000000000000..565196280ce0
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/clair/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildGoModule, fetchFromGitHub, makeWrapper, rpm, xz }:
+
+buildGoModule rec {
+  pname = "clair";
+  version = "2.1.4";
+
+  src = fetchFromGitHub {
+    owner = "quay";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1bvwh3ghxb3ynq8a07ka9i0rzaqg1aikxvqxmpjkwjvhwk63lwqd";
+  };
+
+  vendorSha256 = "0x31n50vd8660z816as6kms5dkv87b0mhblccpkvd9cbvcv2n37a";
+
+  doCheck = false;
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  postInstall = ''
+    wrapProgram $out/bin/clair \
+      --prefix PATH : "${lib.makeBinPath [ rpm xz ]}"
+  '';
+
+  meta = with lib; {
+    description = "Vulnerability Static Analysis for Containers";
+    homepage = "https://github.com/quay/clair";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/cli53/default.nix b/nixpkgs/pkgs/tools/admin/cli53/default.nix
new file mode 100644
index 000000000000..4978603c1922
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/cli53/default.nix
@@ -0,0 +1,23 @@
+# This file was generated by https://github.com/kamilchm/go2nix v2.0-dev
+{ lib, buildGoPackage, fetchFromGitHub }:
+
+buildGoPackage {
+  pname = "cli53";
+  version = "0.8.12";
+
+  goPackagePath = "github.com/barnybug/cli53";
+
+  src = fetchFromGitHub {
+    owner = "barnybug";
+    repo = "cli53";
+    rev = "2624c7c4b38a33cdbd166dad1d3e512830f453e4";
+    sha256 = "0bhczmzrgf7ypnhhzdrgnvg8cw8ch1x1d0cgajc5kklq9ixv9ygi";
+  };
+
+  meta = with lib; {
+    description = "CLI tool for the Amazon Route 53 DNS service";
+    homepage = "https://github.com/barnybug/cli53";
+    license = licenses.mit;
+    maintainers = with maintainers; [ benley ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/daemontools/default.nix b/nixpkgs/pkgs/tools/admin/daemontools/default.nix
new file mode 100644
index 000000000000..660563d9757c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/daemontools/default.nix
@@ -0,0 +1,44 @@
+{ fetchurl, bash, glibc, stdenv }:
+
+stdenv.mkDerivation rec {
+  name = "daemontools-0.76";
+
+  src = fetchurl {
+    url = "https://cr.yp.to/daemontools/${name}.tar.gz";
+    sha256 = "07scvw88faxkscxi91031pjkpccql6wspk4yrlnsbrrb5c0kamd5";
+  };
+
+  patches = [ ./fix-nix-usernamespace-build.patch ];
+
+  configurePhase = ''
+    cd ${name}
+
+    sed -ie '1 s_$_ -include ${glibc.dev}/include/errno.h_' src/conf-cc
+
+    substituteInPlace src/Makefile \
+      --replace '/bin/sh' '${bash}/bin/bash -oxtrace'
+
+    sed -ie "s_^PATH=.*_PATH=$src/${name}/compile:''${PATH}_" src/rts.tests
+
+    cat ${glibc.dev}/include/errno.h
+  '';
+
+  buildPhase = ''
+    package/compile
+  '';
+
+  installPhase = ''
+    for cmd in $(cat package/commands); do
+      install -Dm755 "command/$cmd" "$out/bin/$cmd"
+    done
+  '';
+
+  meta = {
+    license = stdenv.lib.licenses.publicDomain;
+    homepage = "https://cr.yp.to/daemontools.html";
+    description = "A collection of tools for managing UNIX services.";
+
+    maintainers = with stdenv.lib.maintainers; [ kevincox ];
+    platforms = stdenv.lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/daemontools/fix-nix-usernamespace-build.patch b/nixpkgs/pkgs/tools/admin/daemontools/fix-nix-usernamespace-build.patch
new file mode 100644
index 000000000000..9b784e7ca112
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/daemontools/fix-nix-usernamespace-build.patch
@@ -0,0 +1,10 @@
+--- admin.org/daemontools-0.76/src/chkshsgr.c	2001-07-12 17:49:49.000000000 +0100
++++ admin/daemontools-0.76/src/chkshsgr.c	2017-05-31 23:54:56.662174028 +0100
+@@ -4,6 +4,7 @@
+ 
+ int main()
+ {
++  return 0;
+   short x[4];
+ 
+   x[0] = x[1] = 0;
diff --git a/nixpkgs/pkgs/tools/admin/dehydrated/default.nix b/nixpkgs/pkgs/tools/admin/dehydrated/default.nix
new file mode 100644
index 000000000000..6cc69c2290d4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/dehydrated/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, coreutils, curl, diffutils, gawk, gnugrep, gnused, openssl, makeWrapper, fetchFromGitHub, installShellFiles }:
+stdenv.mkDerivation rec {
+  pname = "dehydrated";
+  version = "0.6.5";
+
+  src = fetchFromGitHub {
+    owner = "lukas2511";
+    repo = "dehydrated";
+    rev = "v${version}";
+    sha256 = "14k7ykry16zp09i0bqb5pqaclvnjcb6p3x8knm9v5q0bdvlplkjv";
+  };
+
+  nativeBuildInputs = [ makeWrapper installShellFiles ];
+
+  installPhase = ''
+    installManPage docs/man/dehydrated.1
+
+    mkdir -p "$out/share/docs/dehydrated"
+    cp docs/*.md "$out/share/docs/dehydrated"
+    cp -r docs/examples "$out/share/docs/dehydrated"
+    cp {CHANGELOG,LICENSE,README.md} "$out/share/docs/dehydrated"
+
+    mkdir -p $out/bin
+    cp -a dehydrated $out/bin
+    wrapProgram "$out/bin/dehydrated" --prefix PATH : "${stdenv.lib.makeBinPath [ openssl coreutils gnused gnugrep diffutils curl gawk ]}"
+    '';
+
+  meta = with stdenv.lib; {
+    inherit (src.meta) homepage;
+    description = "Letsencrypt/acme client implemented as a shell-script";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = [ maintainers.pstn ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/docker-credential-gcr/default.nix b/nixpkgs/pkgs/tools/admin/docker-credential-gcr/default.nix
new file mode 100644
index 000000000000..d45a57c32211
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/docker-credential-gcr/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, buildGoPackage, fetchFromGitHub }:
+
+buildGoPackage rec {
+  pname = "docker-credential-gcr";
+  version = "2.0.2";
+
+  goPackagePath = "github.com/GoogleCloudPlatform/docker-credential-gcr";
+
+  src = fetchFromGitHub {
+    owner = "GoogleCloudPlatform";
+    repo = "docker-credential-gcr";
+    rev = "v${version}";
+    sha256 = "0m7jx669yf27z2g9gw9vwncpwldrcb3ldlf1xhvbwbijnc2jk866";
+  };
+
+  meta = with stdenv.lib; {
+    description = "A Docker credential helper for GCR (https://gcr.io) users";
+    longDescription = ''
+      docker-credential-gcr is Google Container Registry's Docker credential
+      helper. It allows for Docker clients v1.11+ to easily make
+      authenticated requests to GCR's repositories (gcr.io, eu.gcr.io, etc.).
+    '';
+    homepage = "https://github.com/GoogleCloudPlatform/docker-credential-gcr";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ suvash ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/docker-credential-helpers/default.nix b/nixpkgs/pkgs/tools/admin/docker-credential-helpers/default.nix
new file mode 100644
index 000000000000..38762b6fd29c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/docker-credential-helpers/default.nix
@@ -0,0 +1,49 @@
+{ stdenv, buildGoPackage, fetchFromGitHub, pkg-config, libsecret }:
+
+buildGoPackage rec {
+  pname = "docker-credential-helpers";
+  version = "0.6.3";
+
+  goPackagePath = "github.com/docker/docker-credential-helpers";
+
+  src = fetchFromGitHub {
+    owner = "docker";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0xgmwjva3j1s0cqkbajbamj13bgzh5jkf2ir54m9a7w8gjnsh6dx";
+  };
+
+  nativeBuildInputs = stdenv.lib.optionals stdenv.isLinux [ pkg-config ];
+
+  buildInputs = stdenv.lib.optionals stdenv.isLinux [ libsecret ];
+
+  buildPhase =
+    if stdenv.isDarwin
+    then ''
+      cd go/src/${goPackagePath}
+      go build -ldflags -s -o bin/docker-credential-osxkeychain osxkeychain/cmd/main_darwin.go
+    ''
+    else ''
+      cd go/src/${goPackagePath}
+      go build -o bin/docker-credential-secretservice secretservice/cmd/main_linux.go
+      go build -o bin/docker-credential-pass pass/cmd/main_linux.go
+    '';
+
+  installPhase =
+    if stdenv.isDarwin
+    then ''
+      install -Dm755 -t $out/bin bin/docker-credential-osxkeychain
+    ''
+    else ''
+      install -Dm755 -t $out/bin bin/docker-credential-pass
+      install -Dm755 -t $out/bin bin/docker-credential-secretservice
+    '';
+
+  meta = with stdenv.lib; {
+    description = "Suite of programs to use native stores to keep Docker credentials safe";
+    homepage = "https://github.com/docker/docker-credential-helpers";
+    license = licenses.mit;
+    maintainers = [ maintainers.marsam ];
+    platforms = platforms.linux ++ platforms.darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/eksctl/default.nix b/nixpkgs/pkgs/tools/admin/eksctl/default.nix
new file mode 100644
index 000000000000..74cc3f3f1711
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/eksctl/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildGoModule, fetchFromGitHub, installShellFiles }:
+
+buildGoModule rec {
+  pname = "eksctl";
+  version = "0.27.0";
+
+  src = fetchFromGitHub {
+    owner = "weaveworks";
+    repo = pname;
+    rev = version;
+    sha256 = "1yclffhr76jd5rzqi37bpdj524lmywmgcfr9r0ahacfkp1hxdn3v";
+  };
+
+  vendorSha256 = "133g2d7l1szmpxjdg28yjm3pw6galwq8948rvalnh932kxngkxys";
+
+  doCheck = false;
+
+  subPackages = [ "cmd/eksctl" ];
+
+  buildFlags = [ "-tags netgo" "-tags release" ];
+
+  buildFlagsArray = [
+    "-ldflags=-s -w -X github.com/weaveworks/eksctl/pkg/version.gitCommit=${src.rev} -X github.com/weaveworks/eksctl/pkg/version.buildDate=19700101-00:00:00"
+  ];
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  postInstall = ''
+    for shell in bash fish zsh; do
+      $out/bin/eksctl completion $shell > eksctl.$shell
+      installShellCompletion eksctl.$shell
+    done
+  '';
+
+  meta = with lib; {
+    description = "A CLI for Amazon EKS";
+    homepage = "https://github.com/weaveworks/eksctl";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ xrelkd Chili-Man ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/elasticsearch-curator/default.nix b/nixpkgs/pkgs/tools/admin/elasticsearch-curator/default.nix
new file mode 100644
index 000000000000..60a7e0586f5f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/elasticsearch-curator/default.nix
@@ -0,0 +1,83 @@
+{ lib, fetchFromGitHub, python }:
+
+let
+py = python.override {
+  packageOverrides = self: super: {
+    click = super.click.overridePythonAttrs (oldAttrs: rec {
+      version = "6.7";
+      src = oldAttrs.src.override {
+        inherit version;
+        sha256 = "f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b";
+      };
+      doCheck = false;
+      postPatch = "";
+    });
+  };
+};
+in
+
+with py.pkgs;
+buildPythonApplication rec {
+  pname   = "elasticsearch-curator";
+  version = "5.8.1";
+
+  src = fetchFromGitHub {
+    owner = "elastic";
+    repo = "curator";
+    rev = "v${version}";
+    sha256 = "1shr9jslirjnbvma3p19djsnamxl7f3m9c8zrlclk57zv8rnwpkr";
+  };
+
+  # The test hangs so we disable it.
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    click
+    certifi
+    requests-aws4auth
+    pyopenssl
+    voluptuous
+    pyyaml
+    elasticsearch
+    boto3
+  ];
+
+  checkInputs = [
+    nosexcover
+    coverage
+    nose
+    mock
+    funcsigs
+  ];
+
+  postPatch = ''
+    sed -i s/pyyaml==3.13/pyyaml/g setup.cfg setup.py
+    sed -i s/pyyaml==3.12/pyyaml/g setup.cfg setup.py
+    substituteInPlace setup.py \
+      --replace "urllib3>=1.24.2,<1.25" "urllib3"
+    substituteInPlace setup.cfg \
+      --replace "urllib3>=1.24.2,<1.25" "urllib3"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/elastic/curator";
+    description = "Curate, or manage, your Elasticsearch indices and snapshots";
+    license = licenses.asl20;
+    longDescription = ''
+      Elasticsearch Curator helps you curate, or manage, your Elasticsearch
+      indices and snapshots by:
+
+      * Obtaining the full list of indices (or snapshots) from the cluster, as the
+        actionable list
+
+      * Iterate through a list of user-defined filters to progressively remove
+        indices (or snapshots) from this actionable list as needed.
+
+      * Perform various actions on the items which remain in the actionable list.
+    '';
+    maintainers = with maintainers; [ basvandijk ];
+
+    # https://github.com/elastic/curator/pull/1280
+    #broken = versionAtLeast click.version "7.0";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/exoscale-cli/default.nix b/nixpkgs/pkgs/tools/admin/exoscale-cli/default.nix
new file mode 100644
index 000000000000..41fc026092db
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/exoscale-cli/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, buildGoPackage, fetchFromGitHub }:
+
+buildGoPackage rec {
+  pname = "exoscale-cli";
+  version = "1.17.0";
+
+  src = fetchFromGitHub {
+    owner  = "exoscale";
+    repo   = "cli";
+    rev    = "v${version}";
+    sha256 = "01bll978dis8pqvgrbigzgszkx3kjm6acrw44z6j7algw3an352r";
+  };
+
+  goPackagePath = "github.com/exoscale/cli";
+
+  buildFlagsArray = [ "-ldflags=-s -w -X main.version=${version} -X main.commit=${src.rev}" ];
+
+  # ensures only the cli binary is built and we don't clutter bin/ with submodules
+  subPackages = [ "." ];
+
+  # we need to rename the resulting binary but can't use buildFlags with -o here
+  # because these are passed to "go install" which does not recognize -o
+  postBuild = ''
+    mv go/bin/cli go/bin/exo
+  '';
+
+  meta = {
+    description = "Command-line tool for everything at Exoscale: compute, storage, dns";
+    homepage    = "https://github.com/exoscale/cli";
+    license     = stdenv.lib.licenses.asl20;
+    maintainers = with stdenv.lib.maintainers; [ dramaturg ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/fastlane/Gemfile b/nixpkgs/pkgs/tools/admin/fastlane/Gemfile
new file mode 100644
index 000000000000..1fa8dbca63b1
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/fastlane/Gemfile
@@ -0,0 +1,2 @@
+source 'https://rubygems.org'
+gem 'fastlane'
diff --git a/nixpkgs/pkgs/tools/admin/fastlane/Gemfile.lock b/nixpkgs/pkgs/tools/admin/fastlane/Gemfile.lock
new file mode 100644
index 000000000000..1bfce8606532
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/fastlane/Gemfile.lock
@@ -0,0 +1,179 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    CFPropertyList (3.0.2)
+    addressable (2.7.0)
+      public_suffix (>= 2.0.2, < 5.0)
+    atomos (0.1.3)
+    aws-eventstream (1.1.0)
+    aws-partitions (1.320.0)
+    aws-sdk-core (3.96.1)
+      aws-eventstream (~> 1, >= 1.0.2)
+      aws-partitions (~> 1, >= 1.239.0)
+      aws-sigv4 (~> 1.1)
+      jmespath (~> 1.0)
+    aws-sdk-kms (1.31.0)
+      aws-sdk-core (~> 3, >= 3.71.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-s3 (1.66.0)
+      aws-sdk-core (~> 3, >= 3.96.1)
+      aws-sdk-kms (~> 1)
+      aws-sigv4 (~> 1.1)
+    aws-sigv4 (1.1.3)
+      aws-eventstream (~> 1.0, >= 1.0.2)
+    babosa (1.0.3)
+    claide (1.0.3)
+    colored (1.2)
+    colored2 (3.1.2)
+    commander-fastlane (4.4.6)
+      highline (~> 1.7.2)
+    declarative (0.0.10)
+    declarative-option (0.1.0)
+    digest-crc (0.5.1)
+    domain_name (0.5.20190701)
+      unf (>= 0.0.5, < 1.0.0)
+    dotenv (2.7.5)
+    emoji_regex (1.0.1)
+    excon (0.73.0)
+    faraday (1.0.1)
+      multipart-post (>= 1.2, < 3)
+    faraday-cookie_jar (0.0.6)
+      faraday (>= 0.7.4)
+      http-cookie (~> 1.0.0)
+    faraday_middleware (1.0.0)
+      faraday (~> 1.0)
+    fastimage (2.1.7)
+    fastlane (2.148.1)
+      CFPropertyList (>= 2.3, < 4.0.0)
+      addressable (>= 2.3, < 3.0.0)
+      aws-sdk-s3 (~> 1.0)
+      babosa (>= 1.0.2, < 2.0.0)
+      bundler (>= 1.12.0, < 3.0.0)
+      colored
+      commander-fastlane (>= 4.4.6, < 5.0.0)
+      dotenv (>= 2.1.1, < 3.0.0)
+      emoji_regex (>= 0.1, < 2.0)
+      excon (>= 0.71.0, < 1.0.0)
+      faraday (>= 0.17, < 2.0)
+      faraday-cookie_jar (~> 0.0.6)
+      faraday_middleware (>= 0.13.1, < 2.0)
+      fastimage (>= 2.1.0, < 3.0.0)
+      gh_inspector (>= 1.1.2, < 2.0.0)
+      google-api-client (>= 0.37.0, < 0.39.0)
+      google-cloud-storage (>= 1.15.0, < 2.0.0)
+      highline (>= 1.7.2, < 2.0.0)
+      json (< 3.0.0)
+      jwt (~> 2.1.0)
+      mini_magick (>= 4.9.4, < 5.0.0)
+      multi_xml (~> 0.5)
+      multipart-post (~> 2.0.0)
+      plist (>= 3.1.0, < 4.0.0)
+      public_suffix (~> 2.0.0)
+      rubyzip (>= 1.3.0, < 2.0.0)
+      security (= 0.1.3)
+      simctl (~> 1.6.3)
+      slack-notifier (>= 2.0.0, < 3.0.0)
+      terminal-notifier (>= 2.0.0, < 3.0.0)
+      terminal-table (>= 1.4.5, < 2.0.0)
+      tty-screen (>= 0.6.3, < 1.0.0)
+      tty-spinner (>= 0.8.0, < 1.0.0)
+      word_wrap (~> 1.0.0)
+      xcodeproj (>= 1.13.0, < 2.0.0)
+      xcpretty (~> 0.3.0)
+      xcpretty-travis-formatter (>= 0.0.3)
+    gh_inspector (1.1.3)
+    google-api-client (0.38.0)
+      addressable (~> 2.5, >= 2.5.1)
+      googleauth (~> 0.9)
+      httpclient (>= 2.8.1, < 3.0)
+      mini_mime (~> 1.0)
+      representable (~> 3.0)
+      retriable (>= 2.0, < 4.0)
+      signet (~> 0.12)
+    google-cloud-core (1.5.0)
+      google-cloud-env (~> 1.0)
+      google-cloud-errors (~> 1.0)
+    google-cloud-env (1.3.1)
+      faraday (>= 0.17.3, < 2.0)
+    google-cloud-errors (1.0.0)
+    google-cloud-storage (1.26.1)
+      addressable (~> 2.5)
+      digest-crc (~> 0.4)
+      google-api-client (~> 0.33)
+      google-cloud-core (~> 1.2)
+      googleauth (~> 0.9)
+      mini_mime (~> 1.0)
+    googleauth (0.12.0)
+      faraday (>= 0.17.3, < 2.0)
+      jwt (>= 1.4, < 3.0)
+      memoist (~> 0.16)
+      multi_json (~> 1.11)
+      os (>= 0.9, < 2.0)
+      signet (~> 0.14)
+    highline (1.7.10)
+    http-cookie (1.0.3)
+      domain_name (~> 0.5)
+    httpclient (2.8.3)
+    jmespath (1.4.0)
+    json (2.3.0)
+    jwt (2.1.0)
+    memoist (0.16.2)
+    mini_magick (4.10.1)
+    mini_mime (1.0.2)
+    multi_json (1.14.1)
+    multi_xml (0.6.0)
+    multipart-post (2.0.0)
+    nanaimo (0.2.6)
+    naturally (2.2.0)
+    os (1.1.0)
+    plist (3.5.0)
+    public_suffix (2.0.5)
+    representable (3.0.4)
+      declarative (< 0.1.0)
+      declarative-option (< 0.2.0)
+      uber (< 0.2.0)
+    retriable (3.1.2)
+    rouge (2.0.7)
+    rubyzip (1.3.0)
+    security (0.1.3)
+    signet (0.14.0)
+      addressable (~> 2.3)
+      faraday (>= 0.17.3, < 2.0)
+      jwt (>= 1.5, < 3.0)
+      multi_json (~> 1.10)
+    simctl (1.6.8)
+      CFPropertyList
+      naturally
+    slack-notifier (2.3.2)
+    terminal-notifier (2.0.0)
+    terminal-table (1.8.0)
+      unicode-display_width (~> 1.1, >= 1.1.1)
+    tty-cursor (0.7.1)
+    tty-screen (0.7.1)
+    tty-spinner (0.9.3)
+      tty-cursor (~> 0.7)
+    uber (0.1.0)
+    unf (0.1.4)
+      unf_ext
+    unf_ext (0.0.7.7)
+    unicode-display_width (1.7.0)
+    word_wrap (1.0.0)
+    xcodeproj (1.16.0)
+      CFPropertyList (>= 2.3.3, < 4.0)
+      atomos (~> 0.1.3)
+      claide (>= 1.0.2, < 2.0)
+      colored2 (~> 3.1)
+      nanaimo (~> 0.2.6)
+    xcpretty (0.3.0)
+      rouge (~> 2.0.7)
+    xcpretty-travis-formatter (1.0.0)
+      xcpretty (~> 0.2, >= 0.0.7)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  fastlane
+
+BUNDLED WITH
+   2.1.4
\ No newline at end of file
diff --git a/nixpkgs/pkgs/tools/admin/fastlane/default.nix b/nixpkgs/pkgs/tools/admin/fastlane/default.nix
new file mode 100644
index 000000000000..1093ab9df028
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/fastlane/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, bundlerEnv, ruby, bundlerUpdateScript, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "fastlane";
+  version = (import ./gemset.nix).fastlane.version;
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  phases = [ "installPhase" ];
+
+  installPhase = let
+    env = bundlerEnv {
+      name = "${pname}-${version}-gems";
+      inherit pname ruby;
+      gemdir = ./.;
+    };
+  in ''
+    mkdir -p $out/bin
+    makeWrapper ${env}/bin/fastlane $out/bin/fastlane \
+     --set FASTLANE_SKIP_UPDATE_CHECK 1
+  '';
+
+  passthru.updateScript = bundlerUpdateScript "fastlane";
+
+  meta = with stdenv.lib; {
+    description     = "A tool to automate building and releasing iOS and Android apps";
+    longDescription = "fastlane is a tool for iOS and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application.";
+    homepage        = "https://github.com/fastlane/fastlane";
+    license         = licenses.mit;
+    maintainers     = with maintainers; [
+      peterromfeldhk
+      nicknovitski
+      shahrukh330
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/fastlane/gemset.nix b/nixpkgs/pkgs/tools/admin/fastlane/gemset.nix
new file mode 100644
index 000000000000..e289bc6f17d2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/fastlane/gemset.nix
@@ -0,0 +1,738 @@
+{
+  addressable = {
+    dependencies = ["public_suffix"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fvchp2rhp2rmigx7qglf69xvjqvzq7x0g49naliw29r2bz656sy";
+      type = "gem";
+    };
+    version = "2.7.0";
+  };
+  atomos = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17vq6sjyswr5jfzwdccw748kgph6bdw30bakwnn6p8sl4hpv4hvx";
+      type = "gem";
+    };
+    version = "0.1.3";
+  };
+  aws-eventstream = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0r0pn66yqrdkrfdin7qdim0yj2x75miyg4wp6mijckhzhrjb7cv5";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  aws-partitions = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "011ch85shkb3i3w16jymjx19dmxcgb6jrl6dzwqr4bx16ikdyclc";
+      type = "gem";
+    };
+    version = "1.320.0";
+  };
+  aws-sdk-core = {
+    dependencies = ["aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0jdnzynjrpp2jyg8vrbfbaad16k8ni1520xah1z2ckl5779x9fi6";
+      type = "gem";
+    };
+    version = "3.96.1";
+  };
+  aws-sdk-kms = {
+    dependencies = ["aws-sdk-core" "aws-sigv4"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1czxr6yi8p9gma4dwgygp1jn0i289hwa2vw69kzfscgbn118c3mm";
+      type = "gem";
+    };
+    version = "1.31.0";
+  };
+  aws-sdk-s3 = {
+    dependencies = ["aws-sdk-core" "aws-sdk-kms" "aws-sigv4"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1x1d1azxwanvm0d7qppw41x5nx2zv0bcz41yk9vqi5lvr7apaq13";
+      type = "gem";
+    };
+    version = "1.66.0";
+  };
+  aws-sigv4 = {
+    dependencies = ["aws-eventstream"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kysxyw1zkvggbmcj4xnscdh15kxli8mx07hv447h74g9x02drsd";
+      type = "gem";
+    };
+    version = "1.1.3";
+  };
+  babosa = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10nn9bw63i4awpzn5vrx6kmpx1sg7z8r3fhw9r8bvg9pz2wh489g";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  CFPropertyList = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1825ll26p28swjiw8n3x2pnh5ygsmg83spf82fnzcjn2p87vc5lf";
+      type = "gem";
+    };
+    version = "3.0.2";
+  };
+  claide = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kasxsms24fgcdsq680nz99d5lazl9rmz1qkil2y5gbbssx89g0z";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  colored = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0b0x5jmsyi0z69bm6sij1k89z7h0laag3cb4mdn7zkl9qmxb90lx";
+      type = "gem";
+    };
+    version = "1.2";
+  };
+  colored2 = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0jlbqa9q4mvrm73aw9mxh23ygzbjiqwisl32d8szfb5fxvbjng5i";
+      type = "gem";
+    };
+    version = "3.1.2";
+  };
+  commander-fastlane = {
+    dependencies = ["highline"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0y8d3ac9qwm1cg6rnpf8rcdsy1yxacrd2g2kl809xsp2vi973g65";
+      type = "gem";
+    };
+    version = "4.4.6";
+  };
+  declarative = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0642xvwzzbgi3kp1bg467wma4g3xqrrn0sk369hjam7w579gnv5j";
+      type = "gem";
+    };
+    version = "0.0.10";
+  };
+  declarative-option = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1g4ibxq566f1frnhdymzi9hxxcm4g2gw4n21mpjk2mhwym4q6l0p";
+      type = "gem";
+    };
+    version = "0.1.0";
+  };
+  digest-crc = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10f10yhz7rn31pq859jx47dypsfsxcmx8h482xn7aijfr6vn8yv9";
+      type = "gem";
+    };
+    version = "0.5.1";
+  };
+  domain_name = {
+    dependencies = ["unf"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lcqjsmixjp52bnlgzh4lg9ppsk52x9hpwdjd53k8jnbah2602h0";
+      type = "gem";
+    };
+    version = "0.5.20190701";
+  };
+  dotenv = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17hkd62ig9b0czv192kqdfq7gw0a8hgq07yclri6myc8y5lmfin5";
+      type = "gem";
+    };
+    version = "2.7.5";
+  };
+  emoji_regex = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jfsv8ik2h1msqf3if1f121pnx3lccp8fqnka9na309mnw3bq532";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  excon = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zvphy60fwycl6z2h7dpsy9lgyfrh27fj16987p7bl1n4xlqkvmw";
+      type = "gem";
+    };
+    version = "0.73.0";
+  };
+  faraday = {
+    dependencies = ["multipart-post"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0wwks9652xwgjm7yszcq5xr960pjypc07ivwzbjzpvy9zh2fw6iq";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  faraday-cookie_jar = {
+    dependencies = ["faraday" "http-cookie"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1di4gx6446a6zdkrpj679m5k515i53wvb4yxcsqvy8d8zacxiiv6";
+      type = "gem";
+    };
+    version = "0.0.6";
+  };
+  faraday_middleware = {
+    dependencies = ["faraday"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0jik2kgfinwnfi6fpp512vlvs0mlggign3gkbpkg5fw1jr9his0r";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  fastimage = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06lgsy1zdkhhgd9w1c0nb7v9d38mljwz13n6gi3acbzkhz1sf642";
+      type = "gem";
+    };
+    version = "2.1.7";
+  };
+  fastlane = {
+    dependencies = ["CFPropertyList" "addressable" "aws-sdk-s3" "babosa" "colored" "commander-fastlane" "dotenv" "emoji_regex" "excon" "faraday" "faraday-cookie_jar" "faraday_middleware" "fastimage" "gh_inspector" "google-api-client" "google-cloud-storage" "highline" "json" "jwt" "mini_magick" "multi_xml" "multipart-post" "plist" "public_suffix" "rubyzip" "security" "simctl" "slack-notifier" "terminal-notifier" "terminal-table" "tty-screen" "tty-spinner" "word_wrap" "xcodeproj" "xcpretty" "xcpretty-travis-formatter"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jss8cpcngwrmpck6ncijksrfcj5csgljwn2rmqv9gx1azj4mlgv";
+      type = "gem";
+    };
+    version = "2.148.1";
+  };
+  gh_inspector = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0f8r9byajj3bi2c7c5sqrc7m0zrv3nblfcd4782lw5l73cbsgk04";
+      type = "gem";
+    };
+    version = "1.1.3";
+  };
+  google-api-client = {
+    dependencies = ["addressable" "googleauth" "httpclient" "mini_mime" "representable" "retriable" "signet"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jybks8i00rxrxx9mkx90dbdk6pczh2w757wchlavmrkrk0dp9s1";
+      type = "gem";
+    };
+    version = "0.38.0";
+  };
+  google-cloud-core = {
+    dependencies = ["google-cloud-env" "google-cloud-errors"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1qjn7vs8f85vxi1nkikbjfja6bv9snrj26vzscjii0cm8n4dy0i1";
+      type = "gem";
+    };
+    version = "1.5.0";
+  };
+  google-cloud-env = {
+    dependencies = ["faraday"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rbascsddvwsq827fj4m2daqh0l3ghmdlbbhy48clgaysapaz685";
+      type = "gem";
+    };
+    version = "1.3.1";
+  };
+  google-cloud-errors = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0nl08lhgjvz3g7nsarn9nnsck0k3dg8mwg4awcnklnzpvs62b4ih";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  google-cloud-storage = {
+    dependencies = ["addressable" "digest-crc" "google-api-client" "google-cloud-core" "googleauth" "mini_mime"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1wdnd5wisbrlivapdr7bcg8v59hayqz3q5qiqs0628g371lwx30k";
+      type = "gem";
+    };
+    version = "1.26.1";
+  };
+  googleauth = {
+    dependencies = ["faraday" "jwt" "memoist" "multi_json" "os" "signet"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rsk471ld98pxhvzig3lnw9i13454c9nschvzxvq6vjqnn9ip0yh";
+      type = "gem";
+    };
+    version = "0.12.0";
+  };
+  highline = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01ib7jp85xjc4gh4jg0wyzllm46hwv8p0w1m4c75pbgi41fps50y";
+      type = "gem";
+    };
+    version = "1.7.10";
+  };
+  http-cookie = {
+    dependencies = ["domain_name"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "004cgs4xg5n6byjs7qld0xhsjq3n6ydfh897myr2mibvh6fjc49g";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  httpclient = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19mxmvghp7ki3klsxwrlwr431li7hm1lczhhj8z4qihl2acy8l99";
+      type = "gem";
+    };
+    version = "2.8.3";
+  };
+  jmespath = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1d4wac0dcd1jf6kc57891glih9w57552zgqswgy74d1xhgnk0ngf";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  json = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0nrmw2r4nfxlfgprfgki3hjifgrcrs3l5zvm3ca3gb4743yr25mn";
+      type = "gem";
+    };
+    version = "2.3.0";
+  };
+  jwt = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1w0kaqrbl71cq9sbnixc20x5lqah3hs2i93xmhlfdg2y3by7yzky";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  memoist = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0i9wpzix3sjhf6d9zw60dm4371iq8kyz7ckh2qapan2vyaim6b55";
+      type = "gem";
+    };
+    version = "0.16.2";
+  };
+  mini_magick = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lpq12z70n10c1qshcddd5nib2pkcbkwzvmiqqzj60l01k3x4fg9";
+      type = "gem";
+    };
+    version = "4.10.1";
+  };
+  mini_mime = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1axm0rxyx3ss93wbmfkm78a6x03l8y4qy60rhkkiq0aza0vwq3ha";
+      type = "gem";
+    };
+    version = "1.0.2";
+  };
+  multi_json = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xy54mjf7xg41l8qrg1bqri75agdqmxap9z466fjismc1rn2jwfr";
+      type = "gem";
+    };
+    version = "1.14.1";
+  };
+  multi_xml = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lmd4f401mvravi1i1yq7b2qjjli0yq7dfc4p1nj5nwajp7r6hyj";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  multipart-post = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09k0b3cybqilk1gwrwwain95rdypixb2q9w65gd44gfzsd84xi1x";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+  nanaimo = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ajfyaqjw3dzykk612yw8sm21savfqy292hgps8h8l4lvxww1lz6";
+      type = "gem";
+    };
+    version = "0.2.6";
+  };
+  naturally = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0dzqdawqr4agx7zr1fr5zxdwl8vb5rhpz57l1lk7d2y46ha6l4l7";
+      type = "gem";
+    };
+    version = "2.2.0";
+  };
+  os = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xnynckvrn9ailkmkrmkldnpv8hmmbdwxr7c7iz27cl1cpcdd49n";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  plist = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ra0910xxbhfsmdi0ig36pr3q0khdqzwb5da3wg7y3n8d1sh9ffp";
+      type = "gem";
+    };
+    version = "3.5.0";
+  };
+  public_suffix = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "040jf98jpp6w140ghkhw2hvc1qx41zvywx5gj7r2ylr1148qnj7q";
+      type = "gem";
+    };
+    version = "2.0.5";
+  };
+  representable = {
+    dependencies = ["declarative" "declarative-option" "uber"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qm9rgi1j5a6nv726ka4mmixivlxfsg91h8rpp72wwd4vqbkkm07";
+      type = "gem";
+    };
+    version = "3.0.4";
+  };
+  retriable = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1q48hqws2dy1vws9schc0kmina40gy7sn5qsndpsfqdslh65snha";
+      type = "gem";
+    };
+    version = "3.1.2";
+  };
+  rouge = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0sfikq1q8xyqqx690iiz7ybhzx87am4w50w8f2nq36l3asw4x89d";
+      type = "gem";
+    };
+    version = "2.0.7";
+  };
+  rubyzip = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1qxc2zxwwipm6kviiar4gfhcakpx1jdcs89v6lvzivn5hq1xk78l";
+      type = "gem";
+    };
+    version = "1.3.0";
+  };
+  security = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ryjxs0j66wrbky2c08yf0mllwalvpg12rpxzbdx2rdhj3cbrlxa";
+      type = "gem";
+    };
+    version = "0.1.3";
+  };
+  signet = {
+    dependencies = ["addressable" "faraday" "jwt" "multi_json"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10g2667fvxnc50hcd1aywgsbf8j7nrckg3n7zjvywmyz82pwmpqp";
+      type = "gem";
+    };
+    version = "0.14.0";
+  };
+  simctl = {
+    dependencies = ["CFPropertyList" "naturally"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1v9rsdmg5c5kkf8ps47xnrfbvjnq11sbaifr186jwkh4npawz00x";
+      type = "gem";
+    };
+    version = "1.6.8";
+  };
+  slack-notifier = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pkfn99dhy5s526r6k8d87fwwb6j287ga9s7lxqmh60z28xqh3bv";
+      type = "gem";
+    };
+    version = "2.3.2";
+  };
+  terminal-notifier = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1slc0y8pjpw30hy21v8ypafi8r7z9jlj4bjbgz03b65b28i2n3bs";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+  terminal-table = {
+    dependencies = ["unicode-display_width"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1512cngw35hsmhvw4c05rscihc59mnj09m249sm9p3pik831ydqk";
+      type = "gem";
+    };
+    version = "1.8.0";
+  };
+  tty-cursor = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0j5zw041jgkmn605ya1zc151bxgxl6v192v2i26qhxx7ws2l2lvr";
+      type = "gem";
+    };
+    version = "0.7.1";
+  };
+  tty-screen = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jwgr2i3wilng3mx851xczmkzllbirmsmr42ik4amqyyvry1yzyf";
+      type = "gem";
+    };
+    version = "0.7.1";
+  };
+  tty-spinner = {
+    dependencies = ["tty-cursor"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hh5awmijnzw9flmh5ak610x1d00xiqagxa5mbr63ysggc26y0qf";
+      type = "gem";
+    };
+    version = "0.9.3";
+  };
+  uber = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1p1mm7mngg40x05z52md3mbamkng0zpajbzqjjwmsyw0zw3v9vjv";
+      type = "gem";
+    };
+    version = "0.1.0";
+  };
+  unf = {
+    dependencies = ["unf_ext"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9";
+      type = "gem";
+    };
+    version = "0.1.4";
+  };
+  unf_ext = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0wc47r23h063l8ysws8sy24gzh74mks81cak3lkzlrw4qkqb3sg4";
+      type = "gem";
+    };
+    version = "0.0.7.7";
+  };
+  unicode-display_width = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06i3id27s60141x6fdnjn5rar1cywdwy64ilc59cz937303q3mna";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  word_wrap = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1iyc5bc7dbgsd8j3yk1i99ral39f23l6wapi0083fbl19hid8mpm";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  xcodeproj = {
+    dependencies = ["CFPropertyList" "atomos" "claide" "colored2" "nanaimo"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bkk8y6lzd86w9yx72hd1nil3fkk5f0v3il9vm554gzpl6dhc2bi";
+      type = "gem";
+    };
+    version = "1.16.0";
+  };
+  xcpretty = {
+    dependencies = ["rouge"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xq47q2h5llj7b54rws4796904vnnjz7qqnacdv7wlp3gdbwrivm";
+      type = "gem";
+    };
+    version = "0.3.0";
+  };
+  xcpretty-travis-formatter = {
+    dependencies = ["xcpretty"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15b5c0lxz2blmichfdlabzlbyw5nlh1ci898pxwb661m9bahz3ml";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+}
\ No newline at end of file
diff --git a/nixpkgs/pkgs/tools/admin/fbvnc/default.nix b/nixpkgs/pkgs/tools/admin/fbvnc/default.nix
new file mode 100644
index 000000000000..ec32b5f0a268
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/fbvnc/default.nix
@@ -0,0 +1,30 @@
+{stdenv, fetchFromGitHub}:
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "fbvnc";
+  version = "1.0.2";
+
+  src = fetchFromGitHub {
+    owner = "zohead";
+    repo = pname;
+    sha256 = "0lkr4j1wsa05av2g9w99rr9w4j4k7a21vp36x0a3h50y8bmgwgm1";
+    rev = "783204ff6c92afec33d6d36f7e74f1fcf2b1b601";
+  };
+
+  buildInputs = [];
+
+  installPhase = ''
+    mkdir -p "$out/bin"
+    cp fbvnc "$out/bin"
+    mkdir -p "$out/share/doc/${pname}"
+    cp README* "$out/share/doc/${pname}"
+  '';
+
+  meta = {
+    description = "Framebuffer VNC client";
+    license = stdenv.lib.licenses.bsd3;
+    maintainers = [stdenv.lib.maintainers.raskin];
+    platforms = stdenv.lib.platforms.linux;
+    homepage = "https://github.com/zohead/fbvnc/";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/gixy/default.nix b/nixpkgs/pkgs/tools/admin/gixy/default.nix
new file mode 100644
index 000000000000..118457d40802
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/gixy/default.nix
@@ -0,0 +1,43 @@
+{ lib, fetchFromGitHub, python }:
+
+python.pkgs.buildPythonApplication rec {
+  pname = "gixy";
+  version = "0.1.20";
+
+  # package is only compatible with python 2.7 and 3.5+
+  disabled = with python.pkgs; !(pythonAtLeast "3.5" || isPy27);
+
+  # fetching from GitHub because the PyPi source is missing the tests
+  src = fetchFromGitHub {
+    owner = "yandex";
+    repo = "gixy";
+    rev = "v${version}";
+    sha256 = "14arz3fjidb8z37m08xcpih1391varj8s0v3gri79z3qb4zq5k6b";
+  };
+
+  postPatch = ''
+    sed -ie '/argparse/d' setup.py
+  '';
+
+  propagatedBuildInputs = with python.pkgs; [
+    cached-property
+    ConfigArgParse
+    pyparsing
+    jinja2
+    nose
+    setuptools
+    six
+  ];
+
+  meta = with lib; {
+    description = "Nginx configuration static analyzer";
+    longDescription = ''
+      Gixy is a tool to analyze Nginx configuration.
+      The main goal of Gixy is to prevent security misconfiguration and automate flaw detection.
+    '';
+    homepage = "https://github.com/yandex/gixy";
+    license = licenses.mpl20;
+    maintainers = [ maintainers.willibutz ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/google-cloud-sdk/alpha__init__.py b/nixpkgs/pkgs/tools/admin/google-cloud-sdk/alpha__init__.py
new file mode 100755
index 000000000000..d120969d8fb8
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/google-cloud-sdk/alpha__init__.py
@@ -0,0 +1,23 @@
+# Copyright 2013 Google Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Auth for the Google Cloud SDK.
+"""
+
+from googlecloudsdk.calliope import base
+
+
+@base.ReleaseTracks(base.ReleaseTrack.ALPHA)
+class Alpha(base.Group):
+  """Alpha versions of gcloud commands."""
diff --git a/nixpkgs/pkgs/tools/admin/google-cloud-sdk/beta__init__.py b/nixpkgs/pkgs/tools/admin/google-cloud-sdk/beta__init__.py
new file mode 100755
index 000000000000..bb52c5a0bc4a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/google-cloud-sdk/beta__init__.py
@@ -0,0 +1,23 @@
+# Copyright 2013 Google Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Auth for the Google Cloud SDK.
+"""
+
+from googlecloudsdk.calliope import base
+
+
+@base.ReleaseTracks(base.ReleaseTrack.BETA)
+class Beta(base.Group):
+  """Beta versions of gcloud commands."""
diff --git a/nixpkgs/pkgs/tools/admin/google-cloud-sdk/default.nix b/nixpkgs/pkgs/tools/admin/google-cloud-sdk/default.nix
new file mode 100644
index 000000000000..5a51ace3b986
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/google-cloud-sdk/default.nix
@@ -0,0 +1,105 @@
+# Make sure that the "with-gce" flag is set when building `google-cloud-sdk`
+# for GCE hosts. This flag prevents "google-compute-engine" from being a
+# default dependency which is undesirable because this package is
+#
+#   1) available only on GNU/Linux (requires `systemd` in particular)
+#   2) intended only for GCE guests (and is useless elsewhere)
+#   3) used by `google-cloud-sdk` only on GCE guests
+#
+
+{ stdenv, lib, fetchurl, makeWrapper, python, openssl, jq, with-gce ? false }:
+
+let
+  pythonEnv = python.withPackages (p: with p; [
+    cffi
+    cryptography
+    pyopenssl
+    crcmod
+  ] ++ lib.optional (with-gce) google-compute-engine);
+
+  baseUrl = "https://dl.google.com/dl/cloudsdk/channels/rapid/downloads";
+  sources = name: system: {
+    x86_64-darwin = {
+      url = "${baseUrl}/${name}-darwin-x86_64.tar.gz";
+      sha256 = "1l2r9pgyzih7xgrr2ygm0mcl97kyp1wfvybwhbn1i0kbb72nagk1";
+    };
+
+    x86_64-linux = {
+      url = "${baseUrl}/${name}-linux-x86_64.tar.gz";
+      sha256 = "1qbkdfa7dzysp7crv9ph476hbabl3qiszs067f20dadqssqs1v4r";
+    };
+  }.${system};
+
+in stdenv.mkDerivation rec {
+  pname = "google-cloud-sdk";
+  version = "306.0.0";
+
+  src = fetchurl (sources "${pname}-${version}" stdenv.hostPlatform.system);
+
+  buildInputs = [ python makeWrapper ];
+
+  nativeBuildInputs = [ jq ];
+
+  patches = [
+    ./gcloud-path.patch
+    ./gsutil-disable-updates.patch
+  ];
+
+  installPhase = ''
+    mkdir -p $out/google-cloud-sdk
+    cp -R * .install $out/google-cloud-sdk/
+
+    mkdir -p $out/google-cloud-sdk/lib/surface/{alpha,beta}
+    cp ${./alpha__init__.py} $out/google-cloud-sdk/lib/surface/alpha/__init__.py
+    cp ${./beta__init__.py} $out/google-cloud-sdk/lib/surface/beta/__init__.py
+
+    # create wrappers with correct env
+    for program in gcloud bq gsutil git-credential-gcloud.sh docker-credential-gcloud; do
+        programPath="$out/google-cloud-sdk/bin/$program"
+        binaryPath="$out/bin/$program"
+        wrapProgram "$programPath" \
+            --set CLOUDSDK_PYTHON "${pythonEnv}/bin/python" \
+            --prefix PYTHONPATH : "${pythonEnv}/${python.sitePackages}" \
+            --prefix PATH : "${openssl.bin}/bin"
+
+        mkdir -p $out/bin
+        ln -s $programPath $binaryPath
+    done
+
+    # disable component updater and update check
+    substituteInPlace $out/google-cloud-sdk/lib/googlecloudsdk/core/config.json \
+      --replace "\"disable_updater\": false" "\"disable_updater\": true"
+    echo "
+    [component_manager]
+    disable_update_check = true" >> $out/google-cloud-sdk/properties
+
+    # setup bash completion
+    mkdir -p $out/etc/bash_completion.d
+    mv $out/google-cloud-sdk/completion.bash.inc $out/etc/bash_completion.d/gcloud.inc
+
+    # This directory contains compiled mac binaries. We used crcmod from
+    # nixpkgs instead.
+    rm -r $out/google-cloud-sdk/platform/gsutil/third_party/crcmod \
+          $out/google-cloud-sdk/platform/gsutil/third_party/crcmod_osx
+
+    # remove tests and test data
+    find $out -name tests -type d -exec rm -rf '{}' +
+    rm $out/google-cloud-sdk/platform/gsutil/gslib/commands/test.py
+
+    # compact all the JSON
+    find $out -name \*.json | while read path; do
+      jq -c . $path > $path.min
+      mv $path.min $path
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Tools for the google cloud platform";
+    longDescription = "The Google Cloud SDK. This package has the programs: gcloud, gsutil, and bq";
+    # This package contains vendored dependencies. All have free licenses.
+    license = licenses.free;
+    homepage = "https://cloud.google.com/sdk/";
+    maintainers = with maintainers; [ pradyuman stephenmw zimbatm ];
+    platforms = [ "x86_64-linux" "x86_64-darwin" ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/google-cloud-sdk/gcloud-path.patch b/nixpkgs/pkgs/tools/admin/google-cloud-sdk/gcloud-path.patch
new file mode 100644
index 000000000000..64ec6cdb1b65
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/google-cloud-sdk/gcloud-path.patch
@@ -0,0 +1,47 @@
+From b69fee70154a861637c82e98e18be01bbb96423b Mon Sep 17 00:00:00 2001
+From: Florian Klink <flokli@flokli.de>
+Date: Wed, 12 Jun 2019 17:03:09 +0200
+Subject: [PATCH] kubeconfig: don't store absolute path to gcloud binary
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The `gcloud beta container clusters get-credentials $cluster \
+--region $region --project $project`
+command can be used to write kubectl config files.
+
+In that file, normally the absolute path to the `gcloud` binary is
+stored.
+
+This is a bad idea in NixOS. We might eventually garbage-collect that
+specific gcloud binary - and in general, would expect a nix-shell
+provided gcloud to be used.
+
+In its current state, token renewal would just start to break with the
+following error message:
+
+Unable to connect to the server: error executing access token command "/nix/store/…/gcloud config config-helper --format=json": err=fork/exec /nix/store/…/gcloud: no such file or directory output= stderr=
+
+Avoid this by storing just `gcloud` inside `cmd-path`, which causes
+kubectl to lookup the gcloud command from $PATH, which is more likely to
+keep working.
+---
+ lib/googlecloudsdk/api_lib/container/kubeconfig.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/googlecloudsdk/api_lib/container/kubeconfig.py b/lib/googlecloudsdk/api_lib/container/kubeconfig.py
+index 4330988d6..37424b841 100644
+--- a/lib/googlecloudsdk/api_lib/container/kubeconfig.py
++++ b/lib/googlecloudsdk/api_lib/container/kubeconfig.py
+@@ -255,7 +255,7 @@ def _AuthProvider(name='gcp'):
+       raise Error(SDK_BIN_PATH_NOT_FOUND)
+     cfg = {
+         # Command for gcloud credential helper
+-        'cmd-path': os.path.join(sdk_bin_path, bin_name),
++        'cmd-path': bin_name,
+         # Args for gcloud credential helper
+         'cmd-args': 'config config-helper --format=json',
+         # JSONpath to the field that is the raw access token
+-- 
+2.21.0
+
diff --git a/nixpkgs/pkgs/tools/admin/google-cloud-sdk/gsutil-disable-updates.patch b/nixpkgs/pkgs/tools/admin/google-cloud-sdk/gsutil-disable-updates.patch
new file mode 100644
index 000000000000..de44ea7e7915
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/google-cloud-sdk/gsutil-disable-updates.patch
@@ -0,0 +1,50 @@
+diff --git a/platform/gsutil/gslib/command_runner.py b/platform/gsutil/gslib/command_runner.py
+index 06ca5e5..4a4e225 100644
+--- a/platform/gsutil/gslib/command_runner.py
++++ b/platform/gsutil/gslib/command_runner.py
+@@ -61,7 +61,6 @@ from gslib.utils.text_util import InsistAsciiHeaderValue
+ from gslib.utils.text_util import print_to_fd
+ from gslib.utils.unit_util import SECONDS_PER_DAY
+ from gslib.utils.update_util import LookUpGsutilVersion
+-from gslib.tests.util import HAS_NON_DEFAULT_GS_HOST
+ 
+ 
+ def HandleHeaderCoding(headers):
+@@ -331,17 +330,6 @@ class CommandRunner(object):
+     Returns:
+       Return value(s) from Command that was run.
+     """
+-    command_changed_to_update = False
+-    if (not skip_update_check and
+-        self.MaybeCheckForAndOfferSoftwareUpdate(command_name, debug)):
+-      command_name = 'update'
+-      command_changed_to_update = True
+-      args = [_StringToSysArgType('-n')]
+-
+-      # Check for opt-in analytics.
+-      if system_util.IsRunningInteractively() and collect_analytics:
+-        metrics.CheckAndMaybePromptForAnalyticsEnabling()
+-
+     if not args:
+       args = []
+ 
+@@ -414,18 +402,10 @@ class CommandRunner(object):
+       ShutDownGsutil()
+     if GetFailureCount() > 0:
+       return_code = 1
+-    if command_changed_to_update:
+-      # If the command changed to update, the user's original command was
+-      # not executed.
+-      return_code = 1
+-      print('\n'.join(
+-          textwrap.wrap(
+-              'Update was successful. Exiting with code 1 as the original command '
+-              'issued prior to the update was not executed and should be re-run.'
+-          )))
+     return return_code
+ 
+   def MaybeCheckForAndOfferSoftwareUpdate(self, command_name, debug):
++    return False
+     """Checks the last time we checked for an update and offers one if needed.
+ 
+     Offer is made if the time since the last update check is longer
diff --git a/nixpkgs/pkgs/tools/admin/gtk-vnc/default.nix b/nixpkgs/pkgs/tools/admin/gtk-vnc/default.nix
new file mode 100644
index 000000000000..afaa237d342c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/gtk-vnc/default.nix
@@ -0,0 +1,78 @@
+{ stdenv
+, fetchurl
+, fetchpatch
+, meson
+, ninja
+, gobject-introspection
+, gnutls
+, cairo
+, glib
+, pkgconfig
+, cyrus_sasl
+, libpulseaudio
+, libgcrypt
+, gtk3
+, vala
+, gettext
+, perl
+, gnome3
+, gdk-pixbuf
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gtk-vnc";
+  version = "1.0.0";
+
+  outputs = [ "out" "bin" "man" "dev" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "1060ws037v556rx1qhfrcg02859rscksrzr8fq11himdg4d1y6m8";
+  };
+
+  patches = [
+    # Fix undeclared gio-unix-2.0 in example program.
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gtk-vnc/commit/8588bc1c8321152ddc5086ca9b2c03a7f511e0d0.patch";
+      sha256 = "0i1iapsbngl1mhnz22dd73mnzk68qc4n51pqdhnm18zqc8pawvh4";
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkgconfig
+    gobject-introspection
+    vala
+    gettext
+    perl # for pod2man
+  ];
+
+  buildInputs = [
+    gnutls
+    cairo
+    gdk-pixbuf
+    zlib
+    glib
+    libgcrypt
+    cyrus_sasl
+    libpulseaudio
+    gtk3
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      versionPolicy = "none";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "GTK VNC widget";
+    homepage = "https://wiki.gnome.org/Projects/gtk-vnc";
+    license = licenses.lgpl2Plus;
+    maintainers = with maintainers; [ raskin offline ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/iamy/default.nix b/nixpkgs/pkgs/tools/admin/iamy/default.nix
new file mode 100644
index 000000000000..1a668777e2e6
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/iamy/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "iamy";
+  version = "2.3.2";
+
+  src = fetchFromGitHub {
+    owner = "99designs";
+    repo = "iamy";
+    rev = "v${version}";
+    sha256 = "1fypc6yjnhlpk7zhb2lvah2ikh2zji9sll55rqjbr3i4j02h484z";
+  };
+
+  vendorSha256 = "0c4g1zr0wl118g41hqri0vwvfin39yvgs214w3spw8ggjcj6bzph";
+
+  doCheck = false;
+
+  buildFlagsArray = [''-ldflags=
+    -X main.Version=v${version} -s -w
+  ''];
+
+  meta = with stdenv.lib; {
+    description = "A cli tool for importing and exporting AWS IAM configuration to YAML files";
+    homepage = "https://github.com/99designs/iamy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ suvash ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/intecture/agent.nix b/nixpkgs/pkgs/tools/admin/intecture/agent.nix
new file mode 100644
index 000000000000..1c2d84836ebb
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/intecture/agent.nix
@@ -0,0 +1,29 @@
+{ lib, fetchFromGitHub, rustPlatform
+, openssl, zeromq, czmq, pkgconfig, cmake, zlib }:
+
+with rustPlatform;
+
+buildRustPackage rec {
+  pname = "intecture-agent";
+  version = "0.3.1";
+
+  src = fetchFromGitHub {
+    owner = "intecture";
+    repo = "agent";
+    rev = version;
+    sha256 = "0j27qdgyxybaixggh7k57mpm6rifimn4z2vydk463msc8b3kgywj";
+  };
+
+  cargoSha256 = "1is1cbbwxf00dc64h76h57s0wxsai0zm5vfrrss7598cim6a4yxb";
+
+  buildInputs = [ openssl zeromq czmq zlib ];
+
+  nativeBuildInputs = [ pkgconfig cmake ];
+
+  meta = with lib; {
+    description = "Authentication client/server for Intecture components";
+    homepage = "https://intecture.io";
+    license = licenses.mpl20;
+    maintainers = [ maintainers.rushmorem ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/intecture/auth.nix b/nixpkgs/pkgs/tools/admin/intecture/auth.nix
new file mode 100644
index 000000000000..0d7443d3225e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/intecture/auth.nix
@@ -0,0 +1,29 @@
+{ lib, fetchFromGitHub, rustPlatform
+, openssl, zeromq, czmq, pkgconfig, cmake, zlib }:
+
+with rustPlatform;
+
+buildRustPackage rec {
+  pname = "intecture-auth";
+  version = "0.1.2";
+
+  src = fetchFromGitHub {
+    owner = "intecture";
+    repo = "auth";
+    rev = version;
+    sha256 = "0c7ar3pc7n59lzfy74lwz51p09s2bglc870rfr4c0vmc91jl0pj2";
+  };
+
+  cargoSha256 = "17k4a3jd7n2fkalx7vvgah62pj77n536jvm17d60sj0yz2fxx799";
+
+  buildInputs = [ openssl zeromq czmq zlib ];
+
+  nativeBuildInputs = [ pkgconfig cmake ];
+
+  meta = with lib; {
+    description = "Authentication client/server for Intecture components";
+    homepage = "https://intecture.io";
+    license = licenses.mpl20;
+    maintainers = [ maintainers.rushmorem ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/intecture/cli.nix b/nixpkgs/pkgs/tools/admin/intecture/cli.nix
new file mode 100644
index 000000000000..5a841b920402
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/intecture/cli.nix
@@ -0,0 +1,32 @@
+{ lib, fetchFromGitHub, rustPlatform
+, openssl, zeromq, czmq, pkgconfig, cmake, zlib }:
+
+with rustPlatform;
+
+buildRustPackage rec {
+  pname = "intecture-cli";
+  version = "0.3.4";
+
+  src = fetchFromGitHub {
+    owner = "intecture";
+    repo = "cli";
+    rev = version;
+    sha256 = "16a5fkpyqkf8w20k3ircc1d0qmif7nygkzxj6mzk9609dlb0dmxq";
+  };
+
+  cargoSha256 = "11r551baz3hrkyf9nv68mdf09nqyvbcfjh2rgy8babmi7jljpzav";
+
+  buildInputs = [ openssl zeromq czmq zlib ];
+
+  nativeBuildInputs = [ pkgconfig cmake ];
+
+  # Needed for tests
+  USER = "$(whoami)";
+
+  meta = with lib; {
+    description = "A developer friendly, language agnostic configuration management tool for server systems";
+    homepage = "https://intecture.io";
+    license = licenses.mpl20;
+    maintainers = [ maintainers.rushmorem ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/lego/default.nix b/nixpkgs/pkgs/tools/admin/lego/default.nix
new file mode 100644
index 000000000000..18ec4ba4636e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/lego/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchFromGitHub, buildGoModule, nixosTests }:
+
+buildGoModule rec {
+  pname = "lego";
+  version = "4.0.1";
+
+  src = fetchFromGitHub {
+    owner = "go-acme";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1s3sh4n12g7ylkpmxqjcpdw3gqhdjbh9r09h2rsrm30xr4qaqpng";
+  };
+
+  vendorSha256 = "0p2pibid2d761whfk7zgq230lyqi2f0wmfvxqkjzrd1sba40r9bp";
+
+  doCheck = false;
+
+  subPackages = [ "cmd/lego" ];
+
+  buildFlagsArray = [
+    "-ldflags=-X main.version=${version}"
+  ];
+
+  meta = with lib; {
+    description = "Let's Encrypt client and ACME library written in Go";
+    license = licenses.mit;
+    homepage = "https://go-acme.github.io/lego/";
+    maintainers = teams.acme.members;
+  };
+
+  passthru.tests.lego = nixosTests.acme;
+}
diff --git a/nixpkgs/pkgs/tools/admin/lexicon/default.nix b/nixpkgs/pkgs/tools/admin/lexicon/default.nix
new file mode 100644
index 000000000000..3af266c81753
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/lexicon/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, python3Packages
+, fetchFromGitHub
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "lexicon";
+  version = "3.3.27";
+
+  propagatedBuildInputs = with python3Packages; [ requests tldextract future cryptography pyyaml boto3 zeep xmltodict beautifulsoup4 dnspython pynamecheap softlayer transip localzone ];
+
+  checkInputs = with python3Packages; [ pytest pytestcov pytest_xdist vcrpy mock ];
+
+  checkPhase = ''
+    pytest --ignore=lexicon/tests/providers/test_auto.py
+  '';
+
+  src = fetchFromGitHub {
+    owner = "AnalogJ";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0i6grrpdwh7axhnsabb0pfjhpd3prc9ji1afivi7q3c0krgvncmc";
+  };
+
+  meta = with lib; {
+    description = "Manipulate DNS records on various DNS providers in a standardized way.";
+    homepage = "https://github.com/AnalogJ/lexicon";
+    maintainers = with maintainers; [ flyfloh ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/lxd/default.nix b/nixpkgs/pkgs/tools/admin/lxd/default.nix
new file mode 100644
index 000000000000..3d62e39c6ed3
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/lxd/default.nix
@@ -0,0 +1,72 @@
+{ stdenv, hwdata, pkgconfig, lxc, buildGoPackage, fetchurl
+, makeWrapper, acl, rsync, gnutar, xz, btrfs-progs, gzip, dnsmasq
+, squashfsTools, iproute, iptables, ebtables, iptables-nftables-compat, libcap
+, libco-canonical, dqlite, raft-canonical, sqlite-replication, udev
+, writeShellScriptBin, apparmor-profiles, apparmor-parser
+, criu
+, bash
+, installShellFiles
+, nftablesSupport ? false
+}:
+
+let
+  networkPkgs = if nftablesSupport then
+    [ iptables-nftables-compat ]
+  else
+    [ iptables ebtables ];
+
+in
+buildGoPackage rec {
+  pname = "lxd";
+  version = "4.6";
+
+  goPackagePath = "github.com/lxc/lxd";
+
+  src = fetchurl {
+    url = "https://github.com/lxc/lxd/releases/download/${pname}-${version}/${pname}-${version}.tar.gz";
+    sha256 = "011fsyafmpis6j0aq7vwd56m2mcb9v3rn4f246ms5nx6zgmga0ip";
+  };
+
+  postPatch = ''
+    substituteInPlace shared/usbid/load.go \
+      --replace "/usr/share/misc/usb.ids" "${hwdata}/share/hwdata/usb.ids"
+  '';
+
+  preBuild = ''
+    # unpack vendor
+    pushd go/src/github.com/lxc/lxd
+    rm _dist/src/github.com/lxc/lxd
+    cp -r _dist/src/* ../../..
+    popd
+  '';
+
+  buildFlags = [ "-tags libsqlite3" ];
+
+  postInstall = ''
+    # test binaries, code generation
+    rm $out/bin/{deps,macaroon-identity,generate}
+
+    wrapProgram $out/bin/lxd --prefix PATH : ${stdenv.lib.makeBinPath (
+      networkPkgs
+      ++ [ acl rsync gnutar xz btrfs-progs gzip dnsmasq squashfsTools iproute bash criu ]
+      ++ [ (writeShellScriptBin "apparmor_parser" ''
+             exec '${apparmor-parser}/bin/apparmor_parser' -I '${apparmor-profiles}/etc/apparmor.d' "$@"
+           '') ]
+      )
+    }
+
+    installShellCompletion --bash go/src/github.com/lxc/lxd/scripts/bash/lxd-client
+  '';
+
+  nativeBuildInputs = [ installShellFiles pkgconfig makeWrapper ];
+  buildInputs = [ lxc acl libcap libco-canonical.dev dqlite.dev
+                  raft-canonical.dev sqlite-replication udev.dev ];
+
+  meta = with stdenv.lib; {
+    description = "Daemon based on liblxc offering a REST API to manage containers";
+    homepage = "https://linuxcontainers.org/lxd/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fpletz wucke13 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/mycli/default.nix b/nixpkgs/pkgs/tools/admin/mycli/default.nix
new file mode 100644
index 000000000000..4745d065be93
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/mycli/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, python3
+, glibcLocales
+}:
+
+with python3.pkgs;
+
+buildPythonApplication rec {
+  pname = "mycli";
+  version = "1.22.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lq2x95553vdmhw13cxcgsd2g2i32izhsb7hxd4m1iwf9b3msbpv";
+  };
+
+  propagatedBuildInputs = [
+    paramiko pymysql configobj sqlparse prompt_toolkit pygments click pycrypto cli-helpers
+  ];
+
+  checkInputs = [ pytest mock glibcLocales ];
+
+  checkPhase = ''
+    export HOME=.
+    export LC_ALL="en_US.UTF-8"
+
+    py.test \
+      --ignore=mycli/packages/paramiko_stub/__init__.py
+  '';
+
+  meta = {
+    inherit version;
+    description = "Command-line interface for MySQL";
+    longDescription = ''
+      Rich command-line interface for MySQL with auto-completion and
+      syntax highlighting.
+    '';
+    homepage = "http://mycli.net";
+    license = lib.licenses.bsd3;
+    maintainers = [ lib.maintainers.jojosch ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/nomachine-client/default.nix b/nixpkgs/pkgs/tools/admin/nomachine-client/default.nix
new file mode 100644
index 000000000000..4657c64d3307
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/nomachine-client/default.nix
@@ -0,0 +1,96 @@
+{ stdenv, file, fetchurl, makeWrapper,
+  autoPatchelfHook, jsoncpp, libpulseaudio }:
+let
+  versionMajor = "6.11";
+  versionMinor = "2";
+  versionBuild_x86_64 = "1";
+  versionBuild_i686 = "1";
+in
+  stdenv.mkDerivation rec {
+    pname = "nomachine-client";
+    version = "${versionMajor}.${versionMinor}";
+
+    src =
+      if stdenv.hostPlatform.system == "x86_64-linux" then
+        fetchurl {
+          urls = [
+            "https://download.nomachine.com/download/${versionMajor}/Linux/nomachine_${version}_${versionBuild_x86_64}_x86_64.tar.gz"
+            "https://web.archive.org/web/https://download.nomachine.com/download/${versionMajor}/Linux/nomachine_${version}_${versionBuild_x86_64}_x86_64.tar.gz"
+          ];
+          sha256 = "1b6r9bwkr8mhaljma19ikxpkmlx8iy5r1vf5hlv27bja2zz1r8xr";
+        }
+      else if stdenv.hostPlatform.system == "i686-linux" then
+        fetchurl {
+          urls = [
+            "https://download.nomachine.com/download/${versionMajor}/Linux/nomachine_${version}_${versionBuild_i686}_i686.tar.gz"
+            "https://web.archive.org/web/https://download.nomachine.com/download/${versionMajor}/Linux/nomachine_${version}_${versionBuild_i686}_i686.tar.gz"
+          ];
+          sha256 = "0dl138ry9n1qh651zh0zvp88qhgxrs2kvvnq329jw0py5v70b9pm";
+        }
+      else
+        throw "NoMachine client is not supported on ${stdenv.hostPlatform.system}";
+
+    postUnpack = ''
+      mv $(find . -type f -name nxclient.tar.gz) .
+      mv $(find . -type f -name nxplayer.tar.gz) .
+      rm -r NX/
+      tar xf nxclient.tar.gz
+      tar xf nxplayer.tar.gz
+      rm $(find . -maxdepth 1 -type f)
+    '';
+
+    nativeBuildInputs = [ file makeWrapper autoPatchelfHook ];
+    buildInputs = [ jsoncpp libpulseaudio ];
+
+    installPhase = ''
+      rm bin/nxplayer bin/nxclient
+
+      mkdir -p $out/NX
+      cp -r bin lib share $out/NX/
+
+      ln -s $out/NX/bin $out/bin
+
+      for i in share/icons/*; do
+        if [[ -d "$i" ]]; then
+          mkdir -p "$out/share/icons/hicolor/$(basename $i)/apps"
+          cp "$i"/* "$out/share/icons/hicolor/$(basename $i)/apps/"
+        fi
+      done
+
+      mkdir $out/share/applications
+      cp share/applnk/player/xdg/*.desktop $out/share/applications/
+      cp share/applnk/client/xdg-mime/*.desktop $out/share/applications/
+
+      mkdir -p $out/share/mime/packages
+      cp share/applnk/client/xdg-mime/*.xml $out/share/mime/packages/
+
+      for i in $out/share/applications/*.desktop; do
+        substituteInPlace "$i" --replace /usr/NX/bin $out/bin
+      done
+    '';
+
+    postFixup = ''
+      makeWrapper $out/bin/nxplayer.bin $out/bin/nxplayer --set NX_SYSTEM $out/NX
+      makeWrapper $out/bin/nxclient.bin $out/bin/nxclient --set NX_SYSTEM $out/NX
+
+      # libnxcau.so needs libpulse.so.0 for audio to work, but doesn't
+      # have a DT_NEEDED entry for it.
+      patchelf --add-needed libpulse.so.0 $out/NX/lib/libnxcau.so
+    '';
+
+    dontBuild = true;
+    dontStrip = true;
+
+    meta = with stdenv.lib; {
+      description = "NoMachine remote desktop client (nxplayer)";
+      homepage = "https://www.nomachine.com/";
+      license = {
+        fullName = "NoMachine 6 End-User License Agreement";
+        url = "https://www.nomachine.com/licensing-6";
+        free = false;
+      };
+      maintainers = with maintainers; [ talyz ];
+      platforms = [ "x86_64-linux" "i686-linux" ];
+    };
+  }
+
diff --git a/nixpkgs/pkgs/tools/admin/oxidized/Gemfile b/nixpkgs/pkgs/tools/admin/oxidized/Gemfile
new file mode 100644
index 000000000000..bddfe1adee53
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/oxidized/Gemfile
@@ -0,0 +1,5 @@
+source 'https://rubygems.org'
+
+gem 'oxidized', '0.26.3'
+gem 'oxidized-web', '0.13.1'
+gem 'oxidized-script', '0.6.0'
diff --git a/nixpkgs/pkgs/tools/admin/oxidized/Gemfile.lock b/nixpkgs/pkgs/tools/admin/oxidized/Gemfile.lock
new file mode 100644
index 000000000000..64bc02cafc3c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/oxidized/Gemfile.lock
@@ -0,0 +1,80 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    asetus (0.3.0)
+    backports (3.14.0)
+    charlock_holmes (0.7.6)
+    emk-sinatra-url-for (0.2.1)
+      sinatra (>= 0.9.1.1)
+    ffi (1.10.0)
+    git (1.5.0)
+    haml (5.0.4)
+      temple (>= 0.8.0)
+      tilt
+    htmlentities (4.3.4)
+    json (2.2.0)
+    multi_json (1.13.1)
+    net-ssh (5.2.0)
+    net-telnet (0.1.1)
+    oxidized (0.26.3)
+      asetus (~> 0.1)
+      git (~> 1)
+      net-ssh (~> 5)
+      net-telnet (~> 0.1.1)
+      rugged (~> 0.21, >= 0.21.4)
+      slop (~> 3.5)
+    oxidized-script (0.6.0)
+      oxidized (~> 0.25)
+      slop (~> 3.5)
+    oxidized-web (0.13.1)
+      charlock_holmes (~> 0.7.5)
+      emk-sinatra-url-for (~> 0.2)
+      haml (~> 5.0)
+      htmlentities (~> 4.3)
+      json (>= 1.7.0)
+      oxidized (~> 0.26)
+      puma (~> 3.11.4)
+      rack-test (~> 0.7.0)
+      sass (~> 3.3)
+      sinatra (~> 1.4, >= 1.4.6)
+      sinatra-contrib (~> 1.4, >= 1.4.6)
+    puma (3.11.4)
+    rack (1.6.11)
+    rack-protection (1.5.5)
+      rack
+    rack-test (0.7.0)
+      rack (>= 1.0, < 3)
+    rb-fsevent (0.10.3)
+    rb-inotify (0.10.0)
+      ffi (~> 1.0)
+    rugged (0.28.1)
+    sass (3.7.4)
+      sass-listen (~> 4.0.0)
+    sass-listen (4.0.0)
+      rb-fsevent (~> 0.9, >= 0.9.4)
+      rb-inotify (~> 0.9, >= 0.9.7)
+    sinatra (1.4.8)
+      rack (~> 1.5)
+      rack-protection (~> 1.4)
+      tilt (>= 1.3, < 3)
+    sinatra-contrib (1.4.7)
+      backports (>= 2.0)
+      multi_json
+      rack-protection
+      rack-test
+      sinatra (~> 1.4.0)
+      tilt (>= 1.3, < 3)
+    slop (3.6.0)
+    temple (0.8.1)
+    tilt (2.0.9)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  oxidized (= 0.26.3)
+  oxidized-script (= 0.6.0)
+  oxidized-web (= 0.13.1)
+
+BUNDLED WITH
+   2.1.4
diff --git a/nixpkgs/pkgs/tools/admin/oxidized/default.nix b/nixpkgs/pkgs/tools/admin/oxidized/default.nix
new file mode 100644
index 000000000000..01129c5afb10
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/oxidized/default.nix
@@ -0,0 +1,20 @@
+{ lib, ruby, bundlerApp, bundlerUpdateScript }:
+
+bundlerApp {
+  pname = "oxidized";
+  gemdir = ./.;
+
+  inherit ruby;
+
+  exes = [ "oxidized" "oxidized-web" "oxidized-script" ];
+
+  passthru.updateScript = bundlerUpdateScript "oxidized";
+
+  meta = with lib; {
+    description = "Oxidized is a network device configuration backup tool. It's a RANCID replacement!";
+    homepage    = "https://github.com/ytti/oxidized";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ willibutz nicknovitski ];
+    platforms   = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/oxidized/gemset.nix b/nixpkgs/pkgs/tools/admin/oxidized/gemset.nix
new file mode 100644
index 000000000000..ff77102af12a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/oxidized/gemset.nix
@@ -0,0 +1,304 @@
+{
+  asetus = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zkr8cbp8klanqmhzz7qmimzlxh6zmsy98zb3s75af34l7znq790";
+      type = "gem";
+    };
+    version = "0.3.0";
+  };
+  backports = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17j5pf0b69bkn043wi4xd530ky53jbbnljr4bsjzlm4k8bzlknfn";
+      type = "gem";
+    };
+    version = "3.14.0";
+  };
+  charlock_holmes = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nf1l31n10yaark2rrg5qzyzcx9w80681449s3j09qmnipsl8rl5";
+      type = "gem";
+    };
+    version = "0.7.6";
+  };
+  emk-sinatra-url-for = {
+    dependencies = ["sinatra"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rd5b1lraklv0hblzdnmw2z3dragfg0qqk7wxbpn58f8y7jxzjgj";
+      type = "gem";
+    };
+    version = "0.2.1";
+  };
+  ffi = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0j8pzj8raxbir5w5k6s7a042sb5k02pg0f8s4na1r5lan901j00p";
+      type = "gem";
+    };
+    version = "1.10.0";
+  };
+  git = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bf83icwypi3p3pd97vlqbnp3hvf31ncd440m9kh9y7x6yk74wyh";
+      type = "gem";
+    };
+    version = "1.5.0";
+  };
+  haml = {
+    dependencies = ["temple" "tilt"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1q0a9fvqh8kn6wm97fcks6qzbjd400bv8bx748w8v87m7p4klhac";
+      type = "gem";
+    };
+    version = "5.0.4";
+  };
+  htmlentities = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nkklqsn8ir8wizzlakncfv42i32wc0w9hxp00hvdlgjr7376nhj";
+      type = "gem";
+    };
+    version = "4.3.4";
+  };
+  json = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0sx97bm9by389rbzv8r1f43h06xcz8vwi3h5jv074gvparql7lcx";
+      type = "gem";
+    };
+    version = "2.2.0";
+  };
+  multi_json = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rl0qy4inf1mp8mybfk56dfga0mvx97zwpmq5xmiwl5r770171nv";
+      type = "gem";
+    };
+    version = "1.13.1";
+  };
+  net-ssh = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "101wd2px9lady54aqmkibvy4j62zk32w0rjz4vnigyg974fsga40";
+      type = "gem";
+    };
+    version = "5.2.0";
+  };
+  net-telnet = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13qxznpwmc3hs51b76wqx2w29r158gzzh8719kv2gpi56844c8fx";
+      type = "gem";
+    };
+    version = "0.1.1";
+  };
+  oxidized = {
+    dependencies = ["asetus" "git" "net-ssh" "net-telnet" "rugged" "slop"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07hpxmdjkfpkc00ln3hhh5qkj0lyhcmgbi0jza2c8cnjyy9sc73x";
+      type = "gem";
+    };
+    version = "0.26.3";
+  };
+  oxidized-script = {
+    dependencies = ["oxidized" "slop"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15cxsyaz2mwd7jj63gfv3lzyqkvb3gz29wxfy7xyjdzkc19c7vk6";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  oxidized-web = {
+    dependencies = ["charlock_holmes" "emk-sinatra-url-for" "haml" "htmlentities" "json" "oxidized" "puma" "rack-test" "sass" "sinatra" "sinatra-contrib"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07qmal83h1h5dqapgirq5yrnclbm3xhcjqkj80lla3dq18jmjhqs";
+      type = "gem";
+    };
+    version = "0.13.1";
+  };
+  puma = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06qiqx1pcfwq4gi9pdrrq8r6hgh3rwl7nl51r67zpm5xmqlp0g10";
+      type = "gem";
+    };
+    version = "3.11.4";
+  };
+  rack = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1g9926ln2lw12lfxm4ylq1h6nl0rafl10za3xvjzc87qvnqic87f";
+      type = "gem";
+    };
+    version = "1.6.11";
+  };
+  rack-protection = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0my0wlw4a5l3hs79jkx2xzv7djhajgf8d28k8ai1ddlnxxb0v7ss";
+      type = "gem";
+    };
+    version = "1.5.5";
+  };
+  rack-test = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0f50ljlbg38g21q242him0n12r0fz7r3rs9n6p8ppahzh7k22x11";
+      type = "gem";
+    };
+    version = "0.7.0";
+  };
+  rb-fsevent = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lm1k7wpz69jx7jrc92w3ggczkjyjbfziq5mg62vjnxmzs383xx8";
+      type = "gem";
+    };
+    version = "0.10.3";
+  };
+  rb-inotify = {
+    dependencies = ["ffi"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fs7hxm9g6ywv2yih83b879klhc4fs8i0p9166z795qmd77dk0a4";
+      type = "gem";
+    };
+    version = "0.10.0";
+  };
+  rugged = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yiszpz6y13vvgh3fss1l0ipp0zgsbbc8c28vynnpdyx1sy6krp6";
+      type = "gem";
+    };
+    version = "0.28.1";
+  };
+  sass = {
+    dependencies = ["sass-listen"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0p95lhs0jza5l7hqci1isflxakz83xkj97lkvxl919is0lwhv2w0";
+      type = "gem";
+    };
+    version = "3.7.4";
+  };
+  sass-listen = {
+    dependencies = ["rb-fsevent" "rb-inotify"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xw3q46cmahkgyldid5hwyiwacp590zj2vmswlll68ryvmvcp7df";
+      type = "gem";
+    };
+    version = "4.0.0";
+  };
+  sinatra = {
+    dependencies = ["rack" "rack-protection" "tilt"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0byxzl7rx3ki0xd7aiv1x8mbah7hzd8f81l65nq8857kmgzj1jqq";
+      type = "gem";
+    };
+    version = "1.4.8";
+  };
+  sinatra-contrib = {
+    dependencies = ["backports" "multi_json" "rack-protection" "rack-test" "sinatra" "tilt"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0vi3i0icbi2figiayxpvxbqpbn1syma7w4p4zw5mav1ln4c7jnfr";
+      type = "gem";
+    };
+    version = "1.4.7";
+  };
+  slop = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00w8g3j7k7kl8ri2cf1m58ckxk8rn350gp4chfscmgv6pq1spk3n";
+      type = "gem";
+    };
+    version = "3.6.0";
+  };
+  temple = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "158d7ygbwcifqnvrph219p7m78yjdjazhykv5darbkms7bxm5y09";
+      type = "gem";
+    };
+    version = "0.8.1";
+  };
+  tilt = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ca4k0clwf0rkvy7726x4nxpjxkpv67w043i39saxgldxd97zmwz";
+      type = "gem";
+    };
+    version = "2.0.9";
+  };
+}
\ No newline at end of file
diff --git a/nixpkgs/pkgs/tools/admin/pebble/default.nix b/nixpkgs/pkgs/tools/admin/pebble/default.nix
new file mode 100644
index 000000000000..4813f86ea641
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/pebble/default.nix
@@ -0,0 +1,26 @@
+{ buildGoPackage
+, fetchFromGitHub
+, lib
+}:
+
+let
+  version = "v2.3.0";
+  pname = "pebble";
+in buildGoPackage {
+  inherit pname version;
+  goPackagePath = "github.com/letsencrypt/${pname}";
+
+  src = fetchFromGitHub {
+    owner = "letsencrypt";
+    repo = pname;
+    rev = version;
+    sha256 = "1piwzzfqsdx6s2niczzp4mf4r3qn9nfdgpn7882g52cmmm0vzks2";
+  };
+
+  meta = {
+    homepage = "https://github.com/letsencrypt/pebble";
+    description = "A miniature version of Boulder, Pebble is a small RFC 8555 ACME test server not suited for a production CA";
+    license = [ lib.licenses.mpl20 ];
+    maintainers = lib.teams.acme.members;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/procs/default.nix b/nixpkgs/pkgs/tools/admin/procs/default.nix
new file mode 100644
index 000000000000..54bdf238e3f2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/procs/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchFromGitHub, rustPlatform, Security }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "procs";
+  version = "0.10.4";
+
+  src = fetchFromGitHub {
+    owner = "dalance";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1a28kkxcrdfmrq2mmsfkdxfp3msklwga5nbfhjb7a7s64xh8jmjv";
+  };
+
+  cargoSha256 = "1xlxjr0pkwlzm7f5xlrsf76in28r9jj41n6gn44vxqbh4x161gs1";
+
+  buildInputs = stdenv.lib.optional stdenv.isDarwin Security;
+
+  meta = with stdenv.lib; {
+    description = "A modern replacement for ps written in Rust";
+    homepage = "https://github.com/dalance/procs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dalance filalex77 ];
+    platforms = with platforms; linux ++ darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/pulumi/data.nix b/nixpkgs/pkgs/tools/admin/pulumi/data.nix
new file mode 100644
index 000000000000..7d2523b4073d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/pulumi/data.nix
@@ -0,0 +1,179 @@
+# DO NOT EDIT! This file is generated automatically by update.sh
+{ }:
+{
+  version = "2.10.2";
+  pulumiPkgs = {
+    x86_64-linux = [
+      {
+        url = "https://get.pulumi.com/releases/sdk/pulumi-v2.10.2-linux-x64.tar.gz";
+        sha256 = "0pxm90vmha265zc4b1ip2f3iryslkwxznn4kb8l3ma6gibz1zav3";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-auth0-v1.1.0-linux-amd64.tar.gz";
+        sha256 = "1l4kszzw1w862sfd4jnz66lwnp02p4kl1fwvj5ab81qfwzwg0cfx";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-aws-v3.4.0-linux-amd64.tar.gz";
+        sha256 = "1gzjdafx5zsqrb5r3amskak51ajcpqbbfw45939jdsdll8vclw7g";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-cloudflare-v2.6.0-linux-amd64.tar.gz";
+        sha256 = "0myvx2glqnx29l4wd5vx4gm773zrcmwcjvs2b1yv63fl10md9sv7";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-consul-v2.5.0-linux-amd64.tar.gz";
+        sha256 = "12cajd8jiqy11s880vsv20gqfm44g160x7fxm93agjl7wng32ad6";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-datadog-v2.8.0-linux-amd64.tar.gz";
+        sha256 = "0k429fh477f84kmnhyl5s9p0yym7d6sdq7hy7wqx6psxp4rf5h9x";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-digitalocean-v2.8.0-linux-amd64.tar.gz";
+        sha256 = "045z7qj23bq71nxfjk1vvnfbjcnqfkcbxbpjz72q0hw4xn7dq6jz";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-docker-v2.3.0-linux-amd64.tar.gz";
+        sha256 = "16d0jd3429pr4vlrzrv32w2fa53j7gyqq5lc78gw9j4v3mc3scvz";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-gcp-v3.25.0-linux-amd64.tar.gz";
+        sha256 = "0gz4kpddaf9p25lfnp70p6197wrfgsiys7s4vdy75z8dyd4sbiv0";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-github-v2.0.0-linux-amd64.tar.gz";
+        sha256 = "0n2532gfb5i53raya07rn8wcp15rc07jfg8wsm2lfzj7a4mp2p6c";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-gitlab-v2.6.0-linux-amd64.tar.gz";
+        sha256 = "16l1a30rkg9l6yh68qv61dgm3h3gdgpsdacvnfg1ra0fvvfs9477";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-hcloud-v0.2.0-linux-amd64.tar.gz";
+        sha256 = "1m2w8gsksr36pprxr6v3v4y3n7x5ycbcdfywv67yxmbi4lxyy3ar";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-kubernetes-v2.6.1-linux-amd64.tar.gz";
+        sha256 = "01vnbgck1ffj4jg8ghmkjp63xq3r9q3459vy03xpzm14l1i6agwv";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-mailgun-v2.2.0-linux-amd64.tar.gz";
+        sha256 = "1g05kqymbkrxf48iskn9w12kxy880allhqm9a7p4g7mx0174yfhm";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-mysql-v2.2.1-linux-amd64.tar.gz";
+        sha256 = "1fa5i283nisa6cq02fcrsgwkw7bwnh2j3agjbqyvv2xiss34i7hw";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-openstack-v2.6.0-linux-amd64.tar.gz";
+        sha256 = "0ihiag248c30dz4z2b559689zqwp52p0m7pv7jqpk86xwvimbsn1";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-packet-v3.1.0-linux-amd64.tar.gz";
+        sha256 = "0jwvdsb26bhsqcbrsw9ss54xgpccl830hhbwnbz8ql8yndd35srg";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-postgresql-v2.4.0-linux-amd64.tar.gz";
+        sha256 = "1wr4p312xwqi0icn153iv2j88rp37wkf8hc5y4pmdr61vd0kpw7w";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-random-v2.3.1-linux-amd64.tar.gz";
+        sha256 = "0xq3as94i9ah9dv1cabgdqjg68yg7laksfzpf81s6kcv742cnnqi";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-vault-v2.4.0-linux-amd64.tar.gz";
+        sha256 = "1av7fj1jlhhqplqq60d6hzzidlhsvr41z9p1x3mvz5frwijxr1ab";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-vsphere-v2.10.0-linux-amd64.tar.gz";
+        sha256 = "1bgw5xw6f01whxlm5358xn6v9wqz9mxg3dvb5vi7rfs9wwxykr4g";
+      }
+    ];
+    x86_64-darwin = [
+      {
+        url = "https://get.pulumi.com/releases/sdk/pulumi-v2.10.2-darwin-x64.tar.gz";
+        sha256 = "1fzqylx7pmrpvsxrmhlx56v9i9zkid96zrj9hsc26qhx5w7k600w";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-auth0-v1.1.0-darwin-amd64.tar.gz";
+        sha256 = "05dxpdwdg8cd1a6d3xh8dkns5wkvpr0v11bb4zdzv38x6wxnqx0z";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-aws-v3.4.0-darwin-amd64.tar.gz";
+        sha256 = "1jbnx1wpzh2k127ixh9j0ghlqhj3sc1s17cp3ax3q9gq3cadcl5i";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-cloudflare-v2.6.0-darwin-amd64.tar.gz";
+        sha256 = "0lpf3cqi3kss7hmr8a3y6gmwjl854vmva4f9p9q7147rxr8aw5f9";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-consul-v2.5.0-darwin-amd64.tar.gz";
+        sha256 = "0qwjrhmspibjr17kgswfcgbdhmkicqrjd1md6azingdr5wp7cwwm";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-datadog-v2.8.0-darwin-amd64.tar.gz";
+        sha256 = "0rwgbpif7l3ayh363cz0k2dir36a87x0bszspq3nm3xbwmd190f0";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-digitalocean-v2.8.0-darwin-amd64.tar.gz";
+        sha256 = "0943r8x70gxxkfn0rhcx2b9zya44k28j5s8z2m8jn2i1fvqvahq5";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-docker-v2.3.0-darwin-amd64.tar.gz";
+        sha256 = "1nvqjc1zrxfn2r1wdh2sdr2vimar5836bhscqsiaw4i6mjdsggfy";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-gcp-v3.25.0-darwin-amd64.tar.gz";
+        sha256 = "05x0qlv3xkkvs71ixzmc21ck85w9f4a4dxrwmgkq6c0nhy3npbnj";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-github-v2.0.0-darwin-amd64.tar.gz";
+        sha256 = "1m80l75r2w46m7191igjan4ipfkhc9ld1xlybncd628qlcf2jpqz";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-gitlab-v2.6.0-darwin-amd64.tar.gz";
+        sha256 = "0dan0qqvaxfh90db14s7adjjy670lz15bbm6a8fjfyj4fdhsbwyn";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-hcloud-v0.2.0-darwin-amd64.tar.gz";
+        sha256 = "1gznv5d10pxbkyl4hbd4c9skkgkypfs1xg0jjmszkwxcjzvhc4l3";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-kubernetes-v2.6.1-darwin-amd64.tar.gz";
+        sha256 = "08w8by7h9nlgvyap2in6yy21dk46fxvl93h4ghaw7xxjjs2l3dfi";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-mailgun-v2.2.0-darwin-amd64.tar.gz";
+        sha256 = "0qjszd30r3094p5m7v5gynx2kxh9xf9878mxdc2wnswpkpw3v5pb";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-mysql-v2.2.1-darwin-amd64.tar.gz";
+        sha256 = "1a19lmxi8r8h4yfll0k97kvq0lgkzwvrwf52ny4zl67bc9g4jr5p";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-openstack-v2.6.0-darwin-amd64.tar.gz";
+        sha256 = "11vfjkmhrq7q4j6h5d2sdzan3ziyhl5qhc0fhfnsz2pxss549zab";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-packet-v3.1.0-darwin-amd64.tar.gz";
+        sha256 = "1ny1m6pb44k77gqf97km3gkb7dwhilkmqi2zy4hdl20js1ijsh7p";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-postgresql-v2.4.0-darwin-amd64.tar.gz";
+        sha256 = "1vm2pfj93wi6q7kcrqwy9190mx0jn2p96algcd5gms48a4m8bgpb";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-random-v2.3.1-darwin-amd64.tar.gz";
+        sha256 = "0mnmlvyppfndq1rwy4k40j0syy590v2lg75kg0rnf16qlpffskn9";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-vault-v2.4.0-darwin-amd64.tar.gz";
+        sha256 = "0q9qbqalask628cbi3347pjbnm3304c8qhx7h8icqxxh59mjnhr7";
+      }
+      {
+        url = "https://api.pulumi.com/releases/plugins/pulumi-resource-vsphere-v2.10.0-darwin-amd64.tar.gz";
+        sha256 = "1gxiqq6hk77s1n3q3p92p0yykpihw2k8lv01dra015fjha6pyl19";
+      }
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/pulumi/default.nix b/nixpkgs/pkgs/tools/admin/pulumi/default.nix
new file mode 100644
index 000000000000..231bdc099653
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/pulumi/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, fetchurl, autoPatchelfHook, makeWrapper }:
+
+with lib;
+
+let
+  data = import ./data.nix {};
+in stdenv.mkDerivation {
+  pname = "pulumi";
+  version = data.version;
+
+  postUnpack = ''
+    mv pulumi-* pulumi
+  '';
+
+  srcs = map (x: fetchurl x) data.pulumiPkgs.${stdenv.hostPlatform.system};
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp * $out/bin/
+  '' + optionalString stdenv.isLinux ''
+    wrapProgram $out/bin/pulumi --set LD_LIBRARY_PATH "${stdenv.cc.cc.lib}/lib"
+  '';
+
+  nativeBuildInputs = optionals stdenv.isLinux [ autoPatchelfHook makeWrapper ];
+
+  meta = {
+    homepage = "https://pulumi.io/";
+    description = "Pulumi is a cloud development platform that makes creating cloud programs easy and productive";
+    license = with licenses; [ asl20 ];
+    platforms = builtins.attrNames data.pulumiPkgs;
+    maintainers = with maintainers; [
+      ghuntley
+      peterromfeldhk
+      jlesquembre
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/pulumi/update.sh b/nixpkgs/pkgs/tools/admin/pulumi/update.sh
new file mode 100755
index 000000000000..5e0c721959c3
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/pulumi/update.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+# Bash 3 compatible for Darwin
+
+# Version of Pulumi from
+# https://www.pulumi.com/docs/get-started/install/versions/
+VERSION="2.10.2"
+
+# Grab latest release ${VERSION} from
+# https://github.com/pulumi/pulumi-${NAME}/releases
+plugins=(
+    "auth0=1.1.0"
+    "aws=3.4.0"
+    "cloudflare=2.6.0"
+    "consul=2.5.0"
+    "datadog=2.8.0"
+    "digitalocean=2.8.0"
+    "docker=2.3.0"
+    "gcp=3.25.0"
+    "github=2.0.0"
+    "gitlab=2.6.0"
+    "hcloud=0.2.0"
+    "kubernetes=2.6.1"
+    "mailgun=2.2.0"
+    "mysql=2.2.1"
+    "openstack=2.6.0"
+    "packet=3.1.0"
+    "postgresql=2.4.0"
+    "random=2.3.1"
+    "vault=2.4.0"
+    "vsphere=2.10.0"
+    );
+
+function genMainSrc() {
+    local url="https://get.pulumi.com/releases/sdk/pulumi-v${VERSION}-$1-x64.tar.gz"
+    local sha256
+    sha256=$(nix-prefetch-url "$url")
+    echo "      {"
+    echo "        url = \"${url}\";"
+    echo "        sha256 = \"$sha256\";"
+    echo "      }"
+}
+
+function genSrcs() {
+    for plugVers in "${plugins[@]}"; do
+        local plug=${plugVers%=*}
+        local version=${plugVers#*=}
+        # url as defined here
+        # https://github.com/pulumi/pulumi/blob/06d4dde8898b2a0de2c3c7ff8e45f97495b89d82/pkg/workspace/plugins.go#L197
+        local url="https://api.pulumi.com/releases/plugins/pulumi-resource-${plug}-v${version}-$1-amd64.tar.gz"
+        local sha256
+        sha256=$(nix-prefetch-url "$url")
+        echo "      {"
+        echo "        url = \"${url}\";"
+        echo "        sha256 = \"$sha256\";"
+        echo "      }"
+    done
+}
+
+cat <<EOF                     > data.nix
+# DO NOT EDIT! This file is generated automatically by update.sh
+{ }:
+{
+  version = "${VERSION}";
+  pulumiPkgs = {
+    x86_64-linux = [
+EOF
+genMainSrc "linux"           >> data.nix
+genSrcs "linux"              >> data.nix
+echo "    ];"                >> data.nix
+
+echo "    x86_64-darwin = [" >> data.nix
+genMainSrc "darwin"          >> data.nix
+genSrcs "darwin"             >> data.nix
+echo "    ];"                >> data.nix
+echo "  };"                  >> data.nix
+echo "}"                     >> data.nix
+
diff --git a/nixpkgs/pkgs/tools/admin/s3bro/default.nix b/nixpkgs/pkgs/tools/admin/s3bro/default.nix
new file mode 100644
index 000000000000..154b4aae9665
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/s3bro/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, python3Packages }:
+
+python3Packages.buildPythonPackage rec {
+  pname = "s3bro";
+  version = "2.8";
+
+  src = python3Packages.fetchPypi {
+    inherit pname version;
+    sha256 = "0k25g3vch0q772f29jlghda5mjvps55h5lgwhwwbd5g2nlnrrspq";
+  };
+
+  propagatedBuildInputs = with python3Packages; [ boto3 botocore click termcolor ];
+
+  # No tests
+  doCheck = false;
+
+  meta = with stdenv.lib; {
+    description = "A handy s3 cli tool";
+    homepage = "https://github.com/rsavordelli/s3bro";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/salt/default.nix b/nixpkgs/pkgs/tools/admin/salt/default.nix
new file mode 100644
index 000000000000..83b69b12fea1
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/salt/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, python3
+, openssl
+  # Many Salt modules require various Python modules to be installed,
+  # passing them in this array enables Salt to find them.
+, extraInputs ? []
+}:
+python3.pkgs.buildPythonApplication rec {
+  pname = "salt";
+  version = "3001.1";
+
+  src = python3.pkgs.fetchPypi {
+    inherit pname version;
+    sha256 = "1g2sdcibir0zhldmngv1iyzlhh2adq9dqjc73grap3df5zcv9sz9";
+  };
+
+  propagatedBuildInputs = with python3.pkgs; [
+    distro
+    jinja2
+    markupsafe
+    msgpack
+    pycryptodomex
+    pyyaml
+    pyzmq
+    requests
+    tornado
+  ] ++ extraInputs;
+
+  patches = [ ./fix-libcrypto-loading.patch ];
+
+  postPatch = ''
+    substituteInPlace "salt/utils/rsax931.py" \
+      --subst-var-by "libcrypto" "${openssl.out}/lib/libcrypto.so"
+  '';
+
+  # The tests fail due to socket path length limits at the very least;
+  # possibly there are more issues but I didn't leave the test suite running
+  # as is it rather long.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://saltstack.com/";
+    description = "Portable, distributed, remote execution and configuration management system";
+    maintainers = with maintainers; [ aneeshusa ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/salt/fix-libcrypto-loading.patch b/nixpkgs/pkgs/tools/admin/salt/fix-libcrypto-loading.patch
new file mode 100644
index 000000000000..e011a15b43f9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/salt/fix-libcrypto-loading.patch
@@ -0,0 +1,13 @@
+diff --git a/salt/utils/rsax931.py b/salt/utils/rsax931.py
+index f827cc6db8..b728595186 100644
+--- a/salt/utils/rsax931.py
++++ b/salt/utils/rsax931.py
+@@ -74,7 +74,7 @@
+     """
+     Attempt to load libcrypto.
+     """
+-    return cdll.LoadLibrary(_find_libcrypto())
++    return cdll.LoadLibrary('@libcrypto@')
+ 
+ 
+ def _init_libcrypto():
diff --git a/nixpkgs/pkgs/tools/admin/salt/pepper/default.nix b/nixpkgs/pkgs/tools/admin/salt/pepper/default.nix
new file mode 100644
index 000000000000..0c6e9dc0ab23
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/salt/pepper/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, python3Packages
+, salt
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "salt-pepper";
+  version = "0.7.5";
+  src = python3Packages.fetchPypi {
+    inherit pname version;
+    sha256 = "1wh6yidwdk8jvjpr5g3azhqgsk24c5rlzmw6l86dmi0mpvmxm94w";
+  };
+
+  buildInputs = with python3Packages; [ setuptools setuptools_scm salt ];
+  checkInputs = with python3Packages; [
+    pytest mock pyzmq pytest-rerunfailures pytestcov cherrypy tornado
+  ];
+
+  meta = with lib; {
+    description = "A CLI front-end to a running salt-api system";
+    homepage = "https://github.com/saltstack/pepper";
+    maintainers = [ maintainers.pierrer ];
+    license = licenses.asl20;
+    broken = true; # ModuleNotFoundError: No module named 'pytestsalt'
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/scaleway-cli/default.nix b/nixpkgs/pkgs/tools/admin/scaleway-cli/default.nix
new file mode 100644
index 000000000000..a174937e5a12
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/scaleway-cli/default.nix
@@ -0,0 +1,22 @@
+{ stdenv, fetchFromGitHub, buildGoPackage }:
+
+buildGoPackage rec {
+  pname = "scaleway-cli";
+  version = "1.20";
+
+  goPackagePath = "github.com/scaleway/scaleway-cli";
+
+  src = fetchFromGitHub {
+    owner = "scaleway";
+    repo = "scaleway-cli";
+    rev = "v${version}";
+    sha256 = "14likzp3hl04nq9nmpmh9m5zqjyspy5cyk20dkh03c1nhkd4vcnx";
+  };
+
+  meta = with stdenv.lib; {
+    description = "Interact with Scaleway API from the command line";
+    homepage = "https://github.com/scaleway/scaleway-cli";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nickhu ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/sec/default.nix b/nixpkgs/pkgs/tools/admin/sec/default.nix
new file mode 100644
index 000000000000..b082f61f875d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/sec/default.nix
@@ -0,0 +1,32 @@
+{ fetchFromGitHub, perl, stdenv }:
+
+stdenv.mkDerivation rec {
+  name = "sec-${meta.version}";
+
+  src = fetchFromGitHub {
+    owner = "simple-evcorr";
+    repo = "sec";
+    rev = meta.version;
+    sha256 = "0ryic5ilj1i5l41440i0ss6j3yv796fz3gr0qij5pqyd1z21md83";
+  };
+
+  buildInputs = [ perl ];
+
+  dontBuild = false;
+  doCheck = false;
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share/man/man1
+    cp sec $out/bin
+    cp sec.man $out/share/man/man1/sec.1
+  '';
+
+  meta = {
+    homepage = "https://simple-evcorr.github.io";
+    license = stdenv.lib.licenses.gpl2;
+    description = "Simple Event Correlator";
+    maintainers = [ stdenv.lib.maintainers.tv ];
+    platforms = stdenv.lib.platforms.all;
+    version = "2.8.3";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/sewer/default.nix b/nixpkgs/pkgs/tools/admin/sewer/default.nix
new file mode 100644
index 000000000000..471a8788a95e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/sewer/default.nix
@@ -0,0 +1,20 @@
+{ stdenv, python3Packages }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "sewer";
+  version = "0.8.1";
+
+  src = python3Packages.fetchPypi {
+    inherit pname version;
+    sha256 = "0s8f0w6nv8dcs5yw7rn49981b3c9mnnx4f6wzqw4zha0rpp60z22";
+  };
+
+  propagatedBuildInputs = with python3Packages; [ pyopenssl requests tldextract ];
+
+  meta = with stdenv.lib; {
+    homepage = "https://github.com/komuw/sewer";
+    description = "ACME client";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kevincox ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/simp_le/default.nix b/nixpkgs/pkgs/tools/admin/simp_le/default.nix
new file mode 100644
index 000000000000..6ff547ab5322
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/simp_le/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, python3Packages, bash }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "simp_le-client";
+  version = "0.17.0";
+
+  src = python3Packages.fetchPypi {
+    inherit pname version;
+    sha256 = "0m1jynar4calaffp2zdxr5yy9vnhw2qf2hsfxwzfwf8fqb5h7bjb";
+  };
+
+  postPatch = ''
+    # drop upper bound of idna requirement
+    sed -ri "s/'(idna)<[^']+'/'\1'/" setup.py
+    substituteInPlace simp_le.py \
+      --replace "/bin/sh" "${bash}/bin/sh"
+  '';
+
+  checkPhase = ''
+    $out/bin/simp_le --test
+  '';
+
+  propagatedBuildInputs = with python3Packages; [ acme setuptools_scm josepy idna ];
+
+  meta = with stdenv.lib; {
+    homepage = "https://github.com/zenhack/simp_le";
+    description = "Simple Let's Encrypt client";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ gebner makefu ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/ssh-import-id/default.nix b/nixpkgs/pkgs/tools/admin/ssh-import-id/default.nix
new file mode 100644
index 000000000000..77d30e56d5fc
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/ssh-import-id/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, stdenv
+, fetchgit
+, requests
+, makeWrapper
+, extraHandlers ? []
+}:
+
+buildPythonPackage rec {
+  pname = "ssh-import-id";
+  version = "5.8";
+
+  src = fetchgit {
+    url = "https://git.launchpad.net/ssh-import-id";
+    rev = version;
+    sha256 = "0l9gya1hyf2qfidlmvg2cgfils1fp9rn5r8sihwvx4qfsfp5yaak";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ] ++ extraHandlers;
+
+  nativeBuildInputs = [
+    makeWrapper
+  ];
+
+  # handlers require main bin, main bin requires handlers
+  makeWrapperArgs = [ "--prefix" ":" "$out/bin" ];
+
+  meta = with stdenv.lib; {
+    description = "Retrieves an SSH public key and installs it locally";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ mkg20001 ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/ssl-cert-check/default.nix b/nixpkgs/pkgs/tools/admin/ssl-cert-check/default.nix
new file mode 100644
index 000000000000..b94d77bdf706
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/ssl-cert-check/default.nix
@@ -0,0 +1,57 @@
+{ stdenv
+, fetchFromGitHub
+, makeWrapper
+, openssl
+, which
+, gnugrep
+, gnused
+, gawk
+, mktemp
+, coreutils
+, findutils
+}:
+
+stdenv.mkDerivation rec {
+  pname = "ssl-cert-check";
+  version = "3.31";
+
+  src = fetchFromGitHub {
+    owner = "Matty9191";
+    repo = pname;
+    rev = "698c1996d05152cfaf2a1a3df4cc70482411fac8";
+    sha256 = "0jvi9phs0ngfwrj9zixb03v9byavbwxx8xkp0h5m98qppn1kvl3n";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  buildInputs = [
+    openssl
+    which
+    gnugrep
+    mktemp
+    gawk
+    gnused
+    coreutils
+    findutils
+  ];
+
+  prePatch = ''
+    substituteInPlace $pname --replace PATH= NOT_PATH=
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp $pname $out/bin/$pname
+    wrapProgram $out/bin/$pname \
+      --set PATH "${stdenv.lib.makeBinPath buildInputs}"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "a Bourne shell script that can be used to report on expiring SSL certificates";
+    homepage = "https://github.com/Matty9191/ssl-cert-check";
+    license = licenses.gpl2;
+    maintainers = [ maintainers.ryantm ];
+    platforms = platforms.linux;
+  };
+
+}
diff --git a/nixpkgs/pkgs/tools/admin/swiftclient/default.nix b/nixpkgs/pkgs/tools/admin/swiftclient/default.nix
new file mode 100644
index 000000000000..91860d2df08e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/swiftclient/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonApplication, fetchPypi, requests, six, pbr, setuptools }:
+
+buildPythonApplication rec {
+  pname = "python-swiftclient";
+  version = "3.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0xx3v5kk8jp352rydy3jxndy1b9kl2zmkj1gi14fjxjc5r4rf82g";
+  };
+
+  propagatedBuildInputs = [ requests six pbr setuptools ];
+
+  # For the tests the following requirements are needed:
+  # https://github.com/openstack/python-swiftclient/blob/master/test-requirements.txt
+  #
+  # The ones missing in nixpkgs (currently) are:
+  # - hacking
+  # - keystoneauth
+  # - oslosphinx
+  # - stestr
+  # - reno
+  # - openstackdocstheme
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/openstack/python-swiftclient";
+    description = "Python bindings to the OpenStack Object Storage API";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ c0deaddict ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/tigervnc/default.nix b/nixpkgs/pkgs/tools/admin/tigervnc/default.nix
new file mode 100644
index 000000000000..0bb291d797ba
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/tigervnc/default.nix
@@ -0,0 +1,107 @@
+{ stdenv, fetchFromGitHub
+, xorg, xkeyboard_config, zlib
+, libjpeg_turbo, pixman, fltk
+, fontDirectories
+, cmake, gettext, libtool
+, libGLU
+, gnutls, pam, nettle
+, xterm, openssh, perl
+, makeWrapper}:
+
+with stdenv.lib;
+
+stdenv.mkDerivation rec {
+  version = "1.10.1";
+  pname = "tigervnc";
+
+  src = fetchFromGitHub {
+    owner = "TigerVNC";
+    repo = "tigervnc";
+    rev = "v1.10.1";
+    sha256 = "001n189d2f3psn7nxgl8188ml6f7jbk26cxn2835y3mnlk5lmhgr";
+  };
+
+  inherit fontDirectories;
+
+  patches = [ ./u_xorg-server-1.20.7-ddxInputThreadInit.patch ];
+
+  postPatch = ''
+    sed -i -e '/^\$cmd \.= " -pn";/a$cmd .= " -xkbdir ${xkeyboard_config}/etc/X11/xkb";' unix/vncserver
+    fontPath=
+    for i in $fontDirectories; do
+      for j in $(find $i -name fonts.dir); do
+        addToSearchPathWithCustomDelimiter "," fontPath $(dirname $j)
+      done
+    done
+    sed -i -e '/^\$cmd \.= " -pn";/a$cmd .= " -fp '"$fontPath"'";' unix/vncserver
+    substituteInPlace vncviewer/vncviewer.cxx \
+       --replace '"/usr/bin/ssh' '"${openssh}/bin/ssh'
+  '';
+
+  dontUseCmakeBuildDir = true;
+
+  postBuild = ''
+    export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -Wno-error=int-to-pointer-cast -Wno-error=pointer-to-int-cast"
+    export CXXFLAGS="$CXXFLAGS -fpermissive"
+    # Build Xvnc
+    tar xf ${xorg.xorgserver.src}
+    cp -R xorg*/* unix/xserver
+    pushd unix/xserver
+    version=$(echo ${xorg.xorgserver.name} | sed 's/.*-\([0-9]\+\).\([0-9]\+\).*/\1\2/g')
+    patch -p1 < ${src}/unix/xserver$version.patch
+    autoreconf -vfi
+    ./configure $configureFlags  --disable-devel-docs --disable-docs \
+        --disable-xorg --disable-xnest --disable-xvfb --disable-dmx \
+        --disable-xwin --disable-xephyr --disable-kdrive --with-pic \
+        --disable-xorgcfg --disable-xprint --disable-static \
+        --enable-composite --disable-xtrap --enable-xcsecurity \
+        --disable-{a,c,m}fb \
+        --disable-xwayland \
+        --disable-config-dbus --disable-config-udev --disable-config-hal \
+        --disable-xevie \
+        --disable-dri --disable-dri2 --disable-dri3 --enable-glx \
+        --enable-install-libxf86config \
+        --prefix="$out" --disable-unit-tests \
+        --with-xkb-path=${xkeyboard_config}/share/X11/xkb \
+        --with-xkb-bin-directory=${xorg.xkbcomp}/bin \
+        --with-xkb-output=$out/share/X11/xkb/compiled
+    make TIGERVNC_SRC=$src TIGERVNC_BUILDDIR=`pwd`/../.. -j$NIX_BUILD_CORES -l$NIX_BUILD_CORES
+    popd
+  '';
+
+  postInstall = ''
+    pushd unix/xserver/hw/vnc
+    make TIGERVNC_SRC=$src TIGERVNC_BUILDDIR=`pwd`/../../../.. install
+    popd
+    rm -f $out/lib/xorg/protocol.txt
+
+    wrapProgram $out/bin/vncserver \
+      --prefix PATH : ${stdenv.lib.makeBinPath (with xorg; [ xterm twm xsetroot xauth ]) }
+  '';
+
+  buildInputs = with xorg; [
+    libjpeg_turbo fltk pixman
+    gnutls pam nettle perl
+    xorgproto
+    utilmacros libXtst libXext libX11 libXext libICE libXi libSM libXft
+    libxkbfile libXfont2 libpciaccess
+    libGLU
+  ] ++ xorg.xorgserver.buildInputs;
+
+  nativeBuildInputs = with xorg; [ cmake zlib gettext libtool utilmacros fontutil makeWrapper ]
+    ++ xorg.xorgserver.nativeBuildInputs;
+
+  propagatedBuildInputs = xorg.xorgserver.propagatedBuildInputs;
+
+  enableParallelBuilding = true;
+
+  meta = {
+    homepage = "https://tigervnc.org/";
+    license = stdenv.lib.licenses.gpl2Plus;
+    description = "Fork of tightVNC, made in cooperation with VirtualGL";
+    maintainers = with stdenv.lib.maintainers; [viric];
+    platforms = with stdenv.lib.platforms; linux;
+    # Prevent a store collision.
+    priority = 4;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/tigervnc/u_xorg-server-1.20.7-ddxInputThreadInit.patch b/nixpkgs/pkgs/tools/admin/tigervnc/u_xorg-server-1.20.7-ddxInputThreadInit.patch
new file mode 100644
index 000000000000..c18f4bf213f2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/tigervnc/u_xorg-server-1.20.7-ddxInputThreadInit.patch
@@ -0,0 +1,21 @@
+Origin: https://build.opensuse.org/package/view_file/X11:XOrg/tigervnc/u_xorg-server-1.20.7-ddxInputThreadInit.patch
+diff -u -p -r tigervnc-1.10.0.old/unix/xserver/hw/vnc/xvnc.c tigervnc-1.10.0/unix/xserver/hw/vnc/xvnc.c
+--- tigervnc-1.10.0.old/unix/xserver/hw/vnc/xvnc.c	2020-01-15 11:19:19.486731848 +0000
++++ tigervnc-1.10.0/unix/xserver/hw/vnc/xvnc.c	2020-01-15 11:37:33.275445409 +0000
+@@ -295,6 +295,15 @@ void ddxBeforeReset(void)
+ }
+ #endif
+ 
++#if INPUTTHREAD
++/** This function is called in Xserver/os/inputthread.c when starting
++    the input thread. */
++void
++ddxInputThreadInit(void)
++{
++}
++#endif
++
+ void ddxUseMsg(void)
+ {
+     vncPrintBanner();
+
diff --git a/nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-15678.patch b/nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-15678.patch
new file mode 100644
index 000000000000..cd65d2fb5dd9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-15678.patch
@@ -0,0 +1,18 @@
+Adapted from https://github.com/LibVNC/libvncserver/commit/c5ba3fee85a7ecbbca1df5ffd46d32b92757bc2a
+diff --git a/vncviewer/rfbproto.c b/vncviewer/rfbproto.c
+index 04b0230..47a6863 100644
+--- a/vncviewer/rfbproto.c
++++ b/vncviewer/rfbproto.c
+@@ -1217,6 +1217,12 @@ HandleRFBServerMessage()
+     if (serverCutText)
+       free(serverCutText);
+ 
++    if (msg.sct.length > 1<<20) {
++      fprintf(stderr,"Ignoring too big cut text length sent by server: %u B > 1 MB\n",
++              (unsigned int)msg.sct.length);
++      return False;
++    }
++
+     serverCutText = malloc(msg.sct.length+1);
+ 
+     if (!ReadFromRFBServer(serverCutText, msg.sct.length))
diff --git a/nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-15679.patch b/nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-15679.patch
new file mode 100644
index 000000000000..6d7b3e89e0c4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-15679.patch
@@ -0,0 +1,19 @@
+Adapted from https://github.com/LibVNC/libvncserver/commit/c2c4b81e6cb3b485fb1ec7ba9e7defeb889f6ba7
+diff --git a/vncviewer/rfbproto.c b/vncviewer/rfbproto.c
+index 04b0230..bd11b54 100644
+--- a/vncviewer/rfbproto.c
++++ b/vncviewer/rfbproto.c
+@@ -303,7 +303,12 @@ InitialiseRFBConnection(void)
+   si.format.blueMax = Swap16IfLE(si.format.blueMax);
+   si.nameLength = Swap32IfLE(si.nameLength);
+ 
+-  /* FIXME: Check arguments to malloc() calls. */
++  if (si.nameLength > 1<<20) {
++    fprintf(stderr, "Too big desktop name length sent by server: %lu B > 1 MB\n",
++            (unsigned long)si.nameLength);
++    return False;
++  }
++
+   desktopName = malloc(si.nameLength + 1);
+   if (!desktopName) {
+     fprintf(stderr, "Error allocating memory for desktop name, %lu bytes\n",
diff --git a/nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-15680.patch b/nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-15680.patch
new file mode 100644
index 000000000000..7426a2b58b10
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-15680.patch
@@ -0,0 +1,16 @@
+diff --git a/vncviewer/zlib.c b/vncviewer/zlib.c
+index 80c4eee..76998d8 100644
+--- a/vncviewer/zlib.c
++++ b/vncviewer/zlib.c
+@@ -55,6 +55,11 @@ HandleZlibBPP (int rx, int ry, int rw, int rh)
+     raw_buffer_size = (( rw * rh ) * ( BPP / 8 ));
+     raw_buffer = (char*) malloc( raw_buffer_size );
+ 
++    if ( raw_buffer == NULL ) {
++      fprintf(stderr,
++              "couldn't allocate raw_buffer in HandleZlibBPP");
++      return False;
++    }
+   }
+ 
+   if (!ReadFromRFBServer((char *)&hdr, sz_rfbZlibHeader))
diff --git a/nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-8287.patch b/nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-8287.patch
new file mode 100644
index 000000000000..5bfd1b9ea87f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/tightvnc/1.3.10-CVE-2019-8287.patch
@@ -0,0 +1,14 @@
+Adapted from https://github.com/LibVNC/libvncserver/commit/7b1ef0ffc4815cab9a96c7278394152bdc89dc4d
+diff --git a/vncviewer/corre.c b/vncviewer/corre.c
+index c846a10..a4c272d 100644
+--- a/vncviewer/corre.c
++++ b/vncviewer/corre.c
+@@ -56,7 +56,7 @@ HandleCoRREBPP (int rx, int ry, int rw, int rh)
+     XChangeGC(dpy, gc, GCForeground, &gcv);
+     XFillRectangle(dpy, desktopWin, gc, rx, ry, rw, rh);
+ 
+-    if (!ReadFromRFBServer(buffer, hdr.nSubrects * (4 + (BPP / 8))))
++    if (hdr.nSubrects > BUFFER_SIZE / (4 + (BPP / 8)) || !ReadFromRFBServer(buffer, hdr.nSubrects * (4 + (BPP / 8))))
+ 	return False;
+ 
+     ptr = (CARD8 *)buffer;
diff --git a/nixpkgs/pkgs/tools/admin/tightvnc/default.nix b/nixpkgs/pkgs/tools/admin/tightvnc/default.nix
new file mode 100644
index 000000000000..7dc416c8efda
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/tightvnc/default.nix
@@ -0,0 +1,85 @@
+{ stdenv, fetchurl, xlibsWrapper, zlib, libjpeg, imake, gccmakedep, libXmu
+, libXaw, libXpm, libXp , perl, xauth, fontDirectories, openssh }:
+
+stdenv.mkDerivation {
+  name = "tightvnc-1.3.10";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/vnc-tight/tightvnc-1.3.10_unixsrc.tar.bz2";
+    sha256 = "f48c70fea08d03744ae18df6b1499976362f16934eda3275cead87baad585c0d";
+  };
+
+  patches = [
+    ./1.3.10-CVE-2019-15678.patch
+    ./1.3.10-CVE-2019-15679.patch
+    ./1.3.10-CVE-2019-15680.patch
+    ./1.3.10-CVE-2019-8287.patch
+  ];
+
+  # for the builder script
+  inherit fontDirectories;
+
+  hardeningDisable = [ "format" ];
+
+  buildInputs = [ xlibsWrapper zlib libjpeg imake gccmakedep libXmu libXaw
+                  libXpm libXp xauth openssh ];
+
+  postPatch = ''
+    fontPath=
+    for i in $fontDirectories; do
+      for j in $(find $i -name fonts.dir); do
+        addToSearchPathWithCustomDelimiter "," fontPath $(dirname $j)
+      done
+    done
+
+    sed -i "s@/usr/bin/ssh@${openssh}/bin/ssh@g" vncviewer/vncviewer.h
+
+    sed -e 's@/usr/bin/perl@${perl}/bin/perl@' \
+        -e 's@unix/:7100@'$fontPath'@' \
+        -i vncserver
+
+    sed -e 's@.* CppCmd .*@#define CppCmd		cpp@' -i Xvnc/config/cf/linux.cf
+    sed -e 's@.* CppCmd .*@#define CppCmd		cpp@' -i Xvnc/config/cf/Imake.tmpl
+    sed -i \
+        -e 's@"uname","xauth","Xvnc","vncpasswd"@"uname","Xvnc","vncpasswd"@g' \
+        -e "s@\<xauth\>@${xauth}/bin/xauth@g" \
+        vncserver
+  '';
+
+  preInstall = ''
+    mkdir -p $out/bin
+    mkdir -p $out/share/man/man1
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    ./vncinstall $out/bin $out/share/man
+
+    runHook postInstall
+  '';
+
+  postInstall = ''
+    # fix HTTP client:
+    mkdir -p $out/share/tightvnc
+    cp -r classes $out/share/tightvnc
+    substituteInPlace $out/bin/vncserver \
+      --replace /usr/local/vnc/classes $out/share/tightvnc/classes
+  '';
+
+  meta = {
+    license = stdenv.lib.licenses.gpl2Plus;
+    homepage = "http://vnc-tight.sourceforge.net/";
+    description = "Improved version of VNC";
+
+    longDescription = ''
+      TightVNC is an improved version of VNC, the great free
+      remote-desktop tool. The improvements include bandwidth-friendly
+      "tight" encoding, file transfers in the Windows version, enhanced
+      GUI, many bugfixes, and more.
+    '';
+
+    maintainers = [];
+    platforms = stdenv.lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/virtscreen/default.nix b/nixpkgs/pkgs/tools/admin/virtscreen/default.nix
new file mode 100644
index 000000000000..3c5fb64f7224
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/virtscreen/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchFromGitHub, python3Packages, x11vnc, xrandr, libGL }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "virtscreen";
+  version = "0.3.1";
+
+  disabled = python3Packages.pythonOlder "3.6";
+
+  # No tests
+  doCheck = false;
+
+  src = fetchFromGitHub {
+    owner = "kbumsik";
+    repo = pname;
+    rev = version;
+    sha256 = "005qach6phz8w17k8kqmyd647c6jkfybczybxq0yxi5ik0s91a08";
+  };
+
+  propagatedBuildInputs = with python3Packages; [
+    netifaces
+    pyqt5
+    quamash
+    x11vnc
+    xrandr
+  ];
+
+  postPatch = let
+    ext = stdenv.hostPlatform.extensions.sharedLibrary; in ''
+    substituteInPlace virtscreen/__main__.py \
+      --replace "'GL'" "'${libGL}/lib/libGL${ext}'" \
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Make your iPad/tablet/computer as a secondary monitor on Linux";
+    homepage = "https://github.com/kbumsik/VirtScreen";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ borisbabic ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/admin/vncdo/default.nix b/nixpkgs/pkgs/tools/admin/vncdo/default.nix
new file mode 100644
index 000000000000..5ca633a944b2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/admin/vncdo/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, fetchFromGitHub
+, python2Packages
+}:
+python2Packages.buildPythonPackage {
+  pname = "vncdo";
+  version = "0.11.2";
+
+  src = fetchFromGitHub {
+    owner = "sibson";
+    repo = "vncdotool";
+    rev = "5c03a82dcb5a3bd9e8f741f8a8d0c1ce082f2834";
+    sha256 = "0k03b09ipsz8vp362x7sx7z68mxgqw9qzvkii2f8j9vx2y79rjsh";
+  };
+
+  propagatedBuildInputs = with python2Packages; [
+    pillow
+    twisted
+    pexpect
+    nose
+    ptyprocess
+  ];
+
+  doCheck = false;
+
+  meta = with stdenv.lib; {
+    homepage = "https://github.com/sibson/vncdotool";
+    description = "A command line VNC client and python library";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elitak ];
+    platforms = with platforms; linux ++ darwin;
+  };
+
+}