diff options
Diffstat (limited to 'pkgs/servers')
46 files changed, 1473 insertions, 1128 deletions
diff --git a/pkgs/servers/adminer/default.nix b/pkgs/servers/adminer/default.nix new file mode 100644 index 000000000000..6d7b12df56d4 --- /dev/null +++ b/pkgs/servers/adminer/default.nix @@ -0,0 +1,31 @@ +{ stdenv, libbsd, fetchurl, phpPackages, php }: + +stdenv.mkDerivation rec { + version = "4.7.6"; + pname = "adminer"; + + # not using fetchFromGitHub as the git repo relies on submodules that are included in the tar file + src = fetchurl { + url = "https://github.com/vrana/adminer/releases/download/v${version}/adminer-${version}.tar.gz"; + sha256 = "1zgvscz7jk32qga8hp2dg89h7y72v05vz4yh4lq2ahhwwkbnsxpi"; + }; + + nativeBuildInputs = with phpPackages; [ php composer ]; + + buildPhase = '' + composer --no-cache run compile + ''; + + installPhase = '' + mkdir $out + cp adminer-${version}.php $out/adminer.php + ''; + + meta = with stdenv.lib; { + description = "Database management in a single PHP file"; + homepage = "https://www.adminer.org"; + license = with licenses; [ asl20 gpl2 ]; + maintainers = with maintainers; [ sstef ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/servers/ankisyncd/default.nix b/pkgs/servers/ankisyncd/default.nix new file mode 100644 index 000000000000..e10986701237 --- /dev/null +++ b/pkgs/servers/ankisyncd/default.nix @@ -0,0 +1,67 @@ +{ lib +, fetchFromGitHub +, python3 +, anki +}: + +python3.pkgs.buildPythonApplication rec { + pname = "ankisyncd"; + version = "2.1.0"; + src = fetchFromGitHub { + owner = "tsudoko"; + repo = "anki-sync-server"; + rev = version; + sha256 = "6a140afa94fdb1725fed716918875e3d2ad0092cb955136e381c9d826cc4927c"; + }; + format = "other"; + + installPhase = '' + runHook preInstall + + mkdir -p $out/${python3.sitePackages} + + cp -r ankisyncd utils ankisyncd.conf $out/${python3.sitePackages} + mkdir $out/share + cp ankisyncctl.py $out/share/ + + runHook postInstall + ''; + + fixupPhase = '' + PYTHONPATH="$PYTHONPATH:$out/${python3.sitePackages}:${anki}" + + makeWrapper "${python3.interpreter}" "$out/bin/ankisyncd" \ + --set PYTHONPATH $PYTHONPATH \ + --add-flags "-m ankisyncd" + + makeWrapper "${python3.interpreter}" "$out/bin/ankisyncctl" \ + --set PYTHONPATH $PYTHONPATH \ + --add-flags "$out/share/ankisyncctl.py" + ''; + + checkInputs = with python3.pkgs; [ + pytest + webtest + ]; + + buildInputs = [ ]; + + propagatedBuildInputs = [ anki ]; + + checkPhase = '' + # Exclude tests that require sqlite's sqldiff command, since + # it isn't yet packaged for NixOS, although 2 PRs exist: + # - https://github.com/NixOS/nixpkgs/pull/69112 + # - https://github.com/NixOS/nixpkgs/pull/75784 + # Once this is merged, these tests can be run as well. + pytest --ignore tests/test_web_media.py tests/ + ''; + + meta = with lib; { + description = "Self-hosted Anki sync server"; + maintainers = with maintainers; [ matt-snider ]; + homepage = "https://github.com/tsudoko/anki-sync-server"; + license = licenses.agpl3; + platforms = platforms.linux; + }; +} diff --git a/pkgs/servers/blockbook/default.nix b/pkgs/servers/blockbook/default.nix index b95c3d41b396..b931e8cfcb20 100644 --- a/pkgs/servers/blockbook/default.nix +++ b/pkgs/servers/blockbook/default.nix @@ -14,7 +14,7 @@ buildGoPackage rec { pname = "blockbook"; - version = "0.3.1"; + version = "0.3.2"; goPackagePath = "blockbook"; @@ -22,7 +22,7 @@ buildGoPackage rec { owner = "trezor"; repo = "blockbook"; rev = "v${version}"; - sha256 = "0qgd1f3b4vavw55mvpvwvlya39dx1c3kjsc7n46nn7kpc152jv1l"; + sha256 = "0hcgz4b7k8ia4dnjg6bbii95sqg3clc40ybwwc4qz3jv21ikc54x"; }; goDeps = ./deps.nix; diff --git a/pkgs/servers/blockbook/deps.nix b/pkgs/servers/blockbook/deps.nix index 90ff098581a2..9f9ae0a4704d 100644 --- a/pkgs/servers/blockbook/deps.nix +++ b/pkgs/servers/blockbook/deps.nix @@ -10,6 +10,33 @@ }; } { + goPackagePath = "github.com/allegro/bigcache"; + fetch = { + type = "git"; + url = "https://github.com/allegro/bigcache"; + rev = "69ea0af04088faa57adb9ac683934277141e92a5"; + sha256 = "0ac9pgzgi9lhklkqmc5f5x3d0cbyxjfpadc6mdbd7hdr7rfrjmxf"; + }; + } + { + goPackagePath = "github.com/aristanetworks/goarista"; + fetch = { + type = "git"; + url = "https://github.com/aristanetworks/goarista"; + rev = "8e7d5b18fe7ad671e07097d5445dbc70422663b2"; + sha256 = "1jbjviz8qi8izhvdvnbc5d9nqyxfww75ffcvxyhw5yxw9r1v0sn2"; + }; + } + { + goPackagePath = "github.com/agl/ed25519"; + fetch = { + type = "git"; + url = "https://github.com/agl/ed25519"; + rev = "5312a61534124124185d41f09206b9fef1d88403"; + sha256 = "1v8mhkf1m3ga5262s75vabskxvsw5rpqvi5nwhxwiv7gfk6h823i"; + }; + } + { goPackagePath = "github.com/beorn7/perks"; fetch = { type = "git"; @@ -46,6 +73,15 @@ }; } { + goPackagePath = "github.com/dchest/blake256"; + fetch = { + type = "git"; + url = "https://github.com/dchest/blake256"; + rev = "dee3fe6eb0e98dc774a94fc231f85baf7c29d360"; + sha256 = "18hkfm1zlkf6fsjzljiz5cjxxcf3kl5p9617si8xjggb33adzhyg"; + }; + } + { goPackagePath = "github.com/deckarep/golang-set"; fetch = { type = "git"; @@ -55,12 +91,39 @@ }; } { + goPackagePath = "github.com/decred/base58"; + fetch = { + type = "git"; + url = "https://github.com/decred/base58"; + rev = "dbeddd8aab76c31eb2ea98351a63fa2c6bf46888"; + sha256 = "0fm0gsz5myin4n15gx3fhi9pk82p6v0sxza945yvny7n13q44ns5"; + }; + } + { + goPackagePath = "github.com/decred/dcrd"; + fetch = { + type = "git"; + url = "https://github.com/decred/dcrd"; + rev = "e3e8c47c68b010dbddeb783ebad32a3a4993dd71"; + sha256 = "0zifsxhrjx282kvsqj80qr3v4af8hx4g6dqvrb6xggpkcaski8b4"; + }; + } + { + goPackagePath = "github.com/decred/slog"; + fetch = { + type = "git"; + url = "https://github.com/decred/slog"; + rev = "fbd821ef791ba2b8ae945f5d44f4e49396d230c5"; + sha256 = "0n3c7saiv4j22kjc1pf3771n6khx4g99n8vn4qvvv0i5vv04585n"; + }; + } + { goPackagePath = "github.com/ethereum/go-ethereum"; fetch = { type = "git"; url = "https://github.com/ethereum/go-ethereum"; - rev = "8bbe72075e4e16442c4e28d999edee12e294329e"; - sha256 = "0q0w0vz85d94wym3xni8y22vly886j6g6zn9hizcww1nanvk4nl6"; + rev = "24d727b6d6e2c0cde222fa12155c4a6db5caaf2e"; + sha256 = "0vrhwfavx3gciihf406f2qfrhvhnygvlj2icbswq0d01dx3s566m"; }; } { @@ -140,8 +203,8 @@ fetch = { type = "git"; url = "https://github.com/martinboehm/btcutil"; - rev = "225ed00dbbd5cb8d8b3949a0ee7c9ea540754585"; - sha256 = "0dn5s6h1524q38glp6fcdws97lyvmchq26dhbd3dqazrq61dhdvy"; + rev = "a3d2b8457b77d37c3813742d4030e199b6e09111"; + sha256 = "0152cyabklv9l39dm1g30jb7hzdv9rj45mp3v9x4kvaza58nz0x4"; }; } { @@ -275,8 +338,8 @@ fetch = { type = "git"; url = "https://go.googlesource.com/crypto"; - rev = "d6449816ce06963d9d136eee5a56fca5b0616e7e"; - sha256 = "17dkprbbk84q165275zwhcn0s6pcarigq37zlhsxj23pq2qz3aqy"; + rev = "a832865fa7ada6126f4c6124ac49f71be71bff2a"; + sha256 = "0bikp74pdi9fsvfdgy0k0r8ipzz96hy28zm8qpky0vdbwqci0a8p"; }; } { diff --git a/pkgs/servers/clickhouse/default.nix b/pkgs/servers/clickhouse/default.nix index 90cdfc3e7051..40760093462a 100644 --- a/pkgs/servers/clickhouse/default.nix +++ b/pkgs/servers/clickhouse/default.nix @@ -1,4 +1,4 @@ -{ stdenv, fetchFromGitHub, cmake, libtool, ninja +{ stdenv, fetchFromGitHub, cmake, libtool, lldClang, ninja , boost, brotli, capnproto, cctz, clang-unwrapped, double-conversion, gperftools , icu, jemalloc, libcpuid, libxml2, lld, llvm, lz4, libmysqlclient, openssl , poco, protobuf, rapidjson, re2, rdkafka, readline, sparsehash, unixODBC @@ -16,7 +16,7 @@ stdenv.mkDerivation rec { sha256 = "0ck6kcifj7y4i2j1jj1a9vf5nfpp9mxk5x8y8557zp9yayjm9qyr"; }; - nativeBuildInputs = [ cmake libtool ninja ]; + nativeBuildInputs = [ cmake libtool lldClang.bintools ninja ]; buildInputs = [ boost brotli capnproto cctz clang-unwrapped double-conversion gperftools icu jemalloc libcpuid libxml2 lld llvm lz4 libmysqlclient openssl diff --git a/pkgs/servers/dns/knot-dns/default.nix b/pkgs/servers/dns/knot-dns/default.nix index 234a39574506..7756c5fa3f19 100644 --- a/pkgs/servers/dns/knot-dns/default.nix +++ b/pkgs/servers/dns/knot-dns/default.nix @@ -8,11 +8,11 @@ let inherit (stdenv.lib) optional optionals; in # Note: ATM only the libraries have been tested in nixpkgs. stdenv.mkDerivation rec { pname = "knot-dns"; - version = "2.9.2"; + version = "2.9.3"; src = fetchurl { url = "https://secure.nic.cz/files/knot-dns/knot-${version}.tar.xz"; - sha256 = "298cdf33aa7589b50df7e5833694b24cd2de8b6d17cee7e1673873fe576db6ee"; + sha256 = "f2adf137d70955a4a20df90c5409e10be8e1127204a98b27d626ac090531a07e"; }; outputs = [ "bin" "out" "dev" ]; diff --git a/pkgs/servers/dns/knot-resolver/default.nix b/pkgs/servers/dns/knot-resolver/default.nix index c1c826b78129..ccb9a8590590 100644 --- a/pkgs/servers/dns/knot-resolver/default.nix +++ b/pkgs/servers/dns/knot-resolver/default.nix @@ -23,6 +23,14 @@ unwrapped = stdenv.mkDerivation rec { sha256 = "4a93264ad0cda7ea2252d1ba057e474722f77848165f2893e0c76e21ae406415"; }; + patches = [ + (fetchpatch { # merged to upstream master, remove on update + name = "zfs-cpu-usage.diff"; + url = "https://gitlab.labs.nic.cz/knot/knot-resolver/merge_requests/946.diff"; + sha256 = "0mcvx4pfnl19h6zrv2fcgxdjarqzczn2dz85sylcczsfvdmn6i5m"; + }) + ]; + outputs = [ "out" "dev" ]; # Path fixups for the NixOS service. diff --git a/pkgs/servers/dns/pdns-recursor/default.nix b/pkgs/servers/dns/pdns-recursor/default.nix index e5fc3ac5bb9a..7d6fa7d9c91b 100644 --- a/pkgs/servers/dns/pdns-recursor/default.nix +++ b/pkgs/servers/dns/pdns-recursor/default.nix @@ -8,11 +8,11 @@ with stdenv.lib; stdenv.mkDerivation rec { pname = "pdns-recursor"; - version = "4.2.1"; + version = "4.3.0"; src = fetchurl { url = "https://downloads.powerdns.com/releases/pdns-recursor-${version}.tar.bz2"; - sha256 = "07w9av3v9zjnb1fhknmza168yxsq4zr2jqcla7yg10ajrhsk534d"; + sha256 = "13v2iah7z10wc43v9agcjrzi3wds4jna8f0b7ph35nyzhzr31h9b"; }; nativeBuildInputs = [ pkgconfig ]; @@ -30,7 +30,7 @@ stdenv.mkDerivation rec { meta = { description = "A recursive DNS server"; - homepage = https://www.powerdns.com/; + homepage = "https://www.powerdns.com/"; platforms = platforms.linux; license = licenses.gpl2; maintainers = with maintainers; [ rnhmjoj ]; diff --git a/pkgs/servers/freeradius/default.nix b/pkgs/servers/freeradius/default.nix index cbd710853402..c7d6c509f098 100644 --- a/pkgs/servers/freeradius/default.nix +++ b/pkgs/servers/freeradius/default.nix @@ -1,4 +1,4 @@ -{ stdenv, fetchurl, autoreconfHook, talloc, finger_bsd, perl +{ stdenv, fetchurl, fetchpatch, autoreconfHook, talloc, finger_bsd, perl , openssl , linkOpenssl? true , openldap @@ -71,13 +71,29 @@ stdenv.mkDerivation rec { "--localstatedir=/var" ] ++ optional (!linkOpenssl) "--with-openssl=no"; + patches = stdenv.lib.optional withRest (fetchpatch { + # Fix HTTP/2 in rest + url = "https://github.com/FreeRADIUS/freeradius-server/commit/6286520698a3cc4053b4d49eb0a61d9ba77632aa.patch"; + sha256 = "1ycvr3ql1mfkvzydnn4aiygnidicv2hgllppv37nb1p2pk02159g"; + }); + postPatch = '' substituteInPlace src/main/checkrad.in --replace "/usr/bin/finger" "${finger_bsd}/bin/finger" ''; + # By default, freeradius will generate Diffie-Hellman parameters and + # self-signed TLS certificates during installation. We don't want + # this, for several reasons: + # - reproducibility (random generation) + # - we don't want _anybody_ to use a cert where the private key is on our public binary cache! + # - we don't want the certs to change each time the package is rebuilt + # So let's avoid anything getting into our output. + makeFlags = [ "LOCAL_CERT_FILES=" ]; + installFlags = [ "sysconfdir=\${out}/etc" "localstatedir=\${TMPDIR}" + "INSTALL_CERT_FILES=" # see comment at makeFlags ]; outputs = [ "out" "dev" "man" "doc" ]; @@ -86,7 +102,7 @@ stdenv.mkDerivation rec { homepage = https://freeradius.org/; description = "A modular, high performance free RADIUS suite"; license = licenses.gpl2; - maintainers = with maintainers; [ sheenobu willibutz ]; + maintainers = with maintainers; [ sheenobu willibutz fpletz lheckemann elseym ]; platforms = with platforms; linux; }; diff --git a/pkgs/servers/gortr/default.nix b/pkgs/servers/gortr/default.nix index 375631d5cbf8..35c6e1452437 100644 --- a/pkgs/servers/gortr/default.nix +++ b/pkgs/servers/gortr/default.nix @@ -2,13 +2,13 @@ buildGoModule rec { pname = "gortr"; - version = "0.13.0"; + version = "0.14.1"; src = fetchFromGitHub { owner = "cloudflare"; repo = pname; rev = "v${version}"; - sha256 = "1kg42qynqqj05bvfwzd77mpl63y3gnkk15x2a4rspxf4w1ziaxkr"; + sha256 = "03wxlras2akk2ig8sxzs89nvbc6zr2kbcmjlqldjdfhs1rcg82ra"; }; modSha256 = "157dpalfz3z1s3mxq63xy6lrkwzyy9xzmvn7wsxkwznjq4djv1a1"; diff --git a/pkgs/servers/grocy/config-locations.patch b/pkgs/servers/grocy/0001-Define-configs-with-env-vars.patch index 475be78ec20e..654d96ae4e1a 100644 --- a/pkgs/servers/grocy/config-locations.patch +++ b/pkgs/servers/grocy/0001-Define-configs-with-env-vars.patch @@ -1,8 +1,20 @@ -diff --git a/app.php b/app.php -index 5f91e4d..09c6010 100644 ---- a/app.php -+++ b/app.php -@@ -23,7 +23,7 @@ else +From 931958d8f11cb55f2e88a178a3b828f3c537eba8 Mon Sep 17 00:00:00 2001 +From: Maximilian Bosch <maximilian@mbosch.me> +Date: Fri, 6 Mar 2020 23:43:58 +0100 +Subject: [PATCH] Define configs with env vars + +--- + app.php | 4 ++-- + services/DatabaseService.php | 2 +- + services/FilesService.php | 2 +- + services/StockService.php | 2 +- + 4 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/app.php b/app.php +index af65ad1..4963c28 100644 +--- a/app.php ++++ b/app.php +@@ -25,7 +25,7 @@ else require_once __DIR__ . '/vendor/autoload.php'; // Load config files @@ -11,20 +23,20 @@ index 5f91e4d..09c6010 100644 require_once __DIR__ . '/config-dist.php'; // For not in own config defined values we use the default ones // Definitions for dev/demo/prerelease mode -@@ -49,7 +49,7 @@ $appContainer = new \Slim\Container([ - ], - 'view' => function($container) - { -- return new \Slim\Views\Blade(__DIR__ . '/views', GROCY_DATAPATH . '/viewcache'); -+ return new \Slim\Views\Blade(__DIR__ . '/views', getenv('GROCY_CACHE_DIR')); - }, - 'LoginControllerInstance' => function($container) - { -diff --git a/services/DatabaseService.php b/services/DatabaseService.php -index 0bcf9b8..ec45e93 100644 ---- a/services/DatabaseService.php -+++ b/services/DatabaseService.php -@@ -13,7 +13,7 @@ class DatabaseService +@@ -50,7 +50,7 @@ $app = AppFactory::create(); + $container = $app->getContainer(); + $container->set('view', function(Container $container) + { +- return new Slim\Views\Blade(__DIR__ . '/views', GROCY_DATAPATH . '/viewcache'); ++ return new \Slim\Views\Blade(__DIR__ . '/views', getenv('GROCY_CACHE_DIR')); + }); + $container->set('LoginControllerInstance', function(Container $container) + { +diff --git a/services/DatabaseService.php b/services/DatabaseService.php +index 23fc7b9..daa1993 100644 +--- a/services/DatabaseService.php ++++ b/services/DatabaseService.php +@@ -25,7 +25,7 @@ class DatabaseService return GROCY_DATAPATH . '/grocy_' . GROCY_CULTURE . '.db'; } @@ -32,25 +44,25 @@ index 0bcf9b8..ec45e93 100644 + return getenv('GROCY_DB_FILE'); } - private $DbConnectionRaw; -diff --git a/services/FilesService.php b/services/FilesService.php -index 7933b73..f52657e 100644 ---- a/services/FilesService.php -+++ b/services/FilesService.php -@@ -12,7 +12,7 @@ class FilesService extends BaseService + private static $DbConnectionRaw = null; +diff --git a/services/FilesService.php b/services/FilesService.php +index cecdae3..357298d 100644 +--- a/services/FilesService.php ++++ b/services/FilesService.php +@@ -12,7 +12,7 @@ class FilesService extends BaseService { parent::__construct(); - + - $this->StoragePath = GROCY_DATAPATH . '/storage'; + $this->StoragePath = getenv('GROCY_STORAGE_DIR'); - + if (!file_exists($this->StoragePath)) { -diff --git a/services/StockService.php b/services/StockService.php -index d7482ef..d1399a7 100644 ---- a/services/StockService.php -+++ b/services/StockService.php -@@ -933,7 +933,7 @@ class StockService extends BaseService +diff --git a/services/StockService.php b/services/StockService.php +index bfde3fc..53b2245 100644 +--- a/services/StockService.php ++++ b/services/StockService.php +@@ -934,7 +934,7 @@ class StockService extends BaseService throw new \Exception('No barcode lookup plugin defined'); } @@ -59,3 +71,6 @@ index d7482ef..d1399a7 100644 if (file_exists($path)) { require_once $path; +-- +2.25.0 + diff --git a/pkgs/servers/grocy/default.nix b/pkgs/servers/grocy/default.nix index 7af59f6904c5..718d4b1bcded 100644 --- a/pkgs/servers/grocy/default.nix +++ b/pkgs/servers/grocy/default.nix @@ -2,11 +2,11 @@ stdenv.mkDerivation rec { pname = "grocy"; - version = "2.6.0"; + version = "2.6.1"; src = fetchurl { url = "https://github.com/grocy/grocy/releases/download/v${version}/grocy_${version}.zip"; - sha256 = "1d4hy495in7p0i4fnhai1yqhjhmblv1g30siggmqpjrzdiiw3bak"; + sha256 = "1fq1zlxxhpcxj67xxlgf20dia95xcimgnm13cr56sy9f2vjx58m6"; }; nativeBuildInputs = [ unzip ]; @@ -14,7 +14,8 @@ stdenv.mkDerivation rec { unzip ${src} -d . ''; - patches = [ ./config-locations.patch ]; + patches = [ ./0001-Define-configs-with-env-vars.patch ]; + patchFlags = [ "--binary" "-p1" ]; dontBuild = true; diff --git a/pkgs/servers/home-assistant/component-packages.nix b/pkgs/servers/home-assistant/component-packages.nix index 0dfb69b95384..6b18dd30f308 100644 --- a/pkgs/servers/home-assistant/component-packages.nix +++ b/pkgs/servers/home-assistant/component-packages.nix @@ -2,911 +2,918 @@ # Do not edit! { - version = "0.104.3"; + version = "0.106.6"; components = { - "abode" = ps: with ps; [ ]; - "acer_projector" = ps: with ps; [ pyserial ]; - "actiontec" = ps: with ps; [ ]; - "adguard" = ps: with ps; [ ]; - "ads" = ps: with ps; [ ]; - "aftership" = ps: with ps; [ ]; - "air_quality" = ps: with ps; [ ]; - "airly" = ps: with ps; [ ]; - "airvisual" = ps: with ps; [ pyairvisual ]; - "aladdin_connect" = ps: with ps; [ ]; - "alarm_control_panel" = ps: with ps; [ ]; - "alarmdecoder" = ps: with ps; [ ]; - "alarmdotcom" = ps: with ps; [ ]; - "alert" = ps: with ps; [ ]; - "alexa" = ps: with ps; [ aiohttp-cors ]; - "almond" = ps: with ps; [ aiohttp-cors ]; - "alpha_vantage" = ps: with ps; [ ]; - "amazon_polly" = ps: with ps; [ boto3 ]; - "ambiclimate" = ps: with ps; [ aiohttp-cors ]; - "ambient_station" = ps: with ps; [ ]; - "amcrest" = ps: with ps; [ ha-ffmpeg ]; - "ampio" = ps: with ps; [ ]; - "android_ip_webcam" = ps: with ps; [ ]; - "androidtv" = ps: with ps; [ ]; - "anel_pwrctrl" = ps: with ps; [ ]; - "anthemav" = ps: with ps; [ ]; - "apache_kafka" = ps: with ps; [ aiokafka ]; - "apcupsd" = ps: with ps; [ ]; - "api" = ps: with ps; [ aiohttp-cors ]; - "apns" = ps: with ps; [ ]; - "apple_tv" = ps: with ps; [ pyatv ]; - "apprise" = ps: with ps; [ apprise ]; - "aprs" = ps: with ps; [ ]; - "aqualogic" = ps: with ps; [ ]; - "aquostv" = ps: with ps; [ ]; - "arcam_fmj" = ps: with ps; [ ]; - "arduino" = ps: with ps; [ ]; - "arest" = ps: with ps; [ ]; - "arlo" = ps: with ps; [ ha-ffmpeg ]; - "aruba" = ps: with ps; [ pexpect ]; - "arwn" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ]; - "asterisk_cdr" = ps: with ps; [ ]; - "asterisk_mbox" = ps: with ps; [ ]; - "asuswrt" = ps: with ps; [ ]; - "aten_pe" = ps: with ps; [ ]; - "atome" = ps: with ps; [ ]; - "august" = ps: with ps; [ ]; - "aurora" = ps: with ps; [ ]; - "aurora_abb_powerone" = ps: with ps; [ ]; - "auth" = ps: with ps; [ aiohttp-cors ]; - "automatic" = ps: with ps; [ aiohttp-cors ]; - "automation" = ps: with ps; [ aiohttp-cors ]; - "avea" = ps: with ps; [ ]; - "avion" = ps: with ps; [ ]; - "awair" = ps: with ps; [ ]; - "aws" = ps: with ps; [ ]; - "axis" = ps: with ps; [ ]; - "azure_event_hub" = ps: with ps; [ ]; - "azure_service_bus" = ps: with ps; [ azure-servicebus ]; - "baidu" = ps: with ps; [ ]; - "bayesian" = ps: with ps; [ ]; - "bbb_gpio" = ps: with ps; [ ]; - "bbox" = ps: with ps; [ ]; - "beewi_smartclim" = ps: with ps; [ ]; - "bh1750" = ps: with ps; [ ]; - "binary_sensor" = ps: with ps; [ ]; - "bitcoin" = ps: with ps; [ ]; - "bizkaibus" = ps: with ps; [ ]; - "blackbird" = ps: with ps; [ ]; - "blink" = ps: with ps; [ ]; - "blinksticklight" = ps: with ps; [ BlinkStick ]; - "blinkt" = ps: with ps; [ ]; - "blockchain" = ps: with ps; [ ]; - "bloomsky" = ps: with ps; [ ]; - "bluesound" = ps: with ps; [ xmltodict ]; - "bluetooth_le_tracker" = ps: with ps; [ ]; - "bluetooth_tracker" = ps: with ps; [ bt_proximity ]; - "bme280" = ps: with ps; [ ]; - "bme680" = ps: with ps; [ ]; - "bmw_connected_drive" = ps: with ps; [ ]; - "bom" = ps: with ps; [ ]; - "braviatv" = ps: with ps; [ ]; - "broadlink" = ps: with ps; [ broadlink ]; - "brother" = ps: with ps; [ ]; - "brottsplatskartan" = ps: with ps; [ ]; - "browser" = ps: with ps; [ ]; - "brunt" = ps: with ps; [ ]; - "bt_home_hub_5" = ps: with ps; [ ]; - "bt_smarthub" = ps: with ps; [ ]; - "buienradar" = ps: with ps; [ ]; - "caldav" = ps: with ps; [ caldav ]; - "calendar" = ps: with ps; [ aiohttp-cors ]; - "camera" = ps: with ps; [ aiohttp-cors ]; - "canary" = ps: with ps; [ ha-ffmpeg ]; - "cast" = ps: with ps; [ PyChromecast ]; - "cert_expiry" = ps: with ps; [ ]; - "channels" = ps: with ps; [ ]; - "cisco_ios" = ps: with ps; [ pexpect ]; - "cisco_mobility_express" = ps: with ps; [ ]; - "cisco_webex_teams" = ps: with ps; [ ]; - "ciscospark" = ps: with ps; [ ]; - "citybikes" = ps: with ps; [ ]; - "clementine" = ps: with ps; [ ]; - "clickatell" = ps: with ps; [ ]; - "clicksend" = ps: with ps; [ ]; - "clicksend_tts" = ps: with ps; [ ]; - "climate" = ps: with ps; [ ]; - "cloud" = ps: with ps; [ aiohttp-cors hass-nabucasa ]; - "cloudflare" = ps: with ps; [ ]; - "cmus" = ps: with ps; [ ]; - "co2signal" = ps: with ps; [ ]; - "coinbase" = ps: with ps; [ ]; - "coinmarketcap" = ps: with ps; [ coinmarketcap ]; - "comed_hourly_pricing" = ps: with ps; [ ]; - "comfoconnect" = ps: with ps; [ ]; - "command_line" = ps: with ps; [ ]; - "concord232" = ps: with ps; [ ]; - "config" = ps: with ps; [ aiohttp-cors ]; - "configurator" = ps: with ps; [ ]; - "conversation" = ps: with ps; [ aiohttp-cors ]; - "coolmaster" = ps: with ps; [ ]; - "counter" = ps: with ps; [ ]; - "cover" = ps: with ps; [ ]; - "cppm_tracker" = ps: with ps; [ ]; - "cpuspeed" = ps: with ps; [ py-cpuinfo ]; - "crimereports" = ps: with ps; [ ]; - "cups" = ps: with ps; [ pycups ]; - "currencylayer" = ps: with ps; [ ]; - "daikin" = ps: with ps; [ ]; - "danfoss_air" = ps: with ps; [ ]; - "darksky" = ps: with ps; [ python-forecastio ]; - "datadog" = ps: with ps; [ datadog ]; - "ddwrt" = ps: with ps; [ ]; - "deconz" = ps: with ps; [ ]; - "decora" = ps: with ps; [ ]; - "decora_wifi" = ps: with ps; [ ]; - "default_config" = ps: with ps; [ pynacl aiohttp-cors defusedxml distro hass-nabucasa netdisco sqlalchemy zeroconf ]; - "delijn" = ps: with ps; [ ]; - "deluge" = ps: with ps; [ deluge-client ]; - "demo" = ps: with ps; [ aiohttp-cors ]; - "denon" = ps: with ps; [ ]; - "denonavr" = ps: with ps; [ ]; - "deutsche_bahn" = ps: with ps; [ ]; - "device_automation" = ps: with ps; [ aiohttp-cors ]; - "device_sun_light_trigger" = ps: with ps; [ ]; - "device_tracker" = ps: with ps; [ ]; - "dht" = ps: with ps; [ ]; - "dialogflow" = ps: with ps; [ aiohttp-cors ]; - "digital_ocean" = ps: with ps; [ digital-ocean ]; - "digitalloggers" = ps: with ps; [ ]; - "directv" = ps: with ps; [ ]; - "discogs" = ps: with ps; [ discogs_client ]; - "discord" = ps: with ps; [ discordpy ]; - "discovery" = ps: with ps; [ netdisco ]; - "dlib_face_detect" = ps: with ps; [ face_recognition ]; - "dlib_face_identify" = ps: with ps; [ face_recognition ]; - "dlink" = ps: with ps; [ ]; - "dlna_dmr" = ps: with ps; [ ]; - "dnsip" = ps: with ps; [ aiodns ]; - "dominos" = ps: with ps; [ aiohttp-cors ]; - "doods" = ps: with ps; [ pillow ]; - "doorbird" = ps: with ps; [ aiohttp-cors ]; - "dovado" = ps: with ps; [ ]; - "downloader" = ps: with ps; [ ]; - "dsmr" = ps: with ps; [ ]; - "dsmr_reader" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ]; - "dte_energy_bridge" = ps: with ps; [ ]; - "dublin_bus_transport" = ps: with ps; [ ]; - "duckdns" = ps: with ps; [ ]; - "duke_energy" = ps: with ps; [ ]; - "dunehd" = ps: with ps; [ ]; - "dwd_weather_warnings" = ps: with ps; [ ]; - "dweet" = ps: with ps; [ ]; - "dyson" = ps: with ps; [ ]; - "ebox" = ps: with ps; [ ]; - "ebusd" = ps: with ps; [ ]; - "ecoal_boiler" = ps: with ps; [ ]; - "ecobee" = ps: with ps; [ ]; - "econet" = ps: with ps; [ ]; - "ecovacs" = ps: with ps; [ ]; - "eddystone_temperature" = ps: with ps; [ construct ]; - "edimax" = ps: with ps; [ ]; - "ee_brightbox" = ps: with ps; [ ]; - "efergy" = ps: with ps; [ ]; - "egardia" = ps: with ps; [ ]; - "eight_sleep" = ps: with ps; [ ]; - "elgato" = ps: with ps; [ ]; - "eliqonline" = ps: with ps; [ ]; - "elkm1" = ps: with ps; [ ]; - "elv" = ps: with ps; [ ]; - "emby" = ps: with ps; [ ]; - "emoncms" = ps: with ps; [ ]; - "emoncms_history" = ps: with ps; [ ]; - "emulated_hue" = ps: with ps; [ aiohttp-cors ]; - "emulated_roku" = ps: with ps; [ ]; - "enigma2" = ps: with ps; [ ]; - "enocean" = ps: with ps; [ ]; - "enphase_envoy" = ps: with ps; [ ]; - "entur_public_transport" = ps: with ps; [ ]; - "environment_canada" = ps: with ps; [ ]; - "envirophat" = ps: with ps; [ ]; - "envisalink" = ps: with ps; [ ]; - "ephember" = ps: with ps; [ ]; - "epson" = ps: with ps; [ ]; - "epsonworkforce" = ps: with ps; [ ]; - "eq3btsmart" = ps: with ps; [ construct ]; - "esphome" = ps: with ps; [ aioesphomeapi ]; - "essent" = ps: with ps; [ ]; - "etherscan" = ps: with ps; [ ]; - "eufy" = ps: with ps; [ ]; - "everlights" = ps: with ps; [ ]; - "evohome" = ps: with ps; [ ]; - "facebook" = ps: with ps; [ ]; - "facebox" = ps: with ps; [ ]; - "fail2ban" = ps: with ps; [ ]; - "familyhub" = ps: with ps; [ ]; - "fan" = ps: with ps; [ ]; - "fastdotcom" = ps: with ps; [ ]; - "feedreader" = ps: with ps; [ ]; - "ffmpeg" = ps: with ps; [ ha-ffmpeg ]; - "ffmpeg_motion" = ps: with ps; [ ha-ffmpeg ]; - "ffmpeg_noise" = ps: with ps; [ ha-ffmpeg ]; - "fibaro" = ps: with ps; [ ]; - "fido" = ps: with ps; [ ]; - "file" = ps: with ps; [ ]; - "filesize" = ps: with ps; [ ]; - "filter" = ps: with ps; [ aiohttp-cors sqlalchemy ]; - "fints" = ps: with ps; [ fints ]; - "fitbit" = ps: with ps; [ aiohttp-cors fitbit ]; - "fixer" = ps: with ps; [ ]; - "fleetgo" = ps: with ps; [ ]; - "flexit" = ps: with ps; [ ]; - "flic" = ps: with ps; [ ]; - "flock" = ps: with ps; [ ]; - "flume" = ps: with ps; [ ]; - "flunearyou" = ps: with ps; [ ]; - "flux" = ps: with ps; [ ]; - "flux_led" = ps: with ps; [ ]; - "folder" = ps: with ps; [ ]; - "folder_watcher" = ps: with ps; [ watchdog ]; - "foobot" = ps: with ps; [ ]; - "fortigate" = ps: with ps; [ ]; - "fortios" = ps: with ps; [ ]; - "foscam" = ps: with ps; [ ]; - "foursquare" = ps: with ps; [ aiohttp-cors ]; - "free_mobile" = ps: with ps; [ ]; - "freebox" = ps: with ps; [ ]; - "freedns" = ps: with ps; [ ]; - "fritz" = ps: with ps; [ fritzconnection ]; - "fritzbox" = ps: with ps; [ ]; - "fritzbox_callmonitor" = ps: with ps; [ fritzconnection ]; - "fritzbox_netmonitor" = ps: with ps; [ fritzconnection ]; - "fritzdect" = ps: with ps; [ ]; - "fronius" = ps: with ps; [ ]; - "frontend" = ps: with ps; [ aiohttp-cors ]; - "frontier_silicon" = ps: with ps; [ ]; - "futurenow" = ps: with ps; [ ]; - "garadget" = ps: with ps; [ ]; - "gc100" = ps: with ps; [ ]; - "gearbest" = ps: with ps; [ ]; - "geizhals" = ps: with ps; [ ]; - "generic" = ps: with ps; [ ]; - "generic_thermostat" = ps: with ps; [ ]; - "geniushub" = ps: with ps; [ ]; - "geo_json_events" = ps: with ps; [ ]; - "geo_location" = ps: with ps; [ ]; - "geo_rss_events" = ps: with ps; [ ]; - "geofency" = ps: with ps; [ aiohttp-cors ]; - "geonetnz_quakes" = ps: with ps; [ ]; - "geonetnz_volcano" = ps: with ps; [ ]; - "gios" = ps: with ps; [ ]; - "github" = ps: with ps; [ PyGithub ]; - "gitlab_ci" = ps: with ps; [ python-gitlab ]; - "gitter" = ps: with ps; [ ]; - "glances" = ps: with ps; [ ]; - "gntp" = ps: with ps; [ ]; - "goalfeed" = ps: with ps; [ ]; - "gogogate2" = ps: with ps; [ ]; - "google" = ps: with ps; [ google_api_python_client httplib2 oauth2client ]; - "google_assistant" = ps: with ps; [ aiohttp-cors ]; - "google_cloud" = ps: with ps; [ google_cloud_texttospeech ]; - "google_domains" = ps: with ps; [ ]; - "google_maps" = ps: with ps; [ ]; - "google_pubsub" = ps: with ps; [ google_cloud_pubsub ]; - "google_translate" = ps: with ps; [ gtts-token ]; - "google_travel_time" = ps: with ps; [ ]; - "google_wifi" = ps: with ps; [ ]; - "gpmdp" = ps: with ps; [ websocket_client ]; - "gpsd" = ps: with ps; [ ]; - "gpslogger" = ps: with ps; [ aiohttp-cors ]; - "graphite" = ps: with ps; [ ]; - "greeneye_monitor" = ps: with ps; [ ]; - "greenwave" = ps: with ps; [ ]; - "group" = ps: with ps; [ ]; - "growatt_server" = ps: with ps; [ ]; - "gstreamer" = ps: with ps; [ ]; - "gtfs" = ps: with ps; [ ]; - "habitica" = ps: with ps; [ ]; - "hangouts" = ps: with ps; [ ]; - "harman_kardon_avr" = ps: with ps; [ ]; - "harmony" = ps: with ps; [ ]; - "hassio" = ps: with ps; [ aiohttp-cors ]; - "haveibeenpwned" = ps: with ps; [ ]; - "hddtemp" = ps: with ps; [ ]; - "hdmi_cec" = ps: with ps; [ ]; - "heatmiser" = ps: with ps; [ ]; - "heos" = ps: with ps; [ ]; - "here_travel_time" = ps: with ps; [ ]; - "hikvision" = ps: with ps; [ ]; - "hikvisioncam" = ps: with ps; [ ]; - "hisense_aehw4a1" = ps: with ps; [ ]; - "history" = ps: with ps; [ aiohttp-cors sqlalchemy ]; - "history_graph" = ps: with ps; [ aiohttp-cors sqlalchemy ]; - "history_stats" = ps: with ps; [ aiohttp-cors sqlalchemy ]; - "hitron_coda" = ps: with ps; [ ]; - "hive" = ps: with ps; [ ]; - "hlk_sw16" = ps: with ps; [ ]; - "homeassistant" = ps: with ps; [ ]; - "homekit" = ps: with ps; [ ]; - "homekit_controller" = ps: with ps; [ ]; - "homematic" = ps: with ps; [ pyhomematic ]; - "homematicip_cloud" = ps: with ps; [ ]; - "homeworks" = ps: with ps; [ ]; - "honeywell" = ps: with ps; [ ]; - "hook" = ps: with ps; [ ]; - "horizon" = ps: with ps; [ ]; - "hp_ilo" = ps: with ps; [ ]; - "html5" = ps: with ps; [ aiohttp-cors pywebpush ]; - "http" = ps: with ps; [ aiohttp-cors ]; - "htu21d" = ps: with ps; [ ]; - "huawei_lte" = ps: with ps; [ stringcase ]; - "huawei_router" = ps: with ps; [ ]; - "hue" = ps: with ps; [ aiohue ]; - "hunterdouglas_powerview" = ps: with ps; [ ]; - "hydrawise" = ps: with ps; [ ]; - "hyperion" = ps: with ps; [ ]; - "ialarm" = ps: with ps; [ ]; - "iaqualink" = ps: with ps; [ ]; - "icloud" = ps: with ps; [ pyicloud ]; - "idteck_prox" = ps: with ps; [ ]; - "ifttt" = ps: with ps; [ aiohttp-cors pyfttt ]; - "iglo" = ps: with ps; [ ]; - "ign_sismologia" = ps: with ps; [ ]; - "ihc" = ps: with ps; [ defusedxml ]; - "image_processing" = ps: with ps; [ aiohttp-cors ]; - "imap" = ps: with ps; [ ]; - "imap_email_content" = ps: with ps; [ ]; - "incomfort" = ps: with ps; [ ]; - "influxdb" = ps: with ps; [ influxdb ]; - "input_boolean" = ps: with ps; [ ]; - "input_datetime" = ps: with ps; [ ]; - "input_number" = ps: with ps; [ ]; - "input_select" = ps: with ps; [ ]; - "input_text" = ps: with ps; [ ]; - "insteon" = ps: with ps; [ ]; - "integration" = ps: with ps; [ ]; - "intent" = ps: with ps; [ aiohttp-cors ]; - "intent_script" = ps: with ps; [ ]; - "intesishome" = ps: with ps; [ ]; - "ios" = ps: with ps; [ aiohttp-cors zeroconf ]; - "iota" = ps: with ps; [ ]; - "iperf3" = ps: with ps; [ ]; - "ipma" = ps: with ps; [ ]; - "iqvia" = ps: with ps; [ numpy ]; - "irish_rail_transport" = ps: with ps; [ ]; - "islamic_prayer_times" = ps: with ps; [ ]; - "iss" = ps: with ps; [ ]; - "isy994" = ps: with ps; [ ]; - "itach" = ps: with ps; [ ]; - "itunes" = ps: with ps; [ ]; - "izone" = ps: with ps; [ ]; - "jewish_calendar" = ps: with ps; [ ]; - "joaoapps_join" = ps: with ps; [ ]; - "juicenet" = ps: with ps; [ ]; - "kaiterra" = ps: with ps; [ ]; - "kankun" = ps: with ps; [ ]; - "keba" = ps: with ps; [ ]; - "keenetic_ndms2" = ps: with ps; [ ]; - "kef" = ps: with ps; [ ]; - "keyboard" = ps: with ps; [ ]; - "keyboard_remote" = ps: with ps; [ evdev ]; - "kira" = ps: with ps; [ ]; - "kiwi" = ps: with ps; [ ]; - "knx" = ps: with ps; [ ]; - "kodi" = ps: with ps; [ jsonrpc-async jsonrpc-websocket ]; - "konnected" = ps: with ps; [ aiohttp-cors ]; - "kwb" = ps: with ps; [ ]; - "lacrosse" = ps: with ps; [ ]; - "lametric" = ps: with ps; [ ]; - "lannouncer" = ps: with ps; [ ]; - "lastfm" = ps: with ps; [ pylast ]; - "launch_library" = ps: with ps; [ ]; - "lcn" = ps: with ps; [ ]; - "lg_netcast" = ps: with ps; [ ]; - "lg_soundbar" = ps: with ps; [ ]; - "life360" = ps: with ps; [ ]; - "lifx" = ps: with ps; [ aiolifx aiolifx-effects ]; - "lifx_cloud" = ps: with ps; [ ]; - "lifx_legacy" = ps: with ps; [ ]; - "light" = ps: with ps; [ ]; - "lightwave" = ps: with ps; [ ]; - "limitlessled" = ps: with ps; [ limitlessled ]; - "linksys_smart" = ps: with ps; [ ]; - "linky" = ps: with ps; [ ]; - "linode" = ps: with ps; [ linode-api ]; - "linux_battery" = ps: with ps; [ batinfo ]; - "lirc" = ps: with ps; [ ]; - "litejet" = ps: with ps; [ ]; - "liveboxplaytv" = ps: with ps; [ ]; - "llamalab_automate" = ps: with ps; [ ]; - "local_file" = ps: with ps; [ ]; - "local_ip" = ps: with ps; [ ]; - "locative" = ps: with ps; [ aiohttp-cors ]; - "lock" = ps: with ps; [ ]; - "lockitron" = ps: with ps; [ ]; - "logbook" = ps: with ps; [ aiohttp-cors sqlalchemy ]; - "logentries" = ps: with ps; [ ]; - "logger" = ps: with ps; [ ]; - "logi_circle" = ps: with ps; [ aiohttp-cors ha-ffmpeg ]; - "london_air" = ps: with ps; [ ]; - "london_underground" = ps: with ps; [ ]; - "loopenergy" = ps: with ps; [ ]; - "lovelace" = ps: with ps; [ ]; - "luci" = ps: with ps; [ ]; - "luftdaten" = ps: with ps; [ luftdaten ]; - "lupusec" = ps: with ps; [ ]; - "lutron" = ps: with ps; [ ]; - "lutron_caseta" = ps: with ps; [ ]; - "lw12wifi" = ps: with ps; [ ]; - "lyft" = ps: with ps; [ ]; - "magicseaweed" = ps: with ps; [ ]; - "mailbox" = ps: with ps; [ aiohttp-cors ]; - "mailgun" = ps: with ps; [ aiohttp-cors ]; - "manual" = ps: with ps; [ ]; - "manual_mqtt" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ]; - "map" = ps: with ps; [ aiohttp-cors ]; - "marytts" = ps: with ps; [ ]; - "mastodon" = ps: with ps; [ ]; - "matrix" = ps: with ps; [ matrix-client ]; - "maxcube" = ps: with ps; [ ]; - "mcp23017" = ps: with ps; [ ]; - "media_extractor" = ps: with ps; [ aiohttp-cors youtube-dl-light ]; - "media_player" = ps: with ps; [ aiohttp-cors ]; - "mediaroom" = ps: with ps; [ ]; - "melissa" = ps: with ps; [ ]; - "meraki" = ps: with ps; [ aiohttp-cors ]; - "message_bird" = ps: with ps; [ ]; - "met" = ps: with ps; [ ]; - "meteo_france" = ps: with ps; [ ]; - "meteoalarm" = ps: with ps; [ ]; - "metoffice" = ps: with ps; [ ]; - "mfi" = ps: with ps; [ ]; - "mhz19" = ps: with ps; [ ]; - "microsoft" = ps: with ps; [ ]; - "microsoft_face" = ps: with ps; [ aiohttp-cors ]; - "microsoft_face_detect" = ps: with ps; [ aiohttp-cors ]; - "microsoft_face_identify" = ps: with ps; [ aiohttp-cors ]; - "miflora" = ps: with ps; [ ]; - "mikrotik" = ps: with ps; [ ]; - "mill" = ps: with ps; [ ]; - "min_max" = ps: with ps; [ ]; - "minio" = ps: with ps; [ minio ]; - "mitemp_bt" = ps: with ps; [ ]; - "mjpeg" = ps: with ps; [ ]; - "mobile_app" = ps: with ps; [ pynacl aiohttp-cors ]; - "mochad" = ps: with ps; [ ]; - "modbus" = ps: with ps; [ ]; - "modem_callerid" = ps: with ps; [ ]; - "mold_indicator" = ps: with ps; [ ]; - "monoprice" = ps: with ps; [ ]; - "moon" = ps: with ps; [ ]; - "mopar" = ps: with ps; [ ]; - "mpchc" = ps: with ps; [ ]; - "mpd" = ps: with ps; [ mpd2 ]; - "mqtt" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ]; - "mqtt_eventstream" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ]; - "mqtt_json" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ]; - "mqtt_room" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ]; - "mqtt_statestream" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ]; - "msteams" = ps: with ps; [ ]; - "mvglive" = ps: with ps; [ PyMVGLive ]; - "mychevy" = ps: with ps; [ ]; - "mycroft" = ps: with ps; [ ]; - "myq" = ps: with ps; [ ]; - "mysensors" = ps: with ps; [ ]; - "mystrom" = ps: with ps; [ aiohttp-cors ]; - "mythicbeastsdns" = ps: with ps; [ ]; - "n26" = ps: with ps; [ ]; - "nad" = ps: with ps; [ ]; - "namecheapdns" = ps: with ps; [ defusedxml ]; - "nanoleaf" = ps: with ps; [ ]; - "neato" = ps: with ps; [ pybotvac ]; - "nederlandse_spoorwegen" = ps: with ps; [ ]; - "nello" = ps: with ps; [ ]; - "ness_alarm" = ps: with ps; [ ]; - "nest" = ps: with ps; [ ]; - "netatmo" = ps: with ps; [ aiohttp-cors pyatmo ]; - "netdata" = ps: with ps; [ ]; - "netgear" = ps: with ps; [ ]; - "netgear_lte" = ps: with ps; [ ]; - "netio" = ps: with ps; [ aiohttp-cors ]; - "neurio_energy" = ps: with ps; [ ]; - "nextbus" = ps: with ps; [ ]; - "nfandroidtv" = ps: with ps; [ ]; - "niko_home_control" = ps: with ps; [ ]; - "nilu" = ps: with ps; [ ]; - "nissan_leaf" = ps: with ps; [ ]; - "nmap_tracker" = ps: with ps; [ ]; - "nmbs" = ps: with ps; [ ]; - "no_ip" = ps: with ps; [ ]; - "noaa_tides" = ps: with ps; [ ]; - "norway_air" = ps: with ps; [ ]; - "notify" = ps: with ps; [ ]; - "notion" = ps: with ps; [ ]; - "nsw_fuel_station" = ps: with ps; [ ]; - "nsw_rural_fire_service_feed" = ps: with ps; [ ]; - "nuheat" = ps: with ps; [ ]; - "nuimo_controller" = ps: with ps; [ ]; - "nuki" = ps: with ps; [ ]; - "nut" = ps: with ps; [ ]; - "nws" = ps: with ps; [ ]; - "nx584" = ps: with ps; [ ]; - "nzbget" = ps: with ps; [ ]; - "oasa_telematics" = ps: with ps; [ ]; - "obihai" = ps: with ps; [ ]; - "octoprint" = ps: with ps; [ ]; - "oem" = ps: with ps; [ ]; - "ohmconnect" = ps: with ps; [ defusedxml ]; - "ombi" = ps: with ps; [ ]; - "onboarding" = ps: with ps; [ aiohttp-cors ]; - "onewire" = ps: with ps; [ ]; - "onkyo" = ps: with ps; [ onkyo-eiscp ]; - "onvif" = ps: with ps; [ ha-ffmpeg ]; - "openalpr_cloud" = ps: with ps; [ ]; - "openalpr_local" = ps: with ps; [ ]; - "opencv" = ps: with ps; [ numpy ]; - "openevse" = ps: with ps; [ ]; - "openexchangerates" = ps: with ps; [ ]; - "opengarage" = ps: with ps; [ ]; - "openhardwaremonitor" = ps: with ps; [ ]; - "openhome" = ps: with ps; [ ]; - "opensensemap" = ps: with ps; [ ]; - "opensky" = ps: with ps; [ ]; - "opentherm_gw" = ps: with ps; [ ]; - "openuv" = ps: with ps; [ ]; - "openweathermap" = ps: with ps; [ pyowm ]; - "opple" = ps: with ps; [ ]; - "orangepi_gpio" = ps: with ps; [ ]; - "oru" = ps: with ps; [ ]; - "orvibo" = ps: with ps; [ ]; - "osramlightify" = ps: with ps; [ ]; - "otp" = ps: with ps; [ pyotp ]; - "owlet" = ps: with ps; [ ]; - "owntracks" = ps: with ps; [ pynacl aiohttp-cors ]; - "panasonic_bluray" = ps: with ps; [ ]; - "panasonic_viera" = ps: with ps; [ wakeonlan ]; - "pandora" = ps: with ps; [ pexpect ]; - "panel_custom" = ps: with ps; [ aiohttp-cors ]; - "panel_iframe" = ps: with ps; [ aiohttp-cors ]; - "pcal9535a" = ps: with ps; [ ]; - "pencom" = ps: with ps; [ ]; - "persistent_notification" = ps: with ps; [ ]; - "person" = ps: with ps; [ ]; - "philips_js" = ps: with ps; [ ]; - "pi_hole" = ps: with ps; [ ]; - "picotts" = ps: with ps; [ ]; - "piglow" = ps: with ps; [ ]; - "pilight" = ps: with ps; [ ]; - "ping" = ps: with ps; [ ]; - "pioneer" = ps: with ps; [ ]; - "pjlink" = ps: with ps; [ ]; - "plaato" = ps: with ps; [ aiohttp-cors ]; - "plant" = ps: with ps; [ ]; - "plex" = ps: with ps; [ aiohttp-cors ]; - "plugwise" = ps: with ps; [ ]; - "plum_lightpad" = ps: with ps; [ ]; - "pocketcasts" = ps: with ps; [ ]; - "point" = ps: with ps; [ aiohttp-cors ]; - "postnl" = ps: with ps; [ ]; - "prezzibenzina" = ps: with ps; [ ]; - "proliphix" = ps: with ps; [ ]; - "prometheus" = ps: with ps; [ aiohttp-cors prometheus_client ]; - "prowl" = ps: with ps; [ ]; - "proximity" = ps: with ps; [ ]; - "proxmoxve" = ps: with ps; [ ]; - "proxy" = ps: with ps; [ pillow ]; - "ps4" = ps: with ps; [ ]; - "ptvsd" = ps: with ps; [ ]; - "pulseaudio_loopback" = ps: with ps; [ ]; - "push" = ps: with ps; [ aiohttp-cors ]; - "pushbullet" = ps: with ps; [ pushbullet ]; - "pushetta" = ps: with ps; [ ]; - "pushover" = ps: with ps; [ python-pushover ]; - "pushsafer" = ps: with ps; [ ]; - "pvoutput" = ps: with ps; [ ]; - "pyload" = ps: with ps; [ ]; - "python_script" = ps: with ps; [ restrictedpython ]; - "qbittorrent" = ps: with ps; [ ]; - "qld_bushfire" = ps: with ps; [ ]; - "qnap" = ps: with ps; [ ]; - "qrcode" = ps: with ps; [ pillow ]; - "quantum_gateway" = ps: with ps; [ ]; - "qwikswitch" = ps: with ps; [ ]; - "rachio" = ps: with ps; [ aiohttp-cors ]; - "radarr" = ps: with ps; [ ]; - "radiotherm" = ps: with ps; [ ]; - "rainbird" = ps: with ps; [ ]; - "raincloud" = ps: with ps; [ ]; - "rainforest_eagle" = ps: with ps; [ ]; - "rainmachine" = ps: with ps; [ ]; - "random" = ps: with ps; [ ]; - "raspihats" = ps: with ps; [ ]; - "raspyrfm" = ps: with ps; [ ]; - "recollect_waste" = ps: with ps; [ ]; - "recorder" = ps: with ps; [ sqlalchemy ]; - "recswitch" = ps: with ps; [ ]; - "reddit" = ps: with ps; [ praw ]; - "rejseplanen" = ps: with ps; [ ]; - "remember_the_milk" = ps: with ps; [ httplib2 ]; - "remote" = ps: with ps; [ ]; - "remote_rpi_gpio" = ps: with ps; [ ]; - "repetier" = ps: with ps; [ ]; - "rest" = ps: with ps; [ ]; - "rest_command" = ps: with ps; [ ]; - "rflink" = ps: with ps; [ ]; - "rfxtrx" = ps: with ps; [ ]; - "ring" = ps: with ps; [ ha-ffmpeg ]; - "ripple" = ps: with ps; [ ]; - "rmvtransport" = ps: with ps; [ ]; - "rocketchat" = ps: with ps; [ ]; - "roku" = ps: with ps; [ ]; - "roomba" = ps: with ps; [ ]; - "route53" = ps: with ps; [ boto3 ]; - "rova" = ps: with ps; [ ]; - "rpi_camera" = ps: with ps; [ ]; - "rpi_gpio" = ps: with ps; [ ]; - "rpi_gpio_pwm" = ps: with ps; [ ]; - "rpi_pfio" = ps: with ps; [ ]; - "rpi_rf" = ps: with ps; [ ]; - "rss_feed_template" = ps: with ps; [ aiohttp-cors ]; - "rtorrent" = ps: with ps; [ ]; - "russound_rio" = ps: with ps; [ ]; - "russound_rnet" = ps: with ps; [ ]; - "sabnzbd" = ps: with ps; [ ]; - "saj" = ps: with ps; [ ]; - "samsungtv" = ps: with ps; [ wakeonlan ]; - "satel_integra" = ps: with ps; [ ]; - "scene" = ps: with ps; [ ]; - "scrape" = ps: with ps; [ beautifulsoup4 ]; - "script" = ps: with ps; [ ]; - "scsgate" = ps: with ps; [ ]; - "season" = ps: with ps; [ ephem ]; - "sendgrid" = ps: with ps; [ ]; - "sense" = ps: with ps; [ ]; - "sensehat" = ps: with ps; [ ]; - "sensibo" = ps: with ps; [ ]; - "sensor" = ps: with ps; [ ]; - "sentry" = ps: with ps; [ sentry-sdk ]; - "serial" = ps: with ps; [ pyserial-asyncio ]; - "serial_pm" = ps: with ps; [ ]; - "sesame" = ps: with ps; [ ]; - "seven_segments" = ps: with ps; [ pillow ]; - "seventeentrack" = ps: with ps; [ ]; - "shell_command" = ps: with ps; [ ]; - "shiftr" = ps: with ps; [ paho-mqtt ]; - "shodan" = ps: with ps; [ shodan ]; - "shopping_list" = ps: with ps; [ aiohttp-cors ]; - "sht31" = ps: with ps; [ ]; - "sigfox" = ps: with ps; [ ]; - "signal_messenger" = ps: with ps; [ ]; - "simplepush" = ps: with ps; [ ]; - "simplisafe" = ps: with ps; [ ]; - "simulated" = ps: with ps; [ ]; - "sinch" = ps: with ps; [ ]; - "sisyphus" = ps: with ps; [ ]; - "sky_hub" = ps: with ps; [ ]; - "skybeacon" = ps: with ps; [ ]; - "skybell" = ps: with ps; [ ]; - "slack" = ps: with ps; [ ]; - "sleepiq" = ps: with ps; [ ]; - "slide" = ps: with ps; [ ]; - "sma" = ps: with ps; [ ]; - "smappee" = ps: with ps; [ ]; - "smarthab" = ps: with ps; [ ]; - "smartthings" = ps: with ps; [ aiohttp-cors ]; - "smarty" = ps: with ps; [ ]; - "smhi" = ps: with ps; [ ]; - "smtp" = ps: with ps; [ ]; - "snapcast" = ps: with ps; [ snapcast ]; - "snips" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ]; - "snmp" = ps: with ps; [ pysnmp ]; - "sochain" = ps: with ps; [ ]; - "socialblade" = ps: with ps; [ ]; - "solaredge" = ps: with ps; [ stringcase ]; - "solaredge_local" = ps: with ps; [ ]; - "solarlog" = ps: with ps; [ ]; - "solax" = ps: with ps; [ ]; - "soma" = ps: with ps; [ ]; - "somfy" = ps: with ps; [ aiohttp-cors ]; - "somfy_mylink" = ps: with ps; [ ]; - "sonarr" = ps: with ps; [ ]; - "songpal" = ps: with ps; [ ]; - "sonos" = ps: with ps; [ pysonos ]; - "sony_projector" = ps: with ps; [ ]; - "soundtouch" = ps: with ps; [ libsoundtouch ]; - "spaceapi" = ps: with ps; [ aiohttp-cors ]; - "spc" = ps: with ps; [ ]; - "speedtestdotnet" = ps: with ps; [ speedtest-cli ]; - "spider" = ps: with ps; [ ]; - "splunk" = ps: with ps; [ ]; - "spotcrime" = ps: with ps; [ ]; - "spotify" = ps: with ps; [ aiohttp-cors ]; - "sql" = ps: with ps; [ sqlalchemy ]; - "squeezebox" = ps: with ps; [ ]; - "ssdp" = ps: with ps; [ defusedxml netdisco ]; - "starline" = ps: with ps; [ ]; - "starlingbank" = ps: with ps; [ ]; - "startca" = ps: with ps; [ xmltodict ]; - "statistics" = ps: with ps; [ ]; - "statsd" = ps: with ps; [ statsd ]; - "steam_online" = ps: with ps; [ ]; - "stiebel_eltron" = ps: with ps; [ ]; - "stookalert" = ps: with ps; [ ]; - "stream" = ps: with ps; [ aiohttp-cors av ]; - "streamlabswater" = ps: with ps; [ ]; - "stt" = ps: with ps; [ aiohttp-cors ]; - "suez_water" = ps: with ps; [ ]; - "sun" = ps: with ps; [ ]; - "supervisord" = ps: with ps; [ ]; - "supla" = ps: with ps; [ ]; - "surepetcare" = ps: with ps; [ ]; - "swiss_hydrological_data" = ps: with ps; [ ]; - "swiss_public_transport" = ps: with ps; [ ]; - "swisscom" = ps: with ps; [ ]; - "switch" = ps: with ps; [ ]; - "switchbot" = ps: with ps; [ ]; - "switcher_kis" = ps: with ps; [ ]; - "switchmate" = ps: with ps; [ ]; - "syncthru" = ps: with ps; [ ]; - "synology" = ps: with ps; [ ]; - "synology_chat" = ps: with ps; [ ]; - "synology_srm" = ps: with ps; [ ]; - "synologydsm" = ps: with ps; [ ]; - "syslog" = ps: with ps; [ ]; - "system_health" = ps: with ps; [ aiohttp-cors ]; - "system_log" = ps: with ps; [ aiohttp-cors ]; - "systemmonitor" = ps: with ps; [ psutil ]; - "tado" = ps: with ps; [ ]; - "tahoma" = ps: with ps; [ ]; - "tank_utility" = ps: with ps; [ ]; - "tapsaff" = ps: with ps; [ ]; - "tautulli" = ps: with ps; [ ]; - "tcp" = ps: with ps; [ ]; - "ted5000" = ps: with ps; [ xmltodict ]; - "teksavvy" = ps: with ps; [ ]; - "telegram" = ps: with ps; [ pysocks aiohttp-cors python-telegram-bot ]; - "telegram_bot" = ps: with ps; [ pysocks aiohttp-cors python-telegram-bot ]; - "tellduslive" = ps: with ps; [ ]; - "tellstick" = ps: with ps; [ ]; - "telnet" = ps: with ps; [ ]; - "temper" = ps: with ps; [ ]; - "template" = ps: with ps; [ ]; - "tensorflow" = ps: with ps; [ numpy pillow protobuf tensorflow ]; - "tesla" = ps: with ps; [ ]; - "tfiac" = ps: with ps; [ ]; - "thermoworks_smoke" = ps: with ps; [ stringcase ]; - "thethingsnetwork" = ps: with ps; [ ]; - "thingspeak" = ps: with ps; [ ]; - "thinkingcleaner" = ps: with ps; [ ]; - "thomson" = ps: with ps; [ ]; - "threshold" = ps: with ps; [ ]; - "tibber" = ps: with ps; [ ]; - "tikteck" = ps: with ps; [ ]; - "tile" = ps: with ps; [ ]; - "time_date" = ps: with ps; [ ]; - "timer" = ps: with ps; [ ]; - "tmb" = ps: with ps; [ ]; - "tod" = ps: with ps; [ ]; - "todoist" = ps: with ps; [ todoist ]; - "tof" = ps: with ps; [ ]; - "tomato" = ps: with ps; [ ]; - "toon" = ps: with ps; [ ]; - "torque" = ps: with ps; [ aiohttp-cors ]; - "totalconnect" = ps: with ps; [ ]; - "touchline" = ps: with ps; [ ]; - "tplink" = ps: with ps; [ ]; - "tplink_lte" = ps: with ps; [ ]; - "traccar" = ps: with ps; [ aiohttp-cors stringcase ]; - "trackr" = ps: with ps; [ ]; - "tradfri" = ps: with ps; [ ]; - "trafikverket_train" = ps: with ps; [ ]; - "trafikverket_weatherstation" = ps: with ps; [ ]; - "transmission" = ps: with ps; [ transmissionrpc ]; - "transport_nsw" = ps: with ps; [ ]; - "travisci" = ps: with ps; [ ]; - "trend" = ps: with ps; [ numpy ]; - "tts" = ps: with ps; [ aiohttp-cors mutagen ]; - "tuya" = ps: with ps; [ ]; - "twentemilieu" = ps: with ps; [ ]; - "twilio" = ps: with ps; [ aiohttp-cors twilio ]; - "twilio_call" = ps: with ps; [ aiohttp-cors twilio ]; - "twilio_sms" = ps: with ps; [ aiohttp-cors twilio ]; - "twitch" = ps: with ps; [ ]; - "twitter" = ps: with ps; [ ]; - "ubee" = ps: with ps; [ ]; - "ubus" = ps: with ps; [ ]; - "ue_smart_radio" = ps: with ps; [ ]; - "uk_transport" = ps: with ps; [ ]; - "unifi" = ps: with ps; [ aiounifi ]; - "unifi_direct" = ps: with ps; [ pexpect ]; - "unifiled" = ps: with ps; [ ]; - "universal" = ps: with ps; [ ]; - "upc_connect" = ps: with ps; [ ]; - "upcloud" = ps: with ps; [ ]; - "updater" = ps: with ps; [ distro ]; - "upnp" = ps: with ps; [ ]; - "uptime" = ps: with ps; [ ]; - "uptimerobot" = ps: with ps; [ ]; - "uscis" = ps: with ps; [ ]; - "usgs_earthquakes_feed" = ps: with ps; [ ]; - "utility_meter" = ps: with ps; [ ]; - "uvc" = ps: with ps; [ ]; - "vacuum" = ps: with ps; [ ]; - "vallox" = ps: with ps; [ ]; - "vasttrafik" = ps: with ps; [ ]; - "velbus" = ps: with ps; [ ]; - "velux" = ps: with ps; [ ]; - "venstar" = ps: with ps; [ ]; - "vera" = ps: with ps; [ ]; - "verisure" = ps: with ps; [ ]; - "versasense" = ps: with ps; [ ]; - "version" = ps: with ps; [ pyhaversion ]; - "vesync" = ps: with ps; [ ]; - "viaggiatreno" = ps: with ps; [ ]; - "vicare" = ps: with ps; [ ]; - "vivotek" = ps: with ps; [ ]; - "vizio" = ps: with ps; [ ]; - "vlc" = ps: with ps; [ python-vlc ]; - "vlc_telnet" = ps: with ps; [ ]; - "voicerss" = ps: with ps; [ ]; - "volkszaehler" = ps: with ps; [ ]; - "volumio" = ps: with ps; [ ]; - "volvooncall" = ps: with ps; [ ]; - "vultr" = ps: with ps; [ vultr ]; - "w800rf32" = ps: with ps; [ ]; - "wake_on_lan" = ps: with ps; [ wakeonlan ]; - "waqi" = ps: with ps; [ ]; - "water_heater" = ps: with ps; [ ]; - "waterfurnace" = ps: with ps; [ ]; - "watson_iot" = ps: with ps; [ ]; - "watson_tts" = ps: with ps; [ ]; - "waze_travel_time" = ps: with ps; [ WazeRouteCalculator ]; - "weather" = ps: with ps; [ ]; - "webhook" = ps: with ps; [ aiohttp-cors ]; - "weblink" = ps: with ps; [ ]; - "webostv" = ps: with ps; [ ]; - "websocket_api" = ps: with ps; [ aiohttp-cors ]; - "wemo" = ps: with ps; [ ]; - "whois" = ps: with ps; [ ]; - "wink" = ps: with ps; [ aiohttp-cors ]; - "wirelesstag" = ps: with ps; [ ]; - "withings" = ps: with ps; [ aiohttp-cors ]; - "wled" = ps: with ps; [ ]; - "workday" = ps: with ps; [ holidays ]; - "worldclock" = ps: with ps; [ ]; - "worldtidesinfo" = ps: with ps; [ ]; - "worxlandroid" = ps: with ps; [ ]; - "wsdot" = ps: with ps; [ ]; - "wunderground" = ps: with ps; [ ]; - "wunderlist" = ps: with ps; [ ]; - "wwlln" = ps: with ps; [ ]; - "x10" = ps: with ps; [ ]; - "xbox_live" = ps: with ps; [ ]; - "xeoma" = ps: with ps; [ ]; - "xfinity" = ps: with ps; [ ]; - "xiaomi" = ps: with ps; [ ha-ffmpeg ]; - "xiaomi_aqara" = ps: with ps; [ ]; - "xiaomi_miio" = ps: with ps; [ construct python-miio ]; - "xiaomi_tv" = ps: with ps; [ ]; - "xmpp" = ps: with ps; [ slixmpp ]; - "xs1" = ps: with ps; [ ]; - "yale_smart_alarm" = ps: with ps; [ ]; - "yamaha" = ps: with ps; [ rxv ]; - "yamaha_musiccast" = ps: with ps; [ ]; - "yandex_transport" = ps: with ps; [ ]; - "yandextts" = ps: with ps; [ ]; - "yeelight" = ps: with ps; [ ]; - "yeelightsunflower" = ps: with ps; [ ]; - "yessssms" = ps: with ps; [ ]; - "yi" = ps: with ps; [ aioftp ha-ffmpeg ]; - "yr" = ps: with ps; [ xmltodict ]; - "yweather" = ps: with ps; [ yahooweather ]; - "zabbix" = ps: with ps; [ ]; - "zamg" = ps: with ps; [ ]; - "zengge" = ps: with ps; [ ]; - "zeroconf" = ps: with ps; [ aiohttp-cors zeroconf ]; - "zestimate" = ps: with ps; [ xmltodict ]; - "zha" = ps: with ps; [ zha-quirks zigpy-deconz zigpy ]; - "zhong_hong" = ps: with ps; [ ]; - "zigbee" = ps: with ps; [ ]; - "ziggo_mediabox_xl" = ps: with ps; [ ]; - "zone" = ps: with ps; [ ]; - "zoneminder" = ps: with ps; [ zm-py ]; - "zwave" = ps: with ps; [ homeassistant-pyozw pydispatcher ]; + "abode" = ps: with ps; [ ]; # missing inputs: abodepy + "acer_projector" = ps: with ps; [ pyserial]; + "actiontec" = ps: with ps; [ ]; + "adguard" = ps: with ps; [ ]; # missing inputs: adguardhome + "ads" = ps: with ps; [ ]; # missing inputs: pyads + "aftership" = ps: with ps; [ ]; # missing inputs: pyaftership + "air_quality" = ps: with ps; [ ]; + "airly" = ps: with ps; [ ]; # missing inputs: airly + "airvisual" = ps: with ps; [ pyairvisual]; + "aladdin_connect" = ps: with ps; [ ]; # missing inputs: aladdin_connect + "alarm_control_panel" = ps: with ps; [ ]; + "alarmdecoder" = ps: with ps; [ ]; # missing inputs: alarmdecoder + "alarmdotcom" = ps: with ps; [ ]; # missing inputs: pyalarmdotcom + "alert" = ps: with ps; [ ]; + "alexa" = ps: with ps; [ aiohttp-cors]; + "almond" = ps: with ps; [ aiohttp-cors]; # missing inputs: pyalmond + "alpha_vantage" = ps: with ps; [ ]; # missing inputs: alpha_vantage + "amazon_polly" = ps: with ps; [ boto3]; + "ambiclimate" = ps: with ps; [ aiohttp-cors]; # missing inputs: ambiclimate + "ambient_station" = ps: with ps; [ ]; # missing inputs: aioambient + "amcrest" = ps: with ps; [ ha-ffmpeg]; # missing inputs: amcrest + "ampio" = ps: with ps; [ ]; # missing inputs: asmog + "android_ip_webcam" = ps: with ps; [ ]; # missing inputs: pydroid-ipcam + "androidtv" = ps: with ps; [ ]; # missing inputs: adb-shell androidtv pure-python-adb + "anel_pwrctrl" = ps: with ps; [ ]; # missing inputs: anel_pwrctrl-homeassistant + "anthemav" = ps: with ps; [ ]; # missing inputs: anthemav + "apache_kafka" = ps: with ps; [ aiokafka]; + "apcupsd" = ps: with ps; [ ]; # missing inputs: apcaccess + "api" = ps: with ps; [ aiohttp-cors]; + "apns" = ps: with ps; [ ]; # missing inputs: apns2 + "apple_tv" = ps: with ps; [ pyatv]; + "apprise" = ps: with ps; [ apprise]; + "aprs" = ps: with ps; [ ]; # missing inputs: aprslib geopy + "aqualogic" = ps: with ps; [ ]; # missing inputs: aqualogic + "aquostv" = ps: with ps; [ ]; # missing inputs: sharp_aquos_rc + "arcam_fmj" = ps: with ps; [ ]; # missing inputs: arcam-fmj + "arduino" = ps: with ps; [ ]; # missing inputs: PyMata + "arest" = ps: with ps; [ ]; + "arlo" = ps: with ps; [ ha-ffmpeg]; # missing inputs: pyarlo + "aruba" = ps: with ps; [ pexpect]; + "arwn" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt]; + "asterisk_cdr" = ps: with ps; [ ]; # missing inputs: asterisk_mbox + "asterisk_mbox" = ps: with ps; [ ]; # missing inputs: asterisk_mbox + "asuswrt" = ps: with ps; [ ]; # missing inputs: aioasuswrt + "aten_pe" = ps: with ps; [ ]; # missing inputs: atenpdu + "atome" = ps: with ps; [ ]; # missing inputs: pyatome + "august" = ps: with ps; [ ]; # missing inputs: py-august + "aurora" = ps: with ps; [ ]; + "aurora_abb_powerone" = ps: with ps; [ ]; # missing inputs: aurorapy + "auth" = ps: with ps; [ aiohttp-cors]; + "automatic" = ps: with ps; [ aiohttp-cors]; # missing inputs: aioautomatic + "automation" = ps: with ps; [ aiohttp-cors]; + "avea" = ps: with ps; [ ]; # missing inputs: avea + "avion" = ps: with ps; [ ]; # missing inputs: avion + "awair" = ps: with ps; [ ]; # missing inputs: python_awair + "aws" = ps: with ps; [ ]; # missing inputs: aiobotocore + "axis" = ps: with ps; [ ]; # missing inputs: axis + "azure_event_hub" = ps: with ps; [ ]; # missing inputs: azure-eventhub + "azure_service_bus" = ps: with ps; [ azure-servicebus]; + "baidu" = ps: with ps; [ ]; # missing inputs: baidu-aip + "bayesian" = ps: with ps; [ ]; + "bbb_gpio" = ps: with ps; [ ]; # missing inputs: Adafruit_BBIO + "bbox" = ps: with ps; [ ]; # missing inputs: pybbox + "beewi_smartclim" = ps: with ps; [ ]; # missing inputs: beewi_smartclim + "bh1750" = ps: with ps; [ ]; # missing inputs: i2csense smbus-cffi + "binary_sensor" = ps: with ps; [ ]; + "bitcoin" = ps: with ps; [ ]; # missing inputs: blockchain + "bizkaibus" = ps: with ps; [ ]; # missing inputs: bizkaibus + "blackbird" = ps: with ps; [ ]; # missing inputs: pyblackbird + "blink" = ps: with ps; [ ]; # missing inputs: blinkpy + "blinksticklight" = ps: with ps; [ BlinkStick]; + "blinkt" = ps: with ps; [ ]; # missing inputs: blinkt + "blockchain" = ps: with ps; [ ]; # missing inputs: python-blockchain-api + "bloomsky" = ps: with ps; [ ]; + "bluesound" = ps: with ps; [ xmltodict]; + "bluetooth_le_tracker" = ps: with ps; [ ]; # missing inputs: pygatt[GATTTOOL] + "bluetooth_tracker" = ps: with ps; [ bt_proximity]; # missing inputs: pybluez + "bme280" = ps: with ps; [ ]; # missing inputs: i2csense smbus-cffi + "bme680" = ps: with ps; [ ]; # missing inputs: bme680 smbus-cffi + "bmw_connected_drive" = ps: with ps; [ ]; # missing inputs: bimmer_connected + "bom" = ps: with ps; [ ]; # missing inputs: bomradarloop + "braviatv" = ps: with ps; [ getmac]; # missing inputs: bravia-tv + "broadlink" = ps: with ps; [ broadlink]; + "brother" = ps: with ps; [ ]; # missing inputs: brother + "brottsplatskartan" = ps: with ps; [ ]; # missing inputs: brottsplatskartan + "browser" = ps: with ps; [ ]; + "brunt" = ps: with ps; [ ]; # missing inputs: brunt + "bt_home_hub_5" = ps: with ps; [ ]; # missing inputs: bthomehub5-devicelist + "bt_smarthub" = ps: with ps; [ ]; # missing inputs: btsmarthub_devicelist + "buienradar" = ps: with ps; [ ]; # missing inputs: buienradar + "caldav" = ps: with ps; [ caldav]; + "calendar" = ps: with ps; [ aiohttp-cors]; + "camera" = ps: with ps; [ aiohttp-cors]; + "canary" = ps: with ps; [ ha-ffmpeg]; # missing inputs: py-canary + "cast" = ps: with ps; [ PyChromecast]; + "cert_expiry" = ps: with ps; [ ]; + "channels" = ps: with ps; [ ]; # missing inputs: pychannels + "cisco_ios" = ps: with ps; [ pexpect]; + "cisco_mobility_express" = ps: with ps; [ ]; # missing inputs: ciscomobilityexpress + "cisco_webex_teams" = ps: with ps; [ ]; # missing inputs: webexteamssdk + "citybikes" = ps: with ps; [ ]; + "clementine" = ps: with ps; [ ]; # missing inputs: python-clementine-remote + "clickatell" = ps: with ps; [ ]; + "clicksend" = ps: with ps; [ ]; + "clicksend_tts" = ps: with ps; [ ]; + "climate" = ps: with ps; [ ]; + "cloud" = ps: with ps; [ aiohttp-cors hass-nabucasa]; + "cloudflare" = ps: with ps; [ ]; # missing inputs: pycfdns + "cmus" = ps: with ps; [ ]; # missing inputs: pycmus + "co2signal" = ps: with ps; [ ]; # missing inputs: co2signal + "coinbase" = ps: with ps; [ ]; # missing inputs: coinbase + "coinmarketcap" = ps: with ps; [ coinmarketcap]; + "comed_hourly_pricing" = ps: with ps; [ ]; + "comfoconnect" = ps: with ps; [ ]; # missing inputs: pycomfoconnect + "command_line" = ps: with ps; [ ]; + "concord232" = ps: with ps; [ ]; # missing inputs: concord232 + "config" = ps: with ps; [ aiohttp-cors]; + "configurator" = ps: with ps; [ ]; + "conversation" = ps: with ps; [ aiohttp-cors]; + "coolmaster" = ps: with ps; [ ]; # missing inputs: pycoolmasternet + "coronavirus" = ps: with ps; [ ]; # missing inputs: coronavirus + "counter" = ps: with ps; [ ]; + "cover" = ps: with ps; [ ]; + "cppm_tracker" = ps: with ps; [ ]; # missing inputs: clearpasspy + "cpuspeed" = ps: with ps; [ py-cpuinfo]; + "crimereports" = ps: with ps; [ ]; # missing inputs: crimereports + "cups" = ps: with ps; [ pycups]; + "currencylayer" = ps: with ps; [ ]; + "daikin" = ps: with ps; [ ]; # missing inputs: pydaikin + "danfoss_air" = ps: with ps; [ ]; # missing inputs: pydanfossair + "darksky" = ps: with ps; [ python-forecastio]; + "datadog" = ps: with ps; [ datadog]; + "ddwrt" = ps: with ps; [ ]; + "deconz" = ps: with ps; [ ]; # missing inputs: pydeconz + "decora" = ps: with ps; [ ]; # missing inputs: bluepy decora + "decora_wifi" = ps: with ps; [ ]; # missing inputs: decora_wifi + "default_config" = ps: with ps; [ pynacl aiohttp-cors defusedxml distro hass-nabucasa netdisco sqlalchemy zeroconf]; # missing inputs: home-assistant-frontend + "delijn" = ps: with ps; [ ]; # missing inputs: pydelijn + "deluge" = ps: with ps; [ deluge-client]; + "demo" = ps: with ps; [ aiohttp-cors]; + "denon" = ps: with ps; [ ]; + "denonavr" = ps: with ps; [ denonavr]; + "derivative" = ps: with ps; [ ]; + "deutsche_bahn" = ps: with ps; [ ]; # missing inputs: schiene + "device_automation" = ps: with ps; [ aiohttp-cors]; + "device_sun_light_trigger" = ps: with ps; [ ]; + "device_tracker" = ps: with ps; [ ]; + "dht" = ps: with ps; [ ]; # missing inputs: Adafruit-DHT + "dialogflow" = ps: with ps; [ aiohttp-cors]; + "digital_ocean" = ps: with ps; [ digital-ocean]; + "digitalloggers" = ps: with ps; [ ]; # missing inputs: dlipower + "directv" = ps: with ps; [ ]; # missing inputs: directpy + "discogs" = ps: with ps; [ discogs_client]; + "discord" = ps: with ps; [ discordpy]; + "discovery" = ps: with ps; [ netdisco]; + "dlib_face_detect" = ps: with ps; [ face_recognition]; + "dlib_face_identify" = ps: with ps; [ face_recognition]; + "dlink" = ps: with ps; [ ]; # missing inputs: pyW215 + "dlna_dmr" = ps: with ps; [ ]; # missing inputs: async-upnp-client + "dnsip" = ps: with ps; [ aiodns]; + "dominos" = ps: with ps; [ aiohttp-cors]; # missing inputs: pizzapi + "doods" = ps: with ps; [ pillow]; # missing inputs: pydoods + "doorbird" = ps: with ps; [ aiohttp-cors sqlalchemy]; # missing inputs: doorbirdpy home-assistant-frontend + "dovado" = ps: with ps; [ ]; # missing inputs: dovado + "downloader" = ps: with ps; [ ]; + "dsmr" = ps: with ps; [ ]; # missing inputs: dsmr_parser + "dsmr_reader" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt]; + "dte_energy_bridge" = ps: with ps; [ ]; + "dublin_bus_transport" = ps: with ps; [ ]; + "duckdns" = ps: with ps; [ ]; + "dunehd" = ps: with ps; [ ]; # missing inputs: pdunehd + "dwd_weather_warnings" = ps: with ps; [ ]; + "dweet" = ps: with ps; [ ]; # missing inputs: dweepy + "dynalite" = ps: with ps; [ ]; # missing inputs: dynalite_devices + "dyson" = ps: with ps; [ ]; # missing inputs: libpurecool + "ebox" = ps: with ps; [ ]; # missing inputs: pyebox + "ebusd" = ps: with ps; [ ]; # missing inputs: ebusdpy + "ecoal_boiler" = ps: with ps; [ ]; # missing inputs: ecoaliface + "ecobee" = ps: with ps; [ ]; # missing inputs: python-ecobee-api + "econet" = ps: with ps; [ ]; # missing inputs: pyeconet + "ecovacs" = ps: with ps; [ ]; # missing inputs: sucks + "eddystone_temperature" = ps: with ps; [ construct]; # missing inputs: beacontools[scan] + "edimax" = ps: with ps; [ ]; # missing inputs: pyedimax + "ee_brightbox" = ps: with ps; [ ]; # missing inputs: eebrightbox + "efergy" = ps: with ps; [ ]; + "egardia" = ps: with ps; [ ]; # missing inputs: pythonegardia + "eight_sleep" = ps: with ps; [ ]; # missing inputs: pyeight + "elgato" = ps: with ps; [ ]; # missing inputs: elgato + "eliqonline" = ps: with ps; [ ]; # missing inputs: eliqonline + "elkm1" = ps: with ps; [ ]; # missing inputs: elkm1-lib + "elv" = ps: with ps; [ ]; # missing inputs: pypca + "emby" = ps: with ps; [ ]; # missing inputs: pyemby + "emoncms" = ps: with ps; [ ]; + "emoncms_history" = ps: with ps; [ ]; + "emulated_hue" = ps: with ps; [ aiohttp-cors]; + "emulated_roku" = ps: with ps; [ ]; # missing inputs: emulated_roku + "enigma2" = ps: with ps; [ ]; # missing inputs: openwebifpy + "enocean" = ps: with ps; [ ]; # missing inputs: enocean + "enphase_envoy" = ps: with ps; [ ]; # missing inputs: envoy_reader + "entur_public_transport" = ps: with ps; [ ]; # missing inputs: enturclient + "environment_canada" = ps: with ps; [ ]; # missing inputs: env_canada + "envirophat" = ps: with ps; [ ]; # missing inputs: envirophat smbus-cffi + "envisalink" = ps: with ps; [ ]; # missing inputs: pyenvisalink + "ephember" = ps: with ps; [ ]; # missing inputs: pyephember + "epson" = ps: with ps; [ ]; # missing inputs: epson-projector + "epsonworkforce" = ps: with ps; [ ]; # missing inputs: epsonprinter + "eq3btsmart" = ps: with ps; [ construct]; # missing inputs: python-eq3bt + "esphome" = ps: with ps; [ aioesphomeapi]; + "essent" = ps: with ps; [ ]; # missing inputs: PyEssent + "etherscan" = ps: with ps; [ ]; # missing inputs: python-etherscan-api + "eufy" = ps: with ps; [ ]; # missing inputs: lakeside + "everlights" = ps: with ps; [ ]; # missing inputs: pyeverlights + "evohome" = ps: with ps; [ ]; # missing inputs: evohome-async + "facebook" = ps: with ps; [ ]; + "facebox" = ps: with ps; [ ]; + "fail2ban" = ps: with ps; [ ]; + "familyhub" = ps: with ps; [ ]; # missing inputs: python-family-hub-local + "fan" = ps: with ps; [ ]; + "fastdotcom" = ps: with ps; [ ]; # missing inputs: fastdotcom + "feedreader" = ps: with ps; [ ]; # missing inputs: feedparser-homeassistant + "ffmpeg" = ps: with ps; [ ha-ffmpeg]; + "ffmpeg_motion" = ps: with ps; [ ha-ffmpeg]; + "ffmpeg_noise" = ps: with ps; [ ha-ffmpeg]; + "fibaro" = ps: with ps; [ ]; # missing inputs: fiblary3 + "fido" = ps: with ps; [ ]; # missing inputs: pyfido + "file" = ps: with ps; [ ]; + "filesize" = ps: with ps; [ ]; + "filter" = ps: with ps; [ aiohttp-cors sqlalchemy]; + "fints" = ps: with ps; [ fints]; + "fitbit" = ps: with ps; [ aiohttp-cors fitbit]; + "fixer" = ps: with ps; [ ]; # missing inputs: fixerio + "fleetgo" = ps: with ps; [ ]; # missing inputs: ritassist + "flexit" = ps: with ps; [ ]; # missing inputs: pyflexit pymodbus + "flic" = ps: with ps; [ ]; # missing inputs: pyflic-homeassistant + "flock" = ps: with ps; [ ]; + "flume" = ps: with ps; [ ]; # missing inputs: pyflume + "flunearyou" = ps: with ps; [ ]; # missing inputs: pyflunearyou + "flux" = ps: with ps; [ ]; + "flux_led" = ps: with ps; [ flux-led]; + "folder" = ps: with ps; [ ]; + "folder_watcher" = ps: with ps; [ watchdog]; + "foobot" = ps: with ps; [ ]; # missing inputs: foobot_async + "fortigate" = ps: with ps; [ ]; # missing inputs: pyfgt + "fortios" = ps: with ps; [ ]; # missing inputs: fortiosapi + "foscam" = ps: with ps; [ ]; # missing inputs: libpyfoscam + "foursquare" = ps: with ps; [ aiohttp-cors]; + "free_mobile" = ps: with ps; [ ]; # missing inputs: freesms + "freebox" = ps: with ps; [ ]; # missing inputs: aiofreepybox + "freedns" = ps: with ps; [ ]; + "fritz" = ps: with ps; [ fritzconnection]; + "fritzbox" = ps: with ps; [ ]; # missing inputs: pyfritzhome + "fritzbox_callmonitor" = ps: with ps; [ fritzconnection]; + "fritzbox_netmonitor" = ps: with ps; [ fritzconnection]; + "fronius" = ps: with ps; [ ]; # missing inputs: pyfronius + "frontend" = ps: with ps; [ aiohttp-cors]; # missing inputs: home-assistant-frontend + "frontier_silicon" = ps: with ps; [ ]; # missing inputs: afsapi + "futurenow" = ps: with ps; [ ]; # missing inputs: pyfnip + "garadget" = ps: with ps; [ ]; + "garmin_connect" = ps: with ps; [ ]; # missing inputs: garminconnect + "gc100" = ps: with ps; [ ]; # missing inputs: python-gc100 + "gdacs" = ps: with ps; [ ]; # missing inputs: aio_georss_gdacs + "gearbest" = ps: with ps; [ ]; # missing inputs: gearbest_parser + "geizhals" = ps: with ps; [ ]; # missing inputs: geizhals + "generic" = ps: with ps; [ ]; + "generic_thermostat" = ps: with ps; [ ]; + "geniushub" = ps: with ps; [ ]; # missing inputs: geniushub-client + "geo_json_events" = ps: with ps; [ ]; # missing inputs: geojson_client + "geo_location" = ps: with ps; [ ]; + "geo_rss_events" = ps: with ps; [ ]; # missing inputs: georss_generic_client + "geofency" = ps: with ps; [ aiohttp-cors]; + "geonetnz_quakes" = ps: with ps; [ ]; # missing inputs: aio_geojson_geonetnz_quakes + "geonetnz_volcano" = ps: with ps; [ ]; # missing inputs: aio_geojson_geonetnz_volcano + "gios" = ps: with ps; [ ]; # missing inputs: gios + "github" = ps: with ps; [ PyGithub]; + "gitlab_ci" = ps: with ps; [ python-gitlab]; + "gitter" = ps: with ps; [ ]; # missing inputs: gitterpy + "glances" = ps: with ps; [ ]; # missing inputs: glances_api + "gntp" = ps: with ps; [ ]; # missing inputs: gntp + "goalfeed" = ps: with ps; [ ]; # missing inputs: pysher + "gogogate2" = ps: with ps; [ ]; # missing inputs: pygogogate2 + "google" = ps: with ps; [ google_api_python_client httplib2 oauth2client]; + "google_assistant" = ps: with ps; [ aiohttp-cors]; + "google_cloud" = ps: with ps; [ google_cloud_texttospeech]; + "google_domains" = ps: with ps; [ ]; + "google_maps" = ps: with ps; [ ]; # missing inputs: locationsharinglib + "google_pubsub" = ps: with ps; [ google_cloud_pubsub]; + "google_translate" = ps: with ps; [ gtts-token]; + "google_travel_time" = ps: with ps; [ ]; # missing inputs: googlemaps + "google_wifi" = ps: with ps; [ ]; + "gpmdp" = ps: with ps; [ websocket_client]; + "gpsd" = ps: with ps; [ ]; # missing inputs: gps3 + "gpslogger" = ps: with ps; [ aiohttp-cors]; + "graphite" = ps: with ps; [ ]; + "greeneye_monitor" = ps: with ps; [ ]; # missing inputs: greeneye_monitor + "greenwave" = ps: with ps; [ ]; # missing inputs: greenwavereality + "group" = ps: with ps; [ ]; + "growatt_server" = ps: with ps; [ ]; # missing inputs: growattServer + "gstreamer" = ps: with ps; [ ]; # missing inputs: gstreamer-player + "gtfs" = ps: with ps; [ ]; # missing inputs: pygtfs + "habitica" = ps: with ps; [ ]; # missing inputs: habitipy + "hangouts" = ps: with ps; [ ]; # missing inputs: hangups + "harman_kardon_avr" = ps: with ps; [ ]; # missing inputs: hkavr + "harmony" = ps: with ps; [ ]; # missing inputs: aioharmony + "hassio" = ps: with ps; [ aiohttp-cors]; # missing inputs: home-assistant-frontend + "haveibeenpwned" = ps: with ps; [ ]; + "hddtemp" = ps: with ps; [ ]; + "hdmi_cec" = ps: with ps; [ ]; # missing inputs: pyCEC + "heatmiser" = ps: with ps; [ ]; # missing inputs: heatmiserV3 + "heos" = ps: with ps; [ ]; # missing inputs: pyheos + "here_travel_time" = ps: with ps; [ ]; # missing inputs: herepy + "hikvision" = ps: with ps; [ ]; # missing inputs: pyhik + "hikvisioncam" = ps: with ps; [ ]; # missing inputs: hikvision + "hisense_aehw4a1" = ps: with ps; [ ]; # missing inputs: pyaehw4a1 + "history" = ps: with ps; [ aiohttp-cors sqlalchemy]; + "history_graph" = ps: with ps; [ aiohttp-cors sqlalchemy]; + "history_stats" = ps: with ps; [ aiohttp-cors sqlalchemy]; + "hitron_coda" = ps: with ps; [ ]; + "hive" = ps: with ps; [ ]; # missing inputs: pyhiveapi + "hlk_sw16" = ps: with ps; [ ]; # missing inputs: hlk-sw16 + "homeassistant" = ps: with ps; [ ]; + "homekit" = ps: with ps; [ ]; # missing inputs: HAP-python + "homekit_controller" = ps: with ps; [ ]; # missing inputs: homekit[IP] + "homematic" = ps: with ps; [ pyhomematic]; + "homematicip_cloud" = ps: with ps; [ ]; # missing inputs: homematicip + "homeworks" = ps: with ps; [ ]; # missing inputs: pyhomeworks + "honeywell" = ps: with ps; [ ]; # missing inputs: somecomfort + "horizon" = ps: with ps; [ ]; # missing inputs: horimote + "hp_ilo" = ps: with ps; [ ]; # missing inputs: python-hpilo + "html5" = ps: with ps; [ aiohttp-cors pywebpush]; + "http" = ps: with ps; [ aiohttp-cors]; + "htu21d" = ps: with ps; [ ]; # missing inputs: i2csense smbus-cffi + "huawei_lte" = ps: with ps; [ getmac stringcase]; # missing inputs: huawei-lte-api url-normalize + "huawei_router" = ps: with ps; [ ]; + "hue" = ps: with ps; [ aiohue]; + "hunterdouglas_powerview" = ps: with ps; [ ]; # missing inputs: aiopvapi + "hydrawise" = ps: with ps; [ ]; # missing inputs: hydrawiser + "hyperion" = ps: with ps; [ ]; + "ialarm" = ps: with ps; [ ]; # missing inputs: pyialarm + "iaqualink" = ps: with ps; [ ]; # missing inputs: iaqualink + "icloud" = ps: with ps; [ pyicloud]; + "idteck_prox" = ps: with ps; [ ]; # missing inputs: rfk101py + "ifttt" = ps: with ps; [ aiohttp-cors pyfttt]; + "iglo" = ps: with ps; [ ]; # missing inputs: iglo + "ign_sismologia" = ps: with ps; [ ]; # missing inputs: georss_ign_sismologia_client + "ihc" = ps: with ps; [ defusedxml]; # missing inputs: ihcsdk + "image_processing" = ps: with ps; [ aiohttp-cors]; + "imap" = ps: with ps; [ ]; # missing inputs: aioimaplib + "imap_email_content" = ps: with ps; [ ]; + "incomfort" = ps: with ps; [ ]; # missing inputs: incomfort-client + "influxdb" = ps: with ps; [ influxdb]; + "input_boolean" = ps: with ps; [ ]; + "input_datetime" = ps: with ps; [ ]; + "input_number" = ps: with ps; [ ]; + "input_select" = ps: with ps; [ ]; + "input_text" = ps: with ps; [ ]; + "insteon" = ps: with ps; [ ]; # missing inputs: insteonplm + "integration" = ps: with ps; [ ]; + "intent" = ps: with ps; [ aiohttp-cors]; + "intent_script" = ps: with ps; [ ]; + "intesishome" = ps: with ps; [ ]; # missing inputs: pyintesishome + "ios" = ps: with ps; [ aiohttp-cors zeroconf]; + "iota" = ps: with ps; [ ]; # missing inputs: pyota + "iperf3" = ps: with ps; [ ]; # missing inputs: iperf3 + "ipma" = ps: with ps; [ ]; # missing inputs: pyipma + "iqvia" = ps: with ps; [ numpy]; # missing inputs: pyiqvia + "irish_rail_transport" = ps: with ps; [ ]; # missing inputs: pyirishrail + "islamic_prayer_times" = ps: with ps; [ ]; # missing inputs: prayer_times_calculator + "iss" = ps: with ps; [ ]; # missing inputs: pyiss + "isy994" = ps: with ps; [ ]; # missing inputs: PyISY + "itach" = ps: with ps; [ ]; # missing inputs: pyitachip2ir + "itunes" = ps: with ps; [ ]; + "izone" = ps: with ps; [ ]; # missing inputs: python-izone + "jewish_calendar" = ps: with ps; [ ]; # missing inputs: hdate + "joaoapps_join" = ps: with ps; [ ]; # missing inputs: python-join-api + "juicenet" = ps: with ps; [ ]; # missing inputs: python-juicenet + "kaiterra" = ps: with ps; [ ]; # missing inputs: kaiterra-async-client + "kankun" = ps: with ps; [ ]; + "keba" = ps: with ps; [ ]; # missing inputs: keba-kecontact + "keenetic_ndms2" = ps: with ps; [ ]; # missing inputs: ndms2_client + "kef" = ps: with ps; [ getmac]; # missing inputs: aiokef + "keyboard" = ps: with ps; [ ]; # missing inputs: pyuserinput + "keyboard_remote" = ps: with ps; [ evdev]; # missing inputs: aionotify + "kira" = ps: with ps; [ ]; # missing inputs: pykira + "kiwi" = ps: with ps; [ ]; # missing inputs: kiwiki-client + "knx" = ps: with ps; [ ]; # missing inputs: xknx + "kodi" = ps: with ps; [ jsonrpc-async jsonrpc-websocket]; + "konnected" = ps: with ps; [ aiohttp-cors]; # missing inputs: konnected + "kwb" = ps: with ps; [ ]; # missing inputs: pykwb + "lacrosse" = ps: with ps; [ ]; # missing inputs: pylacrosse + "lametric" = ps: with ps; [ ]; # missing inputs: lmnotify + "lannouncer" = ps: with ps; [ ]; + "lastfm" = ps: with ps; [ pylast]; + "launch_library" = ps: with ps; [ ]; # missing inputs: pylaunches + "lcn" = ps: with ps; [ ]; # missing inputs: pypck + "lg_netcast" = ps: with ps; [ ]; # missing inputs: pylgnetcast-homeassistant + "lg_soundbar" = ps: with ps; [ ]; # missing inputs: temescal + "life360" = ps: with ps; [ ]; # missing inputs: life360 + "lifx" = ps: with ps; [ aiolifx aiolifx-effects]; + "lifx_cloud" = ps: with ps; [ ]; + "lifx_legacy" = ps: with ps; [ ]; # missing inputs: liffylights + "light" = ps: with ps; [ ]; + "lightwave" = ps: with ps; [ ]; # missing inputs: lightwave + "limitlessled" = ps: with ps; [ limitlessled]; + "linksys_smart" = ps: with ps; [ ]; + "linky" = ps: with ps; [ ]; # missing inputs: pylinky + "linode" = ps: with ps; [ linode-api]; + "linux_battery" = ps: with ps; [ batinfo]; + "lirc" = ps: with ps; [ ]; # missing inputs: python-lirc + "litejet" = ps: with ps; [ ]; # missing inputs: pylitejet + "llamalab_automate" = ps: with ps; [ ]; + "local_file" = ps: with ps; [ ]; + "local_ip" = ps: with ps; [ ]; + "locative" = ps: with ps; [ aiohttp-cors]; + "lock" = ps: with ps; [ ]; + "lockitron" = ps: with ps; [ ]; + "logbook" = ps: with ps; [ aiohttp-cors sqlalchemy]; # missing inputs: home-assistant-frontend + "logentries" = ps: with ps; [ ]; + "logger" = ps: with ps; [ ]; + "logi_circle" = ps: with ps; [ aiohttp-cors ha-ffmpeg]; # missing inputs: logi_circle + "london_air" = ps: with ps; [ ]; + "london_underground" = ps: with ps; [ ]; # missing inputs: london-tube-status + "loopenergy" = ps: with ps; [ ]; # missing inputs: pyloopenergy + "lovelace" = ps: with ps; [ ]; + "luci" = ps: with ps; [ ]; # missing inputs: openwrt-luci-rpc + "luftdaten" = ps: with ps; [ luftdaten]; + "lupusec" = ps: with ps; [ ]; # missing inputs: lupupy + "lutron" = ps: with ps; [ ]; # missing inputs: pylutron + "lutron_caseta" = ps: with ps; [ ]; # missing inputs: pylutron-caseta + "lw12wifi" = ps: with ps; [ ]; # missing inputs: lw12 + "lyft" = ps: with ps; [ ]; # missing inputs: lyft_rides + "magicseaweed" = ps: with ps; [ ]; # missing inputs: magicseaweed + "mailbox" = ps: with ps; [ aiohttp-cors]; + "mailgun" = ps: with ps; [ aiohttp-cors]; # missing inputs: pymailgunner + "manual" = ps: with ps; [ ]; + "manual_mqtt" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt]; + "map" = ps: with ps; [ aiohttp-cors]; # missing inputs: home-assistant-frontend + "marytts" = ps: with ps; [ ]; # missing inputs: speak2mary + "mastodon" = ps: with ps; [ ]; # missing inputs: Mastodon.py + "matrix" = ps: with ps; [ matrix-client]; + "maxcube" = ps: with ps; [ ]; # missing inputs: maxcube-api + "mcp23017" = ps: with ps; [ ]; # missing inputs: RPi.GPIO adafruit-blinka adafruit-circuitpython-mcp230xx + "media_extractor" = ps: with ps; [ aiohttp-cors youtube-dl-light]; + "media_player" = ps: with ps; [ aiohttp-cors]; + "mediaroom" = ps: with ps; [ ]; # missing inputs: pymediaroom + "melcloud" = ps: with ps; [ ]; # missing inputs: pymelcloud + "melissa" = ps: with ps; [ ]; # missing inputs: py-melissa-climate + "meraki" = ps: with ps; [ aiohttp-cors]; + "message_bird" = ps: with ps; [ ]; # missing inputs: messagebird + "met" = ps: with ps; [ ]; # missing inputs: pyMetno + "meteo_france" = ps: with ps; [ ]; # missing inputs: meteofrance vigilancemeteo + "meteoalarm" = ps: with ps; [ ]; # missing inputs: meteoalertapi + "metoffice" = ps: with ps; [ ]; # missing inputs: datapoint + "mfi" = ps: with ps; [ ]; # missing inputs: mficlient + "mhz19" = ps: with ps; [ ]; # missing inputs: pmsensor + "microsoft" = ps: with ps; [ ]; # missing inputs: pycsspeechtts + "microsoft_face" = ps: with ps; [ aiohttp-cors]; + "microsoft_face_detect" = ps: with ps; [ aiohttp-cors]; + "microsoft_face_identify" = ps: with ps; [ aiohttp-cors]; + "miflora" = ps: with ps; [ ]; # missing inputs: bluepy miflora + "mikrotik" = ps: with ps; [ ]; # missing inputs: librouteros + "mill" = ps: with ps; [ ]; # missing inputs: millheater + "min_max" = ps: with ps; [ ]; + "minecraft_server" = ps: with ps; [ getmac]; # missing inputs: mcstatus + "minio" = ps: with ps; [ minio]; + "mitemp_bt" = ps: with ps; [ ]; # missing inputs: mitemp_bt + "mjpeg" = ps: with ps; [ ]; + "mobile_app" = ps: with ps; [ pynacl aiohttp-cors]; + "mochad" = ps: with ps; [ ]; # missing inputs: pymochad + "modbus" = ps: with ps; [ ]; # missing inputs: pymodbus + "modem_callerid" = ps: with ps; [ ]; # missing inputs: basicmodem + "mold_indicator" = ps: with ps; [ ]; + "monoprice" = ps: with ps; [ ]; # missing inputs: pymonoprice + "moon" = ps: with ps; [ ]; + "mopar" = ps: with ps; [ ]; # missing inputs: motorparts + "mpchc" = ps: with ps; [ ]; + "mpd" = ps: with ps; [ mpd2]; + "mqtt" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt]; + "mqtt_eventstream" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt]; + "mqtt_json" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt]; + "mqtt_room" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt]; + "mqtt_statestream" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt]; + "msteams" = ps: with ps; [ ]; # missing inputs: pymsteams + "mvglive" = ps: with ps; [ PyMVGLive]; + "mychevy" = ps: with ps; [ ]; # missing inputs: mychevy + "mycroft" = ps: with ps; [ ]; # missing inputs: mycroftapi + "myq" = ps: with ps; [ ]; # missing inputs: pymyq + "mysensors" = ps: with ps; [ ]; # missing inputs: pymysensors + "mystrom" = ps: with ps; [ aiohttp-cors]; # missing inputs: python-mystrom + "mythicbeastsdns" = ps: with ps; [ ]; # missing inputs: mbddns + "n26" = ps: with ps; [ ]; # missing inputs: n26 + "nad" = ps: with ps; [ ]; # missing inputs: nad_receiver + "namecheapdns" = ps: with ps; [ defusedxml]; + "nanoleaf" = ps: with ps; [ ]; # missing inputs: pynanoleaf + "neato" = ps: with ps; [ pybotvac]; + "nederlandse_spoorwegen" = ps: with ps; [ ]; # missing inputs: nsapi + "nello" = ps: with ps; [ ]; # missing inputs: pynello + "ness_alarm" = ps: with ps; [ ]; # missing inputs: nessclient + "nest" = ps: with ps; [ ]; # missing inputs: python-nest + "netatmo" = ps: with ps; [ aiohttp-cors pyatmo]; + "netdata" = ps: with ps; [ ]; # missing inputs: netdata + "netgear" = ps: with ps; [ ]; # missing inputs: pynetgear + "netgear_lte" = ps: with ps; [ ]; # missing inputs: eternalegypt + "netio" = ps: with ps; [ aiohttp-cors]; # missing inputs: pynetio + "neurio_energy" = ps: with ps; [ ]; # missing inputs: neurio + "nextbus" = ps: with ps; [ ]; # missing inputs: py_nextbusnext + "nfandroidtv" = ps: with ps; [ ]; + "niko_home_control" = ps: with ps; [ ]; # missing inputs: niko-home-control + "nilu" = ps: with ps; [ ]; # missing inputs: niluclient + "nissan_leaf" = ps: with ps; [ ]; # missing inputs: pycarwings2 + "nmap_tracker" = ps: with ps; [ getmac]; # missing inputs: python-nmap + "nmbs" = ps: with ps; [ ]; # missing inputs: pyrail + "no_ip" = ps: with ps; [ ]; + "noaa_tides" = ps: with ps; [ ]; # missing inputs: py_noaa + "norway_air" = ps: with ps; [ ]; # missing inputs: pyMetno + "notify" = ps: with ps; [ ]; + "notion" = ps: with ps; [ ]; # missing inputs: aionotion + "nsw_fuel_station" = ps: with ps; [ ]; # missing inputs: nsw-fuel-api-client + "nsw_rural_fire_service_feed" = ps: with ps; [ ]; # missing inputs: aio_geojson_nsw_rfs_incidents + "nuheat" = ps: with ps; [ ]; # missing inputs: nuheat + "nuimo_controller" = ps: with ps; [ ]; # missing inputs: --only-binary=all nuimo + "nuki" = ps: with ps; [ ]; # missing inputs: pynuki + "nut" = ps: with ps; [ ]; # missing inputs: pynut2 + "nws" = ps: with ps; [ ]; # missing inputs: pynws + "nx584" = ps: with ps; [ ]; # missing inputs: pynx584 + "nzbget" = ps: with ps; [ ]; # missing inputs: pynzbgetapi + "oasa_telematics" = ps: with ps; [ ]; # missing inputs: oasatelematics + "obihai" = ps: with ps; [ ]; # missing inputs: pyobihai + "octoprint" = ps: with ps; [ ]; + "oem" = ps: with ps; [ ]; # missing inputs: oemthermostat + "ohmconnect" = ps: with ps; [ defusedxml]; + "ombi" = ps: with ps; [ ]; # missing inputs: pyombi + "onboarding" = ps: with ps; [ aiohttp-cors]; + "onewire" = ps: with ps; [ ]; # missing inputs: pyownet + "onkyo" = ps: with ps; [ onkyo-eiscp]; + "onvif" = ps: with ps; [ ha-ffmpeg]; # missing inputs: onvif-zeep-async + "openalpr_cloud" = ps: with ps; [ ]; + "openalpr_local" = ps: with ps; [ ]; + "opencv" = ps: with ps; [ numpy]; # missing inputs: opencv-python-headless + "openevse" = ps: with ps; [ ]; # missing inputs: openevsewifi + "openexchangerates" = ps: with ps; [ ]; + "opengarage" = ps: with ps; [ ]; + "openhardwaremonitor" = ps: with ps; [ ]; + "openhome" = ps: with ps; [ ]; # missing inputs: openhomedevice + "opensensemap" = ps: with ps; [ ]; # missing inputs: opensensemap-api + "opensky" = ps: with ps; [ ]; + "opentherm_gw" = ps: with ps; [ ]; # missing inputs: pyotgw + "openuv" = ps: with ps; [ ]; # missing inputs: pyopenuv + "openweathermap" = ps: with ps; [ pyowm]; + "opnsense" = ps: with ps; [ ]; # missing inputs: pyopnsense + "opple" = ps: with ps; [ ]; # missing inputs: pyoppleio + "orangepi_gpio" = ps: with ps; [ ]; # missing inputs: OPi.GPIO + "oru" = ps: with ps; [ ]; # missing inputs: oru + "orvibo" = ps: with ps; [ ]; # missing inputs: orvibo + "osramlightify" = ps: with ps; [ ]; # missing inputs: lightify + "otp" = ps: with ps; [ pyotp]; + "owntracks" = ps: with ps; [ pynacl aiohttp-cors]; + "panasonic_bluray" = ps: with ps; [ ]; # missing inputs: panacotta + "panasonic_viera" = ps: with ps; [ wakeonlan]; # missing inputs: panasonic_viera + "pandora" = ps: with ps; [ pexpect]; + "panel_custom" = ps: with ps; [ aiohttp-cors]; # missing inputs: home-assistant-frontend + "panel_iframe" = ps: with ps; [ aiohttp-cors]; # missing inputs: home-assistant-frontend + "pcal9535a" = ps: with ps; [ ]; # missing inputs: pcal9535a + "pencom" = ps: with ps; [ ]; # missing inputs: pencompy + "persistent_notification" = ps: with ps; [ ]; + "person" = ps: with ps; [ ]; + "philips_js" = ps: with ps; [ ]; # missing inputs: ha-philipsjs + "pi_hole" = ps: with ps; [ ]; # missing inputs: hole + "picotts" = ps: with ps; [ ]; + "piglow" = ps: with ps; [ ]; # missing inputs: piglow + "pilight" = ps: with ps; [ ]; # missing inputs: pilight + "ping" = ps: with ps; [ ]; + "pioneer" = ps: with ps; [ ]; + "pjlink" = ps: with ps; [ ]; # missing inputs: pypjlink2 + "plaato" = ps: with ps; [ aiohttp-cors]; + "plant" = ps: with ps; [ ]; + "plex" = ps: with ps; [ aiohttp-cors plexapi plexauth plexwebsocket]; + "plugwise" = ps: with ps; [ ]; # missing inputs: haanna + "plum_lightpad" = ps: with ps; [ ]; # missing inputs: plumlightpad + "pocketcasts" = ps: with ps; [ ]; # missing inputs: pocketcasts + "point" = ps: with ps; [ aiohttp-cors]; # missing inputs: pypoint + "prezzibenzina" = ps: with ps; [ ]; # missing inputs: prezzibenzina-py + "proliphix" = ps: with ps; [ ]; # missing inputs: proliphix + "prometheus" = ps: with ps; [ aiohttp-cors prometheus_client]; + "prowl" = ps: with ps; [ ]; + "proximity" = ps: with ps; [ ]; + "proxmoxve" = ps: with ps; [ ]; # missing inputs: proxmoxer + "proxy" = ps: with ps; [ pillow]; + "ps4" = ps: with ps; [ ]; # missing inputs: pyps4-2ndscreen + "ptvsd" = ps: with ps; [ ]; # missing inputs: ptvsd + "pulseaudio_loopback" = ps: with ps; [ ]; + "push" = ps: with ps; [ aiohttp-cors]; + "pushbullet" = ps: with ps; [ pushbullet]; + "pushetta" = ps: with ps; [ ]; # missing inputs: pushetta + "pushover" = ps: with ps; [ pushover-complete]; + "pushsafer" = ps: with ps; [ ]; + "pvoutput" = ps: with ps; [ ]; + "pyload" = ps: with ps; [ ]; + "python_script" = ps: with ps; [ restrictedpython]; + "qbittorrent" = ps: with ps; [ ]; # missing inputs: python-qbittorrent + "qld_bushfire" = ps: with ps; [ ]; # missing inputs: georss_qld_bushfire_alert_client + "qnap" = ps: with ps; [ ]; # missing inputs: qnapstats + "qrcode" = ps: with ps; [ pillow]; # missing inputs: pyzbar + "quantum_gateway" = ps: with ps; [ ]; # missing inputs: quantum-gateway + "qwikswitch" = ps: with ps; [ ]; # missing inputs: pyqwikswitch + "rachio" = ps: with ps; [ aiohttp-cors]; # missing inputs: rachiopy + "radarr" = ps: with ps; [ ]; + "radiotherm" = ps: with ps; [ ]; # missing inputs: radiotherm + "rainbird" = ps: with ps; [ ]; # missing inputs: pyrainbird + "raincloud" = ps: with ps; [ ]; # missing inputs: raincloudy + "rainforest_eagle" = ps: with ps; [ ]; # missing inputs: eagle200_reader uEagle + "rainmachine" = ps: with ps; [ ]; # missing inputs: regenmaschine + "random" = ps: with ps; [ ]; + "raspihats" = ps: with ps; [ ]; # missing inputs: raspihats smbus-cffi + "raspyrfm" = ps: with ps; [ ]; # missing inputs: raspyrfm-client + "recollect_waste" = ps: with ps; [ ]; # missing inputs: recollect-waste + "recorder" = ps: with ps; [ sqlalchemy]; + "recswitch" = ps: with ps; [ ]; # missing inputs: pyrecswitch + "reddit" = ps: with ps; [ praw]; + "rejseplanen" = ps: with ps; [ ]; # missing inputs: rjpl + "remember_the_milk" = ps: with ps; [ httplib2]; # missing inputs: RtmAPI + "remote" = ps: with ps; [ ]; + "remote_rpi_gpio" = ps: with ps; [ ]; # missing inputs: gpiozero + "repetier" = ps: with ps; [ ]; # missing inputs: pyrepetier + "rest" = ps: with ps; [ jsonpath xmltodict]; + "rest_command" = ps: with ps; [ ]; + "rflink" = ps: with ps; [ ]; # missing inputs: rflink + "rfxtrx" = ps: with ps; [ ]; # missing inputs: pyRFXtrx + "ring" = ps: with ps; [ ha-ffmpeg]; # missing inputs: ring_doorbell + "ripple" = ps: with ps; [ ]; # missing inputs: python-ripple-api + "rmvtransport" = ps: with ps; [ ]; # missing inputs: PyRMVtransport + "rocketchat" = ps: with ps; [ ]; # missing inputs: rocketchat-API + "roku" = ps: with ps; [ ]; # missing inputs: roku + "roomba" = ps: with ps; [ ]; # missing inputs: roombapy + "route53" = ps: with ps; [ boto3]; # missing inputs: ipify + "rova" = ps: with ps; [ ]; # missing inputs: rova + "rpi_camera" = ps: with ps; [ ]; + "rpi_gpio" = ps: with ps; [ ]; # missing inputs: RPi.GPIO + "rpi_gpio_pwm" = ps: with ps; [ ]; # missing inputs: pwmled + "rpi_pfio" = ps: with ps; [ ]; # missing inputs: pifacecommon pifacedigitalio + "rpi_rf" = ps: with ps; [ ]; # missing inputs: rpi-rf + "rss_feed_template" = ps: with ps; [ aiohttp-cors]; + "rtorrent" = ps: with ps; [ ]; + "russound_rio" = ps: with ps; [ ]; # missing inputs: russound_rio + "russound_rnet" = ps: with ps; [ ]; # missing inputs: russound + "sabnzbd" = ps: with ps; [ ]; # missing inputs: pysabnzbd + "safe_mode" = ps: with ps; [ aiohttp-cors hass-nabucasa]; # missing inputs: home-assistant-frontend + "saj" = ps: with ps; [ ]; # missing inputs: pysaj + "salt" = ps: with ps; [ ]; # missing inputs: saltbox + "samsungtv" = ps: with ps; [ ]; # missing inputs: samsungctl[websocket] + "satel_integra" = ps: with ps; [ ]; # missing inputs: satel_integra + "scene" = ps: with ps; [ ]; + "scrape" = ps: with ps; [ beautifulsoup4]; + "script" = ps: with ps; [ ]; + "scsgate" = ps: with ps; [ ]; # missing inputs: scsgate + "search" = ps: with ps; [ aiohttp-cors]; + "season" = ps: with ps; [ ephem]; + "sendgrid" = ps: with ps; [ ]; # missing inputs: sendgrid + "sense" = ps: with ps; [ ]; # missing inputs: sense_energy + "sensehat" = ps: with ps; [ ]; # missing inputs: sense-hat + "sensibo" = ps: with ps; [ ]; # missing inputs: pysensibo + "sensor" = ps: with ps; [ ]; + "sentry" = ps: with ps; [ sentry-sdk]; + "serial" = ps: with ps; [ pyserial-asyncio]; + "serial_pm" = ps: with ps; [ ]; # missing inputs: pmsensor + "sesame" = ps: with ps; [ ]; # missing inputs: pysesame2 + "seven_segments" = ps: with ps; [ pillow]; + "seventeentrack" = ps: with ps; [ ]; # missing inputs: py17track + "shell_command" = ps: with ps; [ ]; + "shiftr" = ps: with ps; [ paho-mqtt]; + "shodan" = ps: with ps; [ shodan]; + "shopping_list" = ps: with ps; [ aiohttp-cors]; + "sht31" = ps: with ps; [ ]; # missing inputs: Adafruit-GPIO Adafruit-SHT31 + "sigfox" = ps: with ps; [ ]; + "sighthound" = ps: with ps; [ ]; # missing inputs: simplehound + "signal_messenger" = ps: with ps; [ ]; # missing inputs: pysignalclirestapi + "simplepush" = ps: with ps; [ ]; # missing inputs: simplepush + "simplisafe" = ps: with ps; [ ]; # missing inputs: simplisafe-python + "simulated" = ps: with ps; [ ]; + "sinch" = ps: with ps; [ ]; # missing inputs: clx-sdk-xms + "sisyphus" = ps: with ps; [ ]; # missing inputs: sisyphus-control + "sky_hub" = ps: with ps; [ ]; + "skybeacon" = ps: with ps; [ ]; # missing inputs: pygatt[GATTTOOL] + "skybell" = ps: with ps; [ ]; # missing inputs: skybellpy + "slack" = ps: with ps; [ ]; # missing inputs: slacker + "sleepiq" = ps: with ps; [ ]; # missing inputs: sleepyq + "slide" = ps: with ps; [ ]; # missing inputs: goslide-api + "sma" = ps: with ps; [ ]; # missing inputs: pysma + "smappee" = ps: with ps; [ ]; # missing inputs: smappy + "smarthab" = ps: with ps; [ ]; # missing inputs: smarthab + "smartthings" = ps: with ps; [ aiohttp-cors]; # missing inputs: pysmartapp pysmartthings + "smarty" = ps: with ps; [ ]; # missing inputs: pysmarty + "smhi" = ps: with ps; [ ]; # missing inputs: smhi-pkg + "sms" = ps: with ps; [ ]; # missing inputs: python-gammu + "smtp" = ps: with ps; [ ]; + "snapcast" = ps: with ps; [ snapcast]; + "snips" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt]; + "snmp" = ps: with ps; [ pysnmp]; + "sochain" = ps: with ps; [ ]; # missing inputs: python-sochain-api + "socialblade" = ps: with ps; [ ]; # missing inputs: socialbladeclient + "solaredge" = ps: with ps; [ stringcase]; # missing inputs: solaredge + "solaredge_local" = ps: with ps; [ ]; # missing inputs: solaredge-local + "solarlog" = ps: with ps; [ ]; # missing inputs: sunwatcher + "solax" = ps: with ps; [ ]; # missing inputs: solax + "soma" = ps: with ps; [ ]; # missing inputs: pysoma + "somfy" = ps: with ps; [ aiohttp-cors]; # missing inputs: pymfy + "somfy_mylink" = ps: with ps; [ ]; # missing inputs: somfy-mylink-synergy + "sonarr" = ps: with ps; [ ]; + "songpal" = ps: with ps; [ ]; # missing inputs: python-songpal + "sonos" = ps: with ps; [ pysonos]; + "sony_projector" = ps: with ps; [ ]; # missing inputs: pysdcp + "soundtouch" = ps: with ps; [ libsoundtouch]; + "spaceapi" = ps: with ps; [ aiohttp-cors]; + "spc" = ps: with ps; [ ]; # missing inputs: pyspcwebgw + "speedtestdotnet" = ps: with ps; [ speedtest-cli]; + "spider" = ps: with ps; [ ]; # missing inputs: spiderpy + "splunk" = ps: with ps; [ ]; + "spotcrime" = ps: with ps; [ ]; # missing inputs: spotcrime + "spotify" = ps: with ps; [ aiohttp-cors spotipy]; + "sql" = ps: with ps; [ sqlalchemy]; + "squeezebox" = ps: with ps; [ ]; + "ssdp" = ps: with ps; [ defusedxml netdisco]; + "starline" = ps: with ps; [ ]; # missing inputs: starline + "starlingbank" = ps: with ps; [ ]; # missing inputs: starlingbank + "startca" = ps: with ps; [ xmltodict]; + "statistics" = ps: with ps; [ ]; + "statsd" = ps: with ps; [ statsd]; + "steam_online" = ps: with ps; [ ]; # missing inputs: steamodd + "stiebel_eltron" = ps: with ps; [ ]; # missing inputs: pymodbus pystiebeleltron + "stookalert" = ps: with ps; [ ]; # missing inputs: stookalert + "stream" = ps: with ps; [ aiohttp-cors av]; + "streamlabswater" = ps: with ps; [ ]; # missing inputs: streamlabswater + "stt" = ps: with ps; [ aiohttp-cors]; + "suez_water" = ps: with ps; [ ]; # missing inputs: pysuez + "sun" = ps: with ps; [ ]; + "supervisord" = ps: with ps; [ ]; + "supla" = ps: with ps; [ ]; # missing inputs: pysupla + "surepetcare" = ps: with ps; [ ]; # missing inputs: surepy + "swiss_hydrological_data" = ps: with ps; [ ]; # missing inputs: swisshydrodata + "swiss_public_transport" = ps: with ps; [ ]; # missing inputs: python_opendata_transport + "swisscom" = ps: with ps; [ ]; + "switch" = ps: with ps; [ ]; + "switchbot" = ps: with ps; [ ]; # missing inputs: PySwitchbot + "switcher_kis" = ps: with ps; [ ]; # missing inputs: aioswitcher + "switchmate" = ps: with ps; [ ]; # missing inputs: pySwitchmate + "syncthru" = ps: with ps; [ ]; # missing inputs: pysyncthru + "synology" = ps: with ps; [ ]; # missing inputs: py-synology + "synology_chat" = ps: with ps; [ ]; + "synology_srm" = ps: with ps; [ ]; # missing inputs: synology-srm + "synologydsm" = ps: with ps; [ ]; # missing inputs: python-synology + "syslog" = ps: with ps; [ ]; + "system_health" = ps: with ps; [ aiohttp-cors]; + "system_log" = ps: with ps; [ aiohttp-cors]; + "systemmonitor" = ps: with ps; [ psutil]; + "tado" = ps: with ps; [ ]; # missing inputs: python-tado + "tahoma" = ps: with ps; [ ]; # missing inputs: tahoma-api + "tank_utility" = ps: with ps; [ ]; # missing inputs: tank_utility + "tapsaff" = ps: with ps; [ ]; # missing inputs: tapsaff + "tautulli" = ps: with ps; [ ]; # missing inputs: pytautulli + "tcp" = ps: with ps; [ ]; + "ted5000" = ps: with ps; [ xmltodict]; + "teksavvy" = ps: with ps; [ ]; + "telegram" = ps: with ps; [ pysocks aiohttp-cors python-telegram-bot]; + "telegram_bot" = ps: with ps; [ pysocks aiohttp-cors python-telegram-bot]; + "tellduslive" = ps: with ps; [ ]; # missing inputs: tellduslive + "tellstick" = ps: with ps; [ ]; # missing inputs: tellcore-net tellcore-py + "telnet" = ps: with ps; [ ]; + "temper" = ps: with ps; [ ]; # missing inputs: temperusb + "template" = ps: with ps; [ ]; + "tensorflow" = ps: with ps; [ numpy pillow protobuf tensorflow]; + "tesla" = ps: with ps; [ ]; # missing inputs: teslajsonpy + "tfiac" = ps: with ps; [ ]; # missing inputs: pytfiac + "thermoworks_smoke" = ps: with ps; [ stringcase]; # missing inputs: thermoworks_smoke + "thethingsnetwork" = ps: with ps; [ ]; + "thingspeak" = ps: with ps; [ ]; # missing inputs: thingspeak + "thinkingcleaner" = ps: with ps; [ ]; # missing inputs: pythinkingcleaner + "thomson" = ps: with ps; [ ]; + "threshold" = ps: with ps; [ ]; + "tibber" = ps: with ps; [ ]; # missing inputs: pyTibber + "tikteck" = ps: with ps; [ ]; # missing inputs: tikteck + "tile" = ps: with ps; [ ]; # missing inputs: pytile + "time_date" = ps: with ps; [ ]; + "timer" = ps: with ps; [ ]; + "tmb" = ps: with ps; [ ]; # missing inputs: tmb + "tod" = ps: with ps; [ ]; + "todoist" = ps: with ps; [ todoist]; + "tof" = ps: with ps; [ ]; # missing inputs: RPi.GPIO VL53L1X2 + "tomato" = ps: with ps; [ ]; + "toon" = ps: with ps; [ ]; # missing inputs: toonapilib + "torque" = ps: with ps; [ aiohttp-cors]; + "totalconnect" = ps: with ps; [ ]; # missing inputs: total_connect_client + "touchline" = ps: with ps; [ ]; # missing inputs: pytouchline + "tplink" = ps: with ps; [ ]; # missing inputs: pyHS100 + "tplink_lte" = ps: with ps; [ ]; # missing inputs: tp-connected + "traccar" = ps: with ps; [ aiohttp-cors stringcase]; # missing inputs: pytraccar + "trackr" = ps: with ps; [ ]; # missing inputs: pytrackr + "tradfri" = ps: with ps; [ ]; # missing inputs: pytradfri[async] + "trafikverket_train" = ps: with ps; [ ]; # missing inputs: pytrafikverket + "trafikverket_weatherstation" = ps: with ps; [ ]; # missing inputs: pytrafikverket + "transmission" = ps: with ps; [ transmissionrpc]; + "transport_nsw" = ps: with ps; [ ]; # missing inputs: PyTransportNSW + "travisci" = ps: with ps; [ ]; # missing inputs: TravisPy + "trend" = ps: with ps; [ numpy]; + "tts" = ps: with ps; [ aiohttp-cors mutagen]; + "tuya" = ps: with ps; [ ]; # missing inputs: tuyaha + "twentemilieu" = ps: with ps; [ ]; # missing inputs: twentemilieu + "twilio" = ps: with ps; [ aiohttp-cors twilio]; + "twilio_call" = ps: with ps; [ aiohttp-cors twilio]; + "twilio_sms" = ps: with ps; [ aiohttp-cors twilio]; + "twitch" = ps: with ps; [ ]; # missing inputs: python-twitch-client + "twitter" = ps: with ps; [ ]; # missing inputs: TwitterAPI + "ubee" = ps: with ps; [ ]; # missing inputs: pyubee + "ubus" = ps: with ps; [ ]; + "ue_smart_radio" = ps: with ps; [ ]; + "uk_transport" = ps: with ps; [ ]; + "unifi" = ps: with ps; [ aiounifi]; + "unifi_direct" = ps: with ps; [ pexpect]; + "unifiled" = ps: with ps; [ ]; # missing inputs: unifiled + "universal" = ps: with ps; [ ]; + "upc_connect" = ps: with ps; [ ]; # missing inputs: connect-box + "upcloud" = ps: with ps; [ ]; # missing inputs: upcloud-api + "updater" = ps: with ps; [ distro]; + "upnp" = ps: with ps; [ ]; # missing inputs: async-upnp-client + "uptime" = ps: with ps; [ ]; + "uptimerobot" = ps: with ps; [ ]; # missing inputs: pyuptimerobot + "uscis" = ps: with ps; [ ]; # missing inputs: uscisstatus + "usgs_earthquakes_feed" = ps: with ps; [ ]; # missing inputs: geojson_client + "utility_meter" = ps: with ps; [ ]; + "uvc" = ps: with ps; [ ]; # missing inputs: uvcclient + "vacuum" = ps: with ps; [ ]; + "vallox" = ps: with ps; [ ]; # missing inputs: vallox-websocket-api + "vasttrafik" = ps: with ps; [ ]; # missing inputs: vtjp + "velbus" = ps: with ps; [ ]; # missing inputs: python-velbus + "velux" = ps: with ps; [ ]; # missing inputs: pyvlx + "venstar" = ps: with ps; [ ]; # missing inputs: venstarcolortouch + "vera" = ps: with ps; [ ]; # missing inputs: pyvera + "verisure" = ps: with ps; [ jsonpath]; # missing inputs: vsure + "versasense" = ps: with ps; [ ]; # missing inputs: pyversasense + "version" = ps: with ps; [ pyhaversion]; + "vesync" = ps: with ps; [ ]; # missing inputs: pyvesync + "viaggiatreno" = ps: with ps; [ ]; + "vicare" = ps: with ps; [ ]; # missing inputs: PyViCare + "vilfo" = ps: with ps; [ ]; # missing inputs: vilfo-api-client + "vivotek" = ps: with ps; [ ]; # missing inputs: libpyvivotek + "vizio" = ps: with ps; [ ]; # missing inputs: pyvizio + "vlc" = ps: with ps; [ python-vlc]; + "vlc_telnet" = ps: with ps; [ ]; # missing inputs: python-telnet-vlc + "voicerss" = ps: with ps; [ ]; + "volkszaehler" = ps: with ps; [ ]; # missing inputs: volkszaehler + "volumio" = ps: with ps; [ ]; + "volvooncall" = ps: with ps; [ ]; # missing inputs: volvooncall + "vultr" = ps: with ps; [ vultr]; + "w800rf32" = ps: with ps; [ ]; # missing inputs: pyW800rf32 + "wake_on_lan" = ps: with ps; [ wakeonlan]; + "waqi" = ps: with ps; [ ]; # missing inputs: waqiasync + "water_heater" = ps: with ps; [ ]; + "waterfurnace" = ps: with ps; [ ]; # missing inputs: waterfurnace + "watson_iot" = ps: with ps; [ ]; # missing inputs: ibmiotf + "watson_tts" = ps: with ps; [ ]; # missing inputs: ibm-watson + "waze_travel_time" = ps: with ps; [ WazeRouteCalculator]; + "weather" = ps: with ps; [ ]; + "webhook" = ps: with ps; [ aiohttp-cors]; + "weblink" = ps: with ps; [ ]; + "webostv" = ps: with ps; [ ]; # missing inputs: aiopylgtv + "websocket_api" = ps: with ps; [ aiohttp-cors]; + "wemo" = ps: with ps; [ ]; # missing inputs: pywemo + "whois" = ps: with ps; [ ]; # missing inputs: python-whois + "wink" = ps: with ps; [ aiohttp-cors]; # missing inputs: pubnubsub-handler python-wink + "wirelesstag" = ps: with ps; [ ]; # missing inputs: wirelesstagpy + "withings" = ps: with ps; [ aiohttp-cors]; # missing inputs: withings-api + "wled" = ps: with ps; [ ]; # missing inputs: wled + "workday" = ps: with ps; [ holidays]; + "worldclock" = ps: with ps; [ ]; + "worldtidesinfo" = ps: with ps; [ ]; + "worxlandroid" = ps: with ps; [ ]; + "wsdot" = ps: with ps; [ ]; + "wunderground" = ps: with ps; [ ]; + "wunderlist" = ps: with ps; [ ]; # missing inputs: wunderpy2 + "wwlln" = ps: with ps; [ ]; # missing inputs: aiowwlln + "x10" = ps: with ps; [ ]; + "xbox_live" = ps: with ps; [ ]; # missing inputs: xboxapi + "xeoma" = ps: with ps; [ ]; # missing inputs: pyxeoma + "xfinity" = ps: with ps; [ ]; # missing inputs: xfinity-gateway + "xiaomi" = ps: with ps; [ ha-ffmpeg]; + "xiaomi_aqara" = ps: with ps; [ ]; # missing inputs: PyXiaomiGateway + "xiaomi_miio" = ps: with ps; [ construct python-miio]; + "xiaomi_tv" = ps: with ps; [ ]; # missing inputs: pymitv + "xmpp" = ps: with ps; [ slixmpp]; + "xs1" = ps: with ps; [ ]; # missing inputs: xs1-api-client + "yale_smart_alarm" = ps: with ps; [ ]; # missing inputs: yalesmartalarmclient + "yamaha" = ps: with ps; [ rxv]; + "yamaha_musiccast" = ps: with ps; [ ]; # missing inputs: pymusiccast + "yandex_transport" = ps: with ps; [ ]; # missing inputs: ya_ma + "yandextts" = ps: with ps; [ ]; + "yeelight" = ps: with ps; [ ]; # missing inputs: yeelight + "yeelightsunflower" = ps: with ps; [ ]; # missing inputs: yeelightsunflower + "yessssms" = ps: with ps; [ ]; # missing inputs: YesssSMS + "yi" = ps: with ps; [ aioftp ha-ffmpeg]; + "yr" = ps: with ps; [ xmltodict]; + "yweather" = ps: with ps; [ yahooweather]; + "zabbix" = ps: with ps; [ ]; # missing inputs: pyzabbix + "zamg" = ps: with ps; [ ]; + "zengge" = ps: with ps; [ ]; # missing inputs: zengge + "zeroconf" = ps: with ps; [ aiohttp-cors zeroconf]; + "zestimate" = ps: with ps; [ xmltodict]; + "zha" = ps: with ps; [ zha-quirks zigpy-deconz zigpy]; # missing inputs: bellows-homeassistant zigpy-cc zigpy-xbee-homeassistant zigpy-zigate + "zhong_hong" = ps: with ps; [ ]; # missing inputs: zhong_hong_hvac + "zigbee" = ps: with ps; [ ]; # missing inputs: xbee-helper + "ziggo_mediabox_xl" = ps: with ps; [ ]; # missing inputs: ziggo-mediabox-xl + "zone" = ps: with ps; [ ]; + "zoneminder" = ps: with ps; [ zm-py]; + "zwave" = ps: with ps; [ homeassistant-pyozw pydispatcher]; }; } diff --git a/pkgs/servers/home-assistant/default.nix b/pkgs/servers/home-assistant/default.nix index 7d32bf9a0584..2b571fe96bfc 100644 --- a/pkgs/servers/home-assistant/default.nix +++ b/pkgs/servers/home-assistant/default.nix @@ -67,7 +67,7 @@ let extraBuildInputs = extraPackages py.pkgs; # Don't forget to run parse-requirements.py after updating - hassVersion = "0.104.3"; + hassVersion = "0.106.6"; in with py.pkgs; buildPythonApplication rec { pname = "homeassistant"; @@ -75,6 +75,8 @@ in with py.pkgs; buildPythonApplication rec { disabled = pythonOlder "3.5"; + patches = [ ./relax-importlib-metadata-pyaml.patch ]; + inherit availableComponents; # PyPI tarball is missing tests/ directory @@ -82,7 +84,7 @@ in with py.pkgs; buildPythonApplication rec { owner = "home-assistant"; repo = "home-assistant"; rev = version; - sha256 = "06bh9qrpa1d370pvw6in0isg3yw4p7gh9rpy4hm96p0mf53vxfdp"; + sha256 = "11kv5lmm8nxp7yv3w43mzmgzkafddy0z6wl2878p96iyil1w7qhb"; }; propagatedBuildInputs = [ @@ -95,7 +97,8 @@ in with py.pkgs; buildPythonApplication rec { ] ++ componentBuildInputs ++ extraBuildInputs; checkInputs = [ - asynctest pytest pytest-aiohttp requests-mock pydispatcher aiohue netdisco hass-nabucasa + asynctest pytest pytest-aiohttp requests-mock pydispatcher aiohue netdisco + hass-nabucasa defusedxml ]; postPatch = '' diff --git a/pkgs/servers/home-assistant/frontend.nix b/pkgs/servers/home-assistant/frontend.nix index 75d02ed06351..1446518fbc5c 100644 --- a/pkgs/servers/home-assistant/frontend.nix +++ b/pkgs/servers/home-assistant/frontend.nix @@ -4,11 +4,11 @@ buildPythonPackage rec { # the frontend version corresponding to a specific home-assistant version can be found here # https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/frontend/manifest.json pname = "home-assistant-frontend"; - version = "20200108.0"; + version = "20200220.5"; src = fetchPypi { inherit pname version; - sha256 = "1h6fgkx8fffzs829893gjbh0wbjgxjzz2ca64v8r5sb938bfayg8"; + sha256 = "0nc44r5ybq0prsz2yid622i0xr7q0qrc4ymbk69bqg6jrmjpbdl1"; }; # no Python tests implemented diff --git a/pkgs/servers/home-assistant/parse-requirements.py b/pkgs/servers/home-assistant/parse-requirements.py index 96cf1d86050e..a5c6e9d09614 100755 --- a/pkgs/servers/home-assistant/parse-requirements.py +++ b/pkgs/servers/home-assistant/parse-requirements.py @@ -1,5 +1,5 @@ #! /usr/bin/env nix-shell -#! nix-shell -i python3 -p "python3.withPackages (ps: with ps; [ attrs ]) +#! nix-shell -i python3 -p "python3.withPackages (ps: with ps; [ mypy attrs ]) # # This script downloads Home Assistant's source tarball. # Inside the homeassistant/components directory, each integration has an associated manifest.json, @@ -15,125 +15,168 @@ # nixpkgs' python3Packages are searched for appropriate names. # Then, a Nix attribute set mapping integration name to dependencies is created. -from io import BytesIO import json -import pathlib import os +import pathlib import re import subprocess import sys -import tempfile import tarfile +import tempfile +from io import BytesIO +from typing import Dict, Optional from urllib.request import urlopen -COMPONENT_PREFIX = 'homeassistant.components' -PKG_SET = 'python3Packages' +COMPONENT_PREFIX = "homeassistant.components" +PKG_SET = "python3Packages" # If some requirements are matched by multiple python packages, # the following can be used to choose one of them PKG_PREFERENCES = { # Use python3Packages.youtube-dl-light instead of python3Packages.youtube-dl - 'youtube-dl': 'youtube-dl-light', - 'tensorflow-bin': 'tensorflow', - 'tensorflowWithoutCuda': 'tensorflow' + "youtube-dl": "youtube-dl-light", + "tensorflow-bin": "tensorflow", + "tensorflowWithoutCuda": "tensorflow", } + +def run_mypy() -> None: + cmd = ["mypy", "--ignore-missing-imports", __file__] + print(f"$ {' '.join(cmd)}") + subprocess.run(cmd, check=True) + + def get_version(): - with open(os.path.dirname(sys.argv[0]) + '/default.nix') as f: + with open(os.path.dirname(sys.argv[0]) + "/default.nix") as f: # A version consists of digits, dots, and possibly a "b" (for beta) m = re.search('hassVersion = "([\\d\\.b]+)";', f.read()) return m.group(1) -def parse_components(version='master'): + +def parse_components(version: str = "master"): components = {} with tempfile.TemporaryDirectory() as tmp: - with urlopen(f'https://github.com/home-assistant/home-assistant/archive/{version}.tar.gz') as response: + with urlopen( + f"https://github.com/home-assistant/home-assistant/archive/{version}.tar.gz" + ) as response: tarfile.open(fileobj=BytesIO(response.read())).extractall(tmp) # Use part of a script from the Home Assistant codebase - sys.path.append(os.path.join(tmp, f'home-assistant-{version}')) + core_path = os.path.join(tmp, f"core-{version}") + sys.path.append(core_path) from script.hassfest.model import Integration - integrations = Integration.load_dir(pathlib.Path( - os.path.join(tmp, f'home-assistant-{version}', 'homeassistant/components') - )) + + integrations = Integration.load_dir( + pathlib.Path( + os.path.join(core_path, "homeassistant/components") + ) + ) for domain in sorted(integrations): integration = integrations[domain] components[domain] = integration.manifest return components + # Recursively get the requirements of a component and its dependencies def get_reqs(components, component): - requirements = set(components[component]['requirements']) - for dependency in components[component]['dependencies']: + requirements = set(components[component]["requirements"]) + for dependency in components[component]["dependencies"]: requirements.update(get_reqs(components, dependency)) return requirements -# Store a JSON dump of Nixpkgs' python3Packages -output = subprocess.check_output(['nix-env', '-f', os.path.dirname(sys.argv[0]) + '/../../..', '-qa', '-A', PKG_SET, '--json']) -packages = json.loads(output) -def name_to_attr_path(req): +def dump_packages() -> Dict[str, Dict[str, str]]: + # Store a JSON dump of Nixpkgs' python3Packages + output = subprocess.check_output( + [ + "nix-env", + "-f", + os.path.dirname(sys.argv[0]) + "/../../..", + "-qa", + "-A", + PKG_SET, + "--json", + ] + ) + return json.loads(output) + + +def name_to_attr_path(req: str, packages: Dict[str, Dict[str, str]]) -> Optional[str]: attr_paths = set() names = [req] # E.g. python-mpd2 is actually called python3.6-mpd2 # instead of python-3.6-python-mpd2 inside Nixpkgs - if req.startswith('python-') or req.startswith('python_'): - names.append(req[len('python-'):]) + if req.startswith("python-") or req.startswith("python_"): + names.append(req[len("python-") :]) for name in names: # treat "-" and "_" equally - name = re.sub('[-_]', '[-_]', name) - pattern = re.compile('^python\\d\\.\\d-{}-\\d'.format(name), re.I) + name = re.sub("[-_]", "[-_]", name) + pattern = re.compile("^python\\d\\.\\d-{}-\\d".format(name), re.I) for attr_path, package in packages.items(): - if pattern.match(package['name']): + if pattern.match(package["name"]): attr_paths.add(attr_path) if len(attr_paths) > 1: for to_replace, replacement in PKG_PREFERENCES.items(): try: - attr_paths.remove(PKG_SET + '.' + to_replace) - attr_paths.add(PKG_SET + '.' + replacement) + attr_paths.remove(PKG_SET + "." + to_replace) + attr_paths.add(PKG_SET + "." + replacement) except KeyError: pass # Let's hope there's only one derivation with a matching name - assert len(attr_paths) <= 1, "{} matches more than one derivation: {}".format(req, attr_paths) + assert len(attr_paths) <= 1, "{} matches more than one derivation: {}".format( + req, attr_paths + ) if len(attr_paths) == 1: return attr_paths.pop() else: return None -version = get_version() -print('Generating component-packages.nix for version {}'.format(version)) -components = parse_components(version=version) -build_inputs = {} -for component in sorted(components.keys()): - attr_paths = [] - missing_reqs = [] - reqs = sorted(get_reqs(components, component)) - for req in reqs: - # Some requirements are specified by url, e.g. https://example.org/foobar#xyz==1.0.0 - # Therefore, if there's a "#" in the line, only take the part after it - req = req[req.find('#') + 1:] - name = req.split('==')[0] - attr_path = name_to_attr_path(name) - if attr_path is not None: - # Add attribute path without "python3Packages." prefix - attr_paths.append(attr_path[len(PKG_SET + '.'):]) + +def main() -> None: + packages = dump_packages() + version = get_version() + print("Generating component-packages.nix for version {}".format(version)) + components = parse_components(version=version) + build_inputs = {} + for component in sorted(components.keys()): + attr_paths = [] + missing_reqs = [] + reqs = sorted(get_reqs(components, component)) + for req in reqs: + # Some requirements are specified by url, e.g. https://example.org/foobar#xyz==1.0.0 + # Therefore, if there's a "#" in the line, only take the part after it + req = req[req.find("#") + 1 :] + name = req.split("==")[0] + attr_path = name_to_attr_path(name, packages) + if attr_path is not None: + # Add attribute path without "python3Packages." prefix + attr_paths.append(attr_path[len(PKG_SET + ".") :]) + else: + missing_reqs.append(name) else: - missing_reqs.append(name) - else: - build_inputs[component] = attr_paths - n_diff = len(reqs) > len(build_inputs[component]) - if n_diff > 0: - print("Component {} is missing {} dependencies".format(component, n_diff)) - print("missing requirements: {}".format(missing_reqs)) - -with open(os.path.dirname(sys.argv[0]) + '/component-packages.nix', 'w') as f: - f.write('# Generated by parse-requirements.py\n') - f.write('# Do not edit!\n\n') - f.write('{\n') - f.write(' version = "{}";\n'.format(version)) - f.write(' components = {\n') - for component, attr_paths in build_inputs.items(): - f.write(' "{}" = ps: with ps; [ '.format(component)) - f.write(' '.join(attr_paths)) - f.write(' ];\n') - f.write(' };\n') - f.write('}\n') + build_inputs[component] = (attr_paths, missing_reqs) + n_diff = len(reqs) > len(build_inputs[component]) + if n_diff > 0: + print("Component {} is missing {} dependencies".format(component, n_diff)) + print("missing requirements: {}".format(missing_reqs)) + + with open(os.path.dirname(sys.argv[0]) + "/component-packages.nix", "w") as f: + f.write("# Generated by parse-requirements.py\n") + f.write("# Do not edit!\n\n") + f.write("{\n") + f.write(f' version = "{version}";\n') + f.write(" components = {\n") + for component, deps in build_inputs.items(): + available, missing = deps + f.write(f' "{component}" = ps: with ps; [ ') + f.write(" ".join(available)) + f.write("];") + if len(missing) > 0: + f.write(f" # missing inputs: {' '.join(missing)}") + f.write("\n") + f.write(" };\n") + f.write("}\n") + + +if __name__ == "__main__": + run_mypy() + main() diff --git a/pkgs/servers/home-assistant/relax-importlib-metadata-pyaml.patch b/pkgs/servers/home-assistant/relax-importlib-metadata-pyaml.patch new file mode 100644 index 000000000000..d35e05c6cd78 --- /dev/null +++ b/pkgs/servers/home-assistant/relax-importlib-metadata-pyaml.patch @@ -0,0 +1,22 @@ +diff --git a/setup.py b/setup.py +index 7f9155d9a..f90a0d965 100755 +--- a/setup.py ++++ b/setup.py +@@ -38,7 +38,7 @@ REQUIRES = [ + "attrs==19.3.0", + "bcrypt==3.1.7", + "certifi>=2019.11.28", +- "importlib-metadata==1.5.0", ++ "importlib-metadata>=1.3.0", + "jinja2>=2.10.3", + "PyJWT==1.7.1", + # PyJWT has loose dependency. We want the latest one. +@@ -46,7 +46,7 @@ REQUIRES = [ + "pip>=8.0.3", + "python-slugify==4.0.0", + "pytz>=2019.03", +- "pyyaml==5.3", ++ "pyyaml>=5.2", + "requests==2.22.0", + "ruamel.yaml==0.15.100", + "voluptuous==0.11.7", diff --git a/pkgs/servers/http/unit/default.nix b/pkgs/servers/http/unit/default.nix index 8b36e7de69fd..c56e994ed54e 100644 --- a/pkgs/servers/http/unit/default.nix +++ b/pkgs/servers/http/unit/default.nix @@ -17,14 +17,14 @@ with stdenv.lib; stdenv.mkDerivation rec { - version = "1.15.0"; + version = "1.16.0"; pname = "unit"; src = fetchFromGitHub { owner = "nginx"; repo = "unit"; rev = version; - sha256 = "1dj21fcssrvbspppbhg8684vfcbn0m1abiy1r60h5fzb470k21jb"; + sha256 = "19gclqhwccpi7y4386ap33ycwhylv4s4kwfc6ik8scmc4pw3sj9l"; }; patches = [ diff --git a/pkgs/servers/imgproxy/default.nix b/pkgs/servers/imgproxy/default.nix new file mode 100644 index 000000000000..be78e1aa8316 --- /dev/null +++ b/pkgs/servers/imgproxy/default.nix @@ -0,0 +1,32 @@ +{ lib, buildGoModule, fetchFromGitHub, pkg-config, vips, gobject-introspection }: + +buildGoModule rec { + pname = "imgproxy"; + version = "2.8.1"; + + src = fetchFromGitHub { + owner = pname; + repo = pname; + sha256 = "00hhgh6nrzg2blc6yl8rph5h5w7swlkbh0zgsj7xr0lkm10879pc"; + rev = "v${version}"; + }; + + modSha256 = "0kgd8lwcdns3skvd4bj4z85mq6hkk79mb0zzwky0wqxni8f73s6w"; + + buildInputs = [ + gobject-introspection + pkg-config + vips + ]; + + preBuild = '' + export CGO_LDFLAGS_ALLOW='-(s|w)' + ''; + + meta = with lib; { + description = "Fast and secure on-the-fly image processing server written in Go"; + homepage = "https://imgproxy.net"; + license = licenses.mit; + maintainers = with maintainers; [ paluh ]; + }; +} diff --git a/pkgs/servers/jackett/default.nix b/pkgs/servers/jackett/default.nix index cbac1a423525..9d9ae4e25b43 100644 --- a/pkgs/servers/jackett/default.nix +++ b/pkgs/servers/jackett/default.nix @@ -2,11 +2,11 @@ stdenv.mkDerivation rec { pname = "jackett"; - version = "0.12.1301"; + version = "0.13.467"; src = fetchurl { url = "https://github.com/Jackett/Jackett/releases/download/v${version}/Jackett.Binaries.LinuxAMDx64.tar.gz"; - sha256 = "03glp5qhyb6bldslbhivywcfbxpv374q9aaybz5f2s0r9il5cb35"; + sha256 = "1hjihafb8w9gcqdi2i8dmimbbg17c5hwwqhav3avfizq2drsrv5c"; }; buildInputs = [ makeWrapper ]; @@ -32,9 +32,9 @@ stdenv.mkDerivation rec { meta = with stdenv.lib; { description = "API Support for your favorite torrent trackers."; - homepage = https://github.com/Jackett/Jackett/; + homepage = "https://github.com/Jackett/Jackett/"; license = licenses.gpl2; maintainers = with maintainers; [ edwtjo nyanloutre ]; - platforms = platforms.all; + platforms = platforms.linux; }; } diff --git a/pkgs/servers/jellyfin/default.nix b/pkgs/servers/jellyfin/default.nix index 6da342ae8803..6cac79bdd4e2 100644 --- a/pkgs/servers/jellyfin/default.nix +++ b/pkgs/servers/jellyfin/default.nix @@ -1,4 +1,4 @@ -{ stdenv, lib, fetchurl, unzip, sqlite, makeWrapper, dotnet-netcore, ffmpeg, +{ stdenv, lib, fetchurl, unzip, sqlite, makeWrapper, dotnetCorePackages, ffmpeg, fontconfig, freetype }: let @@ -18,12 +18,12 @@ let in stdenv.mkDerivation rec { pname = "jellyfin"; - version = "10.4.3"; + version = "10.5.0"; # Impossible to build anything offline with dotnet src = fetchurl { url = "https://github.com/jellyfin/jellyfin/releases/download/v${version}/jellyfin_${version}_portable.tar.gz"; - sha256 = "11scxcwf02h6gvll0jwwac1wcpwz8d2y16yc3da0hrhy34yhysbl"; + sha256 = "1r6ljl535f8jchm5zvrwfl4aqjk5bg7sqbwr03yyjxgriqgf36lp"; }; buildInputs = [ @@ -32,7 +32,7 @@ in stdenv.mkDerivation rec { ]; propagatedBuildInputs = [ - dotnet-netcore + dotnetCorePackages.aspnetcore_3_1 sqlite ]; @@ -42,7 +42,7 @@ in stdenv.mkDerivation rec { install -dm 755 "$out/opt/jellyfin" cp -r * "$out/opt/jellyfin" - makeWrapper "${dotnet-netcore}/bin/dotnet" $out/bin/jellyfin \ + makeWrapper "${dotnetCorePackages.aspnetcore_3_1}/bin/dotnet" $out/bin/jellyfin \ --prefix LD_LIBRARY_PATH : "${stdenv.lib.makeLibraryPath [ sqlite fontconfig freetype stdenv.cc.cc.lib ]}:$out/opt/jellyfin/runtimes/${runtimeDir}/native/" \ diff --git a/pkgs/servers/mail/dovecot/default.nix b/pkgs/servers/mail/dovecot/default.nix index 12da51f9f239..fd27d18b5035 100644 --- a/pkgs/servers/mail/dovecot/default.nix +++ b/pkgs/servers/mail/dovecot/default.nix @@ -9,7 +9,7 @@ }: stdenv.mkDerivation rec { - name = "dovecot-2.3.9.3"; + name = "dovecot-2.3.10"; nativeBuildInputs = [ perl pkgconfig ]; buildInputs = @@ -21,7 +21,7 @@ stdenv.mkDerivation rec { src = fetchurl { url = "https://dovecot.org/releases/2.3/${name}.tar.gz"; - sha256 = "0lcnqib63nv32xr3nr4s3x8k77mbgrhc13swjl2xqnzw4fabd7zq"; + sha256 = "1ibiz3k2flablkcqbkvfzsjnq5b5kxximhcrplflsjl57mr88ca7"; }; enableParallelBuilding = true; @@ -81,7 +81,7 @@ stdenv.mkDerivation rec { ++ lib.optional withSQLite "--with-sqlite"; meta = { - homepage = https://dovecot.org/; + homepage = "https://dovecot.org/"; description = "Open source IMAP and POP3 email server written with security primarily in mind"; maintainers = with stdenv.lib.maintainers; [ peti rickynils fpletz globin ]; platforms = stdenv.lib.platforms.unix; diff --git a/pkgs/servers/mail/rspamd/default.nix b/pkgs/servers/mail/rspamd/default.nix index 15a651d8a321..79020ce78488 100644 --- a/pkgs/servers/mail/rspamd/default.nix +++ b/pkgs/servers/mail/rspamd/default.nix @@ -10,13 +10,13 @@ assert withHyperscan -> stdenv.isx86_64; stdenv.mkDerivation rec { pname = "rspamd"; - version = "2.3"; + version = "2.4"; src = fetchFromGitHub { owner = "rspamd"; repo = "rspamd"; rev = version; - sha256 = "1v4kbvj9r0hs8jaisq3fr0rg0qndpbhc5h8cbpfpprmkbw4nj6pf"; + sha256 = "15rdxcvnfn3fzjpjz6z2ljrzhlmhn2y4sxz09z2789k442n4m1qv"; }; nativeBuildInputs = [ cmake pkgconfig perl ]; diff --git a/pkgs/servers/metabase/default.nix b/pkgs/servers/metabase/default.nix index 583c6b739cdc..2a4ac3e17764 100644 --- a/pkgs/servers/metabase/default.nix +++ b/pkgs/servers/metabase/default.nix @@ -2,11 +2,11 @@ stdenv.mkDerivation rec { pname = "metabase"; - version = "0.34.2"; + version = "0.34.3"; src = fetchurl { url = "http://downloads.metabase.com/v${version}/metabase.jar"; - sha256 = "02hpm8h98dsxyjs736bss3pk253aayf9dr7csj6qn3y68hs67jpk"; + sha256 = "0kvjqdzr9zb65c2kaqb39x8s71ynpp56aax2h1x37rds4zxdg2yg"; }; nativeBuildInputs = [ makeWrapper ]; diff --git a/pkgs/servers/monitoring/prometheus/mikrotik-exporter.nix b/pkgs/servers/monitoring/prometheus/mikrotik-exporter.nix new file mode 100644 index 000000000000..12341eee911e --- /dev/null +++ b/pkgs/servers/monitoring/prometheus/mikrotik-exporter.nix @@ -0,0 +1,22 @@ +{ stdenv, buildGoModule, fetchFromGitHub }: + +buildGoModule rec { + pname = "mikrotik-exporter-unstable"; + version = "2020-02-10"; + + src = fetchFromGitHub { + owner = "nshttpd"; + repo = "mikrotik-exporter"; + sha256 = "193zh06rqp9ybsnkxwmv7l4p2h2xisw4f01jjirshsb784j44bh6"; + rev = "3b33400d24abcfdc07dc31c15ca5ba7b82de444f"; + }; + + modSha256 = "1cqjn6j3dfq51ssjx0qrajprlac1h0lb1r4af44lfpigzmrfyi07"; + + meta = with stdenv.lib; { + inherit (src.meta) homepage; + description = "Prometheus MikroTik device(s) exporter"; + license = licenses.bsd3; + maintainers = with maintainers; [ mmilata ]; + }; +} diff --git a/pkgs/servers/monitoring/prometheus/nginx-exporter.nix b/pkgs/servers/monitoring/prometheus/nginx-exporter.nix index ce3ed9ab9d66..70f39418198e 100644 --- a/pkgs/servers/monitoring/prometheus/nginx-exporter.nix +++ b/pkgs/servers/monitoring/prometheus/nginx-exporter.nix @@ -2,7 +2,7 @@ buildGoPackage rec { pname = "nginx_exporter"; - version = "0.5.0"; + version = "0.6.0"; goPackagePath = "github.com/nginxinc/nginx-prometheus-exporter"; @@ -14,7 +14,7 @@ buildGoPackage rec { rev = "v${version}"; owner = "nginxinc"; repo = "nginx-prometheus-exporter"; - sha256 = "1fyn2bjq80dx4jv1rakrm0vg6i657a5rs7kkg0f9mbv1alir8kkx"; + sha256 = "1rwafmm9x0sxj4z7x4axhrjgdy15z70a1y00hw6smq30fcpkazhq"; }; doCheck = true; diff --git a/pkgs/servers/monitoring/prometheus/pushgateway.nix b/pkgs/servers/monitoring/prometheus/pushgateway.nix index 48afc610c615..0a707519c64e 100644 --- a/pkgs/servers/monitoring/prometheus/pushgateway.nix +++ b/pkgs/servers/monitoring/prometheus/pushgateway.nix @@ -2,7 +2,7 @@ buildGoPackage rec { pname = "pushgateway"; - version = "0.8.0"; + version = "1.2.0"; rev = "v${version}"; goPackagePath = "github.com/prometheus/pushgateway"; @@ -11,7 +11,7 @@ buildGoPackage rec { inherit rev; owner = "prometheus"; repo = "pushgateway"; - sha256 = "1mzwkxnznv6wzy7dc8rksa8gr7z92plrzls8gb8rk432zfqcbv6a"; + sha256 = "0q57pvdfapi1xx8mw7ykvxs64alypyqbxwvrqjcrgv2jidbcd1mm"; }; buildUser = "nix@nixpkgs"; diff --git a/pkgs/servers/monitoring/prometheus/wireguard-exporter.nix b/pkgs/servers/monitoring/prometheus/wireguard-exporter.nix index 15802510da3c..1a7a2ebdf211 100644 --- a/pkgs/servers/monitoring/prometheus/wireguard-exporter.nix +++ b/pkgs/servers/monitoring/prometheus/wireguard-exporter.nix @@ -11,10 +11,7 @@ rustPlatform.buildRustPackage rec { sha256 = "18khym7ygj29w98zf6i1l5c2pz84zla2z34l5jnh595xvwfl94pc"; }; - # Delete this on next update; see #79975 for details - legacyCargoFetcher = true; - - cargoSha256 = "1bi9nr1dhyv322pq6fjrhs12h3wdak53mvwkbyim1hmrp62vky4m"; + cargoSha256 = "0m7xa610k260gxn2xg6bc2y6fww0p72mvvik7278j2d15044c4yl"; buildInputs = lib.optional stdenv.isDarwin Security; @@ -26,8 +23,8 @@ rustPlatform.buildRustPackage rec { meta = with lib; { description = "A Prometheus exporter for WireGuard, written in Rust."; + homepage = "https://github.com/MindFlavor/prometheus_wireguard_exporter"; license = licenses.mit; - homepage = https://github.com/MindFlavor/prometheus_wireguard_exporter; maintainers = with maintainers; [ ma27 globin ]; }; } diff --git a/pkgs/servers/monitoring/zabbix/versions.nix b/pkgs/servers/monitoring/zabbix/versions.nix index aa27b6b18ead..2e7afe5266ea 100644 --- a/pkgs/servers/monitoring/zabbix/versions.nix +++ b/pkgs/servers/monitoring/zabbix/versions.nix @@ -1,16 +1,16 @@ generic: { v44 = generic { - version = "4.4.5"; - sha256 = "1snhpqj5p16giplbxa6xfrsairnf0m1qdh378yrifbh6bf19ga4l"; + version = "4.4.6"; + sha256 = "03mf4sklnw1x0ixp41vnibkz0794yi9jhws7ixld8jj2czk2ifr2"; }; v40 = generic { - version = "4.0.17"; - sha256 = "0h699awyw3rhjkm1b84ld0sh7bbpvy4bplmcik36q1303sfrkw21"; + version = "4.0.18"; + sha256 = "105f0mifgm56dd1y8vychq8m2f2wx9a7gv380xv0hrs1q038i1ki"; }; v30 = generic { - version = "3.0.29"; - sha256 = "1d81w68hnkjdj1a00iasg6aidw25syi4lrbsiyc98pdihmxbpiky"; + version = "3.0.30"; + sha256 = "0g2qw4ff02gsnmqza1cv9dq6bqyg7w9cdli6hsln07irf0hyrb07"; }; } diff --git a/pkgs/servers/mpd/default.nix b/pkgs/servers/mpd/default.nix index 7626d487e2ab..e328a79afa69 100644 --- a/pkgs/servers/mpd/default.nix +++ b/pkgs/servers/mpd/default.nix @@ -102,13 +102,13 @@ let in stdenv.mkDerivation rec { pname = "mpd"; - version = "0.21.19"; + version = "0.21.20"; src = fetchFromGitHub { owner = "MusicPlayerDaemon"; repo = "MPD"; rev = "v${version}"; - sha256 = "0awfnhygasww2xbxnc3a81hv2kbw3v3mblav6wjvzz25qipv19dq"; + sha256 = "05148zwaf1ix369i1n1fx84j66qa1ab1p3m7781lk3dz5hqf185x"; }; buildInputs = [ glib boost ] @@ -130,7 +130,7 @@ let meta = with stdenv.lib; { description = "A flexible, powerful daemon for playing music"; - homepage = http://mpd.wikia.com/wiki/Music_Player_Daemon_Wiki; + homepage = "https://www.musicpd.org/"; license = licenses.gpl2; maintainers = with maintainers; [ astsmtl ehmry fpletz tobim ]; platforms = platforms.unix; diff --git a/pkgs/servers/plex/raw.nix b/pkgs/servers/plex/raw.nix index 24422842e355..666da1363517 100644 --- a/pkgs/servers/plex/raw.nix +++ b/pkgs/servers/plex/raw.nix @@ -8,13 +8,13 @@ # server, and the FHS userenv and corresponding NixOS module should # automatically pick up the changes. stdenv.mkDerivation rec { - version = "1.18.7.2438-f342a5a43"; + version = "1.18.7.2457-77cb9455c"; pname = "plexmediaserver"; # Fetch the source src = fetchurl { url = "https://downloads.plex.tv/plex-media-server-new/${version}/redhat/plexmediaserver-${version}.x86_64.rpm"; - sha256 = "07lill29ck5h6lnrxj4k709afh36d6giy4jzv1jwcvcq1hdrvmzh"; + sha256 = "1lhsf4qrq77vqj63a6r0gm90nnlqg50b6v24lrpld1aia9akm9f1"; }; outputs = [ "out" "basedb" ]; diff --git a/pkgs/servers/radarr/default.nix b/pkgs/servers/radarr/default.nix index 61fee03a7a18..b0871a99f671 100644 --- a/pkgs/servers/radarr/default.nix +++ b/pkgs/servers/radarr/default.nix @@ -2,11 +2,11 @@ stdenv.mkDerivation rec { pname = "radarr"; - version = "0.2.0.1450"; + version = "0.2.0.1480"; src = fetchurl { url = "https://github.com/Radarr/Radarr/releases/download/v${version}/Radarr.develop.${version}.linux.tar.gz"; - sha256 = "1sknq6fifpmgzryr07dnriaw2x425v2zxdcqzm65viw5p5j9xh00"; + sha256 = "066kr9fk2ipid11aq057rqzy3b2kgd5qf9msq1fsmxixqg82m64h"; }; nativeBuildInputs = [ makeWrapper ]; @@ -23,7 +23,7 @@ stdenv.mkDerivation rec { meta = with stdenv.lib; { description = "A Usenet/BitTorrent movie downloader"; - homepage = https://radarr.video/; + homepage = "https://radarr.video/"; license = licenses.gpl3; maintainers = with maintainers; [ edwtjo ]; platforms = platforms.all; diff --git a/pkgs/servers/routinator/default.nix b/pkgs/servers/routinator/default.nix index 906ee07f3556..9c99faca4842 100644 --- a/pkgs/servers/routinator/default.nix +++ b/pkgs/servers/routinator/default.nix @@ -11,10 +11,7 @@ rustPlatform.buildRustPackage rec { sha256 = "1hbqvjv9h1aghpyrl03w5f4j8gjy6n9lx83rmpsh5p7yd9ahwmf9"; }; - # Delete this on next update; see #79975 for details - legacyCargoFetcher = true; - - cargoSha256 = "08lizhag7aqz3a59gaapsymn7sf9c6im1aw64n0r9a5advhwdh18"; + cargoSha256 = "1chf1l9jlnhi9cyqpmcz8yfzwzmkn4lfxqhdhclvl8j4b2zvbcgc"; meta = with stdenv.lib; { description = "An RPKI Validator written in Rust"; diff --git a/pkgs/servers/sql/mariadb/connector-c/3_1.nix b/pkgs/servers/sql/mariadb/connector-c/3_1.nix index 257fa93d2b51..e3fc66045301 100644 --- a/pkgs/servers/sql/mariadb/connector-c/3_1.nix +++ b/pkgs/servers/sql/mariadb/connector-c/3_1.nix @@ -1,6 +1,6 @@ { callPackage, ... } @ args: callPackage ./. (args // { - version = "3.1.5"; - sha256 = "1mfrm595kfnpjladaq6m184npa3rxff9pr1vwa35r057s7nmzpm9"; + version = "3.1.7"; + sha256 = "16pmdms454jbralaw6rpx0rjlf2297p6h3q8wfk0n87kbn7vrxv4"; }) diff --git a/pkgs/servers/sql/mariadb/connector-c/default.nix b/pkgs/servers/sql/mariadb/connector-c/default.nix index af344d637217..fb41890d4328 100644 --- a/pkgs/servers/sql/mariadb/connector-c/default.nix +++ b/pkgs/servers/sql/mariadb/connector-c/default.nix @@ -41,6 +41,7 @@ stdenv.mkDerivation { ln -sv mariadb $out/lib/mysql ln -sv mariadb $out/include/mysql ln -sv mariadb_version.h $out/include/mariadb/mysql_version.h + ln -sv libmariadb.pc $out/lib/pkgconfig/mysqlclient.pc ''; meta = { diff --git a/pkgs/servers/sql/postgresql/default.nix b/pkgs/servers/sql/postgresql/default.nix index b9cd50aa5fe0..129292e88907 100644 --- a/pkgs/servers/sql/postgresql/default.nix +++ b/pkgs/servers/sql/postgresql/default.nix @@ -3,7 +3,7 @@ let generic = # dependencies { stdenv, lib, fetchurl, makeWrapper - , glibc, zlib, readline, openssl, openssl_1_0_2, icu, systemd, libossp_uuid + , glibc, zlib, readline, openssl, icu, systemd, libossp_uuid , pkgconfig, libxml2, tzdata # This is important to obtain a version of `libpq` that does not depend on systemd. @@ -32,10 +32,9 @@ let setOutputFlags = false; # $out retains configureFlags :-/ buildInputs = - [ zlib readline libxml2 makeWrapper ] + [ zlib readline openssl libxml2 makeWrapper ] ++ lib.optionals icuEnabled [ icu ] ++ lib.optionals enableSystemd [ systemd ] - ++ [ (if atLeast "9.5" then openssl else openssl_1_0_2) ] ++ lib.optionals (!stdenv.isDarwin) [ libossp_uuid ]; nativeBuildInputs = lib.optionals icuEnabled [ pkgconfig ]; diff --git a/pkgs/servers/sql/postgresql/ext/pgroonga.nix b/pkgs/servers/sql/postgresql/ext/pgroonga.nix index 866dd8021d0a..f57a6e8fa508 100644 --- a/pkgs/servers/sql/postgresql/ext/pgroonga.nix +++ b/pkgs/servers/sql/postgresql/ext/pgroonga.nix @@ -2,11 +2,11 @@ stdenv.mkDerivation rec { pname = "pgroonga"; - version = "2.2.2"; + version = "2.2.5"; src = fetchurl { url = "https://packages.groonga.org/source/${pname}/${pname}-${version}.tar.gz"; - sha256 = "0pdz2lpi7g1n9b5rg6kwhh6fr0bwf06zr642brmh53n6mp41186m"; + sha256 = "0lwj99kdx9kfp4vfd7lfapj183mz235kj1vjfscfnkg5ypj656gz"; }; nativeBuildInputs = [ pkgconfig ]; diff --git a/pkgs/servers/trezord/default.nix b/pkgs/servers/trezord/default.nix index e6427e5970fa..7bdee09fca30 100644 --- a/pkgs/servers/trezord/default.nix +++ b/pkgs/servers/trezord/default.nix @@ -2,7 +2,7 @@ buildGoPackage rec { pname = "trezord-go"; - version = "2.0.28"; + version = "2.0.29"; goPackagePath = "github.com/trezor/trezord-go"; @@ -10,7 +10,7 @@ buildGoPackage rec { owner = "trezor"; repo = "trezord-go"; rev = "v${version}"; - sha256 = "02c1mvn01gcfls37sa0c7v2lwffg14x54np8z7d4hjzxxzwg4gpw"; + sha256 = "1ks1fa0027s3xp0z6qp0dxmayvrb4dwwscfhbx7da0khp153f2cp"; }; propagatedBuildInputs = [ trezor-udev-rules ]; diff --git a/pkgs/servers/ums/default.nix b/pkgs/servers/ums/default.nix index 3fb2817277aa..503ff16caeeb 100644 --- a/pkgs/servers/ums/default.nix +++ b/pkgs/servers/ums/default.nix @@ -4,11 +4,11 @@ stdenv.mkDerivation rec { pname = "ums"; - version = "6.2.2"; + version = "9.1.0"; src = fetchurl { - url = "mirror://sourceforge/project/unimediaserver/Official%20Releases/Linux/" + stdenv.lib.toUpper "${pname}-${version}" + "-Java8.tgz"; - sha256 = "1qa999la9hixy0pdj9phjvr6lwqycgdvm94nc1606vz0ivf95b15"; + url = "mirror://sourceforge/project/unimediaserver/Official%20Releases/Linux/" + stdenv.lib.toUpper "${pname}-${version}" + ".tgz"; + sha256 = "07wprjpwqids96v5q5fhwcxqlg8jp1vy585vl2nqbfi1vf5v294s"; name = "${pname}-${version}.tgz"; }; @@ -19,6 +19,10 @@ stdenv.mkDerivation rec { mkdir $out/bin mv $out/documentation /$out/doc + # ums >= 9.0.0 ships its own JRE in the package. if we remove it, the `UMS.sh` + # script will correctly fall back to the JRE specified by JAVA_HOME + rm -rf $out/linux/jre-x64 $out/linux/jre-x86 + makeWrapper "$out/UMS.sh" "$out/bin/ums" \ --prefix LD_LIBRARY_PATH ":" "${stdenv.lib.makeLibraryPath [ libzen libmediainfo] }" \ --set JAVA_HOME "${jre8}" diff --git a/pkgs/servers/unpfs/default.nix b/pkgs/servers/unpfs/default.nix index dc228c25915d..9b67a901693d 100644 --- a/pkgs/servers/unpfs/default.nix +++ b/pkgs/servers/unpfs/default.nix @@ -13,10 +13,7 @@ rustPlatform.buildRustPackage rec { sourceRoot = "source/example/unpfs"; - # Delete this on next update; see #79975 for details - legacyCargoFetcher = true; - - cargoSha256 = "1d33nwj3i333a6ji3r3037mgg553lc3wsawm0pz13kbvhjf336i8"; + cargoSha256 = "13mk86d8ql2196039qb7z0rx4svwffw1mzpiyxp35gg5fhcphriq"; RUSTC_BOOTSTRAP = 1; diff --git a/pkgs/servers/web-apps/matomo/default.nix b/pkgs/servers/web-apps/matomo/default.nix index 09a8d21c4ce9..90a9a88986ed 100644 --- a/pkgs/servers/web-apps/matomo/default.nix +++ b/pkgs/servers/web-apps/matomo/default.nix @@ -3,16 +3,16 @@ let versions = { matomo = { - version = "3.13.2"; - sha256 = "1psysdz60h5rvgbsflkfprygxnh3kq60snqamyss07rk0ahbcb16"; + version = "3.13.3"; + sha256 = "11mv7q33nhlz9ylsmwrhs315p14imr7sgr70gdbmi9p8jxc7kxrz"; }; matomo-beta = { - version = "3.13.2"; + version = "3.13.3"; # `beta` examples: "b1", "rc1", null # TOOD when updating: use null if stable version is >= latest beta or release candidate beta = null; - sha256 = "1psysdz60h5rvgbsflkfprygxnh3kq60snqamyss07rk0ahbcb16"; + sha256 = "11mv7q33nhlz9ylsmwrhs315p14imr7sgr70gdbmi9p8jxc7kxrz"; }; }; common = pname: { version, sha256, beta ? null }: diff --git a/pkgs/servers/web-apps/moodle/default.nix b/pkgs/servers/web-apps/moodle/default.nix index 3de6005a3cf3..98bd8e0027f4 100644 --- a/pkgs/servers/web-apps/moodle/default.nix +++ b/pkgs/servers/web-apps/moodle/default.nix @@ -1,7 +1,7 @@ { stdenv, fetchurl, writeText }: let - version = "3.8.1"; + version = "3.8.2"; stableVersion = builtins.substring 0 2 (builtins.replaceStrings ["."] [""] version); in @@ -11,7 +11,7 @@ stdenv.mkDerivation rec { src = fetchurl { url = "https://download.moodle.org/stable${stableVersion}/${pname}-${version}.tgz"; - sha256 = "1xz2wq16blw9p2b6wlrn9lr524gddm5jyac5prka8kp6lrk0v0y1"; + sha256 = "134vxsbslk7sfalmgcp744aygaxz2k080d14j8nkivk9zhplds53"; }; phpConfig = writeText "config.php" '' diff --git a/pkgs/servers/webmetro/default.nix b/pkgs/servers/webmetro/default.nix index 4bf329fa5db1..7d0079fca203 100644 --- a/pkgs/servers/webmetro/default.nix +++ b/pkgs/servers/webmetro/default.nix @@ -11,10 +11,7 @@ rustPlatform.buildRustPackage rec { sha256 = "1n2c7ygs8qsd5zgii6fqqcwg427bsij082bg4ijnzkq5630dx651"; }; - # Delete this on next update; see #79975 for details - legacyCargoFetcher = true; - - cargoSha256 = "03ncwj9bn21590phcnqyclclcird7rikbhxbwhg8i9i0nad81aaa"; + cargoSha256 = "0xifc3jwj0c6ynx0gzm5zlnfcq023fjpjmdg9x0vs1fh3b42pdsy"; meta = with stdenv.lib; { description = "Simple relay server for broadcasting a WebM stream"; diff --git a/pkgs/servers/zoneminder/0001-Don-t-use-file-timestamp-in-cache-filename.patch b/pkgs/servers/zoneminder/0001-Don-t-use-file-timestamp-in-cache-filename.patch new file mode 100644 index 000000000000..6ca55a147688 --- /dev/null +++ b/pkgs/servers/zoneminder/0001-Don-t-use-file-timestamp-in-cache-filename.patch @@ -0,0 +1,32 @@ +From db38a11228eceea10dc97ecc87023b4919caa918 Mon Sep 17 00:00:00 2001 +From: Daniel Fullmer <danielrf12@gmail.com> +Date: Fri, 21 Feb 2020 21:52:00 -0500 +Subject: [PATCH] Don't use file timestamp in cache filename + +Every file in the nix store has a timestamp of "1", meaning that the +filename would remain constant even when changing zoneminder versions. +This would mean that newer versions would use the existing symlink to an +older version of the source file. We replace SRC_HASH in nix with a +hash of the source used to build zoneminder to ensure this filename is +unique. +--- + web/includes/functions.php | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/web/includes/functions.php b/web/includes/functions.php +index 19567a5c1..0242c09bc 100644 +--- a/web/includes/functions.php ++++ b/web/includes/functions.php +@@ -2223,7 +2223,8 @@ function cache_bust($file) { + $parts = pathinfo($file); + global $css; + $dirname = preg_replace('/\//', '_', $parts['dirname']); +- $cacheFile = $dirname.'_'.$parts['filename'].'-'.$css.'-'.filemtime($file).'.'.$parts['extension']; ++ $srcHash = '@srcHash@'; ++ $cacheFile = $dirname.'_'.$parts['filename'].'-'.$css.'-'.$srcHash.'.'.$parts['extension']; + if ( file_exists(ZM_DIR_CACHE.'/'.$cacheFile) or symlink(ZM_PATH_WEB.'/'.$file, ZM_DIR_CACHE.'/'.$cacheFile) ) { + return 'cache/'.$cacheFile; + } else { +-- +2.25.1 + diff --git a/pkgs/servers/zoneminder/default.nix b/pkgs/servers/zoneminder/default.nix index e536ea0373cf..93f22e77f870 100644 --- a/pkgs/servers/zoneminder/default.nix +++ b/pkgs/servers/zoneminder/default.nix @@ -1,4 +1,4 @@ -{ stdenv, lib, fetchFromGitHub, fetchurl, cmake, makeWrapper, pkgconfig +{ stdenv, lib, fetchFromGitHub, fetchurl, substituteAll, cmake, makeWrapper, pkgconfig , curl, ffmpeg, glib, libjpeg, libselinux, libsepol, mp4v2, libmysqlclient, mysql, pcre, perl, perlPackages , polkit, utillinuxMinimal, x264, zlib , coreutils, procps, psmisc }: @@ -78,19 +78,18 @@ let in stdenv.mkDerivation rec { pname = "zoneminder"; - version = "1.32.3"; + version = "1.34.3"; src = fetchFromGitHub { owner = "ZoneMinder"; repo = "zoneminder"; rev = version; - sha256 = "1sx2fn99861zh0gp8g53ynr1q6yfmymxamn82y54jqj6nv475njz"; + sha256 = "0jp7950v36gxxzkwdp5i0312s26czhfsl5ixdxfzn21cx31hhlg0"; }; patches = [ ./default-to-http-1dot1.patch - # Explicitly link with dynamic linking library to fix build - ./link-with-libdl.patch + ./0001-Don-t-use-file-timestamp-in-cache-filename.patch ]; postPatch = '' @@ -125,6 +124,10 @@ in stdenv.mkDerivation rec { substituteInPlace scripts/zmdbbackup.in \ --replace /usr/bin/mysqldump ${mysql.client}/bin/mysqldump + substituteInPlace scripts/zmupdate.pl.in \ + --replace "'mysql'" "'${mysql.client}/bin/mysql'" \ + --replace "'mysqldump'" "'${mysql.client}/bin/mysqldump'" + for f in scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in \ scripts/zmupdate.pl.in \ src/zm_config.h.in \ @@ -133,10 +136,14 @@ in stdenv.mkDerivation rec { substituteInPlace $f --replace @ZM_CONFIG_SUBDIR@ /etc/zoneminder done - for f in includes/Event.php views/image.php skins/classic/views/image-ffmpeg.php ; do - substituteInPlace web/$f \ - --replace "'ffmpeg " "'${ffmpeg}/bin/ffmpeg " - done + for f in includes/Event.php views/image.php ; do + substituteInPlace web/$f \ + --replace "'ffmpeg " "'${ffmpeg}/bin/ffmpeg " + done + + substituteInPlace web/includes/functions.php \ + --replace "'date " "'${coreutils}/bin/date " \ + --subst-var-by srcHash "`basename $out`" ''; buildInputs = [ @@ -147,6 +154,7 @@ in stdenv.mkDerivation rec { DateManip DBI DBDmysql LWP SysMmap # run-time dependencies not checked at build-time ClassStdFast DataDump DeviceSerialPort JSONMaybeXS LWPProtocolHttps NumberBytesHuman SysCPU SysMemInfo TimeDate + CryptEksblowfish DataEntropy # zmupdate.pl ]); nativeBuildInputs = [ cmake makeWrapper pkgconfig ]; diff --git a/pkgs/servers/zoneminder/link-with-libdl.patch b/pkgs/servers/zoneminder/link-with-libdl.patch deleted file mode 100644 index 53aaf9b25f7d..000000000000 --- a/pkgs/servers/zoneminder/link-with-libdl.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/src/CMakeLists.txt -+++ b/src/CMakeLists.txt -@@ -20,10 +20,10 @@ add_executable(zms zms.cpp) - include_directories(libbcrypt/include/bcrypt) - include_directories(jwt-cpp/include/jwt-cpp) - --target_link_libraries(zmc zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) --target_link_libraries(zma zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) --target_link_libraries(zmu zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) --target_link_libraries(zms zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) -+target_link_libraries(zmc zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS} ${CMAKE_DL_LIBS}) -+target_link_libraries(zma zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS} ${CMAKE_DL_LIBS}) -+target_link_libraries(zmu zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS} ${CMAKE_DL_LIBS}) -+target_link_libraries(zms zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS} ${CMAKE_DL_LIBS}) - - # Generate man files for the binaries destined for the bin folder - FOREACH(CBINARY zma zmc zmu) |