diff --git a/krebs/3modules/makefu/default.nix b/krebs/3modules/makefu/default.nix index b0bd83248..ffdd99274 100644 --- a/krebs/3modules/makefu/default.nix +++ b/krebs/3modules/makefu/default.nix @@ -235,6 +235,7 @@ in { maps.work.euer IN A ${nets.internet.ip4.addr} play.work.euer IN A ${nets.internet.ip4.addr} ul.work.euer IN A ${nets.internet.ip4.addr} + music.euer IN A ${nets.internet.ip4.addr} ''; }; cores = 8; diff --git a/makefu/0tests/data/secrets/lego-binaergewitter b/makefu/0tests/data/secrets/lego-binaergewitter new file mode 100644 index 000000000..e69de29bb diff --git a/makefu/0tests/data/wg-thierry.key b/makefu/0tests/data/wg-thierry.key new file mode 100644 index 000000000..e69de29bb diff --git a/makefu/1systems/cake/config.nix b/makefu/1systems/cake/config.nix index 3befa201d..8b9812cf4 100644 --- a/makefu/1systems/cake/config.nix +++ b/makefu/1systems/cake/config.nix @@ -5,11 +5,14 @@ in { imports = [ ./hardware-config.nix + + + #./hardware-config.nix { environment.systemPackages = with pkgs;[ rsync screen curl git tmux picocom mosh ];} # # - + # # # configure your hw: # @@ -19,9 +22,11 @@ in { tinc.retiolum.enable = true; build.host = config.krebs.hosts.cake; }; + # ensure disk usage is limited + services.journald.extraConfig = "Storage=volatile"; networking.firewall.trustedInterfaces = [ primaryInterface ]; documentation.info.enable = false; documentation.man.enable = false; - services.nixosManual.enable = false; + documentation.nixos.enable = false; sound.enable = false; } diff --git a/makefu/1systems/cake/hardware-config.nix b/makefu/1systems/cake/hardware-config.nix index d021f9458..a0cd4fac1 100644 --- a/makefu/1systems/cake/hardware-config.nix +++ b/makefu/1systems/cake/hardware-config.nix @@ -1,42 +1,14 @@ { pkgs, lib, ... }: { - # raspi3 - boot.kernelParams = ["cma=32M" "console=ttyS0,115200n8" "console=tty0" "console=ttyS1,115200n8" ]; - boot.loader.grub.enable = false; - boot.loader.raspberryPi.enable = true; - boot.loader.raspberryPi.version = 3; - boot.loader.raspberryPi.uboot.enable = true; - boot.loader.raspberryPi.uboot.configurationLimit = 3; - boot.loader.raspberryPi.firmwareConfig = '' - gpu_mem=32 - arm_freq=1350 - core_freq=500 - over_voltage=4 - disable_splash=1 - # bye bye warranty - force_turbo=1 - ''; - boot.loader.generationsDir.enable = lib.mkDefault false; - - boot.tmpOnTmpfs = lib.mkForce false; - boot.cleanTmpDir = true; - hardware.enableRedistributableFirmware = true; - - ## wifi not working, will be fixed with https://github.com/NixOS/nixpkgs/pull/53747 - # boot.kernelPackages = pkgs.linuxPackages_latest; - boot.kernelPackages = pkgs.linuxPackages_latest; - environment.systemPackages = [ pkgs.raspberrypi-tools ]; - networking.wireless.enable = true; - # File systems configuration for using the installer's partition layout - swapDevices = [ { device = "/var/swap"; size = 2048; } ]; + environment.systemPackages = [ pkgs.libraspberrypi ]; + imports = [ ]; + boot.kernelPackages = pkgs.linuxPackages_rpi4; fileSystems = { - "/boot" = { - device = "/dev/disk/by-label/NIXOS_BOOT"; - fsType = "vfat"; - }; "/" = { device = "/dev/disk/by-label/NIXOS_SD"; fsType = "ext4"; + options = [ "noatime" ]; }; }; + #hardware.raspberry-pi."4".fkms-3d.enable = true; } diff --git a/makefu/1systems/cake/source.nix b/makefu/1systems/cake/source.nix index 22c40039e..8fc2fff2d 100644 --- a/makefu/1systems/cake/source.nix +++ b/makefu/1systems/cake/source.nix @@ -1,4 +1,6 @@ { name="cake"; full = true; + home-manager = true; + hw = true; } diff --git a/makefu/1systems/latte/config.nix b/makefu/1systems/latte/config.nix index 69e401d97..44fa14812 100644 --- a/makefu/1systems/latte/config.nix +++ b/makefu/1systems/latte/config.nix @@ -30,7 +30,7 @@ in { # Storage - + # # Services: @@ -42,7 +42,7 @@ in { # local usage: - + # Supervision @@ -53,6 +53,9 @@ in { # backup + # migrated: + # + ]; krebs = { diff --git a/makefu/1systems/omo/config.nix b/makefu/1systems/omo/config.nix index ee29c03d2..3ff1d0238 100644 --- a/makefu/1systems/omo/config.nix +++ b/makefu/1systems/omo/config.nix @@ -53,7 +53,6 @@ in { - { krebs.airdcpp.dcpp.shares = let diff --git a/makefu/1systems/omo/source.nix b/makefu/1systems/omo/source.nix index af508fbd6..b56e855fc 100644 --- a/makefu/1systems/omo/source.nix +++ b/makefu/1systems/omo/source.nix @@ -1,6 +1,6 @@ { name="omo"; torrent = true; - #unstable = true; + unstable = true; home-manager = true; } diff --git a/makefu/1systems/x/config.nix b/makefu/1systems/x/config.nix index 0377c336f..3f9e071e6 100644 --- a/makefu/1systems/x/config.nix +++ b/makefu/1systems/x/config.nix @@ -137,7 +137,6 @@ # # - # diff --git a/makefu/2configs/bgt/download.binaergewitter.de.nix b/makefu/2configs/bgt/download.binaergewitter.de.nix index 1cf21f213..d49ad158b 100644 --- a/makefu/2configs/bgt/download.binaergewitter.de.nix +++ b/makefu/2configs/bgt/download.binaergewitter.de.nix @@ -59,6 +59,11 @@ in { systemd.services.nginx.serviceConfig.ReadWritePaths = [ "/var/spool/nginx/logs/" ]; + security.acme.certs."download.binaergewitter.de" = { + dnsProvider = "cloudflare"; + credentialsFile = toString ; + webroot = lib.mkForce null; + }; services.nginx = { appendHttpConfig = '' @@ -70,6 +75,8 @@ in { recommendedGzipSettings = true; recommendedOptimisation = true; virtualHosts."download.binaergewitter.de" = { + addSSL = true; + enableACME = true; serverAliases = [ "dl2.binaergewitter.de" ]; root = "/var/www/binaergewitter"; extraConfig = '' diff --git a/makefu/2configs/bitlbee.nix b/makefu/2configs/bitlbee.nix index 52b5d68a5..21626d406 100644 --- a/makefu/2configs/bitlbee.nix +++ b/makefu/2configs/bitlbee.nix @@ -2,7 +2,7 @@ { services.bitlbee = { enable = true; - libpurple_plugins = [ pkgs.telegram-purple pkgs.pidgin-skypeweb]; + # libpurple_plugins = [ pkgs.telegram-purple pkgs.pidgin-skypeweb]; }; users.users.makefu.packages = with pkgs; [ weechat tmux ]; state = [ "/var/lib/bitlbee" ]; diff --git a/makefu/2configs/default.nix b/makefu/2configs/default.nix index 7905cf4eb..66c77e1eb 100644 --- a/makefu/2configs/default.nix +++ b/makefu/2configs/default.nix @@ -52,6 +52,7 @@ with import ; gnumake rxvt_unicode.terminfo htop + nix-output-monitor ]; programs.bash.enableCompletion = true; @@ -86,8 +87,9 @@ with import ; ''; environment.pathsToLink = [ "/share" ]; security.acme = { - email = "letsencrypt@syntax-fehler.de"; + defaults.email = "letsencrypt@syntax-fehler.de"; acceptTerms = true; }; system.stateVersion = lib.mkDefault "20.03"; + services.postgresql.package = pkgs.postgresql_14; } diff --git a/makefu/2configs/deployment/owncloud.nix b/makefu/2configs/deployment/owncloud.nix index e5c7e48de..b660720e5 100644 --- a/makefu/2configs/deployment/owncloud.nix +++ b/makefu/2configs/deployment/owncloud.nix @@ -57,7 +57,7 @@ systemd.services.postgresqlBackup-nextcloud.serviceConfig.SupplementaryGroups = users.users.nextcloud.extraGroups = [ "download" ]; services.nextcloud = { enable = true; - package = pkgs.nextcloud23; + package = pkgs.nextcloud24; hostName = "o.euer.krebsco.de"; # Use HTTPS for links https = true; diff --git a/makefu/2configs/home/3dprint.nix b/makefu/2configs/home/3dprint.nix new file mode 100644 index 000000000..859a18840 --- /dev/null +++ b/makefu/2configs/home/3dprint.nix @@ -0,0 +1,45 @@ +{ pkgs, ... }: +{ + services.mjpg-streamer = { + enable = true; + inputPlugin = "input_uvc.so -d /dev/web_cam -r 1280x960"; + }; + users.users.octoprint.extraGroups = [ "video" ]; + # allow octoprint to access /dev/vchiq + # also ensure that the webcam always comes up under the same name + services.udev.extraRules = '' + SUBSYSTEM=="vchiq",GROUP="video",MODE="0660" + SUBSYSTEM=="video4linux", ATTR{name}=="UVC Camera (046d:0825)",SYMLINK+="web_cam", MODE="0666", GROUP="video" + ''; + systemd.services.octoprint = { + path = [ pkgs.libraspberrypi ]; + }; + services.octoprint = { + enable = true; + plugins = plugins: with plugins;[ + costestimation + displayprogress + mqtt + stlviewer + themeify + # octolapse + (buildPlugin rec { + pname = "OctoPrint-HomeAssistant"; + version = "3.6.2"; + src = pkgs.fetchFromGitHub { + owner = "cmroche"; + repo = pname; + rev = version; + hash = "sha256-oo9OBmHoJFNGK7u9cVouMuBuUcUxRUrY0ppRq0OS1ro="; + }; + }) + ]; + extraConfig.plugins.mqtt.broker = { + url = "omo.lan"; + # TODO TODO TODO + username = "hass"; + password = "lksue43jrf"; + # TODO TODO TODO + }; + }; +} diff --git a/makefu/2configs/home/ham/automation/buttonboard.nix b/makefu/2configs/home/ham/automation/buttonboard.nix new file mode 100644 index 000000000..533311fc5 --- /dev/null +++ b/makefu/2configs/home/ham/automation/buttonboard.nix @@ -0,0 +1,4 @@ +# good, bad radio +# stop +# start radio +# lauter, leister diff --git a/makefu/2configs/home/ham/automation/bye.txt.j2 b/makefu/2configs/home/ham/automation/bye.txt.j2 new file mode 100644 index 000000000..8a5ba7257 --- /dev/null +++ b/makefu/2configs/home/ham/automation/bye.txt.j2 @@ -0,0 +1,2 @@ +Endlich ist Pappa fertig mit arbeit! +Heute hast du {{ states("sensor.felix_at_work_today") |round(1) }} Stunden gearbeitet. diff --git a/makefu/2configs/home/ham/automation/check-in.nix b/makefu/2configs/home/ham/automation/check-in.nix index d589a6971..db051757e 100644 --- a/makefu/2configs/home/ham/automation/check-in.nix +++ b/makefu/2configs/home/ham/automation/check-in.nix @@ -7,6 +7,21 @@ let in { services.home-assistant.config.input_boolean.felix_at_work.name = "Felix auf Arbeit"; + services.home-assistant.config.timer.felix_at_work = { + name = "Felix auf Arbeit Timer"; + duration = "10:00:00"; + }; + services.home-assistant.config.sensor = [ + { + platform = "history_stats"; + name = "Felix at work today"; + entity_id = "input_boolean.felix_at_work"; + state = "on"; + type = "time"; + start = "{{ now().replace(hour=0, minute=0, second=0) }}"; + end = "{{ now() }}"; + } + ]; services.home-assistant.config.script.start_office_radio.sequence = [ { service = "media_player.play_media"; @@ -19,13 +34,41 @@ in ]; services.home-assistant.config.automation = [ - { service = "media_player.play_media"; - data = { - media_content_id = "http://radio.lassul.us:8000/radio.mp3"; - media_content_type = "music"; - }; - target.entity_id = "media_player.office"; - } + { alias = "Zu lange Felix!"; + trigger = + { platform = "event"; + event_type = "timer.finished"; + event_data.entity_id = "timer.felix_at_work"; + }; + + condition = + { + condition = "state"; + entity_id = at_work; + state = "off"; + }; + + action = (say "Felix, die zehn Stunden sind um, aufhören jetzt"); + } + { alias = "Turn off at work sensor"; + trigger = [ + { platform = "time"; at = "00:00:00"; } + ]; + condition = + { + condition = "state"; + entity_id = at_work; + state = "off"; + }; + action = + [ + # felix forgot to stamp out ... + { + service = "homeassistant.turn_off"; + entity_id = [ at_work ]; + } + ]; + } { alias = "Push Check-in Button Felix with button"; trigger = [ { @@ -54,15 +97,12 @@ in { service = "homeassistant.turn_on"; entity_id = at_work; } - ] ++ (say "Willkommen auf Arbeit") ++ - [ - { service = "media_player.play_media"; - data = { - media_content_id = "http://radio.lassul.us:8000/radio.mp3"; - media_content_type = "music"; - }; - target.entity_id = "media_player.office"; + { service = "timer.start"; + entity_id = [ "timer.felix_at_work" ] ; } + ] ++ (say (builtins.readFile ./welcome.txt.j2)) ++ + [ + { service = "script.start_office_radio"; } ]; } { @@ -78,7 +118,12 @@ in { service = "homeassistant.turn_off"; entity_id = at_work; } - ] ++ (say "Endlich ist Pappa fertig mit arbeit!"); + ] ++ (say (builtins.readFile ./bye.txt.j2)) ++ + [ + { service = "timer.stop"; + entity_id = [ "timer.felix_at_work" ] ; + } + ]; } ]; } diff --git a/makefu/2configs/home/ham/automation/daily_speedtext.nix b/makefu/2configs/home/ham/automation/daily_speedtext.nix new file mode 100644 index 000000000..70d59f6e1 --- /dev/null +++ b/makefu/2configs/home/ham/automation/daily_speedtext.nix @@ -0,0 +1,17 @@ +{ + services.home-assistant.config.automation = + [ + { + trigger = [ + { platform = "time"; at = "03:21"; } + ]; + action = + [ + { + service = "speedtestdotnet.speedtest"; + } + ]; + } + ]; + +} diff --git a/makefu/2configs/home/ham/automation/fenster_auf.nix b/makefu/2configs/home/ham/automation/fenster_auf.nix index fa2052be8..b3682fe0c 100644 --- a/makefu/2configs/home/ham/automation/fenster_auf.nix +++ b/makefu/2configs/home/ham/automation/fenster_auf.nix @@ -4,6 +4,11 @@ # binary_sensor.badezimmer_fenster_contact # binary_sensor.dusche_fenster_contact let + hlib = import ../lib; + say = hlib.say.office; + draussen = "sensor.wohnzimmer_temp_temperature"; + draussen_diff = "sensor.unterschied_draussen_drinnen"; + draussen_heiss = 23; min = 20; fenster_offen = name: entity: { alias = "${name} seit ${toString min} Minuten offen"; @@ -16,10 +21,6 @@ let } ]; condition = [ - { condition = "state"; - entity_id = "input_boolean.ist_sommer"; - state = "off"; - } ]; action = [ @@ -67,6 +68,17 @@ let }; in { services.home-assistant.config = { + template = [ + { sensor = { + name = "Unterschied Draussen Drinnen"; + unit_of_measurement = "°C"; + state = '' + {% set inside = states("${draussen}") | float | round(2) -%} + {% set outside = states("sensor.dark_sky_temperature") | float | round(2) -%} + {{ ((outside - inside) | round(1) )}}''; + }; + } + ]; sensor = [ { platform = "season"; type = "meteorological";} ]; @@ -86,6 +98,41 @@ in { (fenster_offen "Badezimmerfenster" "binary_sensor.badezimmer_fenster_contact") (fenster_offen "Duschfenster" "binary_sensor.dusche_fenster_contact") + + { alias = "Draussen ist wieder kaelter"; + trigger = [ + { + platform = "numeric_state"; + entity_id = draussen_diff; + below = 0; + for.minutes = 20; + } + ]; + condition = [ + { condition = "numeric_state"; + entity_id = draussen; + above = draussen_heiss; + } + ]; + action = (say "Draussen ist es endlich kühler, jetzt kann man die Fenster auf machen"); + } + { alias = "Draussen ist zu warm"; + trigger = [ + { + platform = "numeric_state"; + entity_id = draussen_diff; + above = 0; + for.minutes = 20; + } + ]; + condition = [ + { condition = "numeric_state"; + entity_id = draussen; + above = draussen_heiss; + } + ]; + action = (say "Draussen wird es jetzt zu warm, besser das fenster schliessen"); + } ]; }; } diff --git a/makefu/2configs/home/ham/automation/firetv_restart.nix b/makefu/2configs/home/ham/automation/firetv_restart.nix index 12e0e845a..01d1ba6e9 100644 --- a/makefu/2configs/home/ham/automation/firetv_restart.nix +++ b/makefu/2configs/home/ham/automation/firetv_restart.nix @@ -20,17 +20,17 @@ in action = [ (cmd "reboot") (sec 90) # go to my music because apparently select_source does not seem to always work - (cmd "HOME") - (sec 2) - (cmd "DOWN") - (sec 2) - (cmd "DOWN") - (sec 2) - (cmd "ENTER") - (sec 4) - (cmd "RIGHT") - (sec 2) - (cmd "RIGHT") + #(cmd "HOME") + #(sec 2) + #(cmd "DOWN") + #(sec 2) + #(cmd "DOWN") + #(sec 2) + #(cmd "ENTER") + #(sec 4) + #(cmd "RIGHT") + #(sec 2) + #(cmd "RIGHT") ]; } ]; diff --git a/makefu/2configs/home/ham/automation/flurlicht.nix b/makefu/2configs/home/ham/automation/flurlicht.nix index aa62ab9e4..bb4877100 100644 --- a/makefu/2configs/home/ham/automation/flurlicht.nix +++ b/makefu/2configs/home/ham/automation/flurlicht.nix @@ -32,12 +32,16 @@ in [ { choose = [ (lightcond "Badezimmer Fenster Auf" - { condition = "state"; entity_id = "binary_sensor.badezimmer_fenster_contact"; state = "on"; } - [ 64 207 255 ] 255 # helblau + [ { condition = "state"; entity_id = "binary_sensor.badezimmer_fenster_contact"; state = "on"; } + { condition = "state"; entity_id = "input_boolean.ist_sommer"; state = "off"; } + + ] + [ 64 207 255 ] 128 # hellblau ) (lightcond "Duschenster auf" - { condition = "state"; entity_id = "binary_sensor.dusche_fenster_contact"; state = "on"; } - [ 64 207 255 ] 255 # helblau + [ { condition = "state"; entity_id = "binary_sensor.dusche_fenster_contact"; state = "on"; } + { condition = "state"; entity_id = "input_boolean.ist_sommer"; state = "off"; } ] + [ 64 207 255 ] 128 # hellblau ) (lightcond "Nachtlicht" { condition = "state"; entity_id = "sun.sun"; state = "below_horizon"; } diff --git a/makefu/2configs/home/ham/automation/shutdown_button.nix b/makefu/2configs/home/ham/automation/shutdown_button.nix index 4c12be277..ec1a25567 100644 --- a/makefu/2configs/home/ham/automation/shutdown_button.nix +++ b/makefu/2configs/home/ham/automation/shutdown_button.nix @@ -1,5 +1,8 @@ let btn = "sensor.arbeitszimmer_btn1_action"; + lib = import ../lib; + say = lib.say.living_room; + all_lights = [ # Wohnzimmer "light.wled" @@ -21,6 +24,8 @@ let all_media_player = [ "media_player.living_room" "media_player.office" + "media_player.bedroom" + ]; in { services.home-assistant.config.automation = @@ -30,13 +35,13 @@ in { { platform = "state"; entity_id = btn; - to = "on"; + to = "single"; } ]; condition = [ ]; - action = [ + action = (say "Alles Aus" )++ [ { - service = "home_assistant.turn_off"; + service = "light.turn_off"; target.entity_id = all_lights; } { service = "media_player.media_stop"; diff --git a/makefu/2configs/home/ham/automation/urlaub.nix b/makefu/2configs/home/ham/automation/urlaub.nix index c11c589cf..7f47c9da5 100644 --- a/makefu/2configs/home/ham/automation/urlaub.nix +++ b/makefu/2configs/home/ham/automation/urlaub.nix @@ -4,7 +4,10 @@ # "all" lights let - schranklicht = "light.wohnzimmer_schrank_osram"; + schranklicht = [ + "light.wohnzimmer_schrank_osram" + "light.wohnzimmer_komode_osram" + ]; weihnachtslicht = "light.wohnzimmer_fenster_lichterkette_licht"; fernsehlicht = "light.wled"; @@ -24,7 +27,7 @@ let turn_on = entity_id: offset: # negative offset => before sunset - { alias = "Turn on ${entity_id} at sunset ${offset}"; + { alias = "Turn on ${toString entity_id} at sunset ${offset}"; trigger = [ { platform = "sun"; event = "sunset"; inherit offset; } ]; diff --git a/makefu/2configs/home/ham/automation/welcome.txt.j2 b/makefu/2configs/home/ham/automation/welcome.txt.j2 new file mode 100644 index 000000000..76091b868 --- /dev/null +++ b/makefu/2configs/home/ham/automation/welcome.txt.j2 @@ -0,0 +1,45 @@ +{% set arbeit_heute = is_state("binary_sensor.arbeitstag","on") -%} +{% set weekday = ['Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sonntag'][now().weekday()] -%} +{% set is_friday = now().weekday() == 4 %} + +{% if not arbeit_heute %} +Heute ist {{ weekday }}, du solltest gar nicht arbeiten! +{% else %} +Willkommen auf Arbeit Felix. +{% endif -%} +Das aktuell gewählte Projekt ist {{ states("sensor.felix_project") }}. + +{% set inside = states("sensor.wohnzimmer_temp_temperature") | float | round(2) -%} +{% set outside = states("sensor.dark_sky_temperature") | float | round(2) -%} +{% set arbeit_morgen = is_state("binary_sensor.arbeitstag_morgen","on") -%} + +Die Wetteraussichten: {{ states("sensor.dark_sky_hourly_summary") | replace(".","")}} bei {{ states("sensor.dark_sky_temperature") }} Grad mit {{ states("sensor.dark_sky_humidity") | round(0) }}% Luftfeuchtigkeit. +{% if states("calendar.abfall_papiermuell") == "on" %} +Heute ist Papiermuell, bring noch schnell dein Papier raus +{% endif %} +{% if states("calendar.abfall_restmuell") == "on" %} +Ausserdem ist heute Restmuell. +{% endif -%} + +{% if ( outside < inside ) and ( outside > 18 ) %} +Draussen ist es gerade {{ ((inside - outside) | round(1) )}} gerade kühler +{% endif -%} + +{% set current_count = state_attr("sensor.dwd_weather_warnings_current_warning_level", "warning_count") %} +{% for i in range(current_count) %} +{% set idx = i + 1 %} + {% set headline = state_attr("sensor.dwd_weather_warnings_current_warning_level", "warning_" ~ idx ~ "_headline") %} + {% set description = state_attr("sensor.dwd_weather_warnings_current_warning_level", "warning_" ~ idx ~ "_description") %} + {% set level = state_attr("sensor.dwd_weather_warnings_current_warning_level", "warning_" ~ idx ~ "_level") %} + {% set time_start = state_attr("sensor.dwd_weather_warnings_current_warning_level", "warning_" ~ idx ~ "_start") %} + {% set time_end = state_attr("sensor.dwd_weather_warnings_current_warning_level", "warning_" ~ idx ~ "_end") %} +Wetterwarnung {{idx}}: {{ headline }} Stufe {{level}} von {{ time_start.strftime("%H:%M") ~ " bis " ~ time_end.strftime("%H:%M") }} Uhr + +{{ description }} +{% endfor %} + +{% if is_friday %} +Endlich ist Freitag! +{% elif not arbeit_morgen %} +Morgen ist Feiertag, also nicht versehentlich arbeiten +{% endif -%} diff --git a/makefu/2configs/home/ham/default.nix b/makefu/2configs/home/ham/default.nix index f54fd32f7..b08152935 100644 --- a/makefu/2configs/home/ham/default.nix +++ b/makefu/2configs/home/ham/default.nix @@ -24,13 +24,17 @@ in { ./device_tracker/tile.nix ./sensor/outside.nix + ./sensor/pollen.nix + ./sensor/dwd.nix ./calendar/nextcloud.nix ./media/firetv.nix ./media/sonos.nix + ./media/schlafzimmer_music_remote.nix ./media/remote_sound_wohnzimmer.nix ./media/remote_sound_arbeitszimmer.nix + ./media/arbeitszimmer_matrix.nix ./automation/check-in.nix ./automation/fenster_auf.nix @@ -41,9 +45,12 @@ in { ./automation/flurlicht.nix ./automation/giesskanne.nix ./automation/pflanzen_giessen_erinnerung.nix - ./automation/urlaub.nix + # ./automation/urlaub.nix ./automation/moodlight.nix ./automation/shutdown_button.nix + ./automation/project_tracker.nix + ./automation/daily_speedtext.nix + ./light/arbeitszimmer.nix ./light/schlafzimmer.nix @@ -53,18 +60,14 @@ in { ]; services.home-assistant = { - package = (pkgs.home-assistant.overrideAttrs (old: { - doInstallCheck = false; - })).override { - extraPackages = p: [ - (p.callPackage ./deps/dwdwfsapi.nix {}) - # (p.callPackage ./signal-rest/pkg.nix {}) - (p.callPackage ./deps/pykodi.nix {}) - ]; - }; + extraComponents = [ "mobile_app" ]; + extraPackages = python3Packages: with python3Packages; [ pytz ]; config = { + default_config = {}; # for sonos aiodiscover + influxdb = { + api_version = 1; database = "ham"; host = "localhost"; tags = { @@ -87,6 +90,25 @@ in { { type = "homeassistant"; } ]; }; + binary_sensor = [ + { platform = "workday"; + name = "Arbeitstag"; + country = "DE"; + province = "BW"; + } + { platform = "workday"; + name = "Arbeitstag Morgen"; + country = "DE"; + province = "BW"; + days_offset = 1; + } + { platform = "workday"; + name = "Arbeitstag Gestern"; + country = "DE"; + province = "BW"; + days_offset = 1; + } + ]; discovery = {}; conversation = {}; history = {}; @@ -141,22 +163,19 @@ in { retain = true; }; }; - #luftdaten = { - # show_on_map = true; - # sensor_id = 10529; - # sensors.monitored_conditions = [ "P1" "P2" ]; - #}; + luftdaten = { + # show_on_map = true; + sensor_id = 72935; + # sensors.monitored_conditions = [ "P1" "P2" ]; + }; #binary_sensor = # flurlicht.binary_sensor; sensor = [ - { platform = "speedtestdotnet"; - scan_interval.hours = 6; - monitored_conditions = [ "ping" "download" "upload" ]; - } # https://www.home-assistant.io/cookbook/automation_for_rainy_days/ ]; frontend = { }; + speedtestdotnet = { }; http = { use_x_forwarded_for = true; #server_host = "127.0.0.1"; @@ -167,6 +186,7 @@ in { switch = []; automation = []; script = { }; + media_source = {}; }; enable = true; configDir = hassdir; diff --git a/makefu/2configs/home/ham/lib/default.nix b/makefu/2configs/home/ham/lib/default.nix index 67e8e902d..cf1c32abd 100644 --- a/makefu/2configs/home/ham/lib/default.nix +++ b/makefu/2configs/home/ham/lib/default.nix @@ -14,7 +14,7 @@ in { service = "tts.google_say"; data = { - entity_id = entity; + entity_id = entity; inherit message; language = "de"; }; @@ -27,10 +27,7 @@ in #} { delay.seconds = 1; } { delay = '' - {% set duration = states.${entity}.attributes.media_duration %} - {% if duration > 0 %} - {% set duration = duration - 1 %} - {% endif %} + {% set duration = state_attr("${entity}","media_duration") %} {% set seconds = duration % 60 %} {% set minutes = (duration / 60)|int % 60 %} {% set hours = (duration / 3600)|int %} @@ -53,6 +50,10 @@ in inherit message; entity = "media_player.office"; }; + bedroom = message: tts { + inherit message; + entity = "media_player.bedroom"; + }; }; zigbee.prefix = "/ham/zigbee"; diff --git a/makefu/2configs/home/ham/light/tint_wohnzimmer.nix b/makefu/2configs/home/ham/light/tint_wohnzimmer.nix index 474bf5c99..243243816 100644 --- a/makefu/2configs/home/ham/light/tint_wohnzimmer.nix +++ b/makefu/2configs/home/ham/light/tint_wohnzimmer.nix @@ -21,24 +21,26 @@ let group_id_2 = 16389; group_id_3 = 16390; remote = "sensor.schlafzimmer_remote1_action"; - main_light_1 = "light.wled"; + main_light_1 = "light.wled"; # fernseher + main_light_2 = "light.wled_2"; #fernsehwand + default_scene_1 = "Solid"; default_color_1 = "Default"; main_color_select_1 = "select.wled_color_palette"; light_group_1.entity_id = [ main_light_1 + main_light_2 ]; # contains only the actually changeable lights - light_group_2 = { entity_id = [ + light_group_2.entity_id = [ "light.wohnzimmer_komode_osram" "light.wohnzimmer_schrank_osram" "light.wohnzimmer_fenster_lichterkette_licht" ]; - }; - light_group_3 = { entity_id = [ + light_group_3.entity_id = [ "light.wohnzimmer_stehlampe_osram" - ]; }; + ]; statecond = cond: { # cond must be a list condition = "template"; diff --git a/makefu/2configs/home/ham/media/arbeitszimmer_matrix.nix b/makefu/2configs/home/ham/media/arbeitszimmer_matrix.nix new file mode 100644 index 000000000..26fec370f --- /dev/null +++ b/makefu/2configs/home/ham/media/arbeitszimmer_matrix.nix @@ -0,0 +1,104 @@ +{ lib, ... }: +let + remote = "sensor.schlafzimmer_music_remote_action"; + hlib = import ../lib; + step = 0.02; + #room = "bedroom"; + room = "office"; + + player = "media_player.${room}"; + say = hlib.say."${room}"; + + remote_action = key: actions: { + conditions = ''{{ trigger.entity_id == 'binary_sensor.matrix_button_${toString key}' }}''; + sequence = actions; + }; + all_buttons = map (key: "binary_sensor.matrix_button_${toString key}") [ + 0 1 2 3 4 5 6 7 8 9 + "b9" "b10" "b11" "b12" "b13" "b14" + ]; +in + { + services.home-assistant.config.rest_command = { + good_song = { + url = "http://prism.r:8001/good"; + method = "POST"; + }; + bad_song = { + url = "http://prism.r:8001/skip"; + method = "POST"; + }; + }; + services.home-assistant.config.automation = + [ + { alias = "Arbeitszimmer Matrix music action"; + mode = "queued"; + trigger = [ + { + platform = "state"; + entity_id = all_buttons; + to = "on"; # ignore 'unavailable' + } + ]; + action = + [ + { choose = [ + (remote_action "9" { + service = "media_player.media_play"; + target.entity_id = player; + }) + (remote_action "7" + { + service = "media_player.media_mute"; + target.entity_id = player; + data.is_volume_muted = ''{{ not state_attr('${player}' , 'is_volume_muted') }}''; + } + ) + (remote_action "2" + { + service = "media_player.media_stop"; + target.entity_id = player; + } + ) + + (remote_action "b9" [ { service = "rest_command.good_song"; } ]) + (remote_action "b10" [ { service = "rest_command.bad_song"; } ]) + + (remote_action "3" + ((say "Starte Lass") ++ [ + { service = "media_player.play_media"; + data = { + media_content_id = "http://radio.lassul.us:8000/radio.mp3"; + media_content_type = "music"; + }; + target.entity_id = player; + } + ])) + (remote_action "1" + ((say "Starte Groovesalad") ++ [ + { service = "media_player.play_media"; + data = { + media_content_id = "http://ice2.somafm.com/groovesalad-128.mp3"; + media_content_type = "music"; + }; + target.entity_id = player; + } + ])) + (remote_action "8" { + service = "media_player.volume_set"; + target.entity_id = player; + data.volume_level = ''{{ state_attr("${player}","volume_level") + (${toString step}|float) }}''; + }) + (remote_action "5"{ + service = "media_player.volume_set"; + target.entity_id = player; + data.volume_level = ''{{ state_attr("${player}","volume_level") - (${toString step}|float) }}''; + }) + ]; + #default = { }; + } + ]; + } + ]; + +} diff --git a/makefu/2configs/home/ham/media/firetv.nix b/makefu/2configs/home/ham/media/firetv.nix index 429688c6a..fc33346cd 100644 --- a/makefu/2configs/home/ham/media/firetv.nix +++ b/makefu/2configs/home/ham/media/firetv.nix @@ -3,14 +3,9 @@ let in { services.home-assistant.config = { notify = [ - #{ - # platform = "kodi"; - # name = "Kodi Wohnzimmer"; - # host = firetv_stick; - #} { platform = "nfandroidtv"; - name = "FireTV Wohnzimmer"; + name = "FireTV Wohnzimmer Notification"; host = firetv_stick; } ]; @@ -20,10 +15,10 @@ in { # name = "FireTV Stick kodi"; # host = firetv_stick; #} + # Configuration needs to be done by hand via web interface "integration" { platform = "androidtv"; - name = "FireTV Stick"; - device_class = "firetv"; - # adb_server_ip = firetv_stick; + name = "FireTV Stick Android"; + device_class = "firetv"; host = firetv_stick; port = 5555; } diff --git a/makefu/2configs/home/ham/media/remote_sound_arbeitszimmer.nix b/makefu/2configs/home/ham/media/remote_sound_arbeitszimmer.nix index f59f022f4..cfa1da44e 100644 --- a/makefu/2configs/home/ham/media/remote_sound_arbeitszimmer.nix +++ b/makefu/2configs/home/ham/media/remote_sound_arbeitszimmer.nix @@ -1,5 +1,10 @@ { lib, ...}: let + # https://www.radiotheque.de/stream/4744806739035994/ABC-Lounge-Music-Radio/pls/ + # http://listen.radionomy.com/ABC-Lounge + # https://str1.openstream.co/589 + # https://listen.openstream.co/3139/audio + # https://str1.openstream.co/589?aw_0_1st.collectionid%3D3139%26stationId%3D3139%26publisherId%3D613%26k%3D1659381767%26aw_0_azn.pcountry%3D%5B%22FR%22%2C%22IT%22%2C%22DE%22%2C%22ES%22%2C%22GB%22%2C%22CH%22%2C%22CA%22%2C%22AT%22%2C%22US%22%5D%26aw_0_azn.planguage%3D%5B%22en%22%2C%22fr%22%2C%22de%22%5D%26aw_0_azn.pgenre%3D%5B%22Jazz%22%2C%22Easy+Listening%22%2C%22Music%22%5D statecond = cond: { # cond must be a list condition = "template"; value_template = "{{ trigger.to_state.state in ( " + diff --git a/makefu/2configs/home/ham/media/schlafzimmer_music_remote.nix b/makefu/2configs/home/ham/media/schlafzimmer_music_remote.nix new file mode 100644 index 000000000..438ce6bda --- /dev/null +++ b/makefu/2configs/home/ham/media/schlafzimmer_music_remote.nix @@ -0,0 +1,158 @@ +{ lib, ... }: +let + remote = "sensor.schlafzimmer_music_remote_action"; + hlib = import ../lib; + step = 0.03; + #room = "bedroom"; + room = "living_room"; + #room = "office"; + + player = "media_player.${room}"; + say = hlib.say."${room}"; + + remote_action = state: actions: { + conditions = ''{{ trigger.to_state.attributes.action == '${state}' }}''; + sequence = actions; + }; + album_list = [ +# Wieso Weshalb Warum Junior +"Doris%20R%c3%bcbel,%20JUMBO%20Neue%20Medien%20%26%20Verlag%20GmbH/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Helfen,%20teilen,%20sich%20vertragen" +"Wieso%3f%20Weshalb%3f%20Warum%3f%20junior/Mein%20Kindergarten" +"Wieso%3f%20Weshalb%3f%20Warum%3f%20junior/Unser%20Werkzeug" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Am%20Meer" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Ampel,%20Stra%c3%9fe%20und%20Verkehr" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Autos%20und%20Laster" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Der%20Bagger" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Der%20Bauernhof" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Der%20Flughafen" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Der%20Pinguin" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Der%20Traktor" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Die%20Baustelle" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Die%20Eisenbahn" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Die%20Feuerwehr" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Die%20Jahreszeiten" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Die%20M%c3%bcllabfuhr" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Die%20Polizei" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Die%20Rettungsfahrzeuge" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Die%20Ritterburg" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Heute,%20morgen,%20jetzt%20und%20gleich" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Im%20Streichelzoo" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20In%20den%20Bergen" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Mama,%20Papa,%20Oma,%20Opa" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Mein%20Hund" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Tanken,%20waschen,%20reparieren" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Tiere%20in%20Afrika" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Unsere%20Tierkinder" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Unterwegs%20mit%20Bus%20und%20Bahn" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Was%20ich%20alles%20kann" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Was%20kriecht%20und%20krabbelt%20da%3f" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Was%20machen%20wir%20an%20Weihnachten%3f" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Was%20machen%20wir%20im%20Fr%c3%bchling%3f" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Was%20machen%20wir%20im%20Herbst%3f" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Was%20machen%20wir%20im%20Sommer%3f" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Was%20machen%20wir%20im%20Winter%3f" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Was%20macht%20der%20Fu%c3%9fballer%3f" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Was%20macht%20der%20Polizist" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Was%20macht%20die%20Prinzessin%3f" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Was%20w%c3%a4chst%20da%3f" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Wenn%20es%20dunkel%20wird" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Wer%20arbeitet%20auf%20der%20Baustelle%3f" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Wir%20feiern%20Geburtstag" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Wir%20gehen%20in%20den%20Zoo" +"Wieso%3f%20Weshalb%3f%20Warum%3f/Wieso%3f%20Weshalb%3f%20Warum%3f%20junior.%20Z%c3%a4hne%20putzen,%20Pipi%20machen" + + ]; + albums = lib.concatMapStringsSep ", " (x: ''"A:ALBUMARTIST/${x}"'') + album_list; +in +{ + services.home-assistant.config.automation = + [ + { alias = "Schlafzimmer music action"; + mode = "queued"; + trigger = [ + { + platform = "state"; + entity_id = remote; + attribute = "action"; + not_to = ""; + } + ]; + action = + [ + { choose = [ + (remote_action "on" + ((say "Starte Essensmusik") ++ [ + { service = "media_player.play_media"; + data = { + media_content_id = "https://listen.openstream.co/4457/audio.mp3"; + media_content_type = "music"; + }; + target.entity_id = player; + } + ])) + (remote_action "off" + [ + { + service = "media_player.media_stop"; + target.entity_id = player; + } + ] + ) + + (remote_action "arrow_right_hold" + ((say "Starte Lass") ++ [ + { service = "media_player.play_media"; + data = { + media_content_id = "http://radio.lassul.us:8000/radio.mp3"; + media_content_type = "music"; + }; + target.entity_id = player; + } + ])) + (remote_action "arrow_left_hold" + ((say "Starte Deep House Music") ++ [ + { service = "media_player.play_media"; + data = { + media_content_id = "http://live.dancemusic.ro:7000/stream.mp3"; + media_content_type = "music"; + }; + target.entity_id = player; + } + ])) + + # TODO: choose random kindermusik? + (remote_action "brightness_move_up" + ((say "Starte Liam Album") ++ [ + { + service = "media_player.play_media"; + target.entity_id = player; + data = { + media_content_id = "{{ [${albums}]|random }}"; + media_content_type = "album"; + }; + } + ]) + ) + #(remote_action "brightness_move_down" + #) + (remote_action "arrow_right_click" { + + service = "media_player.volume_set"; + target.entity_id = player; + data.volume_level = ''{{ state_attr("${player}","volume_level") + (${toString step}|float) }}''; + }) + #(remote_action "brightness_move_down" { + (remote_action "arrow_left_click"{ + service = "media_player.volume_set"; + target.entity_id = player; + data.volume_level = ''{{ state_attr("${player}","volume_level") - (${toString step}|float) }}''; + }) + ]; + #default = { }; + } + ]; + } + ]; + +} diff --git a/makefu/2configs/home/ham/media/sonos.nix b/makefu/2configs/home/ham/media/sonos.nix index 40dcfc3ca..c9cf1a510 100644 --- a/makefu/2configs/home/ham/media/sonos.nix +++ b/makefu/2configs/home/ham/media/sonos.nix @@ -4,5 +4,4 @@ "192.168.111.31" "192.168.111.32" ]; - - } +} diff --git a/makefu/2configs/home/ham/sensor/dwd.nix b/makefu/2configs/home/ham/sensor/dwd.nix new file mode 100644 index 000000000..c1d55d03c --- /dev/null +++ b/makefu/2configs/home/ham/sensor/dwd.nix @@ -0,0 +1,8 @@ +{ + services.home-assistant.config.sensor = + [ + { platform = "dwd_weather_warnings"; + region_name = "Stadt Stuttgart"; + } + ]; +} diff --git a/makefu/2configs/home/ham/sensor/pollen.nix b/makefu/2configs/home/ham/sensor/pollen.nix new file mode 100644 index 000000000..d95c199bf --- /dev/null +++ b/makefu/2configs/home/ham/sensor/pollen.nix @@ -0,0 +1,65 @@ +{ pkgs, lib, ... }: +with lib; +let + region = "112"; + types = [ + "Erle" + "Beifuss" + "Ambrosia" + "Birke" + "Esche" + "Hasel" + "Graeser" + "Roggen" + ]; + gen_tomorrow_sensor = type: { + name = "dwd_pollenbelastung_${toLower type}_tomorrow"; + value = { + icon_template = "mdi:grass"; + friendly_name = "${type} Morgen"; + value_template = "{{ state_attr('sensor.dwd_pollenbelastung_${toLower type}', 'tomorrow') }}"; + }; + }; + gen_sensor = type: { + name = "dwd_pollenbelastung_${toLower type}"; + value = { + icon_template = "mdi:tree-outline"; + friendly_name = type; + value_template = '' + {% set dwd_state = state_attr('sensor.dwd_pollenbelastung_stuttgart', '${type}')['today'] %} + {% if dwd_state == "3" %}6{% elif dwd_state == "2-3"%}5{% elif dwd_state == "2"%}4{% elif dwd_state == "1-2"%}3{% elif dwd_state == "1"%}2{% elif dwd_state == "0-1"%}1{% else %}0{% endif %} + ''; + attribute_templates.today = '' + {% set dwd_state = state_attr('sensor.dwd_pollenbelastung_stuttgart', '${type}')['today'] %} + {% if dwd_state == "3" %}6{% elif dwd_state == "2-3"%}5{% elif dwd_state == "2"%}4{% elif dwd_state == "1-2"%}3{% elif dwd_state == "1"%}2{% elif dwd_state == "0-1"%}1{% else %}0{% endif %} + ''; + attribute_templates.tomorrow = '' + {% set dwd_state = state_attr('sensor.dwd_pollenbelastung_stuttgart', '${type}')['tomorrow'] %} + {% if dwd_state == "3" %}6{% elif dwd_state == "2-3"%}5{% elif dwd_state == "2"%}4{% elif dwd_state == "1-2"%}3{% elif dwd_state == "1"%}2{% elif dwd_state == "0-1"%}1{% else %}0{% endif %} + ''; + # -1 == unknown + #attribute_templates.dayafter = '' + # {% set dwd_state = state_attr('sensor.dwd_pollenbelastung', '${type}')['dayafter_to'] %} + # {% if dwd_state == "3" %}6{% elif dwd_state == "2-3"%}5{% elif dwd_state == "2"%}4{% elif dwd_state == "1-2"%}3{% elif dwd_state == "1"%}2{% elif dwd_state == "0-1"%}1{% elif dwd_state == "-1"%}-1{% else %}0{% endif %} + #''; + }; + }; +in + { + services.home-assistant.config.sensor = [ + { + platform = "rest"; + scan_interval = 3600; + name = "DWD Pollenbelastung Stuttgart"; + resource = "https://opendata.dwd.de/climate_environment/health/alerts/s31fg.json"; + json_attributes_path = "$..content[?(@.partregion_id==${region})].Pollen"; + json_attributes = types; + value_template = "{{ value_json.last_update }}"; + } + { + platform = "template"; + sensors = (listToAttrs (map gen_sensor types)) // + (listToAttrs (map gen_tomorrow_sensor types)) ; + } + ]; +} diff --git a/makefu/2configs/home/ham/signal-rest/service.nix b/makefu/2configs/home/ham/signal-rest/service.nix index 250a3596d..1f718efa5 100644 --- a/makefu/2configs/home/ham/signal-rest/service.nix +++ b/makefu/2configs/home/ham/signal-rest/service.nix @@ -14,5 +14,7 @@ in { volumes = [ "${config}:/home/.local/share/signal-cli" ]; + environment.MODE ="json-rpc"; + #environment.MODE ="native"; # only required for reigstration }; } diff --git a/makefu/2configs/home/ham/zigbee2mqtt.nix b/makefu/2configs/home/ham/zigbee2mqtt.nix index 7809dbb51..efcbb0d00 100644 --- a/makefu/2configs/home/ham/zigbee2mqtt.nix +++ b/makefu/2configs/home/ham/zigbee2mqtt.nix @@ -38,93 +38,6 @@ in icon = "mdi:chip"; } ]; - switch = [ - { - platform = "mqtt"; - name = "Zigbee2mqtt Main join"; - state_topic = "${prefix}/bridge/config/permit_join"; - command_topic = "${prefix}/bridge/config/permit_join"; - payload_on = "true"; - payload_off = "false"; - } - ]; - automation = [ - { - alias = "Zigbee2mqtt Log Level"; - initial_state = "on"; - trigger = { - platform = "state"; - entity_id = "input_select.zigbee2mqtt_log_level"; - }; - action = [ - { - service = "mqtt.publish"; - data = { - payload_template = "{{ states('input_select.zigbee2mqtt_log_level') }}"; - topic = "${prefix}/bridge/config/log_level"; - }; - } - ]; - } - # Automation to start timer when enable join is turned on - { - id = "zigbee_join_enabled"; - alias = "Zigbee Join Enabled"; - trigger = - { - platform = "state"; - entity_id = "switch.zigbee2mqtt_main_join"; - to = "on"; - }; - action = - { - service = "timer.start"; - entity_id = "timer.zigbee_permit_join"; - }; - } - # # Automation to stop timer when switch turned off and turn off switch when timer finished - { - id = "zigbee_join_disabled"; - alias = "Zigbee Join Disabled"; - trigger = [ - { - platform = "event"; - event_type = "timer.finished"; - event_data.entity_id = "timer.zigbee_permit_join"; - } - { - platform = "state"; - entity_id = "switch.zigbee2mqtt_main_join"; - to = "off"; - } - ]; - action = [ - { service = "timer.cancel"; - data.entity_id = "timer.zigbee_permit_join"; - } - { service = "switch.turn_off"; - entity_id = "switch.zigbee2mqtt_main_join"; - } - ]; - } - ]; - input_select.zigbee2mqtt_log_level = - { - name = "Zigbee2mqtt Log Level"; - options = [ - "debug" - "info" - "warn" - "error" - ]; - initial = "info"; - icon = "mdi:format-list-bulleted"; - }; - timer.zigbee_permit_join = - { - name = "Zigbee Time remaining"; - duration = 120; - }; }; } diff --git a/makefu/2configs/home/jellyfin.nix b/makefu/2configs/home/jellyfin.nix index 672a483e5..acfdb2599 100644 --- a/makefu/2configs/home/jellyfin.nix +++ b/makefu/2configs/home/jellyfin.nix @@ -2,9 +2,65 @@ { services.jellyfin.enable = true; services.jellyfin.openFirewall = true; - #users.users.${config.services.jellyfin.user}.extraGroups = [ "download" "video" "render" ]; state = [ "/var/lib/jellyfin" ]; - systemd.services.jellyfin.serviceConfig.PrivateDevices = lib.mkForce false; - systemd.services.jellyfin.serviceConfig.DeviceAllow = lib.mkForce ["char-drm rwm" "char-nvidia-frontend" "char-nvidia-uvm"]; - systemd.services.jellyfin.serviceConfig.SupplementaryGroups = [ "video" "render" "download" ]; + users.users.${config.services.jellyfin.user}.extraGroups = [ "download" "video" "render" ]; + + systemd.services.jellyfin = { + + after = [ "media-cloud.mount" ]; + serviceConfig = rec { + SupplementaryGroups = lib.mkForce [ "video" "render" "download" ]; + UMask = lib.mkForce "0077"; + + + Type = lib.mkForce "simple"; + StateDirectory = lib.mkForce "jellyfin"; + StateDirectoryMode = lib.mkForce "0700"; + CacheDirectory = lib.mkForce "jellyfin"; + CacheDirectoryMode = lib.mkForce "0700"; + WorkingDirectory = lib.mkForce "/var/lib/jellyfin"; + Restart = lib.mkForce "on-failure"; + TimeoutSec = lib.mkForce 15; + SuccessExitStatus = lib.mkForce ["0" "143"]; + + # Security options: + NoNewPrivileges = lib.mkForce true; + SystemCallArchitectures = lib.mkForce "native"; + # AF_NETLINK needed because Jellyfin monitors the network connection + RestrictAddressFamilies = lib.mkForce [ "AF_UNIX" "AF_INET" "AF_INET6" "AF_NETLINK" ]; + RestrictNamespaces = lib.mkForce false; + RestrictRealtime = lib.mkForce true; + RestrictSUIDSGID = lib.mkForce true; + ProtectControlGroups = lib.mkForce false; + ProtectHostname = lib.mkForce true; + ProtectKernelLogs = lib.mkForce false; + ProtectKernelModules = lib.mkForce false; + ProtectKernelTunables = lib.mkForce false; + LockPersonality = lib.mkForce true; + PrivateTmp = lib.mkForce false; + # needed for hardware accelaration + PrivateDevices = lib.mkForce false; + PrivateUsers = lib.mkForce true; + RemoveIPC = lib.mkForce true; + + SystemCallFilter = lib.mkForce [ + "~@clock" + "~@aio" + "~@chown" + "~@cpu-emulation" + "~@debug" + "~@keyring" + "~@memlock" + "~@module" + "~@mount" + "~@obsolete" + "~@privileged" + "~@raw-io" + "~@reboot" + "~@setuid" + "~@swap" + ]; + SystemCallErrorNumber = lib.mkForce "EPERM"; + }; + }; } diff --git a/makefu/2configs/home/music.nix b/makefu/2configs/home/music.nix index 7f5a425d2..7dd8ca6e1 100644 --- a/makefu/2configs/home/music.nix +++ b/makefu/2configs/home/music.nix @@ -22,10 +22,6 @@ in locations."/".proxyPass = "http://localhost:${toString port}"; locations."/".proxyWebsockets = true; - extraConfig = '' - if ( $server_addr != "${internal-ip}" ) { - return 403; - } - ''; }; + networking.firewall.allowedTCPPorts = [ port ]; } diff --git a/makefu/2configs/nginx/music.euer.nix b/makefu/2configs/nginx/music.euer.nix new file mode 100644 index 000000000..e866f1b0d --- /dev/null +++ b/makefu/2configs/nginx/music.euer.nix @@ -0,0 +1,26 @@ +{ config, lib, pkgs, ... }: + +let + hostname = config.krebs.build.host.name; + user = config.services.nginx.user; + group = config.services.nginx.group; + external-ip = config.krebs.build.host.nets.internet.ip4.addr; + internal-ip = config.krebs.build.host.nets.retiolum.ip4.addr; +in { + services.nginx = { + enable = lib.mkDefault true; + virtualHosts."music.euer.krebsco.de" = { + forceSSL = true; + enableACME = true; + locations."/" = { + proxyPass = "http://omo:4533/"; + proxyWebsockets = true; + extraConfig = '' + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + ''; + }; + }; + }; +} diff --git a/makefu/2configs/remote-build/arm-emulation.nix b/makefu/2configs/remote-build/arm-emulation.nix new file mode 100644 index 000000000..dbef25222 --- /dev/null +++ b/makefu/2configs/remote-build/arm-emulation.nix @@ -0,0 +1,25 @@ +{ pkgs, ... }: +let qemu-arm-static = pkgs.stdenv.mkDerivation { + name = "qemu-arm-static"; + src = builtins.fetchurl { + url = "https://github.com/multiarch/qemu-user-static/releases/download/v6.1.0-8/qemu-arm-static"; + sha256 = "06344d77d4f08b3e1b26ff440cb115179c63ca8047afb978602d7922a51231e3"; + }; + dontUnpack = true; + installPhase = "install -D -m 0755 $src $out/bin/qemu-arm-static"; +}; +in { + # Enable binfmt emulation of extra binary formats (armv7l-linux, for exmaple). + boot.binfmt.emulatedSystems = [ "aarch64-linux" ]; + boot.binfmt.registrations.arm = { + interpreter = "${qemu-arm-static}/bin/qemu-arm-static"; + magicOrExtension = ''\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00''; + mask = ''\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\x00\xff\xfe\xff\xff\xff''; + }; + + # Define additional settings for nix. + nix.extraOptions = '' + extra-platforms = armv7l-linux + ''; + nix.sandboxPaths = [ "/run/binfmt/arm=${qemu-arm-static}/bin/qemu-arm-static" ]; +} diff --git a/makefu/2configs/share/gum-client.nix b/makefu/2configs/share/gum-client.nix index db2adfb1c..5192ef515 100644 --- a/makefu/2configs/share/gum-client.nix +++ b/makefu/2configs/share/gum-client.nix @@ -2,21 +2,28 @@ let automount_opts = - [ "x-systemd.automount" - "noauto" "x-systemd.idle-timeout=600" - "x-systemd.device-timeout=5s" - "x-systemd.mount-timeout=5s" + [ "x-systemd.automount" "noauto" + "x-systemd.idle-timeout=300" + "x-systemd.mount-timeout=60s" ]; - host = "nextgum"; #TODO + host = "gum"; #TODO in { - fileSystems."/media/download" = { - device = "//${host}/download"; + boot.extraModprobeConfig = '' + options cifs CIFSMaxBufSize=130048 + ''; + fileSystems."/media/cloud" = { + device = "//${host}/cloud-proxy"; fsType = "cifs"; options = automount_opts ++ [ "credentials=/var/src/secrets/download.smb" "file_mode=0775" "dir_mode=0775" - "uid=9001" + "bsize=8388608" + "fsc" + "rsize=130048" + "cache=loose" + "uid=${toString config.users.users.download.uid}" + "gid=${toString config.users.groups.download.gid}" "vers=3" ]; }; diff --git a/makefu/2configs/share/gum.nix b/makefu/2configs/share/gum.nix index fd81f28ca..9647e0a6c 100644 --- a/makefu/2configs/share/gum.nix +++ b/makefu/2configs/share/gum.nix @@ -1,6 +1,5 @@ { config, lib, pkgs, ... }: -with import ; let hostname = config.krebs.build.host.name; in { @@ -11,15 +10,11 @@ in { # home = "/var/empty"; # }; environment.systemPackages = [ pkgs.samba ]; - users.users.download = { - uid = genid "download"; - isNormalUser = true; - }; services.samba = { enable = true; shares = { - download = { - path = "/var/download"; + cloud-proxy = { + path = "/media/cloud"; "read only" = "no"; browseable = "yes"; "guest ok" = "no"; diff --git a/makefu/2configs/share/hetzner-client.nix b/makefu/2configs/share/hetzner-client.nix index 90bc32deb..dc8637361 100644 --- a/makefu/2configs/share/hetzner-client.nix +++ b/makefu/2configs/share/hetzner-client.nix @@ -21,11 +21,12 @@ in { "dir_mode=0770" "uid=${toString config.users.users.download.uid}" "gid=${toString config.users.groups.download.gid}" - #"vers=3" - "vers=2.1" + "vers=3" + #"vers=2.1" "rsize=65536" "wsize=130048" "iocharset=utf8" + "cache=loose" ]; }; } diff --git a/makefu/2configs/share/omo.nix b/makefu/2configs/share/omo.nix index e53158b8f..4756ccf81 100644 --- a/makefu/2configs/share/omo.nix +++ b/makefu/2configs/share/omo.nix @@ -87,6 +87,12 @@ in { "guest ok" = "no"; "valid users" = "makefu"; }; + #cloud = { + # path = "/media/cloud/download/finished"; + # "read only" = "no"; + # browseable = "yes"; + # "guest ok" = "yes"; + #}; }; extraConfig = '' guest account = smbguest diff --git a/makefu/2configs/tools/all.nix b/makefu/2configs/tools/all.nix index 6844fdfe4..37673768a 100644 --- a/makefu/2configs/tools/all.nix +++ b/makefu/2configs/tools/all.nix @@ -2,18 +2,19 @@ imports = [ ./android-pentest.nix ./consoles.nix - ./core.nix ./core-gui.nix - ./dev.nix + ./core.nix ./desktop.nix + ./dev.nix ./extra-gui.nix ./games.nix + ./maker.nix ./media.nix ./mobility.nix ./pcmanfm-extra.nix ./scanner-tools.nix - ./sec.nix ./sec-gui.nix + ./sec.nix ./studio.nix ]; } diff --git a/makefu/2configs/tools/dev.nix b/makefu/2configs/tools/dev.nix index 66bc9a0e6..2b9baa9c5 100644 --- a/makefu/2configs/tools/dev.nix +++ b/makefu/2configs/tools/dev.nix @@ -22,6 +22,7 @@ brain whatsupnix nixpkgs-pytools + nixpkgs-fmt hydra-check # git-related git-preview diff --git a/makefu/2configs/tools/games.nix b/makefu/2configs/tools/games.nix index 0f1e61791..507887cff 100644 --- a/makefu/2configs/tools/games.nix +++ b/makefu/2configs/tools/games.nix @@ -8,5 +8,6 @@ games-user-env wine pkg2zip + steam ]; } diff --git a/makefu/2configs/tools/maker.nix b/makefu/2configs/tools/maker.nix new file mode 100644 index 000000000..8388db583 --- /dev/null +++ b/makefu/2configs/tools/maker.nix @@ -0,0 +1,16 @@ +{ pkgs, ... }: +{ + users.users.makefu.packages = with pkgs; [ + # media + picard + asunder + #darkice + lame + # creation + blender + openscad + # slicing + cura + chitubox + ]; +} diff --git a/makefu/2configs/wireguard/thierry.nix b/makefu/2configs/wireguard/thierry.nix new file mode 100644 index 000000000..f1dfef192 --- /dev/null +++ b/makefu/2configs/wireguard/thierry.nix @@ -0,0 +1,21 @@ +{ lib, ... }: +{ + networking.wireguard.interfaces.thierry-wg = { + ips = [ "172.27.66.10/24" ]; # TODO: not dnyamic + privateKeyFile = (toString ) + "/wg-thierry.key"; + allowedIPsAsRoutes = true; + # explicit route via eth0 to gum + peers = [ + { + endpoint = "thierryhome.duckdns.org:51820"; + allowedIPs = [ "172.27.66.0/24" ]; + publicKey = "filYuG/xbb2YW8WT0xT26rzeZ/ZiM6NLnbxbsCR9rS0="; + persistentKeepalive = 25; + } + #{ + # allowedIPs = [ "172.27.66.3/32" ]; + # publicKey = "cDIf14LH4qleXNo889lS2ATIqDx9r//JNCkhHlHgc1Q="; + #} + ]; + }; +} diff --git a/makefu/3modules/ps3netsrv.nix b/makefu/3modules/ps3netsrv.nix index bb2abd9a5..a0a6eb1f4 100644 --- a/makefu/3modules/ps3netsrv.nix +++ b/makefu/3modules/ps3netsrv.nix @@ -41,7 +41,7 @@ let }; serviceConfig = { Type = "simple"; - ExecStart = "${cfg.package}/bin/ps3netsrv++ ${shell.escape cfg.servedir}"; + ExecStart = "${cfg.package}/bin/ps3netsrv ${shell.escape cfg.servedir}"; PrivateTmp = true; User = "${cfg.user}"; }; diff --git a/makefu/3modules/sane-extra.nix b/makefu/3modules/sane-extra.nix index 2e0ce8f2f..8cbed572c 100644 --- a/makefu/3modules/sane-extra.nix +++ b/makefu/3modules/sane-extra.nix @@ -22,7 +22,7 @@ let ${concatMapStrings (c: '' f="$out/${c.name}.conf" [ ! -e "$f" ] || chmod +w "$f" - cat ${builtins.toFile "" (c.value + "\n")} >>"$f" + cat ${builtins.toFile "outfile" (c.value + "\n")} >>"$f" chmod -w "$f" '') (mapAttrsToList nameValuePair cfg.extraConfig)} chmod -w $out diff --git a/makefu/5pkgs/beef/Gemfile b/makefu/5pkgs/beef/Gemfile deleted file mode 100644 index 759ba2d23..000000000 --- a/makefu/5pkgs/beef/Gemfile +++ /dev/null @@ -1,93 +0,0 @@ -# BeEF's Gemfile - -# -# Copyright (c) 2006-2021 Wade Alcorn - wade@bindshell.net -# Browser Exploitation Framework (BeEF) - http://beefproject.com -# See the file 'doc/COPYING' for copying permission -# -#gem 'simplecov', require: false, group: :test -gem 'eventmachine' -gem 'thin' -gem 'sinatra', '>= 2.0.2' -gem 'rack', '>= 2.2.3' -gem 'rack-protection', '>= 2.0.0' -gem 'em-websocket' # WebSocket support -gem 'uglifier', '>= 2.7.2' -gem 'mime-types' -gem 'execjs' -gem 'ansi' -gem 'term-ansicolor', :require => 'term/ansicolor' -gem 'json' -gem 'rubyzip', '>= 1.2.2' -gem 'espeak-ruby', '>= 1.0.4' # Text-to-Voice -gem 'nokogiri', '>= 1.11.1' -gem 'rake', '>= 12.3.3' -gem 'otr-activerecord', '>= 1.4.2' -gem 'sqlite3' -gem 'rubocop', '~> 0.92.0', require: false - -# Geolocation support -group :geoip do - gem 'maxmind-db' -end - -gem 'parseconfig' -gem 'erubis' - -# Metasploit Integration extension -group :ext_msf do - gem 'msfrpc-client' - gem 'xmlrpc' -end - -# Notifications extension -group :ext_notifications do - # Pushover - gem 'rushover' - # Slack - gem 'slack-notifier' - # Twitter - gem 'twitter', '>= 5.0.0' -end - -# DNS extension -group :ext_dns do - gem 'async-dns' -end - -# QRcode extension -group :ext_qrcode do - gem 'qr4r' -end - -# For running unit tests -group :test do - gem 'test-unit' - gem 'test-unit-full' - gem 'rspec' - gem 'rdoc' - # curb gem requires curl libraries - # sudo apt-get install libcurl4-openssl-dev - gem 'curb' - # selenium-webdriver 3.x is incompatible with Firefox version 48 and prior - # gem 'selenium' # Requires old version of selenium which is no longer available - gem 'geckodriver-helper' - gem 'selenium-webdriver' - # nokogirl is needed by capybara which may require one of the below commands - # sudo apt-get install libxslt-dev libxml2-dev - # sudo port install libxml2 libxslt - gem 'capybara' - # RESTful API tests/generic command module tests - gem 'rest-client', '>= 2.0.1' - gem 'irb' - gem 'pry-byebug' - gem "websocket-client-simple", "~> 0.3.0" - gem "browserstack-local", "~> 1.3" -end - -source 'https://rubygems.org' - - - - - diff --git a/makefu/5pkgs/beef/Gemfile.lock b/makefu/5pkgs/beef/Gemfile.lock deleted file mode 100644 index fa6f32335..000000000 --- a/makefu/5pkgs/beef/Gemfile.lock +++ /dev/null @@ -1,297 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - activemodel (6.1.4) - activesupport (= 6.1.4) - activerecord (6.1.4) - activemodel (= 6.1.4) - activesupport (= 6.1.4) - activesupport (6.1.4) - concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 1.6, < 2) - minitest (>= 5.1) - tzinfo (~> 2.0) - zeitwerk (~> 2.3) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - ansi (1.5.0) - archive-zip (0.12.0) - io-like (~> 0.3.0) - ast (2.4.2) - async (1.30.1) - console (~> 1.10) - nio4r (~> 2.3) - timers (~> 4.1) - async-dns (1.2.6) - async-io (~> 1.15) - async-io (1.32.2) - async - browserstack-local (1.3.0) - buftok (0.2.0) - byebug (11.1.3) - capybara (3.35.3) - addressable - mini_mime (>= 0.1.3) - nokogiri (~> 1.8) - rack (>= 1.6.0) - rack-test (>= 0.6.3) - regexp_parser (>= 1.5, < 3.0) - xpath (~> 3.2) - childprocess (3.0.0) - coderay (1.1.3) - concurrent-ruby (1.1.9) - console (1.13.1) - fiber-local - curb (0.9.11) - daemons (1.4.0) - diff-lcs (1.4.4) - domain_name (0.5.20190701) - unf (>= 0.0.5, < 1.0.0) - em-websocket (0.5.2) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0.6.0) - equalizer (0.0.11) - erubis (2.7.0) - espeak-ruby (1.0.4) - event_emitter (0.2.6) - eventmachine (1.2.7) - execjs (2.8.1) - ffi (1.15.3) - ffi-compiler (1.0.1) - ffi (>= 1.0.0) - rake - fiber-local (1.0.0) - geckodriver-helper (0.24.0) - archive-zip (~> 0.7) - hashie (4.1.0) - hashie-forbidden_attributes (0.1.1) - hashie (>= 3.0) - http (4.4.1) - addressable (~> 2.3) - http-cookie (~> 1.0) - http-form_data (~> 2.2) - http-parser (~> 1.2.0) - http-accept (1.7.0) - http-cookie (1.0.4) - domain_name (~> 0.5) - http-form_data (2.3.0) - http-parser (1.2.3) - ffi-compiler (>= 1.0, < 2.0) - http_parser.rb (0.6.0) - i18n (1.8.10) - concurrent-ruby (~> 1.0) - io-console (0.5.9) - io-like (0.3.1) - irb (1.3.6) - reline (>= 0.2.5) - json (2.5.1) - maxmind-db (1.1.1) - memoizable (0.4.2) - thread_safe (~> 0.3, >= 0.3.1) - method_source (1.0.0) - mime-types (3.3.1) - mime-types-data (~> 3.2015) - mime-types-data (3.2021.0704) - mini_mime (1.1.0) - mini_portile2 (2.6.1) - minitest (5.14.4) - mojo_magick (0.6.6) - msfrpc-client (1.1.2) - msgpack (~> 1) - msgpack (1.4.2) - multipart-post (2.1.1) - mustermann (1.1.1) - ruby2_keywords (~> 0.0.1) - naught (1.1.0) - netrc (0.11.0) - nio4r (2.5.8) - nokogiri (1.12.2) - mini_portile2 (~> 2.6.1) - racc (~> 1.4) - otr-activerecord (2.0.1) - activerecord (>= 4.0, < 6.3) - hashie-forbidden_attributes (~> 0.1) - parallel (1.20.1) - parseconfig (1.1.0) - parser (3.0.2.0) - ast (~> 2.4.1) - power_assert (2.0.0) - pry (0.13.1) - coderay (~> 1.1) - method_source (~> 1.0) - pry-byebug (3.9.0) - byebug (~> 11.0) - pry (~> 0.13.0) - public_suffix (4.0.6) - qr4r (0.6.1) - mojo_magick (~> 0.6.5) - rqrcode_core (~> 0.1) - racc (1.5.2) - rack (2.2.3) - rack-protection (2.1.0) - rack - rack-test (1.1.0) - rack (>= 1.0, < 3) - rainbow (3.0.0) - rake (13.0.6) - rdoc (6.3.2) - regexp_parser (2.1.1) - reline (0.2.6) - io-console (~> 0.5) - rest-client (2.1.0) - http-accept (>= 1.7.0, < 2.0) - http-cookie (>= 1.0.2, < 2.0) - mime-types (>= 1.16, < 4.0) - netrc (~> 0.8) - rexml (3.2.5) - rqrcode_core (0.2.0) - rr (3.0.5) - rspec (3.10.0) - rspec-core (~> 3.10.0) - rspec-expectations (~> 3.10.0) - rspec-mocks (~> 3.10.0) - rspec-core (3.10.1) - rspec-support (~> 3.10.0) - rspec-expectations (3.10.1) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.10.0) - rspec-mocks (3.10.2) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.10.0) - rspec-support (3.10.2) - rubocop (0.92.0) - parallel (~> 1.10) - parser (>= 2.7.1.5) - rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.7) - rexml - rubocop-ast (>= 0.5.0) - ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 2.0) - rubocop-ast (1.8.0) - parser (>= 3.0.1.1) - ruby-progressbar (1.11.0) - ruby2_keywords (0.0.5) - rubyzip (2.3.2) - rushover (0.3.0) - json - rest-client - selenium-webdriver (3.142.7) - childprocess (>= 0.5, < 4.0) - rubyzip (>= 1.2.2) - simple_oauth (0.3.1) - sinatra (2.1.0) - mustermann (~> 1.0) - rack (~> 2.2) - rack-protection (= 2.1.0) - tilt (~> 2.0) - slack-notifier (2.4.0) - sqlite3 (1.4.2) - sync (0.5.0) - term-ansicolor (1.7.1) - tins (~> 1.0) - test-unit (3.4.4) - power_assert - test-unit-context (0.5.1) - test-unit (>= 2.4.0) - test-unit-full (0.0.5) - test-unit - test-unit-context - test-unit-notify - test-unit-rr - test-unit-runner-tap - test-unit-notify (1.0.4) - test-unit (>= 2.4.9) - test-unit-rr (1.0.5) - rr (>= 1.1.1) - test-unit (>= 2.5.2) - test-unit-runner-tap (1.1.2) - test-unit - thin (1.8.1) - daemons (~> 1.0, >= 1.0.9) - eventmachine (~> 1.0, >= 1.0.4) - rack (>= 1, < 3) - thread_safe (0.3.6) - tilt (2.0.10) - timers (4.3.3) - tins (1.29.1) - sync - twitter (7.0.0) - addressable (~> 2.3) - buftok (~> 0.2.0) - equalizer (~> 0.0.11) - http (~> 4.0) - http-form_data (~> 2.0) - http_parser.rb (~> 0.6.0) - memoizable (~> 0.4.0) - multipart-post (~> 2.0) - naught (~> 1.0) - simple_oauth (~> 0.3.0) - tzinfo (2.0.4) - concurrent-ruby (~> 1.0) - uglifier (4.2.0) - execjs (>= 0.3.0, < 3) - unf (0.1.4) - unf_ext - unf_ext (0.0.7.7) - unicode-display_width (1.7.0) - webrick (1.7.0) - websocket (1.2.9) - websocket-client-simple (0.3.0) - event_emitter - websocket - xmlrpc (0.3.2) - webrick - xpath (3.2.0) - nokogiri (~> 1.8) - zeitwerk (2.4.2) - -PLATFORMS - ruby - -DEPENDENCIES - ansi - async-dns - browserstack-local (~> 1.3) - capybara - curb - em-websocket - erubis - espeak-ruby (>= 1.0.4) - eventmachine - execjs - geckodriver-helper - irb - json - maxmind-db - mime-types - msfrpc-client - nokogiri (>= 1.11.1) - otr-activerecord (>= 1.4.2) - parseconfig - pry-byebug - qr4r - rack (>= 2.2.3) - rack-protection (>= 2.0.0) - rake (>= 12.3.3) - rdoc - rest-client (>= 2.0.1) - rspec - rubocop (~> 0.92.0) - rubyzip (>= 1.2.2) - rushover - selenium-webdriver - sinatra (>= 2.0.2) - slack-notifier - sqlite3 - term-ansicolor - test-unit - test-unit-full - thin - twitter (>= 5.0.0) - uglifier (>= 2.7.2) - websocket-client-simple (~> 0.3.0) - xmlrpc - -BUNDLED WITH - 2.1.4 diff --git a/makefu/5pkgs/beef/db-in-homedir.patch b/makefu/5pkgs/beef/db-in-homedir.patch deleted file mode 100644 index e8dd8e3db..000000000 --- a/makefu/5pkgs/beef/db-in-homedir.patch +++ /dev/null @@ -1,39 +0,0 @@ ---- /beef 2018-08-16 19:03:55.199437566 +0200 -+++ /beef 2018-08-16 19:27:34.735985233 +0200 -@@ -110,9 +110,20 @@ - # - # @note Database setup - use DataMapper::Logger.new($stdout, :debug) for development debugging - # -+ -+# -+# @note Create ~/.beef/ -+# -+begin -+ FileUtils.mkdir_p($home_dir) unless File.directory?($home_dir) -+rescue => e -+ print_error "Could not create '#{$home_dir}': #{e.message}" -+end -+ - case config.get("beef.database.driver") - when "sqlite" -- DataMapper.setup(:default, "sqlite3://#{$root_dir}/#{config.get("beef.database.db_file")}") -+ print_info "Using Database #{$home_dir}/#{config.get("beef.database.db_file")}" -+ DataMapper.setup(:default, "sqlite3://#{$home_dir}/#{config.get("beef.database.db_file")}") - when "mysql", "postgres" - DataMapper.setup(:default, - :adapter => config.get("beef.database.driver"), -@@ -162,14 +173,6 @@ - BeEF::Core::Console::Banners.print_network_interfaces_count - BeEF::Core::Console::Banners.print_network_interfaces_routes - --# --# @note Create ~/.beef/ --# --begin -- FileUtils.mkdir_p($home_dir) unless File.directory?($home_dir) --rescue => e -- print_error "Could not create '#{$home_dir}': #{e.message}" --end - - # - # @note Check whether we load the Console Shell or not diff --git a/makefu/5pkgs/beef/default.nix b/makefu/5pkgs/beef/default.nix deleted file mode 100644 index c99577caf..000000000 --- a/makefu/5pkgs/beef/default.nix +++ /dev/null @@ -1,45 +0,0 @@ -{ stdenv, lib, bundlerEnv, ruby, fetchFromGitHub, nodejs }: -# nix-shell --command "bundler install && bundix" in the clone, copy gemset.nix, Gemfile and Gemfile.lock -let - gems = bundlerEnv { - name = "beef-env"; - inherit ruby; - gemdir = ./.; - }; -in stdenv.mkDerivation { - name = "beef-2018-09-21"; - src = fetchFromGitHub { - owner = "beefproject"; - repo = "beef"; - rev = "d237c95"; - sha256 = "1mykbjwjcbd2a18wycaf35hi3b9rmvqz1jnk2v55sd4c39f0jpf2"; - }; - prePatch = '' - ls -alhtr - ''; - patches = [ ./db-in-homedir.patch ]; - buildInputs = [gems ruby]; - installPhase = '' - mkdir -p $out/{bin,share/beef} - - cp -r * $out/share/beef - # set the default db path, unfortunately setting to /tmp does not seem to work - # sed -i 's#db_file: .*#db_file: "/tmp/beef.db"#' $out/share/beef/config.yaml - - bin=$out/bin/beef - cat > $bin < {}; -stdenv.mkDerivation { - name = "env"; - buildInputs = [ - ruby.devEnv - git - sqlite - libpcap - postgresql - libxml2 - libxslt - pkgconfig - bundix - ]; -} diff --git a/makefu/5pkgs/beef/update.sh b/makefu/5pkgs/beef/update.sh deleted file mode 100755 index cce635f6d..000000000 --- a/makefu/5pkgs/beef/update.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env nix-shell -#!nix-shell -i bash -p curl bundix git libiconv libpcap libxml2 libxslt pkg-config postgresql ruby.devEnv sqlite xmlstarlet nix-update wget - -set -eu -o pipefail -cd "$(dirname "$(readlink -f "$0")")" - - -# TODO find the correct tag -echo Fetching latest Gemfile -wget https://raw.githubusercontent.com/beefproject/beef/master/Gemfile -O Gemfile -rm -f Gemfile.lock -echo Running bundler install -bundler install -echo Running bundix -bundix -exit 0 - -latest=$(curl https://github.com/rapid7/metasploit-framework/releases.atom | xmlstarlet sel -N atom="http://www.w3.org/2005/Atom" -t -m /atom:feed/atom:entry -v atom:title -n | head -n1) -echo "Updating metasploit to $latest" - -sed -i "s#refs/tags/.*#refs/tags/$latest\"#" Gemfile - -bundler install -bundix -sed -i '/[ ]*dependencies =/d' gemset.nix - -cd "../../../../" -nix-update beef --version "$latest" diff --git a/makefu/5pkgs/custom/mediawiki-matrix-bot/default.nix b/makefu/5pkgs/custom/mediawiki-matrix-bot/default.nix index 4a91a9161..421cb76f2 100644 --- a/makefu/5pkgs/custom/mediawiki-matrix-bot/default.nix +++ b/makefu/5pkgs/custom/mediawiki-matrix-bot/default.nix @@ -16,7 +16,12 @@ buildPythonApplication rec { nativeBuildInputs = [ mypy ]; - checkPhase = '' - mypy --strict mediawiki_matrix_bot - ''; + + doCheck = false; + #checkInputs = [ + # types-aiofiles + #]; + #checkPhase = '' + # mypy --strict mediawiki_matrix_bot + #''; } diff --git a/makefu/5pkgs/default.nix b/makefu/5pkgs/default.nix index fd26f462e..66a8d99d1 100644 --- a/makefu/5pkgs/default.nix +++ b/makefu/5pkgs/default.nix @@ -1,3 +1,6 @@ +let + unstable = (import {}).pkgs; +in self: super: with super.lib; with builtins; let # This callPackage will try to detect obsolete overrides. @@ -43,6 +46,8 @@ in { alsa-hdsploader = callPackage ./custom/alsa-tools { alsaToolTarget="hdsploader";}; qcma = super.pkgs.libsForQt5.callPackage ./custom/qcma { }; inherit (callPackage ./devpi {}) devpi-web ; + jellyfin = unstable.jellyfin; + jellyfin-web = unstable.jellyfin-web; nodemcu-uploader = super.pkgs.callPackage ./nodemcu-uploader {}; liveproxy = super.pkgs.python3Packages.callPackage ./custom/liveproxy {}; mediawiki-matrix-bot = super.pkgs.python3Packages.callPackage ./custom/mediawiki-matrix-bot {}; diff --git a/makefu/5pkgs/ns-atmosphere-programmer/default.nix b/makefu/5pkgs/ns-atmosphere-programmer/default.nix index aa7af9922..7d9110e48 100644 --- a/makefu/5pkgs/ns-atmosphere-programmer/default.nix +++ b/makefu/5pkgs/ns-atmosphere-programmer/default.nix @@ -2,8 +2,9 @@ , makeWrapper , autoPatchelfHook , xorg -, gnome3 , libpng12 +, gtk3 +, gnome }: stdenv.mkDerivation rec { name = "ns-atmosphere-programmer-${version}"; @@ -15,13 +16,13 @@ stdenv.mkDerivation rec { sha256 = "1cnyydsmrcpfwpdiry7qybh179499wpbvlzq5rk442hq9ak416ri"; }; - buildInputs = with xorg; [ libX11 libXxf86vm libSM gnome3.gtk libpng12 ]; + buildInputs = with xorg; [ libX11 libXxf86vm libSM gtk3 libpng12 ]; nativeBuildInputs = [ autoPatchelfHook makeWrapper ]; installPhase = '' install -D -m755 NS-Atmosphere $out/bin/NS-Atmosphere wrapProgram $out/bin/NS-Atmosphere --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH" \ ---suffix XDG_DATA_DIRS : '${pkgs.gnome.adwaita-icon-theme}/share' +--suffix XDG_DATA_DIRS : '${gnome.adwaita-icon-theme}/share' ''; dontStrip = true; diff --git a/makefu/5pkgs/ps3netsrv/default.nix b/makefu/5pkgs/ps3netsrv/default.nix new file mode 100644 index 000000000..08d7dbfdc --- /dev/null +++ b/makefu/5pkgs/ps3netsrv/default.nix @@ -0,0 +1,33 @@ +{ lib +, stdenv +, fetchFromGitHub +, meson +, ninja +, mbedtls +}: + +stdenv.mkDerivation rec { + pname = "ps3netsrv"; + version = "20220813"; + + src = fetchFromGitHub { + owner = "aldostools"; + repo = "webMAN-MOD"; + rev = "5301277a0eb2275c73d7c82af9cb9e9ec34369e4"; + hash = "sha256-hgQSqRKFomHgOr1ejfKoR/Sywa3AjbinmAAgscVYs44="; + }; + postUnpack = "pwd; ls -alhtr; ls -alhtr source"; + + #dontUseCmakeConfigure = true; + nativeBuildInputs = [ mbedtls meson ninja ]; + buildInputs = [ mbedtls ]; + sourceRoot = "./source/_Projects_/ps3netsrv"; + + meta = with lib; { + homepage = "https://github.com/aldostools/webMAN-MOD/wiki/~-PS3-NET-Server"; + description = "a server application used to stream content from a remote server to the PS3"; + maintainers = [ maintainers.makefu ]; + platforms = platforms.unix; + license = licenses.mit; + }; +} diff --git a/makefu/5pkgs/ratt/default.nix b/makefu/5pkgs/ratt/default.nix index 57ea545b9..0ad94c55e 100644 --- a/makefu/5pkgs/ratt/default.nix +++ b/makefu/5pkgs/ratt/default.nix @@ -11,7 +11,7 @@ buildGoModule rec { }; proxyVendor = true; - vendorSha256 = "sha256-901xkzF/p/kUy7tZELwNhgepRDScUeWQM3isy7APuik="; + vendorSha256 = "sha256-AOtWR7Ew+0I7+TrMZOCxOKGCv+mlvcqy9s+gX2JKwnE="; # tests try to access the internet to scrape websites doCheck = false; diff --git a/makefu/krops.nix b/makefu/krops.nix index 2757519a6..d907c8e36 100644 --- a/makefu/krops.nix +++ b/makefu/krops.nix @@ -75,20 +75,20 @@ (lib.mkIf ( host-src.hw ) { nixos-hardware.git = { url = https://github.com/nixos/nixos-hardware.git; - ref = "a0d8383"; + ref = "12620020f76b1b5d2b0e6fbbda831ed4f5fe56e1"; }; }) (lib.mkIf ( host-src.nix-ld ) { nix-ld.git = { url = https://github.com/Mic92/nix-ld.git; - ref = "eb9cb8d"; + ref = "c25cc4b"; }; }) (lib.mkIf ( host-src.home-manager ) { home-manager.git = { url = https://github.com/rycee/home-manager; - ref = "426ab2cf111fca61308bd86fe652e14aa12cc2d2"; + ref = "1de492f"; }; }) ]; @@ -97,7 +97,6 @@ in { # usage: $(nix-build --no-out-link --argstr name HOSTNAME -A deploy) deploy = pkgs.krops.writeDeploy "${name}-deploy" { source = source { test = false; }; - fast = true; target = "root@${target}/var/src"; buildTarget = if target == buildTarget then "root@${target}/var/src" else "root@${buildTarget}/tmp/"; };