diff --git a/flake.nix b/flake.nix index fd12a15..c7b1e13 100644 --- a/flake.nix +++ b/flake.nix @@ -19,7 +19,8 @@ system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; writeCommand = krops.packages.${system}.writeCommand; - in { + in + { # deploy like this: # nix run ".#deploy.sterni" apps.${system}.deploy = pkgs.callPackage ./nixos/krops.nix { diff --git a/nixos/configs/pepe/dms.nix b/nixos/configs/pepe/dms.nix index 781e47a..7dbb073 100644 --- a/nixos/configs/pepe/dms.nix +++ b/nixos/configs/pepe/dms.nix @@ -11,7 +11,8 @@ let rev = "2f5c44f017bdfd8abfe908d419ef26bac300f809"; sha256 = "0dxhk1ah6wwbsxyk4hd32rz7886w7r5gfy16485gjbvky1qsi8gd"; }; -in { +in +{ # setup ftp services.vsftpd = { diff --git a/nixos/configs/pepe/hardware-configuration.nix b/nixos/configs/pepe/hardware-configuration.nix index 64388ba..62a9b45 100644 --- a/nixos/configs/pepe/hardware-configuration.nix +++ b/nixos/configs/pepe/hardware-configuration.nix @@ -4,28 +4,31 @@ { modulesPath, config, lib, pkgs, ... }: { - imports = [ "${modulesPath}/installer/scan/not-detected.nix" + imports = [ + "${modulesPath}/installer/scan/not-detected.nix" - (let mediaUUID = "29ebe5ba-7599-4dd3-99a3-37b9bf8e4d61"; - in { - fileSystems."/media" = { - device = "/dev/disk/by-uuid/${mediaUUID}"; - fsType = "ext4"; - options = [ - "nofail" - "noauto" - #"x-systemd.device-timeout=1ms" - ]; - }; - systemd.mounts = [{ - enable = true; - options = "nofail,noauto"; - type = "ext4"; - wantedBy = [ "multi-user.target" ]; - what = "/dev/disk/by-uuid/${mediaUUID}"; - where = "/media"; - }]; - }) + ( + let mediaUUID = "29ebe5ba-7599-4dd3-99a3-37b9bf8e4d61"; + in { + fileSystems."/media" = { + device = "/dev/disk/by-uuid/${mediaUUID}"; + fsType = "ext4"; + options = [ + "nofail" + "noauto" + #"x-systemd.device-timeout=1ms" + ]; + }; + systemd.mounts = [{ + enable = true; + options = "nofail,noauto"; + type = "ext4"; + wantedBy = [ "multi-user.target" ]; + what = "/dev/disk/by-uuid/${mediaUUID}"; + where = "/media"; + }]; + } + ) ]; boot.initrd.availableKernelModules = diff --git a/nixos/configs/pepe/home-assistant.nix b/nixos/configs/pepe/home-assistant.nix index 404217f..9c4e5ea 100644 --- a/nixos/configs/pepe/home-assistant.nix +++ b/nixos/configs/pepe/home-assistant.nix @@ -154,12 +154,13 @@ { alias = "reset everything when back home"; - trigger = map (entity_id: { - platform = "state"; - entity_id = entity_id; - from = "off"; - to = "on"; - }) [ + trigger = map + (entity_id: { + platform = "state"; + entity_id = entity_id; + from = "off"; + to = "on"; + }) [ "binary_sensor.motion_sensor_1" "binary_sensor.motion_sensor_2" "binary_sensor.motion_sensor_3" @@ -185,57 +186,59 @@ ]; - group = let - create_room = { name, description }: { - "${name}" = { - name = "${description}"; + group = + let + create_room = { name, description }: { + "${name}" = { + name = "${description}"; + entities = [ ]; + }; + }; + create_rooms = rooms: + lib.foldr (a: b: a // b) { } (map create_room rooms); + # rooms + # ----- + in + (create_rooms [ + { + name = "floor_room"; + description = "Flur"; + } + { + name = "bed_room"; + description = "Schlafzimmer"; + } + { + name = "living_room"; + description = "Wohnzimmer"; + } + { + name = "kitchen_room"; + description = "Küche"; + } + { + name = "bath_room"; + description = "Klo"; + } + ]) // { + + # overview + # -------- + all_sensors = { name = "Alle Sensoren"; }; + today = { + name = "Today"; + entities = [ "input_select.scene" ]; + }; + # other stuff + # ----------- + tv = { name = "TV"; }; + all_lights = { name = "Alle Lampen"; }; + unknown = { + name = "Not Used"; entities = [ ]; }; - }; - create_rooms = rooms: - lib.foldr (a: b: a // b) { } (map create_room rooms); - # rooms - # ----- - in (create_rooms [ - { - name = "floor_room"; - description = "Flur"; - } - { - name = "bed_room"; - description = "Schlafzimmer"; - } - { - name = "living_room"; - description = "Wohnzimmer"; - } - { - name = "kitchen_room"; - description = "Küche"; - } - { - name = "bath_room"; - description = "Klo"; - } - ]) // { - # overview - # -------- - all_sensors = { name = "Alle Sensoren"; }; - today = { - name = "Today"; - entities = [ "input_select.scene" ]; }; - # other stuff - # ----------- - tv = { name = "TV"; }; - all_lights = { name = "Alle Lampen"; }; - unknown = { - name = "Not Used"; - entities = [ ]; - }; - - }; }; diff --git a/nixos/configs/pepe/home-assistant/chaospott.nix b/nixos/configs/pepe/home-assistant/chaospott.nix index ede1b58..fc10fb4 100644 --- a/nixos/configs/pepe/home-assistant/chaospott.nix +++ b/nixos/configs/pepe/home-assistant/chaospott.nix @@ -5,7 +5,8 @@ let folderPath = config.services.home-assistant.configDir; filePath = "${folderPath}/${name}.json"; -in { +in +{ services.homeAssistantConfig = { sensor = [ diff --git a/nixos/configs/pepe/home-assistant/light-control.nix b/nixos/configs/pepe/home-assistant/light-control.nix index 7a9f8a5..018b50e 100644 --- a/nixos/configs/pepe/home-assistant/light-control.nix +++ b/nixos/configs/pepe/home-assistant/light-control.nix @@ -66,163 +66,167 @@ [ "zigbee2mqtt/motion_sensor_7" "zigbee2mqtt/door_sensor_4" ]; } ]; - sensors = let - door = { topic, room }: { - topic = topic; - key = "contact"; - room = room; - invert_state = true; - delay = 90; - }; - motion = { topic, room }: { - topic = topic; - key = "occupancy"; - room = room; - delay = 60; - }; - in [ - - (motion { - topic = "zigbee2mqtt/motion_sensor_1"; - room = "office_room"; - }) - (motion { - topic = "zigbee2mqtt/motion_sensor_2"; - room = "office_room"; - }) - (motion { - topic = "zigbee2mqtt/motion_sensor_6"; - room = "office_room"; - }) - (motion { - topic = "zigbee2mqtt/motion_sensor_8"; - room = "office_room"; - }) - (motion { - topic = "zigbee2mqtt/motion_sensor_7"; - room = "sleeping_room"; - }) - (motion { - topic = "zigbee2mqtt/motion_sensor_5"; - room = "kitchen"; - }) - (motion { - topic = "zigbee2mqtt/motion_sensor_4"; - room = "storage_room"; - }) - - (door { - topic = "zigbee2mqtt/door_sensor_1"; - room = "storage_room"; - }) - (door { - topic = "zigbee2mqtt/door_sensor_5"; - room = "sleeping_room"; - }) - (door { - # house door - topic = "zigbee2mqtt/door_sensor_4"; - room = "floor"; - }) - - ]; - switches = let - sonoff = { id, rooms, delay ? 0 }: { - topic = "stat/${id}/RESULT"; - key = "POWER"; - rooms = rooms; - delay = delay; - command = { - command = "{{state}}"; - init_command = "(null)"; - topic = "cmnd/${id}/POWER"; - on = "ON"; - off = "OFF"; + sensors = + let + door = { topic, room }: { + topic = topic; + key = "contact"; + room = room; + invert_state = true; + delay = 90; }; - }; - light = { topic, rooms, delay ? 0 }: { - topic = topic; - key = "state"; - rooms = rooms; - delay = delay; - command = { - command = ''{"state":"{{state}}","brightness":{{brightness}}}''; - topic = "${topic}/set"; - on = "ON"; - off = "OFF"; + motion = { topic, room }: { + topic = topic; + key = "occupancy"; + room = room; + delay = 60; }; - }; - led = { topic, rooms, delay ? 0 }: { - topic = topic; - key = "state"; - rooms = rooms; - delay = delay; - command = { - # Configure it once to the color you like - # {"state":"{{state}}","brightness":{{brightness}},"color":{"hex":"#FFFFFF},"color_temp":255","transition":0} - command = '' - {"state":"{{state}}","brightness":{{brightness}},"transition":0}''; - topic = "${topic}/set"; - on = "ON"; - off = "OFF"; + in + [ + + (motion { + topic = "zigbee2mqtt/motion_sensor_1"; + room = "office_room"; + }) + (motion { + topic = "zigbee2mqtt/motion_sensor_2"; + room = "office_room"; + }) + (motion { + topic = "zigbee2mqtt/motion_sensor_6"; + room = "office_room"; + }) + (motion { + topic = "zigbee2mqtt/motion_sensor_8"; + room = "office_room"; + }) + (motion { + topic = "zigbee2mqtt/motion_sensor_7"; + room = "sleeping_room"; + }) + (motion { + topic = "zigbee2mqtt/motion_sensor_5"; + room = "kitchen"; + }) + (motion { + topic = "zigbee2mqtt/motion_sensor_4"; + room = "storage_room"; + }) + + (door { + topic = "zigbee2mqtt/door_sensor_1"; + room = "storage_room"; + }) + (door { + topic = "zigbee2mqtt/door_sensor_5"; + room = "sleeping_room"; + }) + (door { + # house door + topic = "zigbee2mqtt/door_sensor_4"; + room = "floor"; + }) + + ]; + switches = + let + sonoff = { id, rooms, delay ? 0 }: { + topic = "stat/${id}/RESULT"; + key = "POWER"; + rooms = rooms; + delay = delay; + command = { + command = "{{state}}"; + init_command = "(null)"; + topic = "cmnd/${id}/POWER"; + on = "ON"; + off = "OFF"; + }; }; - }; - in [ + light = { topic, rooms, delay ? 0 }: { + topic = topic; + key = "state"; + rooms = rooms; + delay = delay; + command = { + command = ''{"state":"{{state}}","brightness":{{brightness}}}''; + topic = "${topic}/set"; + on = "ON"; + off = "OFF"; + }; + }; + led = { topic, rooms, delay ? 0 }: { + topic = topic; + key = "state"; + rooms = rooms; + delay = delay; + command = { + # Configure it once to the color you like + # {"state":"{{state}}","brightness":{{brightness}},"color":{"hex":"#FFFFFF},"color_temp":255","transition":0} + command = '' + {"state":"{{state}}","brightness":{{brightness}},"transition":0}''; + topic = "${topic}/set"; + on = "ON"; + off = "OFF"; + }; + }; + in + [ - (light { - topic = "zigbee2mqtt/light_2"; - rooms = [ "office_room" ]; - }) - (light { - topic = "zigbee2mqtt/light_4"; - rooms = [ "office_room" ]; - }) - (light { - topic = "zigbee2mqtt/light_5"; - rooms = [ "storage_room" ]; - }) - (light { - topic = "zigbee2mqtt/light_7"; - rooms = [ "sleeping_room" ]; - }) - (led { - topic = "zigbee2mqtt/led_1"; - rooms = [ "office_room" ]; - }) - (led { - topic = "zigbee2mqtt/led_2"; - rooms = [ "kitchen" ]; - }) + (light { + topic = "zigbee2mqtt/light_2"; + rooms = [ "office_room" ]; + }) + (light { + topic = "zigbee2mqtt/light_4"; + rooms = [ "office_room" ]; + }) + (light { + topic = "zigbee2mqtt/light_5"; + rooms = [ "storage_room" ]; + }) + (light { + topic = "zigbee2mqtt/light_7"; + rooms = [ "sleeping_room" ]; + }) + (led { + topic = "zigbee2mqtt/led_1"; + rooms = [ "office_room" ]; + }) + (led { + topic = "zigbee2mqtt/led_2"; + rooms = [ "kitchen" ]; + }) - #(sonoff { - # id = "PAL01"; - # rooms = [ "bed_room" ]; - #}) - #(sonoff { - # id = "PAL03"; - # rooms = [ "living_room" ]; - #}) - #(sonoff { - # id = "PAL04"; - # rooms = [ "bed_room" ]; - #}) - #(sonoff { - # id = "PAL06"; - # rooms = [ "kitchen" ]; - #}) - ## monitor and speakers - #(sonoff { - # id = "PAL07"; - # rooms = [ "bed_room" ]; - # delay = 180; - #}) - #(sonoff { - # id = "PAL08"; - # rooms = [ "bed_room" ]; - # delay = 180; - #}) + #(sonoff { + # id = "PAL01"; + # rooms = [ "bed_room" ]; + #}) + #(sonoff { + # id = "PAL03"; + # rooms = [ "living_room" ]; + #}) + #(sonoff { + # id = "PAL04"; + # rooms = [ "bed_room" ]; + #}) + #(sonoff { + # id = "PAL06"; + # rooms = [ "kitchen" ]; + #}) + ## monitor and speakers + #(sonoff { + # id = "PAL07"; + # rooms = [ "bed_room" ]; + # delay = 180; + #}) + #(sonoff { + # id = "PAL08"; + # rooms = [ "bed_room" ]; + # delay = 180; + #}) - ]; + ]; }; } diff --git a/nixos/configs/pepe/home-assistant/sonoff.nix b/nixos/configs/pepe/home-assistant/sonoff.nix index e492f6b..b290ee7 100644 --- a/nixos/configs/pepe/home-assistant/sonoff.nix +++ b/nixos/configs/pepe/home-assistant/sonoff.nix @@ -39,7 +39,8 @@ let toSwitch = name: "switch.${name}"; -in { +in +{ imports = [ ./mqtt.nix ]; @@ -47,28 +48,32 @@ in { # nicer names # ----------- - homeassistant.customize = lib.mapAttrs' (entity: - { label, icon ? "mdi:power-plug-off", ... }: { - name = toSwitch entity; - value = { - friendly_name = label; - icon = icon; - }; - }) sonoffSwitches; + homeassistant.customize = lib.mapAttrs' + (entity: + { label, icon ? "mdi:power-plug-off", ... }: { + name = toSwitch entity; + value = { + friendly_name = label; + icon = icon; + }; + }) + sonoffSwitches; # define switches # --------------- - switch = lib.mapAttrsToList (name: - { ... }: { - name = name; - platform = "mqtt"; - command_topic = "cmnd/${lib.toUpper name}/POWER"; - state_topic = "stat/${lib.toUpper name}/POWER"; - payload_on = "ON"; - payload_off = "OFF"; - state_on = "ON"; - state_off = "OFF"; - }) sonoffSwitches; + switch = lib.mapAttrsToList + (name: + { ... }: { + name = name; + platform = "mqtt"; + command_topic = "cmnd/${lib.toUpper name}/POWER"; + state_topic = "stat/${lib.toUpper name}/POWER"; + payload_on = "ON"; + payload_off = "OFF"; + state_on = "ON"; + state_off = "OFF"; + }) + sonoffSwitches; # discover state on init # ---------------------- @@ -78,27 +83,34 @@ in { platform = "homeassistant"; event = "start"; }; - action = lib.mapAttrsToList (name: - { ... }: { - service = "mqtt.publish"; - data = { - topic = "cmnd/${lib.toUpper name}/power"; - payload = ""; - }; - }) sonoffSwitches; + action = lib.mapAttrsToList + (name: + { ... }: { + service = "mqtt.publish"; + data = { + topic = "cmnd/${lib.toUpper name}/power"; + payload = ""; + }; + }) + sonoffSwitches; }]; # append to groups # ---------------- - group = let - # sort lights into given groups. - sortedInGroups = let - groupEntries = lib.zipAttrs (lib.flatten (lib.mapAttrsToList (name: - { groups ? [ ], ... }: - map (groupName: { "${groupName}" = "switch.${name}"; }) groups) - sonoffSwitches)); - in lib.mapAttrs (name: entities: { inherit entities; }) groupEntries; - in sortedInGroups; + group = + let + # sort lights into given groups. + sortedInGroups = + let + groupEntries = lib.zipAttrs (lib.flatten (lib.mapAttrsToList + (name: + { groups ? [ ], ... }: + map (groupName: { "${groupName}" = "switch.${name}"; }) groups) + sonoffSwitches)); + in + lib.mapAttrs (name: entities: { inherit entities; }) groupEntries; + in + sortedInGroups; }; } diff --git a/nixos/configs/pepe/home-assistant/stocks.nix b/nixos/configs/pepe/home-assistant/stocks.nix index 7afd2dd..33ccc50 100644 --- a/nixos/configs/pepe/home-assistant/stocks.nix +++ b/nixos/configs/pepe/home-assistant/stocks.nix @@ -27,40 +27,43 @@ let cleanup_list = list: lib.filter (entry: entry != { }) (lib.flatten list); -in { +in +{ services.homeAssistantConfig = { - sensor = cleanup_list (map ({ name, currency, own ? { }, ... }: [ - { - platform = "file"; - name = "stock_${name}"; - file_path = filePath name; - value_template = "{{ value_json.price}} ${currency}"; + sensor = cleanup_list (map + ({ name, currency, own ? { }, ... }: [ + { + platform = "file"; + name = "stock_${name}"; + file_path = filePath name; + value_template = "{{ value_json.price}} ${currency}"; - } - { - platform = "file"; - name = "stock_${name}_change"; - file_path = filePath name; - value_template = "{{ value_json.change}} ${currency}"; + } + { + platform = "file"; + name = "stock_${name}_change"; + file_path = filePath name; + value_template = "{{ value_json.change}} ${currency}"; - } - { - platform = "file"; - name = "stock_${name}_change_percent"; - file_path = filePath name; - value_template = "{{ value_json.change_percent}} %"; - } - (lib.optionalAttrs (own != { }) { - platform = "file"; - name = "stock_${name}_profit"; - file_path = filePath name; - value_template = '' - {{ "{:,.2f}".format( value_json.price * ${toString own.pieces} - ${ - toString (own.pieces * own.price) - } ) }} ${currency}''; - }) - ]) stocks); + } + { + platform = "file"; + name = "stock_${name}_change_percent"; + file_path = filePath name; + value_template = "{{ value_json.change_percent}} %"; + } + (lib.optionalAttrs (own != { }) { + platform = "file"; + name = "stock_${name}_profit"; + file_path = filePath name; + value_template = '' + {{ "{:,.2f}".format( value_json.price * ${toString own.pieces} - ${ + toString (own.pieces * own.price) + } ) }} ${currency}''; + }) + ]) + stocks); homeassistant = { whitelist_external_dirs = [ folderPath ]; @@ -94,7 +97,8 @@ in { friendly_name = "Profit"; }; }) - ]) stocks)); + ]) + stocks)); }; group = (builtins.listToAttrs (map @@ -108,66 +112,71 @@ in { "sensor.stock_${name}_change_percent" ] ++ (lib.optional (own != { }) "sensor.stock_${name}_profit"); }; - }) stocks)); + }) + stocks)); }; - systemd.services = let - pullService = { name, symbol, currency, ... }: { - name = "pull_stock_${name}"; - value = { - enable = true; - before = [ "home-assistant.service" ]; - wantedBy = [ "home-assistant.service" ]; - serviceConfig = { - User = "hass"; - Type = "oneshot"; - }; - description = "pull stock_${name} for homeassistant"; - script = '' - SYMBOL="${symbol}" - CURRENCY="${currency}" - APIKEY=${ - lib.fileContents - } + systemd.services = + let + pullService = { name, symbol, currency, ... }: { + name = "pull_stock_${name}"; + value = { + enable = true; + before = [ "home-assistant.service" ]; + wantedBy = [ "home-assistant.service" ]; + serviceConfig = { + User = "hass"; + Type = "oneshot"; + }; + description = "pull stock_${name} for homeassistant"; + script = '' + SYMBOL="${symbol}" + CURRENCY="${currency}" + APIKEY=${ + lib.fileContents + } - ${pkgs.curl}/bin/curl --location --silent \ - "https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=$SYMBOL&apikey=$APIKEY" \ - | ${pkgs.jq}/bin/jq --compact-output \ - '.["Global Quote"] | - { - price: .["05. price"] | tonumber, - currency: "'$CURRENCY'", - change_percent: .["10. change percent"] | .[0:-1] | tonumber, - change: .["09. change"] | tonumber, - last_date: .["07. latest trading day"], - }' \ - >> ${filePath name} + ${pkgs.curl}/bin/curl --location --silent \ + "https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=$SYMBOL&apikey=$APIKEY" \ + | ${pkgs.jq}/bin/jq --compact-output \ + '.["Global Quote"] | + { + price: .["05. price"] | tonumber, + currency: "'$CURRENCY'", + change_percent: .["10. change percent"] | .[0:-1] | tonumber, + change: .["09. change"] | tonumber, + last_date: .["07. latest trading day"], + }' \ + >> ${filePath name} - # old and stupid - #${pkgs.curl}/bin/curl --location --silent \ - #"https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=$SYMBOL&interval=5min&apikey=$APIKEY" \ - #| ${pkgs.jq}/bin/jq --compact-output \ - # '.["Time Series (5min)"] | to_entries | [ .[] - # | { date : .key , value : .value["4. close"], currency: "'$CURRENCY'" } ] - # | sort_by(.date) | reverse | .[0]' \ - ''; - }; - }; - in builtins.listToAttrs (map pullService stocks); - - systemd.timers = let - pullTimer = { name, ... }: { - name = "pull_stock_${name}"; - value = { - enable = true; - wantedBy = [ "multi-user.target" ]; - timerConfig = { - OnCalendar = "hourly"; - Persistent = "true"; + # old and stupid + #${pkgs.curl}/bin/curl --location --silent \ + #"https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=$SYMBOL&interval=5min&apikey=$APIKEY" \ + #| ${pkgs.jq}/bin/jq --compact-output \ + # '.["Time Series (5min)"] | to_entries | [ .[] + # | { date : .key , value : .value["4. close"], currency: "'$CURRENCY'" } ] + # | sort_by(.date) | reverse | .[0]' \ + ''; }; }; - }; - in builtins.listToAttrs (map pullTimer stocks); + in + builtins.listToAttrs (map pullService stocks); + + systemd.timers = + let + pullTimer = { name, ... }: { + name = "pull_stock_${name}"; + value = { + enable = true; + wantedBy = [ "multi-user.target" ]; + timerConfig = { + OnCalendar = "hourly"; + Persistent = "true"; + }; + }; + }; + in + builtins.listToAttrs (map pullTimer stocks); } diff --git a/nixos/configs/pepe/home-assistant/workday.nix b/nixos/configs/pepe/home-assistant/workday.nix index 1ac918a..00fdeec 100644 --- a/nixos/configs/pepe/home-assistant/workday.nix +++ b/nixos/configs/pepe/home-assistant/workday.nix @@ -2,7 +2,7 @@ let holiday-range = month: dayA: dayB: map (day: "${month}-${toString day}") - (map (lib.fixedWidthNumber 2) (lib.range dayA dayB)); + (map (lib.fixedWidthNumber 2) (lib.range dayA dayB)); privateHolidays = import ; # for example : # holidays = lib.flatten [ @@ -11,7 +11,8 @@ let #]; holidays = lib.flatten (privateHolidays holiday-range); -in { +in +{ services.homeAssistantConfig = { binary_sensor = [ diff --git a/nixos/configs/pepe/home-assistant/zigbee2mqtt/buttons.nix b/nixos/configs/pepe/home-assistant/zigbee2mqtt/buttons.nix index 943f30c..7d5d6d5 100644 --- a/nixos/configs/pepe/home-assistant/zigbee2mqtt/buttons.nix +++ b/nixos/configs/pepe/home-assistant/zigbee2mqtt/buttons.nix @@ -32,81 +32,91 @@ let }; }; -in { +in +{ - services.zigbee2mqttConfiguration = lib.mapAttrs' (name: - { id, ... }: { - name = id; - value = { - retain = false; - friendly_name = name; - }; - }) allDevices; + services.zigbee2mqttConfiguration = lib.mapAttrs' + (name: + { id, ... }: { + name = id; + value = { + retain = false; + friendly_name = name; + }; + }) + allDevices; services.homeAssistantConfig = { # define input_boolean # -------------------- # which get toggled by the buttons - input_boolean = let stripEmpty = lib.filter (a: a != { }); - in builtins.listToAttrs (stripEmpty (lib.flatten (lib.mapAttrsToList (name: - { states ? { }, ... }: [ - (lib.optionalAttrs (!lib.hasAttr "single" states) { - name = "single_${name}"; - value = { icon = "mdi:toggle-switch"; }; - }) - (lib.optionalAttrs (!lib.hasAttr "double" states) { - name = "double_${name}"; - value = { icon = "mdi:toggle-switch"; }; - }) - (lib.optionalAttrs (!lib.hasAttr "hold" states) { - name = "hold_${name}"; - value = { icon = "mdi:toggle-switch"; }; - }) - ]) allDevices))); + input_boolean = + let stripEmpty = lib.filter (a: a != { }); + in builtins.listToAttrs (stripEmpty (lib.flatten (lib.mapAttrsToList + (name: + { states ? { }, ... }: [ + (lib.optionalAttrs (!lib.hasAttr "single" states) { + name = "single_${name}"; + value = { icon = "mdi:toggle-switch"; }; + }) + (lib.optionalAttrs (!lib.hasAttr "double" states) { + name = "double_${name}"; + value = { icon = "mdi:toggle-switch"; }; + }) + (lib.optionalAttrs (!lib.hasAttr "hold" states) { + name = "hold_${name}"; + value = { icon = "mdi:toggle-switch"; }; + }) + ]) + allDevices))); # define meta information sensors - sensor = lib.flatten (lib.mapAttrsToList (name: - { ... }: [ - { - platform = "mqtt"; - name = name; - icon = "mdi:toggle-switch"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - value_template = "{{ value_json.click }}"; - } - { - name = "battery_${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - unit_of_measurement = "%"; - icon = "mdi:battery-10"; - value_template = "{{ value_json.battery }}"; - } - { - name = "link_${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - icon = "mdi:signal"; - unit_of_measurement = "lqi"; - value_template = "{{ value_json.linkquality }}"; - } - ]) allDevices); + sensor = lib.flatten (lib.mapAttrsToList + (name: + { ... }: [ + { + platform = "mqtt"; + name = name; + icon = "mdi:toggle-switch"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + value_template = "{{ value_json.click }}"; + } + { + name = "battery_${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + unit_of_measurement = "%"; + icon = "mdi:battery-10"; + value_template = "{{ value_json.battery }}"; + } + { + name = "link_${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + icon = "mdi:signal"; + unit_of_measurement = "lqi"; + value_template = "{{ value_json.linkquality }}"; + } + ]) + allDevices); - binary_sensor = lib.mapAttrsToList (name: - { ... }: { - name = name; - platform = "mqtt"; - device_class = "motion"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - payload_on = true; - payload_off = false; - value_template = "{{ value_json.occupancy }}"; - }) allDevices; + binary_sensor = lib.mapAttrsToList + (name: + { ... }: { + name = name; + platform = "mqtt"; + device_class = "motion"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + payload_on = true; + payload_off = false; + value_template = "{{ value_json.occupancy }}"; + }) + allDevices; # create groups # ------------- @@ -144,82 +154,96 @@ in { # create automation # ----------------- - automation = let + automation = + let - # single click - toggle_single_button_input = lib.mapAttrsToList (name: - { states ? { }, ... }: - let - entityId = if (lib.hasAttr "single" states) then - states.single - else - "input_boolean.single_${name}"; - in { - alias = "toggle single click ${name}"; - trigger = { - platform = "mqtt"; - topic = "zigbee2mqtt/${name}"; - }; - condition = { - condition = "template"; - value_template = ''{{ "single" == trigger.payload_json.click}}''; - }; - action = { - service = "input_boolean.toggle"; - data.entity_id = entityId; - }; - }) allDevices; + # single click + toggle_single_button_input = lib.mapAttrsToList + (name: + { states ? { }, ... }: + let + entityId = + if (lib.hasAttr "single" states) then + states.single + else + "input_boolean.single_${name}"; + in + { + alias = "toggle single click ${name}"; + trigger = { + platform = "mqtt"; + topic = "zigbee2mqtt/${name}"; + }; + condition = { + condition = "template"; + value_template = ''{{ "single" == trigger.payload_json.click}}''; + }; + action = { + service = "input_boolean.toggle"; + data.entity_id = entityId; + }; + }) + allDevices; - # double click - toggle_double_button_input = lib.mapAttrsToList (name: - { states ? { }, ... }: - let - entityId = if (lib.hasAttr "double" states) then - states.double - else - "input_boolean.double_${name}"; - in { - alias = "toggle double click ${name}"; - trigger = { - platform = "mqtt"; - topic = "zigbee2mqtt/${name}"; - }; - condition = { - condition = "template"; - value_template = ''{{ "double" == trigger.payload_json.click}}''; - }; - action = { - service = "input_boolean.toggle"; - data.entity_id = entityId; - }; - }) allDevices; + # double click + toggle_double_button_input = lib.mapAttrsToList + (name: + { states ? { }, ... }: + let + entityId = + if (lib.hasAttr "double" states) then + states.double + else + "input_boolean.double_${name}"; + in + { + alias = "toggle double click ${name}"; + trigger = { + platform = "mqtt"; + topic = "zigbee2mqtt/${name}"; + }; + condition = { + condition = "template"; + value_template = ''{{ "double" == trigger.payload_json.click}}''; + }; + action = { + service = "input_boolean.toggle"; + data.entity_id = entityId; + }; + }) + allDevices; - # hold - toggle_hold_button_input = lib.mapAttrsToList (name: - { states ? { }, ... }: - let - entityId = if (lib.hasAttr "hold" states) then - states.hold - else - "input_boolean.hold_${name}"; - in { - alias = "toggle hold ${name}"; - trigger = { - platform = "mqtt"; - topic = "zigbee2mqtt/${name}"; - }; - condition = { - condition = "template"; - value_template = ''{{ "hold" == trigger.payload_json.action}}''; - }; - action = { - service = "input_boolean.toggle"; - data.entity_id = entityId; - }; - }) allDevices; + # hold + toggle_hold_button_input = lib.mapAttrsToList + (name: + { states ? { }, ... }: + let + entityId = + if (lib.hasAttr "hold" states) then + states.hold + else + "input_boolean.hold_${name}"; + in + { + alias = "toggle hold ${name}"; + trigger = { + platform = "mqtt"; + topic = "zigbee2mqtt/${name}"; + }; + condition = { + condition = "template"; + value_template = ''{{ "hold" == trigger.payload_json.action}}''; + }; + action = { + service = "input_boolean.toggle"; + data.entity_id = entityId; + }; + }) + allDevices; - in lib.flatten (toggle_single_button_input ++ toggle_double_button_input - ++ toggle_hold_button_input); + in + lib.flatten (toggle_single_button_input ++ toggle_double_button_input + ++ toggle_hold_button_input); }; diff --git a/nixos/configs/pepe/home-assistant/zigbee2mqtt/doors.nix b/nixos/configs/pepe/home-assistant/zigbee2mqtt/doors.nix index 634ecbf..2298e21 100644 --- a/nixos/configs/pepe/home-assistant/zigbee2mqtt/doors.nix +++ b/nixos/configs/pepe/home-assistant/zigbee2mqtt/doors.nix @@ -10,77 +10,91 @@ let "door_sensor_5" = { id = "0x00158d0003120d3e"; }; }; -in { +in +{ - services.zigbee2mqttConfiguration = lib.mapAttrs' (name: - { id, ... }: { - name = id; - value = { - retain = false; - friendly_name = name; - }; - }) allDevices; + services.zigbee2mqttConfiguration = lib.mapAttrs' + (name: + { id, ... }: { + name = id; + value = { + retain = false; + friendly_name = name; + }; + }) + allDevices; services.homeAssistantConfig = { # define meta information sensors - sensor = lib.flatten (lib.mapAttrsToList (name: - { ... }: [ - { - name = "battery_${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - unit_of_measurement = "%"; - icon = "mdi:battery-10"; - value_template = "{{ value_json.battery }}"; - } - { - name = "link_${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - icon = "mdi:signal"; - unit_of_measurement = "lqi"; - value_template = "{{ value_json.linkquality }}"; - } - ]) allDevices); + sensor = lib.flatten (lib.mapAttrsToList + (name: + { ... }: [ + { + name = "battery_${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + unit_of_measurement = "%"; + icon = "mdi:battery-10"; + value_template = "{{ value_json.battery }}"; + } + { + name = "link_${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + icon = "mdi:signal"; + unit_of_measurement = "lqi"; + value_template = "{{ value_json.linkquality }}"; + } + ]) + allDevices); - binary_sensor = lib.mapAttrsToList (name: - { ... }: { - name = name; - platform = "mqtt"; - device_class = "door"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - payload_on = false; - payload_off = true; - value_template = "{{ value_json.contact}}"; - }) allDevices; + binary_sensor = lib.mapAttrsToList + (name: + { ... }: { + name = name; + platform = "mqtt"; + device_class = "door"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + payload_on = false; + payload_off = true; + value_template = "{{ value_json.contact}}"; + }) + allDevices; # create groups # ------------- - group = let - # to have nice panels for every device - sensorGroups = lib.mapAttrs (name: - { ... }: { - entities = [ - "binary_sensor.${name}" - "sensor.battery_${name}" - "sensor.link_${name}" - ]; - }) allDevices; - # sort lights into given groups. - sortedInGroups = let - groupEntries = lib.zipAttrs (lib.flatten (lib.mapAttrsToList (name: - { groups ? [ ], ... }: - map (groupName: { "${groupName}" = "binary_sensor.${name}"; }) groups) - allDevices)); - in lib.mapAttrs (name: entities: { inherit entities; }) groupEntries; - in sortedInGroups // sensorGroups // { - all_sensors.entities = - lib.mapAttrsToList (name: { ... }: "binary_sensor.${name}") allDevices; - }; + group = + let + # to have nice panels for every device + sensorGroups = lib.mapAttrs + (name: + { ... }: { + entities = [ + "binary_sensor.${name}" + "sensor.battery_${name}" + "sensor.link_${name}" + ]; + }) + allDevices; + # sort lights into given groups. + sortedInGroups = + let + groupEntries = lib.zipAttrs (lib.flatten (lib.mapAttrsToList + (name: + { groups ? [ ], ... }: + map (groupName: { "${groupName}" = "binary_sensor.${name}"; }) groups) + allDevices)); + in + lib.mapAttrs (name: entities: { inherit entities; }) groupEntries; + in + sortedInGroups // sensorGroups // { + all_sensors.entities = + lib.mapAttrsToList (name: { ... }: "binary_sensor.${name}") allDevices; + }; }; diff --git a/nixos/configs/pepe/home-assistant/zigbee2mqtt/fyrtur.nix b/nixos/configs/pepe/home-assistant/zigbee2mqtt/fyrtur.nix index 6001e5d..f490df4 100644 --- a/nixos/configs/pepe/home-assistant/zigbee2mqtt/fyrtur.nix +++ b/nixos/configs/pepe/home-assistant/zigbee2mqtt/fyrtur.nix @@ -11,41 +11,46 @@ let # -t "zigbee2mqtt/fyrtur1/set" -m '{"position":100}' # -t "zigbee2mqtt/fyrtur1/set" -m '{"position":15}' -in { +in +{ - services.zigbee2mqttConfiguration = lib.mapAttrs' (name: - { id, ... }: { - name = id; - value = { - retain = false; - friendly_name = name; - transition = 0.1; - }; - }) allDevices; + services.zigbee2mqttConfiguration = lib.mapAttrs' + (name: + { id, ... }: { + name = id; + value = { + retain = false; + friendly_name = name; + transition = 0.1; + }; + }) + allDevices; services.homeAssistantConfig = { - sensor = lib.flatten (lib.mapAttrsToList (name: - { ... }: [ - { - name = "battery_${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - unit_of_measurement = "%"; - icon = "mdi:battery-10"; - value_template = "{{ value_json.battery }}"; - } - { - name = "link_${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - icon = "mdi:signal"; - unit_of_measurement = "lqi"; - value_template = "{{ value_json.linkquality }}"; - } - ]) allDevices); + sensor = lib.flatten (lib.mapAttrsToList + (name: + { ... }: [ + { + name = "battery_${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + unit_of_measurement = "%"; + icon = "mdi:battery-10"; + value_template = "{{ value_json.battery }}"; + } + { + name = "link_${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + icon = "mdi:signal"; + unit_of_measurement = "lqi"; + value_template = "{{ value_json.linkquality }}"; + } + ]) + allDevices); }; diff --git a/nixos/configs/pepe/home-assistant/zigbee2mqtt/heater.nix b/nixos/configs/pepe/home-assistant/zigbee2mqtt/heater.nix index 6166667..426cf11 100644 --- a/nixos/configs/pepe/home-assistant/zigbee2mqtt/heater.nix +++ b/nixos/configs/pepe/home-assistant/zigbee2mqtt/heater.nix @@ -12,68 +12,73 @@ let # -t "zigbee2mqtt/heater3/set" -m '{"system_mode":"auto","current_heating_setpoint":23}' # -t "zigbee2mqtt/heater3/set" -m '{"system_mode":"off"}' -in { +in +{ - services.zigbee2mqttConfiguration = lib.mapAttrs' (name: - { id, ... }: { - name = id; - value = { - legacy = false; - retain = false; - friendly_name = name; - transition = 1; - debounce = 0.5; - filtered_attributes = [ - "battery_low" - "eurotronic_host_flags" - "eurotronic_system_mode" - #"occupied_heating_setpoint" - #"pi_heating_demand" - #"unoccupied_heating_setpoint" - ]; - }; - }) allDevices; + services.zigbee2mqttConfiguration = lib.mapAttrs' + (name: + { id, ... }: { + name = id; + value = { + legacy = false; + retain = false; + friendly_name = name; + transition = 1; + debounce = 0.5; + filtered_attributes = [ + "battery_low" + "eurotronic_host_flags" + "eurotronic_system_mode" + #"occupied_heating_setpoint" + #"pi_heating_demand" + #"unoccupied_heating_setpoint" + ]; + }; + }) + allDevices; services.homeAssistantConfig = { - sensor = lib.flatten (lib.mapAttrsToList (name: - { ... }: [ - { - name = "battery_${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - unit_of_measurement = "%"; - icon = "mdi:battery-10"; - value_template = "{{ value_json.battery }}"; - } - { - name = "link_${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - icon = "mdi:signal"; - unit_of_measurement = "lqi"; - value_template = "{{ value_json.linkquality }}"; - } - { - platform = "mqtt"; - name = "temperature_${name}"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - unit_of_measurement = "°C"; - device_class = "temperature"; - value_template = "{{ value_json.local_temperature }}"; - } - { - platform = "mqtt"; - name = "pi_heating_demand_${name}"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - unit_of_measurement = "%"; - value_template = "{{ value_json.pi_heating_demand }}"; - } - ]) allDevices); + sensor = lib.flatten (lib.mapAttrsToList + (name: + { ... }: [ + { + name = "battery_${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + unit_of_measurement = "%"; + icon = "mdi:battery-10"; + value_template = "{{ value_json.battery }}"; + } + { + name = "link_${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + icon = "mdi:signal"; + unit_of_measurement = "lqi"; + value_template = "{{ value_json.linkquality }}"; + } + { + platform = "mqtt"; + name = "temperature_${name}"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + unit_of_measurement = "°C"; + device_class = "temperature"; + value_template = "{{ value_json.local_temperature }}"; + } + { + platform = "mqtt"; + name = "pi_heating_demand_${name}"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + unit_of_measurement = "%"; + value_template = "{{ value_json.pi_heating_demand }}"; + } + ]) + allDevices); }; diff --git a/nixos/configs/pepe/home-assistant/zigbee2mqtt/leds.nix b/nixos/configs/pepe/home-assistant/zigbee2mqtt/leds.nix index c78e54a..bd99fa0 100644 --- a/nixos/configs/pepe/home-assistant/zigbee2mqtt/leds.nix +++ b/nixos/configs/pepe/home-assistant/zigbee2mqtt/leds.nix @@ -11,32 +11,37 @@ let # -t "zigbee2mqtt/led_1/set" -m '{"state":"OFF","transition":0, "color_temp":255}' # -t "zigbee2mqtt/led_1/set" -m '{"state":"ON","brightness":255,"color":{"hex":"#00FFFF"}}' # -t "zigbee2mqtt/led_1/set" -m '{"state":"OFF"}' -in { +in +{ - services.zigbee2mqttConfiguration = lib.mapAttrs' (name: - { id, ... }: { - name = id; - value = { - retain = false; - friendly_name = name; - transition = 1; - }; - }) allDevices; + services.zigbee2mqttConfiguration = lib.mapAttrs' + (name: + { id, ... }: { + name = id; + value = { + retain = false; + friendly_name = name; + transition = 1; + }; + }) + allDevices; services.homeAssistantConfig = { - light = lib.mapAttrsToList (name: - { ... }: { - platform = "mqtt"; - name = name; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - command_topic = "zigbee2mqtt/${name}/set"; - value_template = "{{ value_json.click }}"; - brightness = true; - color_temp = true; - schema = "json"; - }) allDevices; + light = lib.mapAttrsToList + (name: + { ... }: { + platform = "mqtt"; + name = name; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + command_topic = "zigbee2mqtt/${name}/set"; + value_template = "{{ value_json.click }}"; + brightness = true; + color_temp = true; + schema = "json"; + }) + allDevices; }; diff --git a/nixos/configs/pepe/home-assistant/zigbee2mqtt/lights.nix b/nixos/configs/pepe/home-assistant/zigbee2mqtt/lights.nix index 53cd8c3..8b9cb3e 100644 --- a/nixos/configs/pepe/home-assistant/zigbee2mqtt/lights.nix +++ b/nixos/configs/pepe/home-assistant/zigbee2mqtt/lights.nix @@ -13,32 +13,37 @@ let "light_8" = { id = "0x7cb03eaa0a0384d3"; }; }; -in { +in +{ - services.zigbee2mqttConfiguration = lib.mapAttrs' (name: - { id, ... }: { - name = id; - value = { - retain = false; - friendly_name = name; - osram_set_transition = 2; # time in seconds (integer or float) - }; - }) allDevices; + services.zigbee2mqttConfiguration = lib.mapAttrs' + (name: + { id, ... }: { + name = id; + value = { + retain = false; + friendly_name = name; + osram_set_transition = 2; # time in seconds (integer or float) + }; + }) + allDevices; services.homeAssistantConfig = { - light = lib.mapAttrsToList (name: - { ... }: { - platform = "mqtt"; - name = name; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - command_topic = "zigbee2mqtt/${name}/set"; - value_template = "{{ value_json.click }}"; - brightness = true; - color_temp = true; - schema = "json"; - }) allDevices; + light = lib.mapAttrsToList + (name: + { ... }: { + platform = "mqtt"; + name = name; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + command_topic = "zigbee2mqtt/${name}/set"; + value_template = "{{ value_json.click }}"; + brightness = true; + color_temp = true; + schema = "json"; + }) + allDevices; # sensor = with lib; # mapAttrsToList (name: diff --git a/nixos/configs/pepe/home-assistant/zigbee2mqtt/motion.nix b/nixos/configs/pepe/home-assistant/zigbee2mqtt/motion.nix index ea1376e..cddb06c 100644 --- a/nixos/configs/pepe/home-assistant/zigbee2mqtt/motion.nix +++ b/nixos/configs/pepe/home-assistant/zigbee2mqtt/motion.nix @@ -14,56 +14,63 @@ let "motion_sensor_8" = { id = "0x00158d0002f04637"; }; }; -in { +in +{ - services.zigbee2mqttConfiguration = lib.mapAttrs' (name: - { id, timeout ? 65, ... }: { - name = id; - value = { - retain = false; - friendly_name = name; - # should not be set below 60 seconds - occupancy_timeout = timeout; - }; - }) allDevices; + services.zigbee2mqttConfiguration = lib.mapAttrs' + (name: + { id, timeout ? 65, ... }: { + name = id; + value = { + retain = false; + friendly_name = name; + # should not be set below 60 seconds + occupancy_timeout = timeout; + }; + }) + allDevices; services.homeAssistantConfig = { # define meta information sensors - binary_sensor = lib.flatten (lib.mapAttrsToList (name: - { ... }: [{ - name = "${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - value_template = "{{ value_json.occupancy }}"; - #icon = "mdi:battery-10"; - payload_on = true; - payload_off = false; - device_class = "motion"; - }]) allDevices); + binary_sensor = lib.flatten (lib.mapAttrsToList + (name: + { ... }: [{ + name = "${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + value_template = "{{ value_json.occupancy }}"; + #icon = "mdi:battery-10"; + payload_on = true; + payload_off = false; + device_class = "motion"; + }]) + allDevices); # define meta information sensors - sensor = lib.flatten (lib.mapAttrsToList (name: - { ... }: [ - { - name = "battery_${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - unit_of_measurement = "%"; - icon = "mdi:battery-10"; - value_template = "{{ value_json.battery }}"; - } - { - name = "link_${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - icon = "mdi:signal"; - unit_of_measurement = "lqi"; - value_template = "{{ value_json.linkquality }}"; - } - ]) allDevices); + sensor = lib.flatten (lib.mapAttrsToList + (name: + { ... }: [ + { + name = "battery_${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + unit_of_measurement = "%"; + icon = "mdi:battery-10"; + value_template = "{{ value_json.battery }}"; + } + { + name = "link_${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + icon = "mdi:signal"; + unit_of_measurement = "lqi"; + value_template = "{{ value_json.linkquality }}"; + } + ]) + allDevices); }; } diff --git a/nixos/configs/pepe/home-assistant/zigbee2mqtt/repeater.nix b/nixos/configs/pepe/home-assistant/zigbee2mqtt/repeater.nix index da90113..48fa89e 100644 --- a/nixos/configs/pepe/home-assistant/zigbee2mqtt/repeater.nix +++ b/nixos/configs/pepe/home-assistant/zigbee2mqtt/repeater.nix @@ -9,10 +9,13 @@ let "repeater4" = { id = "0x680ae2fffe8e2e71"; }; }; -in { - services.zigbee2mqttConfiguration = lib.mapAttrs' (name: - { id, ... }: { - name = id; - value = { friendly_name = name; }; - }) allDevices; +in +{ + services.zigbee2mqttConfiguration = lib.mapAttrs' + (name: + { id, ... }: { + name = id; + value = { friendly_name = name; }; + }) + allDevices; } diff --git a/nixos/configs/pepe/home-assistant/zigbee2mqtt/service.nix b/nixos/configs/pepe/home-assistant/zigbee2mqtt/service.nix index a6fd536..6c606f2 100644 --- a/nixos/configs/pepe/home-assistant/zigbee2mqtt/service.nix +++ b/nixos/configs/pepe/home-assistant/zigbee2mqtt/service.nix @@ -26,7 +26,8 @@ let # is copied from the store on startup devices = "devices.yaml"; }; -in { +in +{ options.custom.services.zigbee2mqtt = { enable = mkEnableOption "enable zigbee2mqtt service"; diff --git a/nixos/configs/pepe/home-assistant/zigbee2mqtt/temperatur.nix b/nixos/configs/pepe/home-assistant/zigbee2mqtt/temperatur.nix index c9e9862..e3f5e3e 100644 --- a/nixos/configs/pepe/home-assistant/zigbee2mqtt/temperatur.nix +++ b/nixos/configs/pepe/home-assistant/zigbee2mqtt/temperatur.nix @@ -13,68 +13,73 @@ let }; }; -in { +in +{ - services.zigbee2mqttConfiguration = lib.mapAttrs' (name: - { id, ... }: { - name = id; - value = { - retain = false; - friendly_name = name; - }; - }) allDevices; + services.zigbee2mqttConfiguration = lib.mapAttrs' + (name: + { id, ... }: { + name = id; + value = { + retain = false; + friendly_name = name; + }; + }) + allDevices; services.homeAssistantConfig = { # define meta information sensors - sensor = lib.flatten (lib.mapAttrsToList (name: - { ... }: [ - { - platform = "mqtt"; - name = name; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - unit_of_measurement = "°C"; - device_class = "temperature"; - value_template = "{{ value_json.temperature }}"; - } - { - platform = "mqtt"; - name = "humidity_${name}"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - unit_of_measurement = "%"; - device_class = "humidity"; - value_template = "{{ value_json.humidity }}"; - } - #{ - # platform = "mqtt"; - # name = "pressure_${name}"; - # state_topic = "zigbee2mqtt/${name}"; - # availability_topic = "zigbee2mqtt/bridge/state"; - # unit_of_measurement = "hPa"; - # device_class = "pressure"; - # value_template = "{{ value_json.pressure }}"; - #} - { - name = "battery_${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - unit_of_measurement = "%"; - icon = "mdi:battery-10"; - value_template = "{{ value_json.battery }}"; - } - { - name = "link_${name}"; - platform = "mqtt"; - state_topic = "zigbee2mqtt/${name}"; - availability_topic = "zigbee2mqtt/bridge/state"; - icon = "mdi:signal"; - unit_of_measurement = "lqi"; - value_template = "{{ value_json.linkquality }}"; - } - ]) allDevices); + sensor = lib.flatten (lib.mapAttrsToList + (name: + { ... }: [ + { + platform = "mqtt"; + name = name; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + unit_of_measurement = "°C"; + device_class = "temperature"; + value_template = "{{ value_json.temperature }}"; + } + { + platform = "mqtt"; + name = "humidity_${name}"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + unit_of_measurement = "%"; + device_class = "humidity"; + value_template = "{{ value_json.humidity }}"; + } + #{ + # platform = "mqtt"; + # name = "pressure_${name}"; + # state_topic = "zigbee2mqtt/${name}"; + # availability_topic = "zigbee2mqtt/bridge/state"; + # unit_of_measurement = "hPa"; + # device_class = "pressure"; + # value_template = "{{ value_json.pressure }}"; + #} + { + name = "battery_${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + unit_of_measurement = "%"; + icon = "mdi:battery-10"; + value_template = "{{ value_json.battery }}"; + } + { + name = "link_${name}"; + platform = "mqtt"; + state_topic = "zigbee2mqtt/${name}"; + availability_topic = "zigbee2mqtt/bridge/state"; + icon = "mdi:signal"; + unit_of_measurement = "lqi"; + value_template = "{{ value_json.linkquality }}"; + } + ]) + allDevices); # create groups # ------------- diff --git a/nixos/configs/pepe/lan.nix b/nixos/configs/pepe/lan.nix index c7877fd..bb3d529 100644 --- a/nixos/configs/pepe/lan.nix +++ b/nixos/configs/pepe/lan.nix @@ -5,7 +5,8 @@ let ipAddress = "10.1.0.2"; prefixLength = 24; -in { +in +{ networking.extraHosts = '' 10.1.0.1 workout.lan diff --git a/nixos/configs/pepe/mpd.nix b/nixos/configs/pepe/mpd.nix index a54fa77..239c236 100644 --- a/nixos/configs/pepe/mpd.nix +++ b/nixos/configs/pepe/mpd.nix @@ -30,63 +30,63 @@ services.spotifyd.enable = true; services.spotifyd.config = '' -[global] -username_cmd = "cat ${config.sops.secrets.spotify_user.path}" -password_cmd = "cat ${config.sops.secrets.spotify_pass.path}" -backend = "alsa" # use portaudio for macOS [homebrew] -# The alsa audio device to stream audio to. To get a -# list of valid devices, run `aplay -L`, -#device = "alsa_audio_device" # omit for macOS -# The alsa mixer used by `spotifyd`. -mixer = "PCM" # omit for macOS + [global] + username_cmd = "cat ${config.sops.secrets.spotify_user.path}" + password_cmd = "cat ${config.sops.secrets.spotify_pass.path}" + backend = "alsa" # use portaudio for macOS [homebrew] + # The alsa audio device to stream audio to. To get a + # list of valid devices, run `aplay -L`, + #device = "alsa_audio_device" # omit for macOS + # The alsa mixer used by `spotifyd`. + mixer = "PCM" # omit for macOS -# A script that gets evaluated in the user's shell when the song changes [aliases: onevent] -on-song-change-hook = "${pkgs.mpc_cli}/bin/mpc --host localhost --port 6600 stop" + # A script that gets evaluated in the user's shell when the song changes [aliases: onevent] + on-song-change-hook = "${pkgs.mpc_cli}/bin/mpc --host localhost --port 6600 stop" -# The volume controller. Each one behaves different to -# volume increases. For possible values, run -# `spotifyd --help`. -volume_controller = "alsa" # use softvol for macOS + # The volume controller. Each one behaves different to + # volume increases. For possible values, run + # `spotifyd --help`. + volume_controller = "alsa" # use softvol for macOS -# The name that gets displayed under the connect tab on -# official clients. Spaces are not allowed! -device_name = "DJane" + # The name that gets displayed under the connect tab on + # official clients. Spaces are not allowed! + device_name = "DJane" -# The audio bitrate. 96, 160 or 320 kbit/s -bitrate = 320 + # The audio bitrate. 96, 160 or 320 kbit/s + bitrate = 320 -# The directory used to cache audio data. This setting can save -# a lot of bandwidth when activated, as it will avoid re-downloading -# audio files when replaying them. -# -# Note: The file path does not get expanded. Environment variables and -# shell placeholders like $HOME or ~ don't work! -#cache_path = "cache_directory" + # The directory used to cache audio data. This setting can save + # a lot of bandwidth when activated, as it will avoid re-downloading + # audio files when replaying them. + # + # Note: The file path does not get expanded. Environment variables and + # shell placeholders like $HOME or ~ don't work! + #cache_path = "cache_directory" -# If set to true, audio data does NOT get cached. -no_audio_cache = true + # If set to true, audio data does NOT get cached. + no_audio_cache = true -# Volume on startup between 0 and 100 -# NOTE: This variable's type will change in v0.4, to a number (instead of string) -initial_volume = "90" + # Volume on startup between 0 and 100 + # NOTE: This variable's type will change in v0.4, to a number (instead of string) + initial_volume = "90" -# If set to true, enables volume normalisation between songs. -volume_normalisation = false + # If set to true, enables volume normalisation between songs. + volume_normalisation = false -# The normalisation pregain that is applied for each song. -# normalisation_pregain = -10 + # The normalisation pregain that is applied for each song. + # normalisation_pregain = -10 -# The port `spotifyd` uses to announce its service over the network. -zeroconf_port = 1234 + # The port `spotifyd` uses to announce its service over the network. + zeroconf_port = 1234 -# The proxy `spotifyd` will use to connect to spotify. -#proxy = "http://proxy.example.org:8080" + # The proxy `spotifyd` will use to connect to spotify. + #proxy = "http://proxy.example.org:8080" -# The displayed device type in Spotify clients. -# Can be unknown, computer, tablet, smartphone, speaker, t_v, -# a_v_r (Audio/Video Receiver), s_t_b (Set-Top Box), and audio_dongle. -device_type = "computer" -''; + # The displayed device type in Spotify clients. + # Can be unknown, computer, tablet, smartphone, speaker, t_v, + # a_v_r (Audio/Video Receiver), s_t_b (Set-Top Box), and audio_dongle. + device_type = "computer" + ''; } diff --git a/nixos/configs/pepe/taskwarrior-pushover.nix b/nixos/configs/pepe/taskwarrior-pushover.nix index bae8937..b262bc3 100644 --- a/nixos/configs/pepe/taskwarrior-pushover.nix +++ b/nixos/configs/pepe/taskwarrior-pushover.nix @@ -11,7 +11,7 @@ services.taskwarrior-pushover = { enable = true; - recurrence="on"; + recurrence = "on"; onCalendar = "06:30:00"; server = "taskd.ingolf-wagner.de:53589"; pushoverApiTokenFile = config.sops.secrets.pushoverApiToken.path; @@ -19,6 +19,6 @@ caFile = config.sops.secrets.taskwarriorCa.path; certificateFile = config.sops.secrets.taskwarriorCertificate.path; keyFile = config.sops.secrets.taskwarriorKey.path; - credentials= "1337/palo/ed0fdbe8-2dc3-408b-84cb-d07d363bccd2"; + credentials = "1337/palo/ed0fdbe8-2dc3-408b-84cb-d07d363bccd2"; }; } diff --git a/nixos/configs/pepe/wifi-access-point.nix b/nixos/configs/pepe/wifi-access-point.nix index a602201..b7e5cd4 100644 --- a/nixos/configs/pepe/wifi-access-point.nix +++ b/nixos/configs/pepe/wifi-access-point.nix @@ -10,7 +10,8 @@ let ssid = "palosiot"; wifiPassword = lib.fileContents ; -in { +in +{ # todo only open needed ports networking.firewall.trustedInterfaces = [ wifi ]; diff --git a/nixos/configs/porani/hardware-configuration.nix b/nixos/configs/porani/hardware-configuration.nix index 343190b..269d03a 100644 --- a/nixos/configs/porani/hardware-configuration.nix +++ b/nixos/configs/porani/hardware-configuration.nix @@ -27,26 +27,28 @@ # automount # --------- - (let mediaUUID = "3d106f56-89e5-400d-9d6b-1dd957919548"; - in { - fileSystems."/media" = { - device = "/dev/disk/by-uuid/${mediaUUID}"; - fsType = "ext4"; - options = [ - "nofail" - "noauto" - #"x-systemd.device-timeout=1ms" - ]; - }; - systemd.mounts = [{ - enable = true; - options = "nofail,noauto"; - type = "ext4"; - wantedBy = [ "multi-user.target" ]; - what = "/dev/disk/by-uuid/${mediaUUID}"; - where = "/media"; - }]; - }) + ( + let mediaUUID = "3d106f56-89e5-400d-9d6b-1dd957919548"; + in { + fileSystems."/media" = { + device = "/dev/disk/by-uuid/${mediaUUID}"; + fsType = "ext4"; + options = [ + "nofail" + "noauto" + #"x-systemd.device-timeout=1ms" + ]; + }; + systemd.mounts = [{ + enable = true; + options = "nofail,noauto"; + type = "ext4"; + wantedBy = [ "multi-user.target" ]; + what = "/dev/disk/by-uuid/${mediaUUID}"; + where = "/media"; + }]; + } + ) ]; # NTFS support diff --git a/nixos/configs/porani/syncthing.nix b/nixos/configs/porani/syncthing.nix index 30ec00c..a56a1ac 100644 --- a/nixos/configs/porani/syncthing.nix +++ b/nixos/configs/porani/syncthing.nix @@ -54,7 +54,12 @@ after = [ "media.mount" ]; }; - users.groups."syncthing".members = [ mpd" "syncthing" "kodi" "palo" ]; + users.groups."syncthing".members = [ + "mpd" + "syncthing" + "kodi" + "palo" + ]; backup.dirs = [ "/var/lib/syncthing/finance" ]; diff --git a/nixos/configs/porani/wifi-access-point.nix b/nixos/configs/porani/wifi-access-point.nix index 1c62102..e3eda40 100644 --- a/nixos/configs/porani/wifi-access-point.nix +++ b/nixos/configs/porani/wifi-access-point.nix @@ -8,7 +8,8 @@ let ssid = "palosiot"; wifiPassword = lib.fileContents ; -in { +in +{ # todo only open needed ports networking.firewall.trustedInterfaces = [ wifi ]; diff --git a/nixos/configs/porani/wifi-networking.nix b/nixos/configs/porani/wifi-networking.nix index 18d0b32..b70ab71 100644 --- a/nixos/configs/porani/wifi-networking.nix +++ b/nixos/configs/porani/wifi-networking.nix @@ -1,4 +1,2 @@ { config, lib, ... }: -{ - -} +{ } diff --git a/nixos/configs/sputnik/iodined.nix b/nixos/configs/sputnik/iodined.nix index bf4d49d..dae7e72 100644 --- a/nixos/configs/sputnik/iodined.nix +++ b/nixos/configs/sputnik/iodined.nix @@ -3,7 +3,8 @@ let domain = "io.ingolf-wagner.de"; publicIp = "195.201.134.247"; pw = import ; -in { +in +{ services.iodine.server = { enable = true; diff --git a/nixos/configs/sputnik/nginx.nix b/nixos/configs/sputnik/nginx.nix index e677fb6..542440c 100644 --- a/nixos/configs/sputnik/nginx.nix +++ b/nixos/configs/sputnik/nginx.nix @@ -28,7 +28,8 @@ let root = "${errorPages}/"; }; }; -in { +in +{ networking.firewall.allowedTCPPorts = [ 80 443 4443 config.services.taskserver.listenPort ]; @@ -117,7 +118,7 @@ in { } // error.locations; }; - "grocy.ingolf-wagner.de" = { + "grocy.ingolf-wagner.de" = { listen = [ { addr = "0.0.0.0"; @@ -439,10 +440,11 @@ in { systemd.services."socat-taskd" = { wantedBy = [ "multi-user.target" ]; - script = let port = toString config.services.taskserver.listenPort; - in '' - ${pkgs.socat}/bin/socat TCP-LISTEN:${port},fork TCP:workhorse.private:${port} - ''; + script = + let port = toString config.services.taskserver.listenPort; + in '' + ${pkgs.socat}/bin/socat TCP-LISTEN:${port},fork TCP:workhorse.private:${port} + ''; }; } diff --git a/nixos/configs/sternchen/wifi-access-point.nix b/nixos/configs/sternchen/wifi-access-point.nix index db5f81f..9ce0cc8 100644 --- a/nixos/configs/sternchen/wifi-access-point.nix +++ b/nixos/configs/sternchen/wifi-access-point.nix @@ -8,7 +8,8 @@ let ssid = "bumbumbum"; wifiPassword = lib.fileContents ; -in { +in +{ # todo only open needed ports networking.firewall.trustedInterfaces = [ wifi ]; diff --git a/nixos/configs/sterni/packages.nix b/nixos/configs/sterni/packages.nix index 096452d..6697a0a 100644 --- a/nixos/configs/sterni/packages.nix +++ b/nixos/configs/sterni/packages.nix @@ -9,7 +9,8 @@ let https://nextcloud.ingolf-wagner.de/remote.php/webdav/${folder} ''; -in { +in +{ environment.systemPackages = with pkgs; [ diff --git a/nixos/configs/sterni/wifi-access-point.nix b/nixos/configs/sterni/wifi-access-point.nix index db5f81f..9ce0cc8 100644 --- a/nixos/configs/sterni/wifi-access-point.nix +++ b/nixos/configs/sterni/wifi-access-point.nix @@ -8,7 +8,8 @@ let ssid = "bumbumbum"; wifiPassword = lib.fileContents ; -in { +in +{ # todo only open needed ports networking.firewall.trustedInterfaces = [ wifi ]; diff --git a/nixos/configs/workhorse/castget.nix b/nixos/configs/workhorse/castget.nix index 1d89771..0742dad 100644 --- a/nixos/configs/workhorse/castget.nix +++ b/nixos/configs/workhorse/castget.nix @@ -3,7 +3,8 @@ let home = "/home/syncthing/podcasts"; -in { +in +{ custom.services.castget = { enable = true; user = "root"; diff --git a/nixos/configs/workhorse/finance.nix b/nixos/configs/workhorse/finance.nix index fb3ebac..76de251 100644 --- a/nixos/configs/workhorse/finance.nix +++ b/nixos/configs/workhorse/finance.nix @@ -20,7 +20,8 @@ let stocks = import ../../private_assets/finance/stocks; stocksFile = toString /home/syncthing/finance/hledger/stocks.journal; -in { +in +{ systemd.services.pull_stocks = { enable = true; @@ -30,18 +31,20 @@ in { Type = "oneshot"; }; - script = let - command = { symbol, name, currency, ... }: '' - APIKEY=${lib.fileContents ../../private_assets/finance/alphavantage/apiKey} - SYMBOL="${symbol}" - ${pkgs.curl}/bin/curl --location --silent \ - "https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=$SYMBOL&apikey=$APIKEY" \ - | ${pkgs.jq}/bin/jq --raw-output '.["Global Quote"] - | "P \(.["07. latest trading day"]) ${name} ${currency}\(.["05. price"] | tonumber)"' \ - >> ${stocksFile} - sleep 1 - ''; - in lib.concatStringsSep "\n" (map command stocks); + script = + let + command = { symbol, name, currency, ... }: '' + APIKEY=${lib.fileContents ../../private_assets/finance/alphavantage/apiKey} + SYMBOL="${symbol}" + ${pkgs.curl}/bin/curl --location --silent \ + "https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=$SYMBOL&apikey=$APIKEY" \ + | ${pkgs.jq}/bin/jq --raw-output '.["Global Quote"] + | "P \(.["07. latest trading day"]) ${name} ${currency}\(.["05. price"] | tonumber)"' \ + >> ${stocksFile} + sleep 1 + ''; + in + lib.concatStringsSep "\n" (map command stocks); }; systemd.timers.pull_stocks = { diff --git a/nixos/configs/workhorse/gogs.nix b/nixos/configs/workhorse/gogs.nix index 7c5a9a1..1fd48d4 100644 --- a/nixos/configs/workhorse/gogs.nix +++ b/nixos/configs/workhorse/gogs.nix @@ -28,7 +28,8 @@ let }; }; -in { +in +{ services.nginx = { enable = true; diff --git a/nixos/configs/workhorse/hardware-configuration.nix b/nixos/configs/workhorse/hardware-configuration.nix index dce872f..13e4f89 100644 --- a/nixos/configs/workhorse/hardware-configuration.nix +++ b/nixos/configs/workhorse/hardware-configuration.nix @@ -70,47 +70,51 @@ in { imports = [ # automount # --------- - (let mediaUUID = "b8ba192e-e2aa-47dd-85ec-dcf97ec9310a"; - in { - fileSystems."/media" = { - device = "/dev/disk/by-uuid/${mediaUUID}"; - fsType = "ext4"; - options = [ - "nofail" - "noauto" - #"x-systemd.device-timeout=1ms" - ]; - }; - systemd.mounts = [{ - enable = true; - options = "nofail,noauto"; - type = "ext4"; - wantedBy = [ "multi-user.target" ]; - what = "/dev/disk/by-uuid/${mediaUUID}"; - where = "/media"; - }]; - }) + ( + let mediaUUID = "b8ba192e-e2aa-47dd-85ec-dcf97ec9310a"; + in { + fileSystems."/media" = { + device = "/dev/disk/by-uuid/${mediaUUID}"; + fsType = "ext4"; + options = [ + "nofail" + "noauto" + #"x-systemd.device-timeout=1ms" + ]; + }; + systemd.mounts = [{ + enable = true; + options = "nofail,noauto"; + type = "ext4"; + wantedBy = [ "multi-user.target" ]; + what = "/dev/disk/by-uuid/${mediaUUID}"; + where = "/media"; + }]; + } + ) - (let backupUUID = "f7fa1c0e-ac9f-4955-b4bd-644c1ddb0d89"; - in { - fileSystems."/backup" = { - device = "/dev/disk/by-uuid/${backupUUID}"; - fsType = "ext4"; - options = [ - "nofail" - "noauto" - #"x-systemd.device-timeout=1ms" - ]; - }; - systemd.mounts = [{ - enable = true; - options = "nofail,noauto"; - type = "ext4"; - wantedBy = [ "multi-user.target" ]; - what = "/dev/disk/by-uuid/${backupUUID}"; - where = "/backup"; - }]; - }) + ( + let backupUUID = "f7fa1c0e-ac9f-4955-b4bd-644c1ddb0d89"; + in { + fileSystems."/backup" = { + device = "/dev/disk/by-uuid/${backupUUID}"; + fsType = "ext4"; + options = [ + "nofail" + "noauto" + #"x-systemd.device-timeout=1ms" + ]; + }; + systemd.mounts = [{ + enable = true; + options = "nofail,noauto"; + type = "ext4"; + wantedBy = [ "multi-user.target" ]; + what = "/dev/disk/by-uuid/${backupUUID}"; + where = "/backup"; + }]; + } + ) ]; } diff --git a/nixos/configs/workhorse/jenkins.nix b/nixos/configs/workhorse/jenkins.nix index a87a36d..209383e 100644 --- a/nixos/configs/workhorse/jenkins.nix +++ b/nixos/configs/workhorse/jenkins.nix @@ -9,7 +9,8 @@ let sync-repo = library.jenkins.syncJob; job = library.jenkins.job; -in { +in +{ environment.systemPackages = [ pkgs.cabal-install ]; @@ -62,139 +63,145 @@ in { accessUser = "admin"; # https://docs.openstack.org/infra/jenkins-job-builder/definition.html#modules - nixJobs = let - # ssh username + key - gogs-id = "bc584c99-0fb7-43fb-af75-4076d64c51b2"; - # ssh username + key - github-id = "bc584c99-0fb7-43fb-af75-4076d64c51b2"; - # ssh username + key - sshSputnik = "d91eb57c-5bff-434c-b317-68aad46848d7"; + nixJobs = + let + # ssh username + key + gogs-id = "bc584c99-0fb7-43fb-af75-4076d64c51b2"; + # ssh username + key + github-id = "bc584c99-0fb7-43fb-af75-4076d64c51b2"; + # ssh username + key + sshSputnik = "d91eb57c-5bff-434c-b317-68aad46848d7"; - sync-to-github = name: source: target: - sync-repo name { - url = source; - credentialsId = gogs-id; - } { - url = target; - credentialsId = github-id; - }; + sync-to-github = name: source: target: + sync-repo name + { + url = source; + credentialsId = gogs-id; + } + { + url = target; + credentialsId = github-id; + }; - in [ + in + [ - (job "sync-retiolum" { - url = "git@github.com:krebs/retiolum.git"; - credentialsId = github-id; - triggers = [{ timed = "H/30 * * * *"; }]; - } [ - { - "Download Files" = [ - "chmod 755 hosts" - "chmod 755 -R hosts" - '' - nix-shell -p curl -p gnutar -p bzip2 --run "curl https://lassul.us/retiolum-hosts.tar.bz2 | tar xvjf - || true"'' - "chmod 755 -R etc.hosts" - '' - nix-shell -p curl --run "curl https://lassul.us/retiolum.hosts > etc.hosts || true"'' - ]; - } - { - "update repo" = [ - ''nix-shell -p git --run "git add ."'' - '' - nix-shell -p git --run "git -c user.name=\'Ingolf Wagner\' -c user.email=\'contact@ingolf-wagner.de\' commit -m update-`date +%Y-%m-%dT%H:%M:%S` || exit 0"'' - ]; - } - { - Push = [{ - script = ''nix-shell -p git --run "git push origin master"''; + (job "sync-retiolum" + { + url = "git@github.com:krebs/retiolum.git"; credentialsId = github-id; - }]; - } - ]) + triggers = [{ timed = "H/30 * * * *"; }]; + } [ + { + "Download Files" = [ + "chmod 755 hosts" + "chmod 755 -R hosts" + '' + nix-shell -p curl -p gnutar -p bzip2 --run "curl https://lassul.us/retiolum-hosts.tar.bz2 | tar xvjf - || true"'' + "chmod 755 -R etc.hosts" + '' + nix-shell -p curl --run "curl https://lassul.us/retiolum.hosts > etc.hosts || true"'' + ]; + } + { + "update repo" = [ + ''nix-shell -p git --run "git add ."'' + '' + nix-shell -p git --run "git -c user.name=\'Ingolf Wagner\' -c user.email=\'contact@ingolf-wagner.de\' commit -m update-`date +%Y-%m-%dT%H:%M:%S` || exit 0"'' + ]; + } + { + Push = [{ + script = ''nix-shell -p git --run "git push origin master"''; + credentialsId = github-id; + }]; + } + ]) - (job "test-taskninja" { - url = "ssh://gogs@workhorse.private:2222/palo/taskninja.git"; - credentialsId = gogs-id; - } [ - { - "Create Shell" = [ - '' - nix-shell -p cabal2nix --run "cabal2nix --shell file://. > jenkins.nix"'' - ]; - } - { Update = [ ''nix-shell ./jenkins.nix --run "cabal update"'' ]; } - { - Configure = [ - ''nix-shell ./jenkins.nix --run "cabal configure --enable-tests"'' - '' - nix-shell ./jenkins.nix --run "cabal install --only-dependencies"'' - ]; - } - { Build = [ ''nix-shell ./jenkins.nix --run "cabal build"'' ]; } - { Test = [ ''nix-shell ./jenkins.nix --run "cabal test"'' ]; } - ]) + (job "test-taskninja" + { + url = "ssh://gogs@workhorse.private:2222/palo/taskninja.git"; + credentialsId = gogs-id; + } [ + { + "Create Shell" = [ + '' + nix-shell -p cabal2nix --run "cabal2nix --shell file://. > jenkins.nix"'' + ]; + } + { Update = [ ''nix-shell ./jenkins.nix --run "cabal update"'' ]; } + { + Configure = [ + ''nix-shell ./jenkins.nix --run "cabal configure --enable-tests"'' + '' + nix-shell ./jenkins.nix --run "cabal install --only-dependencies"'' + ]; + } + { Build = [ ''nix-shell ./jenkins.nix --run "cabal build"'' ]; } + { Test = [ ''nix-shell ./jenkins.nix --run "cabal test"'' ]; } + ]) - # sync to github - # -------------- - (sync-to-github "sync-radiodj" - "ssh://gogs@workhorse.private:2222/crashburn_radio/radio-dj2.git" - "git@github.com:crashburn-radio/radio-dj.git") - (sync-to-github "sync-radiodj-tracks" - "ssh://gogs@workhorse.private:2222/crashburn_radio/radio-dj-tracks.git" - "git@github.com:crashburn-radio/radio-dj-tracks.git") + # sync to github + # -------------- + (sync-to-github "sync-radiodj" + "ssh://gogs@workhorse.private:2222/crashburn_radio/radio-dj2.git" + "git@github.com:crashburn-radio/radio-dj.git") + (sync-to-github "sync-radiodj-tracks" + "ssh://gogs@workhorse.private:2222/crashburn_radio/radio-dj-tracks.git" + "git@github.com:crashburn-radio/radio-dj-tracks.git") - (sync-to-github "sync-krops-module" - "ssh://gogs@workhorse.private:2222/nix-modules/krops.git" - "git@github.com:mrVanDalo/module.krops.git") + (sync-to-github "sync-krops-module" + "ssh://gogs@workhorse.private:2222/nix-modules/krops.git" + "git@github.com:mrVanDalo/module.krops.git") - (sync-to-github "sync-cluster-module" - "ssh://gogs@workhorse.private:2222/nix-modules/cluster.git" - "git@github.com:mrVanDalo/module.cluster.git") + (sync-to-github "sync-cluster-module" + "ssh://gogs@workhorse.private:2222/nix-modules/cluster.git" + "git@github.com:mrVanDalo/module.cluster.git") - (sync-to-github "sync-backup-module" - "ssh://gogs@workhorse.private:2222/nix-modules/backup.git" - "git@github.com:mrVanDalo/module.backup.git") + (sync-to-github "sync-backup-module" + "ssh://gogs@workhorse.private:2222/nix-modules/backup.git" + "git@github.com:mrVanDalo/module.backup.git") - (sync-to-github "sync-module-tinc" - "ssh://gogs@workhorse.private:2222/palo/nixos-tinc.git" - "git@github.com:mrVanDalo/nixos-tinc.git") + (sync-to-github "sync-module-tinc" + "ssh://gogs@workhorse.private:2222/palo/nixos-tinc.git" + "git@github.com:mrVanDalo/nixos-tinc.git") - (sync-to-github "sync-memo" - "ssh://gogs@workhorse.private:2222/palo/memo.git" - "git@github.com:mrVanDalo/memo.git") + (sync-to-github "sync-memo" + "ssh://gogs@workhorse.private:2222/palo/memo.git" + "git@github.com:mrVanDalo/memo.git") - (sync-to-github "sync-diagrams-template" - "ssh://gogs@workhorse.private:2222/palo/diagrams-template.git" - "git@github.com:mrVanDalo/diagrams.git") + (sync-to-github "sync-diagrams-template" + "ssh://gogs@workhorse.private:2222/palo/diagrams-template.git" + "git@github.com:mrVanDalo/diagrams.git") - (sync-to-github "sync-plops" - "ssh://gogs@workhorse.private:2222/palo/plops.git" - "git@github.com:mrVanDalo/plops.git") + (sync-to-github "sync-plops" + "ssh://gogs@workhorse.private:2222/palo/plops.git" + "git@github.com:mrVanDalo/plops.git") - (sync-to-github "sync-image-generator" - "ssh://gogs@workhorse.private:2222/palo/image-generator2.git" - "git@github.com:mrVanDalo/image-generator.git") + (sync-to-github "sync-image-generator" + "ssh://gogs@workhorse.private:2222/palo/image-generator2.git" + "git@github.com:mrVanDalo/image-generator.git") - (sync-to-github "sync-image-generator-lib" - "ssh://gogs@workhorse.private:2222/palo/image-generator-lib.git" - "git@github.com:mrVanDalo/image-generator-examples.git") + (sync-to-github "sync-image-generator-lib" + "ssh://gogs@workhorse.private:2222/palo/image-generator-lib.git" + "git@github.com:mrVanDalo/image-generator-examples.git") - (sync-to-github "sync-tech.ingolf-wagner.de" - "ssh://gogs@workhorse.private:2222/palo/tech.ingolf-wagner.de.git" - "git@github.com:mrVanDalo/tech.ingolf-wagner.de.git") + (sync-to-github "sync-tech.ingolf-wagner.de" + "ssh://gogs@workhorse.private:2222/palo/tech.ingolf-wagner.de.git" + "git@github.com:mrVanDalo/tech.ingolf-wagner.de.git") - (sync-to-github "sync-LineageOS-build" - "ssh://gogs@git.ingolf-wagner.de:443/palo/LineagoOS-build.git" - "git@github.com:mrVanDalo/LineagoOS-build.git") + (sync-to-github "sync-LineageOS-build" + "ssh://gogs@git.ingolf-wagner.de:443/palo/LineagoOS-build.git" + "git@github.com:mrVanDalo/LineagoOS-build.git") - (sync-to-github "sync-http-errors" - "ssh://gogs@git.ingolf-wagner.de:443/palo/http-errors.git" - "git@github.com:mrVanDalo/http-errors.git") - (sync-to-github "sync-light-control" - "ssh://gogs@git.ingolf-wagner.de:443/palo/light-control.git" - "git@github.com:mrVanDalo/light-control.git") + (sync-to-github "sync-http-errors" + "ssh://gogs@git.ingolf-wagner.de:443/palo/http-errors.git" + "git@github.com:mrVanDalo/http-errors.git") + (sync-to-github "sync-light-control" + "ssh://gogs@git.ingolf-wagner.de:443/palo/light-control.git" + "git@github.com:mrVanDalo/light-control.git") - ]; + ]; }; }; diff --git a/nixos/configs/workhorse/jupyter.nix b/nixos/configs/workhorse/jupyter.nix index f0199d3..63bdf7c 100644 --- a/nixos/configs/workhorse/jupyter.nix +++ b/nixos/configs/workhorse/jupyter.nix @@ -9,37 +9,39 @@ #NOTE: you need to keep the single quote inside nix string. password = "'sha1:1b961dc713fb:88483270a63e57d18d43cf337e629539de1436ba'"; kernels = { - python3 = let - env = (pkgs.python3.withPackages (pythonPackages: - with pythonPackages; [ - ipykernel - pandas + python3 = + let + env = (pkgs.python3.withPackages (pythonPackages: + with pythonPackages; [ + ipykernel + pandas - # database stuff - mysqlclient - databases - asyncpg - psycopg2 - aiomysql - pymysql - aiosqlite - #aiopg - sqlalchemy + # database stuff + mysqlclient + databases + asyncpg + psycopg2 + aiomysql + pymysql + aiosqlite + #aiopg + sqlalchemy - # pdf export - nbconvert - ])); - in { - displayName = "Python 3"; - argv = [ - "${env.interpreter}" - "-m" - "ipykernel_launcher" - "-f" - "{connection_file}" - ]; - language = "python"; - }; + # pdf export + nbconvert + ])); + in + { + displayName = "Python 3"; + argv = [ + "${env.interpreter}" + "-m" + "ipykernel_launcher" + "-f" + "{connection_file}" + ]; + language = "python"; + }; }; }; diff --git a/nixos/configs/workhorse/mail-fetcher.nix b/nixos/configs/workhorse/mail-fetcher.nix index c25bcfc..6b94422 100644 --- a/nixos/configs/workhorse/mail-fetcher.nix +++ b/nixos/configs/workhorse/mail-fetcher.nix @@ -364,55 +364,60 @@ let } ]; - notmuchTagging = let + notmuchTagging = + let - template = index: - { tags, query, message ? "generic", ... }: - let - command = '' - ${pkgs.notmuch}/bin/notmuch tag ${ - lib.concatStringsSep " " tags - } -- "${query}" + template = index: + { tags, query, message ? "generic", ... }: + let + command = '' + ${pkgs.notmuch}/bin/notmuch tag ${lib.concatStringsSep " " tags} -- "${query}" + ''; + in + '' + echo '${command}' + ${command} ''; - in '' - echo '${command}' - ${command} - ''; - junk_template = index: query: - template index { - tags = [ "+junk" "-unread" "-inbox" ]; - query = query; - message = "generic junk filter"; - }; + junk_template = index: query: + template index { + tags = [ "+junk" "-unread" "-inbox" ]; + query = query; + message = "generic junk filter"; + }; - in pkgs.writers.writeBash "notmuch-tagging" (lib.concatStringsSep "\n" - ((lib.imap0 junk_template junk_filter) ++ (lib.imap0 template filters))); + in + pkgs.writers.writeBash "notmuch-tagging" (lib.concatStringsSep "\n" + ((lib.imap0 junk_template junk_filter) ++ (lib.imap0 template filters))); - notmuchTaggingNew = let + notmuchTaggingNew = + let - template = index: - { tags, query, message ? "generic", ... }: - let - command = '' - ${pkgs.notmuch}/bin/notmuch tag ${ - lib.concatStringsSep " " tags - } -- "${query} AND tag:new" + template = index: + { tags, query, message ? "generic", ... }: + let + command = '' + ${pkgs.notmuch}/bin/notmuch tag ${ + lib.concatStringsSep " " tags + } -- "${query} AND tag:new" + ''; + in + '' + echo '${command}' + ${command} ''; - in '' - echo '${command}' - ${command} - ''; - junk_template = index: query: - template index { - tags = [ "+junk" "-unread" "-inbox" ]; - query = query; - message = "generic junk filter"; - }; - in pkgs.writers.writeBash "notmuch-tagging-new" (lib.concatStringsSep "\n" - ((lib.imap0 junk_template junk_filter) ++ (lib.imap0 template filters))); + junk_template = index: query: + template index { + tags = [ "+junk" "-unread" "-inbox" ]; + query = query; + message = "generic junk filter"; + }; + in + pkgs.writers.writeBash "notmuch-tagging-new" (lib.concatStringsSep "\n" + ((lib.imap0 junk_template junk_filter) ++ (lib.imap0 template filters))); -in { +in +{ backup.dirs = [ "/home/mailfetcher" ]; @@ -431,12 +436,30 @@ in { name = "mailfetcher"; }; - sops.secrets.mail_terranix.owner = "mailUser"; - sops.secrets.mail_gmail.owner = "mailUser"; - sops.secrets.mail_gmx_palo.owner = "mailUser"; - sops.secrets.mail_gmx_ingolf.owner = "mailUser"; - sops.secrets.mail_web.owner = "mailUser"; - sops.secrets.mail_siteground.owner = "mailUser"; + sops.secrets.mail_terranix = { + owner = config.users.users.mailUser.name; + group = config.users.users.mailUser.group; + }; + sops.secrets.mail_gmail = { + owner = config.users.users.mailUser.name; + group = config.users.users.mailUser.group; + }; + sops.secrets.mail_gmx_palo = { + owner = config.users.users.mailUser.name; + group = config.users.users.mailUser.group; + }; + sops.secrets.mail_gmx_ingolf = { + owner = config.users.users.mailUser.name; + group = config.users.users.mailUser.group; + }; + sops.secrets.mail_web = { + owner = config.users.users.mailUser.name; + group = config.users.users.mailUser.group; + }; + sops.secrets.mail_siteground = { + owner = config.users.users.mailUser.name; + group = config.users.users.mailUser.group; + }; environment.systemPackages = [ pkgs.muchsync ]; @@ -595,34 +618,32 @@ in { systemd.services.fetchmail = let threadTag = tag: '' - echo "tag threads with ${tag}" - ${pkgs.notmuch}/bin/notmuch tag +${tag} $(${pkgs.notmuch}/bin/notmuch search --output=threads tag:${tag}) + echo "tag threads with ${tag}" + ${pkgs.notmuch}/bin/notmuch tag +${tag} $(${pkgs.notmuch}/bin/notmuch search --output=threads tag:${tag}) ''; - in { - enable = true; - serviceConfig = { User = config.users.users.mailUser.name; }; - environment.NOTMUCH_CONFIG = - "${config.users.users.mailUser.home}/.config/notmuch/notmuchrc"; - script = '' - echo "run mbsync" - ${pkgs.isync}/bin/mbsync \ - --all + in + { + enable = true; + serviceConfig = { User = config.users.users.mailUser.name; }; + environment.NOTMUCH_CONFIG = + "${config.users.users.mailUser.home}/.config/notmuch/notmuchrc"; + script = '' + echo "run mbsync" + ${pkgs.isync}/bin/mbsync \ + --all + echo "run getmail" + ${pkgs.getmail}/bin/getmail \ + --quiet \ + --rcfile getmailingolf-wagner-de - echo "run getmail" - ${pkgs.getmail}/bin/getmail \ - --quiet \ - --rcfile getmailingolf-wagner-de - - echo "run notmuch" - ${pkgs.notmuch}/bin/notmuch new - ${notmuchTaggingNew} - ${threadTag "muted"} - ${threadTag "wohnung"} - ${threadTag "flagged"} - echo "delete threads" - ${pkgs.notmuch}/bin/notmuch tag +deleted $(${pkgs.notmuch}/bin/notmuch search --output=threads tag:deleted) - ''; - }; + echo "run notmuch" + ${pkgs.notmuch}/bin/notmuch new + ${notmuchTaggingNew} + ${threadTag "muted"} + ${threadTag "wohnung"} + ${threadTag "flagged"} + ''; + }; systemd.timers.fetchmail = { enable = true; # timerConfig.OnCalendar = " *-*-* *:00:00"; @@ -635,9 +656,5 @@ in { enable = true; new.tags = [ "unread" "inbox" "new" ]; }; - #home-manager.users.mailUser.home.file."notmuch" = { - # source = "${config.users.users.mailUser.home}/.config/notmuch/notmuchrc"; - # target = ".notmuch-config"; - #}; } diff --git a/nixos/configs/workhorse/mining.nix b/nixos/configs/workhorse/mining.nix index 474d7a9..6f95ec0 100644 --- a/nixos/configs/workhorse/mining.nix +++ b/nixos/configs/workhorse/mining.nix @@ -7,7 +7,8 @@ let rig = config.networking.hostName; recheckInterval = 2000; package = pkgs.ethminer; -in { +in +{ systemd.services.ethminer = { description = "ethminer ethereum mining service"; diff --git a/nixos/configs/workhorse/nextcloud.nix b/nixos/configs/workhorse/nextcloud.nix index cfe26d6..5a351e1 100644 --- a/nixos/configs/workhorse/nextcloud.nix +++ b/nixos/configs/workhorse/nextcloud.nix @@ -4,11 +4,22 @@ let hostAddress = "192.168.100.10"; containerAddress = "192.168.100.11"; #syncthingGid = config.users.groups.syncthing.gid; + nextcloudUid = 1000; -in { +in +{ - sops.secrets.nextcloud_database_password = {}; - sops.secrets.nextcloud_root_password = {}; + sops.secrets.nextcloud_database_password = { + owner = "nextcloud"; + }; + sops.secrets.nextcloud_root_password = { + owner = "nextcloud"; + }; + + users.users.nextcloud = { + isSystemUser = true; + uid = nextcloudUid; + }; containers.nextcloud = { @@ -16,20 +27,20 @@ in { bindMounts = { rootpassword = { hostPath = - "/run/secrets/nextcloud_root_password"; - #toString ; + "/run/secrets/nextcloud_root_password"; + #toString ; mountPoint = - "/run/secrets/nextcloud_root_password"; - #toString ; + "/run/secrets/nextcloud_root_password"; + #toString ; isReadOnly = true; }; databasepassword = { hostPath = - "/run/secrets/nextcloud_database_password"; - #toString ; + "/run/secrets/nextcloud_database_password"; + #toString ; mountPoint = - "/run/secrets/nextcloud_database_password"; - #toString ; + "/run/secrets/nextcloud_database_password"; + #toString ; isReadOnly = true; }; @@ -85,6 +96,8 @@ in { config = { config, pkgs, lib, ... }: { + users.users.nextcloud.uid = nextcloudUid; + services.nginx = { # Use recommended settings recommendedGzipSettings = lib.mkDefault true; @@ -93,28 +106,30 @@ in { recommendedTlsSettings = lib.mkDefault true; # for graylog logging - commonHttpConfig = let - access_log_sink = "${hostAddress}:12304"; - error_log_sink = "${hostAddress}:12305"; - in '' - log_format graylog2_json escape=json '{ "timestamp": "$time_iso8601", ' - '"facility": "nginx", ' - '"src_addr": "$remote_addr", ' - '"body_bytes_sent": $body_bytes_sent, ' - '"request_time": $request_time, ' - '"response_status": $status, ' - '"request": "$request", ' - '"request_method": "$request_method", ' - '"host": "$host",' - '"upstream_cache_status": "$upstream_cache_status",' - '"upstream_addr": "$upstream_addr",' - '"http_x_forwarded_for": "$http_x_forwarded_for",' - '"http_referrer": "$http_referer", ' - '"http_user_agent": "$http_user_agent" }'; + commonHttpConfig = + let + access_log_sink = "${hostAddress}:12304"; + error_log_sink = "${hostAddress}:12305"; + in + '' + log_format graylog2_json escape=json '{ "timestamp": "$time_iso8601", ' + '"facility": "nginx", ' + '"src_addr": "$remote_addr", ' + '"body_bytes_sent": $body_bytes_sent, ' + '"request_time": $request_time, ' + '"response_status": $status, ' + '"request": "$request", ' + '"request_method": "$request_method", ' + '"host": "$host",' + '"upstream_cache_status": "$upstream_cache_status",' + '"upstream_addr": "$upstream_addr",' + '"http_x_forwarded_for": "$http_x_forwarded_for",' + '"http_referrer": "$http_referer", ' + '"http_user_agent": "$http_user_agent" }'; - access_log syslog:server=${access_log_sink} graylog2_json; - error_log syslog:server=${error_log_sink}; - ''; + access_log syslog:server=${access_log_sink} graylog2_json; + error_log syslog:server=${error_log_sink}; + ''; }; # don't forget the database backup before doing this @@ -331,8 +346,8 @@ in { doInit = true; encryption = { mode = "repokey-blake2"; - passCommand = - "cat ${config.sops.secrets.backup_repository_passphrase.path}"; + passCommand = + "cat ${config.sops.secrets.backup_repository_passphrase.path}"; }; startAt = "0/3:00:00"; prune.keep = { diff --git a/nixos/configs/workhorse/transmission.nix b/nixos/configs/workhorse/transmission.nix index c53ec62..83031de 100644 --- a/nixos/configs/workhorse/transmission.nix +++ b/nixos/configs/workhorse/transmission.nix @@ -1,12 +1,18 @@ -{ pkgs, ... }: +{ pkgs, config, ... }: let hostAddress = "192.168.100.30"; containerAddress = "192.168.100.31"; -in { +in +{ - sops.secrets.nordvpn = {}; + #users.users.transmission = { + # isSystemUser = true; + # uid = config.ids.uids.transmission; + #}; + + sops.secrets.nordvpn = { }; containers.torrent = { @@ -185,7 +191,7 @@ in { remote-cert-tls server - auth-user-pass /run/secrets/nordvpn.txt + auth-user-pass /run/secrets/nordvpn verb 3 pull diff --git a/nixos/configs/workout/lan.nix b/nixos/configs/workout/lan.nix index 04dcf3e..08b6ff5 100644 --- a/nixos/configs/workout/lan.nix +++ b/nixos/configs/workout/lan.nix @@ -5,7 +5,8 @@ let ipAddress = "10.1.0.1"; prefixLength = 24; -in { +in +{ networking.extraHosts = '' 10.1.0.1 workout.lan diff --git a/nixos/configs/workout/packages.nix b/nixos/configs/workout/packages.nix index 91dad23..70fbd72 100644 --- a/nixos/configs/workout/packages.nix +++ b/nixos/configs/workout/packages.nix @@ -4,8 +4,10 @@ nixpkgs.overlays = [ (import ) ]; nixpkgs.config.packageOverrides = pkgs: { - nur = import (builtins.fetchTarball - "https://github.com/nix-community/NUR/archive/master.tar.gz") { + nur = import + (builtins.fetchTarball + "https://github.com/nix-community/NUR/archive/master.tar.gz") + { inherit pkgs; }; }; diff --git a/nixos/flake.lock b/nixos/flake.lock index 715da42..7b47bae 100644 --- a/nixos/flake.lock +++ b/nixos/flake.lock @@ -199,6 +199,28 @@ "type": "github" } }, + "fenix": { + "inputs": { + "nixpkgs": [ + "nixpkgs-fmt", + "nixpkgs" + ], + "rust-analyzer-src": "rust-analyzer-src" + }, + "locked": { + "lastModified": 1631067971, + "narHash": "sha256-z+qlJaCaw/OAoFGdzm0nDKkjRdCwstHzduF74nMn3bY=", + "owner": "nix-community", + "repo": "fenix", + "rev": "0771140f0a6a6622c509fb2d6d2c87f0bfda703d", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, "flake-utils": { "locked": { "lastModified": 1623875721, @@ -215,6 +237,21 @@ } }, "flake-utils_2": { + "locked": { + "lastModified": 1629481132, + "narHash": "sha256-JHgasjPR0/J1J3DRm4KxM4zTyAj4IOJY8vIl75v/kPI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "997f7efcb746a9c140ce1f13c72263189225f482", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { "locked": { "lastModified": 1631561581, "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", @@ -286,6 +323,27 @@ "url": "https://git.ingolf-wagner.de/nix-modules/krops.git" } }, + "naersk": { + "inputs": { + "nixpkgs": [ + "nixpkgs-fmt", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1631004250, + "narHash": "sha256-LGh0CjAZwh13AVkTi9w9lITEC7x6bwSQyFViOZ6HyNo=", + "owner": "nmattia", + "repo": "naersk", + "rev": "08afb3d1dbfe016108b72e05b02ba0f6ecb3c8e1", + "type": "github" + }, + "original": { + "owner": "nmattia", + "repo": "naersk", + "type": "github" + } + }, "nix-straight": { "flake": false, "locked": { @@ -319,6 +377,29 @@ "type": "github" } }, + "nixpkgs-fmt": { + "inputs": { + "fenix": "fenix", + "flake-utils": "flake-utils_2", + "naersk": "naersk", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1631557044, + "narHash": "sha256-5VPeqRvNhRxTv07NSvxQSXvtuGnrjWmmwss0PGhFzTI=", + "owner": "nix-community", + "repo": "nixpkgs-fmt", + "rev": "c7f66ec1b969ed118231fdf7f596c5ed2c2cfe49", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs-fmt", + "type": "github" + } + }, "nixpkgs-unstable": { "locked": { "lastModified": 1634782485, @@ -463,7 +544,7 @@ }, "polygon-art": { "inputs": { - "flake-utils": "flake-utils_2", + "flake-utils": "flake-utils_3", "nixpkgs": "nixpkgs_2" }, "locked": { @@ -505,6 +586,7 @@ "home-manager-utils": "home-manager-utils", "krops-lib": "krops-lib", "nixpkgs": "nixpkgs", + "nixpkgs-fmt": "nixpkgs-fmt", "nixpkgs-unstable": "nixpkgs-unstable", "polygon-art": "polygon-art", "sops-nix": "sops-nix" @@ -526,6 +608,23 @@ "type": "github" } }, + "rust-analyzer-src": { + "flake": false, + "locked": { + "lastModified": 1630943734, + "narHash": "sha256-jqgAKhvrVDEkv8HB56hVIgvMDuuQ7X4D2zE9ATV+baI=", + "owner": "rust-analyzer", + "repo": "rust-analyzer", + "rev": "3dae94bf2b3e496adb049da589c7efef272a39b8", + "type": "github" + }, + "original": { + "owner": "rust-analyzer", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, "sops-nix": { "inputs": { "nixpkgs": "nixpkgs_3" diff --git a/nixos/flake.nix b/nixos/flake.nix index 92d8103..1fbc2c0 100644 --- a/nixos/flake.nix +++ b/nixos/flake.nix @@ -33,11 +33,27 @@ "git+https://git.ingolf-wagner.de/nix-modules/cluster.git?rev=ef621797a30f8a57de16bf33672abdd411cbcece"; flake = false; }; + nixpkgs-fmt = { + url = "github:nix-community/nixpkgs-fmt"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; - outputs = { self, sops-nix, nixpkgs, home-manager, home-manager-utils - , doom-emacs-nix, backup-module, nixpkgs-unstable, krops-lib, cluster-module - , polygon-art, ... }: + outputs = + { self + , sops-nix + , nixpkgs + , home-manager + , home-manager-utils + , doom-emacs-nix + , backup-module + , nixpkgs-unstable + , krops-lib + , cluster-module + , polygon-art + , nixpkgs-fmt + , ... + }: let nixosSystem = nixpkgs.lib.nixosSystem; @@ -70,13 +86,13 @@ } ]; desktopModules = [ - home-manager.nixosModules.home-manager { home-manager.users.mainUser = { imports = [ doom-emacs-nix.hmModule home-manager-utils.hmModule ]; }; - home-manager.useGlobalPkgs = true; - home-manager.useUserPackages = true; + environment.systemPackages = [ + nixpkgs-fmt.defaultPackage."x86_64-linux" + ]; } ]; desktopConfiguration = initPath: @@ -89,7 +105,8 @@ system = "x86_64-linux"; modules = defaultModules ++ [ initPath ]; }; - in { + in + { nixosConfigurations = { sterni = desktopConfiguration ./configs/sterni/configuration.nix; sternchen = desktopConfiguration ./configs/sternchien/configuration.nix; diff --git a/nixos/krops.nix b/nixos/krops.nix index a8d9972..f9ab275 100644 --- a/nixos/krops.nix +++ b/nixos/krops.nix @@ -5,8 +5,9 @@ let command = targetPath: let commandLine = - "TMPDIR=/tmp nixos-rebuild build --flake ${targetPath} -L --keep-going"; - in '' + "TMPDIR=/tmp nixos-rebuild test --flake ${targetPath} -L --keep-going"; + in + '' echo '${commandLine}' nix-shell \ -E "with import {}; mkShell { buildInputs = [ git (nixos { nix.package = nixFlakes; }).nixos-rebuild ]; }" \ @@ -64,7 +65,8 @@ let target = lib.mkTarget "root@${host}/var/krops"; inherit command; }; - in { + in + { "${name}" = pkgs.writers.writeBashBin name '' echo "deploy system" ${system}/bin/system @@ -89,7 +91,8 @@ let force = true; target = lib.mkTarget "root@${host}/etc/NetworkManager"; }; - in { + in + { "${name}" = pkgs.writers.writeBashBin "${name}-all" '' echo "deploy network secerts" ${network}/bin/secrets @@ -98,7 +101,8 @@ let ''; }; -in (desktop { +in +(desktop { name = "sterni"; host = "sterni.private"; }) // (desktop { diff --git a/nixos/library/default.nix b/nixos/library/default.nix index a16a579..9277b6b 100644 --- a/nixos/library/default.nix +++ b/nixos/library/default.nix @@ -1,7 +1,10 @@ { pkgs, lib, ... }: { desktopFile = bin: - { comment ? "No Comment", longName ? "Script" - , command ? "${bin}/bin/${bin.name}", ... }: + { comment ? "No Comment" + , longName ? "Script" + , command ? "${bin}/bin/${bin.name}" + , ... + }: pkgs.writeTextFile { name = "${bin.name}.desktop"; destination = "/share/applications/${bin.name}.desktop"; diff --git a/nixos/library/jenkins.nix b/nixos/library/jenkins.nix index 1b38c6f..f9aa04c 100644 --- a/nixos/library/jenkins.nix +++ b/nixos/library/jenkins.nix @@ -7,79 +7,90 @@ with builtins; { # source container url and credentialsId job = name: - { url, credentialsId, branch ? "master", - # https://docs.openstack.org/infra/jenkins-job-builder/triggers.html - triggers ? [{ - pollscm = { - cron = "H/30 * * * *"; - ignore-post-commit-hooks = true; - }; - }], ... }: + { url + , credentialsId + , branch ? "master" + , # https://docs.openstack.org/infra/jenkins-job-builder/triggers.html + triggers ? [{ + pollscm = { + cron = "H/30 * * * *"; + ignore-post-commit-hooks = true; + }; + }] + , ... + }: config: { job = { inherit name triggers; sandbox = true; project-type = "pipeline"; - dsl = let - stage = elem: - let - stageName = head (attrNames elem); - stateScripts = map (stage: - lib.getAttr (typeOf stage) { - string = '' - withEnv(['PATH=/run/current-system/sw/bin/','NIX_PATH=/var/src/']) { - sh '${toString stage}' - }''; - set = let - script = '' - withEnv(['PATH=/run/current-system/sw/bin/','NIX_PATH=/var/src/']) { - sh '${toString stage.script}' - } - ''; - in if (stage.credentialsId != null) then '' - sshagent(['${stage.credentialsId}']) { ${script} } - '' else - script; - }) (getAttr stageName elem); - in '' - stage('${stageName}') { - steps { - ${concatStringsSep "\n" stateScripts} + dsl = + let + stage = elem: + let + stageName = head (attrNames elem); + stateScripts = map + (stage: + lib.getAttr (typeOf stage) { + string = '' + withEnv(['PATH=/run/current-system/sw/bin/','NIX_PATH=/var/src/']) { + sh '${toString stage}' + }''; + set = + let + script = '' + withEnv(['PATH=/run/current-system/sw/bin/','NIX_PATH=/var/src/']) { + sh '${toString stage.script}' + } + ''; + in + if (stage.credentialsId != null) then '' + sshagent(['${stage.credentialsId}']) { ${script} } + '' else + script; + }) + (getAttr stageName elem); + in + '' + stage('${stageName}') { + steps { + ${concatStringsSep "\n" stateScripts} + } + } + ''; + stages = map stage config; + in + '' + pipeline { + agent any + post { + failure { + mattermostSend channel: 'notification', color: '#FF0000', message: "Failed to build : [''${env.JOB_NAME}-''${env.BUILD_NUMBER}](''${env.BUILD_URL})" + } + success { + mattermostSend channel: 'jenkins', color: '#00FF00', message: "Successfully build : [''${env.JOB_NAME}-''${env.BUILD_NUMBER}](''${env.JOB_URL})" } } - ''; - stages = map stage config; - in '' - pipeline { - agent any - post { - failure { - mattermostSend channel: 'notification', color: '#FF0000', message: "Failed to build : [''${env.JOB_NAME}-''${env.BUILD_NUMBER}](''${env.BUILD_URL})" - } - success { - mattermostSend channel: 'jenkins', color: '#00FF00', message: "Successfully build : [''${env.JOB_NAME}-''${env.BUILD_NUMBER}](''${env.JOB_URL})" - } - } - stages{ - stage('Pull') { - steps { - checkout( - [$class: 'GitSCM' - , branches: [[name: '*/${branch}']] - , doGenerateSubmoduleConfigurations: false - , extensions: [[$class: 'LocalBranch', localBranch: 'master']] - , submoduleCfg: [] - , userRemoteConfigs: - [[ credentialsId: '${credentialsId}' - , url: '${url}']] - ] - ) + stages{ + stage('Pull') { + steps { + checkout( + [$class: 'GitSCM' + , branches: [[name: '*/${branch}']] + , doGenerateSubmoduleConfigurations: false + , extensions: [[$class: 'LocalBranch', localBranch: 'master']] + , submoduleCfg: [] + , userRemoteConfigs: + [[ credentialsId: '${credentialsId}' + , url: '${url}']] + ] + ) + } } + ${concatStringsSep "\n" stages} } - ${concatStringsSep "\n" stages} } - } - ''; + ''; }; }; diff --git a/nixos/modules/programs/browser.nix b/nixos/modules/programs/browser.nix index ae2776b..5a61c96 100644 --- a/nixos/modules/programs/browser.nix +++ b/nixos/modules/programs/browser.nix @@ -45,92 +45,104 @@ let backupFile = "${homeBackup}.tar.lzma"; rolloutFile = "${home}.tar.lzma"; lockFile = "${home}-lock"; - in pkgs.writeShellScriptBin "${name}-clean" # sh - '' - sudo killall -9 -u ${name} - sudo rm -f ${lockFile} - sudo rm -rf ${home} - ''; + in + pkgs.writeShellScriptBin "${name}-clean" # sh + '' + sudo killall -9 -u ${name} + sudo rm -f ${lockFile} + sudo rm -rf ${home} + ''; createBrowser = name: user: browser: home: homeBackup: let backupFile = "${homeBackup}.tar.lzma"; rolloutFile = "${home}.tar.lzma"; lockFile = "${home}-lock"; - in pkgs.writeShellScriptBin "${name}" # sh - '' - # set -x - if [[ ! -e ${lockFile} ]] - then - # rollout backup - if [[ -e ${backupFile} ]] - then - if [[ ! -d ${home} ]] - then - # todo : use make user - sudo mkdir -p ${home} - sudo chown -R ${user}:users ${home} - fi - cp ${backupFile} ${rolloutFile} - sudo -u ${user} ${tarBin} xf ${rolloutFile} --directory ${home} - rm ${rolloutFile} - touch ${lockFile} - fi - fi + in + pkgs.writeShellScriptBin "${name}" # sh + '' + # set -x + if [[ ! -e ${lockFile} ]] + then + # rollout backup + if [[ -e ${backupFile} ]] + then + if [[ ! -d ${home} ]] + then + # todo : use make user + sudo mkdir -p ${home} + sudo chown -R ${user}:users ${home} + fi + cp ${backupFile} ${rolloutFile} + sudo -u ${user} ${tarBin} xf ${rolloutFile} --directory ${home} + rm ${rolloutFile} + touch ${lockFile} + fi + fi - sudo -u ${user} ${browser} - ''; + sudo -u ${user} ${browser} + ''; - browserExecutableList = let - allBrowser = flip mapAttrsToList cfg.configList (name: config: - let - browser = if config.browserType == "chrome" then - ''${chromiumBin} "$@"'' - else if config.browserType == "google" then - ''${chromeBin} "$@"'' - else - ''${firefoxBin} "$@"''; - in createBrowser name config.user browser config.home config.homeBackup); - xclipBrowser = [ - (pkgs.writeShellScriptBin "copy-to-xclip" # sh - '' - echo "$*" | ${pkgs.xclip}/bin/xclip - '') - ]; - in allBrowser ++ xclipBrowser; + browserExecutableList = + let + allBrowser = flip mapAttrsToList cfg.configList (name: config: + let + browser = + if config.browserType == "chrome" then + ''${chromiumBin} "$@"'' + else if config.browserType == "google" then + ''${chromeBin} "$@"'' + else + ''${firefoxBin} "$@"''; + in + createBrowser name config.user browser config.home config.homeBackup); + xclipBrowser = [ + (pkgs.writeShellScriptBin "copy-to-xclip" # sh + '' + echo "$*" | ${pkgs.xclip}/bin/xclip + '') + ]; + in + allBrowser ++ xclipBrowser; createBackupScript = name: home: backupHome: pkgs.writeShellScriptBin "${name}-backup" # sh - '' - sudo -u ${name} \ - ${tarBin} \ - --exclude=.cache \ - --exclude=Downloads \ - --create \ - --verbos \ - --lzma \ - --file ${home}.tar.lzma \ - --directory ${home} \ - . + '' + sudo -u ${name} \ + ${tarBin} \ + --exclude=.cache \ + --exclude=Downloads \ + --create \ + --verbos \ + --lzma \ + --file ${home}.tar.lzma \ + --directory ${home} \ + . - cp ${home}.tar.lzma ${backupHome}.tar.lzma - ''; + cp ${home}.tar.lzma ${backupHome}.tar.lzma + ''; - allBackupScripts = let - filteredConfigs = - filterAttrs (name: browserConfig: browserConfig.homeBackup != null) - cfg.configList; - in mapAttrsToList (name: browserConfig: - createBackupScript name browserConfig.home browserConfig.homeBackup) - filteredConfigs; + allBackupScripts = + let + filteredConfigs = + filterAttrs (name: browserConfig: browserConfig.homeBackup != null) + cfg.configList; + in + mapAttrsToList + (name: browserConfig: + createBackupScript name browserConfig.home browserConfig.homeBackup) + filteredConfigs; - allCleanScripts = let - filteredConfigs = - filterAttrs (name: browserConfig: browserConfig.homeBackup != null) - cfg.configList; - in mapAttrsToList (name: browserConfig: - cleanBrowser name name browserConfig.home browserConfig.homeBackup) - filteredConfigs; + allCleanScripts = + let + filteredConfigs = + filterAttrs (name: browserConfig: browserConfig.homeBackup != null) + cfg.configList; + in + mapAttrsToList + (name: browserConfig: + cleanBrowser name name browserConfig.home browserConfig.homeBackup) + filteredConfigs; allKillScripts = mapAttrsToList (name: _: killBrowser name) cfg.configList; @@ -153,7 +165,8 @@ let $BIN "$@" ''; -in { +in +{ options.programs.custom.browser = { enable = mkEnableOption "enable browsers"; @@ -214,18 +227,22 @@ in { config = mkIf cfg.enable { # add sudo rights - security.sudo.extraConfig = let - extraRules = flip mapAttrsToList cfg.configList (name: values: - concatStringsSep "" (map (sudoUser: '' - # sudo configuration to control browser - ${sudoUser} ALL=(${values.user}) NOPASSWD: ALL - ${sudoUser} ALL=(root) NOPASSWD: /run/current-system/sw/bin/mkdir -p ${values.home} - ${sudoUser} ALL=(root) NOPASSWD: /run/current-system/sw/bin/chown -R ${values.user}\:users ${values.home} - ${sudoUser} ALL=(root) NOPASSWD: /run/current-system/sw/bin/killall -9 -u ${name} - ${sudoUser} ALL=(root) NOPASSWD: /run/current-system/sw/bin/rm -rf ${values.home} - ${sudoUser} ALL=(root) NOPASSWD: /run/current-system/sw/bin/rm -f ${values.home}-lock - '') values.sudoUsers)); - in lib.concatStringsSep "\n" extraRules; + security.sudo.extraConfig = + let + extraRules = flip mapAttrsToList cfg.configList (name: values: + concatStringsSep "" (map + (sudoUser: '' + # sudo configuration to control browser + ${sudoUser} ALL=(${values.user}) NOPASSWD: ALL + ${sudoUser} ALL=(root) NOPASSWD: /run/current-system/sw/bin/mkdir -p ${values.home} + ${sudoUser} ALL=(root) NOPASSWD: /run/current-system/sw/bin/chown -R ${values.user}\:users ${values.home} + ${sudoUser} ALL=(root) NOPASSWD: /run/current-system/sw/bin/killall -9 -u ${name} + ${sudoUser} ALL=(root) NOPASSWD: /run/current-system/sw/bin/rm -rf ${values.home} + ${sudoUser} ALL=(root) NOPASSWD: /run/current-system/sw/bin/rm -f ${values.home}-lock + '') + values.sudoUsers)); + in + lib.concatStringsSep "\n" extraRules; # create users users.users = flip mapAttrs cfg.configList (name: config: { diff --git a/nixos/modules/programs/citate.nix b/nixos/modules/programs/citate.nix index eed2e49..c46cc60 100644 --- a/nixos/modules/programs/citate.nix +++ b/nixos/modules/programs/citate.nix @@ -19,7 +19,8 @@ let scriptAxel = citateScript (toString ../../assets/sprueche-axel) "axel"; scriptSiw = citateScript (toString ../../assets/sprueche-siw) "siw"; -in { +in +{ options.programs.custom.citate = { enable = mkEnableOption "enable programs.custom.citate"; diff --git a/nixos/modules/programs/curl-scripts.nix b/nixos/modules/programs/curl-scripts.nix index 4ff69f6..9453cfd 100644 --- a/nixos/modules/programs/curl-scripts.nix +++ b/nixos/modules/programs/curl-scripts.nix @@ -18,7 +18,8 @@ let cfg = config.programs.custom.curlScripts; -in { +in +{ options.programs.custom.curlScripts.enable = mkEnableOption "enable curl scripts"; diff --git a/nixos/modules/programs/easytag.nix b/nixos/modules/programs/easytag.nix index 02e6814..a790274 100644 --- a/nixos/modules/programs/easytag.nix +++ b/nixos/modules/programs/easytag.nix @@ -6,7 +6,8 @@ let cfg = config.programs.custom.easytag; -in { +in +{ options.programs.custom.easytag.enable = mkEnableOption "install easytag with dependencies"; diff --git a/nixos/modules/programs/elm.nix b/nixos/modules/programs/elm.nix index e1cc323..d6d1f1b 100644 --- a/nixos/modules/programs/elm.nix +++ b/nixos/modules/programs/elm.nix @@ -6,7 +6,8 @@ let cfg = config.programs.custom.elm; -in { +in +{ options.programs.custom.elm.enable = mkEnableOption "enable elm stack"; diff --git a/nixos/modules/programs/espeak.nix b/nixos/modules/programs/espeak.nix index dfe3460..3e2de46 100644 --- a/nixos/modules/programs/espeak.nix +++ b/nixos/modules/programs/espeak.nix @@ -36,7 +36,8 @@ let cfg = config.programs.custom.espeak; -in { +in +{ options.programs.custom.espeak.enable = mkEnableOption "enable espeak scripts"; diff --git a/nixos/modules/programs/ffmpeg.nix b/nixos/modules/programs/ffmpeg.nix index fbd47ba..3db7774 100644 --- a/nixos/modules/programs/ffmpeg.nix +++ b/nixos/modules/programs/ffmpeg.nix @@ -5,8 +5,13 @@ let cfg = config.programs.custom.ffmpeg; ffmpegTemplate = name: - { profile, preset, tune ? null, width ? 1280, height ? 720 - , resolution ? "720p" }: + { profile + , preset + , tune ? null + , width ? 1280 + , height ? 720 + , resolution ? "720p" + }: pkgs.writeShellScriptBin "ffmpeg-${name}" '' if [ $# -eq 0 ] @@ -99,48 +104,53 @@ let ]; tunes = [ "film" "animation" "grain" "stillimage" "fastdecode" ]; - ffmpegs = let + ffmpegs = + let - configurations = lib.cartesianProductOfSets { - profile = profiles; - preset = presets; - }; - - p720 = { profile, preset }: - ffmpegTemplate "${profile}-${preset}-720p" { inherit profile preset; }; - - p1080 = { profile, preset }: - ffmpegTemplate "${profile}-${preset}-1080p" { - inherit profile preset; - height = 1080; - width = 1920; - resolution = "1080p"; - }; - in (map p720 configurations) ++ (map p1080 configurations); - - ffmpegsTune = let - configurations = lib.cartesianProductOfSets { - profile = profiles; - preset = presets; - tune = tunes; - }; - - p720 = { profile, preset, tune }: - ffmpegTemplate "${profile}-${preset}-${tune}-720p" { - inherit profile preset tune; + configurations = lib.cartesianProductOfSets { + profile = profiles; + preset = presets; }; - p1080 = { profile, preset, tune }: - ffmpegTemplate "${profile}-${preset}-${tune}-1080p" { - inherit profile preset tune; - height = 1080; - width = 1920; - resolution = "1080p"; + p720 = { profile, preset }: + ffmpegTemplate "${profile}-${preset}-720p" { inherit profile preset; }; + + p1080 = { profile, preset }: + ffmpegTemplate "${profile}-${preset}-1080p" { + inherit profile preset; + height = 1080; + width = 1920; + resolution = "1080p"; + }; + in + (map p720 configurations) ++ (map p1080 configurations); + + ffmpegsTune = + let + configurations = lib.cartesianProductOfSets { + profile = profiles; + preset = presets; + tune = tunes; }; - in (map p720 configurations) ++ (map p1080 configurations); + p720 = { profile, preset, tune }: + ffmpegTemplate "${profile}-${preset}-${tune}-720p" { + inherit profile preset tune; + }; -in { + p1080 = { profile, preset, tune }: + ffmpegTemplate "${profile}-${preset}-${tune}-1080p" { + inherit profile preset tune; + height = 1080; + width = 1920; + resolution = "1080p"; + }; + + in + (map p720 configurations) ++ (map p1080 configurations); + +in +{ options.programs.custom.ffmpeg = { enable = mkEnableOption "enable programs.custom.ffmpeg"; diff --git a/nixos/modules/programs/git.nix b/nixos/modules/programs/git.nix index c721071..64c3c86 100644 --- a/nixos/modules/programs/git.nix +++ b/nixos/modules/programs/git.nix @@ -6,7 +6,8 @@ let cfg = config.programs.custom.git; -in { +in +{ options.programs.custom.git.enable = mkEnableOption "install git and all its tools"; diff --git a/nixos/modules/programs/shell-tools.nix b/nixos/modules/programs/shell-tools.nix index b0dad7e..780be40 100644 --- a/nixos/modules/programs/shell-tools.nix +++ b/nixos/modules/programs/shell-tools.nix @@ -29,7 +29,8 @@ let cfg = config.programs.custom.shellTools; -in { +in +{ options.programs.custom.shellTools.enable = mkEnableOption "enable shell tools"; diff --git a/nixos/modules/programs/shell-zsh.nix b/nixos/modules/programs/shell-zsh.nix index ba4b52f..d27f9da 100644 --- a/nixos/modules/programs/shell-zsh.nix +++ b/nixos/modules/programs/shell-zsh.nix @@ -6,7 +6,8 @@ let cfg = config.programs.custom.zsh; -in { +in +{ options.programs.custom.zsh = { enable = mkEnableOption "enable zsh"; diff --git a/nixos/modules/programs/slack.nix b/nixos/modules/programs/slack.nix index 90ef624..0af2fce 100644 --- a/nixos/modules/programs/slack.nix +++ b/nixos/modules/programs/slack.nix @@ -14,47 +14,51 @@ let # --------------------------- command = "${pkgs.slack}/bin/slack"; - desktopFile = let - name = program; - comment = "Chat Programm"; - in pkgs.writeTextFile { - name = "${name}.desktop"; - destination = "/share/applications/${name}.desktop"; - text = '' - [Desktop Entry] - Categories=Application;Utility; - Comment=${comment} - Encoding=UTF-8 - Exec=${bin}/bin/${name} - Icon=gnome-lockscreen - Name=${name} - Terminal=false - Type=Application - ''; - }; + desktopFile = + let + name = program; + comment = "Chat Programm"; + in + pkgs.writeTextFile { + name = "${name}.desktop"; + destination = "/share/applications/${name}.desktop"; + text = '' + [Desktop Entry] + Categories=Application;Utility; + Comment=${comment} + Encoding=UTF-8 + Exec=${bin}/bin/${name} + Icon=gnome-lockscreen + Name=${name} + Terminal=false + Type=Application + ''; + }; # the script # ---------- - bin = let - backupFile = "${cfg.homeBackup}.tar.lzma"; - rolloutFile = "${cfg.home}.tar.lzma"; - lockFile = "${cfg.home}-lock"; - in pkgs.writeShellScriptBin "${program}" '' - # set -x - if [[ ! -e ${lockFile} ]] - then - # rollout backup - if [[ -e ${backupFile} ]] + bin = + let + backupFile = "${cfg.homeBackup}.tar.lzma"; + rolloutFile = "${cfg.home}.tar.lzma"; + lockFile = "${cfg.home}-lock"; + in + pkgs.writeShellScriptBin "${program}" '' + # set -x + if [[ ! -e ${lockFile} ]] then - cp ${backupFile} ${rolloutFile} - sudo -u ${program} ${tarBin} xf ${rolloutFile} --directory ${cfg.home} - rm ${rolloutFile} - touch ${lockFile} + # rollout backup + if [[ -e ${backupFile} ]] + then + cp ${backupFile} ${rolloutFile} + sudo -u ${program} ${tarBin} xf ${rolloutFile} --directory ${cfg.home} + rm ${rolloutFile} + touch ${lockFile} + fi fi - fi - sudo -u ${program} ${command} - ''; + sudo -u ${program} ${command} + ''; backupScript = pkgs.writeShellScriptBin "${program}-backup" '' sudo -u ${program} \ @@ -75,7 +79,8 @@ let cfg = config.programs.custom.slack; -in { +in +{ options.programs.custom.slack = { enable = mkEnableOption "install slack"; diff --git a/nixos/modules/programs/steam.nix b/nixos/modules/programs/steam.nix index 5c44f7b..4a41c24 100644 --- a/nixos/modules/programs/steam.nix +++ b/nixos/modules/programs/steam.nix @@ -14,7 +14,8 @@ let cfg = config.programs.custom.steam; -in { +in +{ options.programs.custom.steam.enable = mkEnableOption "enable steam"; diff --git a/nixos/modules/programs/taskwarrior.nix b/nixos/modules/programs/taskwarrior.nix index 554bc8f..9b203e5 100644 --- a/nixos/modules/programs/taskwarrior.nix +++ b/nixos/modules/programs/taskwarrior.nix @@ -34,7 +34,8 @@ let }); #vit = pkgs.vit; -in { +in +{ options.programs.custom.taskwarrior.enable = mkEnableOption "Enable Taskwarrior services"; diff --git a/nixos/modules/programs/urxvt.nix b/nixos/modules/programs/urxvt.nix index 3e58175..f825089 100644 --- a/nixos/modules/programs/urxvt.nix +++ b/nixos/modules/programs/urxvt.nix @@ -6,7 +6,8 @@ let cfg = config.programs.custom.urxvt; -in { +in +{ options.programs.custom.urxvt = { @@ -63,24 +64,26 @@ in { URxvt.fading: 0 ''; - "X11/Xresource.d/urxvt-font".source = let - fontFamily = "terminus"; - normalFont = fontSize: - "-*-${fontFamily}-medium-*-*-*-${toString fontSize}-*-*-*-*-*-*-*"; - boldFont = fontSize: - "-*-${fontFamily}-bold-*-*-*-${toString fontSize}-*-*-*-*-*-*-*"; - italicFont = normalFont; - itallicBoldFont = boldFont; - backupFont = fontSize: - "xft:TerminessTTF Nerd Font:pixelsize=${toString fontSize}"; + "X11/Xresource.d/urxvt-font".source = + let + fontFamily = "terminus"; + normalFont = fontSize: + "-*-${fontFamily}-medium-*-*-*-${toString fontSize}-*-*-*-*-*-*-*"; + boldFont = fontSize: + "-*-${fontFamily}-bold-*-*-*-${toString fontSize}-*-*-*-*-*-*-*"; + italicFont = normalFont; + itallicBoldFont = boldFont; + backupFont = fontSize: + "xft:TerminessTTF Nerd Font:pixelsize=${toString fontSize}"; - fontCommand = key: fontSize: '' - URxvt.keysym.M-${key}: command:\033]710;${normalFont fontSize},${ - backupFont fontSize - }\007\033]711;${boldFont fontSize},${backupFont fontSize}\007 - ''; + fontCommand = key: fontSize: '' + URxvt.keysym.M-${key}: command:\033]710;${normalFont fontSize},${ + backupFont fontSize + }\007\033]711;${boldFont fontSize},${backupFont fontSize}\007 + ''; - in pkgs.writeText "Xresource-urxvt-font" '' + in + pkgs.writeText "Xresource-urxvt-font" '' URxvt.allow_bold: true URxvt.xftAntialias: true @@ -110,28 +113,31 @@ in { ${fontCommand "F4" (cfg.fontSize + 20)} ''; - "X11/Xresource.d/urxvt-colors".source = let - colorTheme = if (cfg.colorTheme == "dark") then '' - #define S_base03 #002b36 - #define S_base02 #073642 - #define S_base01 #586e75 - #define S_base00 #657b83 - #define S_base0 #839496 - #define S_base1 #93a1a1 - #define S_base2 #eee8d5 - #define S_base3 #fdf6e3 - '' else '' - #define S_base03 #fdf6e3 - #define S_base02 #eee8d5 - #define S_base01 #93a1a1 - #define S_base00 #839496 - #define S_base0 #657b83 - #define S_base1 #586e75 - #define S_base2 #073642 - #define S_base3 #002b36 - ''; + "X11/Xresource.d/urxvt-colors".source = + let + colorTheme = + if (cfg.colorTheme == "dark") then '' + #define S_base03 #002b36 + #define S_base02 #073642 + #define S_base01 #586e75 + #define S_base00 #657b83 + #define S_base0 #839496 + #define S_base1 #93a1a1 + #define S_base2 #eee8d5 + #define S_base3 #fdf6e3 + '' else '' + #define S_base03 #fdf6e3 + #define S_base02 #eee8d5 + #define S_base01 #93a1a1 + #define S_base00 #839496 + #define S_base0 #657b83 + #define S_base1 #586e75 + #define S_base2 #073642 + #define S_base3 #002b36 + ''; - in pkgs.writeText "Xresource-urxvt-colors" '' + in + pkgs.writeText "Xresource-urxvt-colors" '' !! Common !! ------ diff --git a/nixos/modules/programs/video.nix b/nixos/modules/programs/video.nix index 6409831..2f7be1e 100644 --- a/nixos/modules/programs/video.nix +++ b/nixos/modules/programs/video.nix @@ -9,24 +9,27 @@ let # show keyboard input on desktop for screencasts screenKey = pkgs.symlinkJoin { name = "screen-keys"; - paths = let - screenKeyScript = { position ? "bottom", size ? "small", ... }: - pkgs.writeShellScriptBin "screenkeys-${position}-${size}" # sh - '' - ${pkgs.screenkey}/bin/screenkey \ - --no-detach \ - --bg-color '#fdf6e3' \ - --font-color '#073642' \ - -p ${position} \ - -s ${size} \ - "$@" - ''; - in lib.flatten (lib.flip map [ "large" "small" "medium" ] (size: - lib.flip map [ "top" "center" "bottom" ] - (position: screenKeyScript { inherit size position; }))); + paths = + let + screenKeyScript = { position ? "bottom", size ? "small", ... }: + pkgs.writeShellScriptBin "screenkeys-${position}-${size}" # sh + '' + ${pkgs.screenkey}/bin/screenkey \ + --no-detach \ + --bg-color '#fdf6e3' \ + --font-color '#073642' \ + -p ${position} \ + -s ${size} \ + "$@" + ''; + in + lib.flatten (lib.flip map [ "large" "small" "medium" ] (size: + lib.flip map [ "top" "center" "bottom" ] + (position: screenKeyScript { inherit size position; }))); }; -in { +in +{ options.programs.custom.video.enable = mkEnableOption "enable video tools"; diff --git a/nixos/modules/programs/vim.nix b/nixos/modules/programs/vim.nix index c698f38..d48ec7e 100644 --- a/nixos/modules/programs/vim.nix +++ b/nixos/modules/programs/vim.nix @@ -125,7 +125,7 @@ let }).env - ''; + ''; }; # active plugins @@ -200,7 +200,8 @@ let ''; -in { +in +{ # no options options.programs.custom.vim.enable = lib.mkEnableOption "vim"; diff --git a/nixos/modules/programs/xterm.nix b/nixos/modules/programs/xterm.nix index 33968ec..8904c1b 100644 --- a/nixos/modules/programs/xterm.nix +++ b/nixos/modules/programs/xterm.nix @@ -6,7 +6,8 @@ let cfg = config.programs.custom.xterm; -in { +in +{ options.programs.custom.xterm = { enable = mkEnableOption "configure and enable urxvt"; @@ -41,17 +42,19 @@ in { ''; - "X11/Xresource.d/xterm-font".source = let - fontFamily = "terminus"; - normalFont = fontSize: - "-*-${fontFamily}-medium-*-*-*-${toString fontSize}-*-*-*-*-*-*-*"; - boldFont = fontSize: - "-*-${fontFamily}-bold-*-*-*-${toString fontSize}-*-*-*-*-*-*-*"; - italicFont = normalFont; - itallicBoldFont = boldFont; - backupFont = fontSize: - "xft:TerminessTTF Nerd Font:pixelsize=${toString fontSize}"; - in pkgs.writeText "Xresource-xterm-font" '' + "X11/Xresource.d/xterm-font".source = + let + fontFamily = "terminus"; + normalFont = fontSize: + "-*-${fontFamily}-medium-*-*-*-${toString fontSize}-*-*-*-*-*-*-*"; + boldFont = fontSize: + "-*-${fontFamily}-bold-*-*-*-${toString fontSize}-*-*-*-*-*-*-*"; + italicFont = normalFont; + itallicBoldFont = boldFont; + backupFont = fontSize: + "xft:TerminessTTF Nerd Font:pixelsize=${toString fontSize}"; + in + pkgs.writeText "Xresource-xterm-font" '' XTerm.allow_bold: true XTerm.xftAntialias: true @@ -76,29 +79,32 @@ in { XTerm.*.bolditalicFont: ${itallicBoldFont cfg.fontSize} ''; - "X11/Xresource.d/xterm-colors".source = let - colorTheme = if (cfg.colorTheme == "dark") then '' - #define S_base03 #002b36 - #define S_base02 #073642 - #define S_base01 #586e75 - #define S_base00 #657b83 - #define S_base0 #839496 - #define S_base1 #93a1a1 - #define S_base2 #eee8d5 - #define S_base3 #fdf6e3 + "X11/Xresource.d/xterm-colors".source = + let + colorTheme = + if (cfg.colorTheme == "dark") then '' + #define S_base03 #002b36 + #define S_base02 #073642 + #define S_base01 #586e75 + #define S_base00 #657b83 + #define S_base0 #839496 + #define S_base1 #93a1a1 + #define S_base2 #eee8d5 + #define S_base3 #fdf6e3 - '' else '' - #define S_base03 #fdf6e3 - #define S_base02 #eee8d5 - #define S_base01 #93a1a1 - #define S_base00 #839496 - #define S_base0 #657b83 - #define S_base1 #586e75 - #define S_base2 #073642 - #define S_base3 #002b36 - ''; + '' else '' + #define S_base03 #fdf6e3 + #define S_base02 #eee8d5 + #define S_base01 #93a1a1 + #define S_base00 #839496 + #define S_base0 #657b83 + #define S_base1 #586e75 + #define S_base2 #073642 + #define S_base3 #002b36 + ''; - in pkgs.writeText "Xresource-xterm-colors" '' + in + pkgs.writeText "Xresource-xterm-colors" '' !! Color Configuration !! ------------------- diff --git a/nixos/modules/services/castget.nix b/nixos/modules/services/castget.nix index d660ed0..20ebcfe 100644 --- a/nixos/modules/services/castget.nix +++ b/nixos/modules/services/castget.nix @@ -6,7 +6,8 @@ let cfg = config.custom.services.castget; -in { +in +{ options.custom.services.castget = { enable = mkEnableOption "enable custom.services.castget"; @@ -67,25 +68,33 @@ in { restartIfChanged = false; serviceConfig.User = cfg.user; - preStart = let - mkSpools = - mapAttrsToList (ignore: value: "mkdir -p ${value.spool}") cfg.feeds; - in concatStringsSep "\n" mkSpools; - script = let - channels = mapAttrsToList (key: ignore: key) cfg.feeds; - castget = "${pkgs.castget}/bin/castget"; + preStart = + let + mkSpools = + mapAttrsToList (ignore: value: "mkdir -p ${value.spool}") cfg.feeds; + in + concatStringsSep "\n" mkSpools; + script = + let + channels = mapAttrsToList (key: ignore: key) cfg.feeds; + castget = "${pkgs.castget}/bin/castget"; - configurationFile = let - configurations = mapAttrsToList (key: value: '' - [${key}] - url=${value.url} - spool=${value.spool} - '') cfg.feeds; - in (pkgs.writeText "castget-configuration" - (concatStringsSep "" configurations)); - in (concatMapStringsSep "\n" - (channel: "${castget} --rcfile ${configurationFile} ${channel}") - channels); + configurationFile = + let + configurations = mapAttrsToList + (key: value: '' + [${key}] + url=${value.url} + spool=${value.spool} + '') + cfg.feeds; + in + (pkgs.writeText "castget-configuration" + (concatStringsSep "" configurations)); + in + (concatMapStringsSep "\n" + (channel: "${castget} --rcfile ${configurationFile} ${channel}") + channels); }; systemd.timers."${cfg.serviceName}" = { diff --git a/nixos/modules/services/home-assistant.nix b/nixos/modules/services/home-assistant.nix index 99aa6e8..8f1631b 100644 --- a/nixos/modules/services/home-assistant.nix +++ b/nixos/modules/services/home-assistant.nix @@ -11,21 +11,24 @@ let inherit example description default; type = with lib.types; let - valueType = nullOr (oneOf [ - bool - int - float - str - (attrsOf valueType) - (listOf valueType) - ]) // { + valueType = nullOr + (oneOf [ + bool + int + float + str + (attrsOf valueType) + (listOf valueType) + ]) // { description = ""; emptyValue.value = { }; }; - in valueType; + in + valueType; }; -in { +in +{ options.services.homeAssistantConfig = mkMagicMergeOption { description = '' diff --git a/nixos/modules/services/lektor.nix b/nixos/modules/services/lektor.nix index 3b325cf..8655451 100644 --- a/nixos/modules/services/lektor.nix +++ b/nixos/modules/services/lektor.nix @@ -6,7 +6,8 @@ let cfg = config.services.lektor; -in { +in +{ options.services.lektor = { enable = mkEnableOption "enable services.lektor"; @@ -107,57 +108,59 @@ in { TimeoutStartSec = "infinity"; # it might take some time will this thing is up - ExecStartPre = let + ExecStartPre = + let - sshKeyTarget = "/run/keys.lektor/id_rsa"; + sshKeyTarget = "/run/keys.lektor/id_rsa"; - sshConfig = pkgs.writeText "sshconfig" '' - Host ${cfg.host} - IdentityFile ${sshKeyTarget} + sshConfig = pkgs.writeText "sshconfig" '' + Host ${cfg.host} + IdentityFile ${sshKeyTarget} - Host * - ForwardAgent no - Compression no - ServerAliveInterval 0 - HashKnownHosts no - UserKnownHostsFile ~/.ssh/known_hosts - ControlMaster no - ControlPath ~/.ssh/master-%r@%n:%p - ControlPersist no - ''; - - sshKeyScript = pkgs.writers.writeDash "keyfile-gen" # sh - '' - set -x - - # setup ~/.ssh - mkdir -p ${cfg.home}/.ssh - chown ${cfg.user} ${cfg.home}/.ssh - chmod 700 ${cfg.home}/.ssh - - cp ${sshConfig} ${cfg.home}/.ssh/config - chown ${cfg.user} ${cfg.home}/.ssh/config - chmod 500 ${cfg.home}/.ssh/config - - mkdir -p ${dirOf sshKeyTarget} - chmod 700 ${dirOf sshKeyTarget} - chown ${cfg.user} ${dirOf sshKeyTarget} - cp ${toString cfg.sshKey} ${sshKeyTarget} - chown ${cfg.user} ${sshKeyTarget} - chmod 500 ${sshKeyTarget} + Host * + ForwardAgent no + Compression no + ServerAliveInterval 0 + HashKnownHosts no + UserKnownHostsFile ~/.ssh/known_hosts + ControlMaster no + ControlPath ~/.ssh/master-%r@%n:%p + ControlPersist no ''; - cloneScript = pkgs.writers.writeDash "clone" # sh - '' - set -x - if [[ `ls ~/${cfg.user} | wc -l` == 0 ]] - then - rm ~/${cfg.user} - fi - ${pkgs.git}/bin/git clone ${cfg.repository} ~/${cfg.user} - ''; + sshKeyScript = pkgs.writers.writeDash "keyfile-gen" # sh + '' + set -x - in [ "+${sshKeyScript}" "-${cloneScript}" ]; + # setup ~/.ssh + mkdir -p ${cfg.home}/.ssh + chown ${cfg.user} ${cfg.home}/.ssh + chmod 700 ${cfg.home}/.ssh + + cp ${sshConfig} ${cfg.home}/.ssh/config + chown ${cfg.user} ${cfg.home}/.ssh/config + chmod 500 ${cfg.home}/.ssh/config + + mkdir -p ${dirOf sshKeyTarget} + chmod 700 ${dirOf sshKeyTarget} + chown ${cfg.user} ${dirOf sshKeyTarget} + cp ${toString cfg.sshKey} ${sshKeyTarget} + chown ${cfg.user} ${sshKeyTarget} + chmod 500 ${sshKeyTarget} + ''; + + cloneScript = pkgs.writers.writeDash "clone" # sh + '' + set -x + if [[ `ls ~/${cfg.user} | wc -l` == 0 ]] + then + rm ~/${cfg.user} + fi + ${pkgs.git}/bin/git clone ${cfg.repository} ~/${cfg.user} + ''; + + in + [ "+${sshKeyScript}" "-${cloneScript}" ]; }; # todo : add restart ruling diff --git a/nixos/modules/services/light-control.nix b/nixos/modules/services/light-control.nix index 6d01dcc..ae80a93 100644 --- a/nixos/modules/services/light-control.nix +++ b/nixos/modules/services/light-control.nix @@ -11,24 +11,27 @@ let inherit example description default; type = with lib.types; let - valueType = nullOr (oneOf [ - bool - int - float - str - (attrsOf valueType) - (listOf valueType) - ]) // { + valueType = nullOr + (oneOf [ + bool + int + float + str + (attrsOf valueType) + (listOf valueType) + ]) // { description = ""; emptyValue.value = { }; }; - in valueType; + in + valueType; }; lightControlConfig = pkgs.writeText "light-control.json" (builtins.toJSON cfg.config); -in { +in +{ options.services.mqtt.light-control = { enable = mkEnableOption "enable mqtt.light-control"; diff --git a/nixos/modules/services/samba-share.nix b/nixos/modules/services/samba-share.nix index 31909f0..47f403c 100644 --- a/nixos/modules/services/samba-share.nix +++ b/nixos/modules/services/samba-share.nix @@ -6,7 +6,8 @@ let cfg = config.custom.samba-share; -in { +in +{ options.custom.samba-share = { enable = mkEnableOption "enable custom.samba-share"; @@ -61,27 +62,31 @@ in { disable spoolss = yes ''; - shares = mapAttrs' (name: path: { - name = name; - value = { - browsable = "yes"; - comment = "read only share ${name}"; - path = path; - "read only" = "yes"; - "guest ok" = "yes"; - }; - }) cfg.folders // (mapAttrs' (name: - { users, folder, ... }: { + shares = mapAttrs' + (name: path: { name = name; value = { browsable = "yes"; comment = "read only share ${name}"; - path = folder; - "read only" = "no"; - "valid users" = users; - "guest ok" = "false"; + path = path; + "read only" = "yes"; + "guest ok" = "yes"; }; - }) cfg.private); + }) + cfg.folders // (mapAttrs' + (name: + { users, folder, ... }: { + name = name; + value = { + browsable = "yes"; + comment = "read only share ${name}"; + path = folder; + "read only" = "no"; + "valid users" = users; + "guest ok" = "false"; + }; + }) + cfg.private); }; users.users.smbguest = { diff --git a/nixos/modules/services/sshd.nix b/nixos/modules/services/sshd.nix index 2c514b3..a252e27 100644 --- a/nixos/modules/services/sshd.nix +++ b/nixos/modules/services/sshd.nix @@ -6,7 +6,8 @@ let cfg = config.services.custom.ssh; -in { +in +{ options.services.custom.ssh = { tools.enable = mkEnableOption "Add ssh tools"; @@ -44,14 +45,16 @@ in { Banner /etc/sshd/banner-line ''; - environment.etc."sshd/banner-line".text = let - text = config.networking.hostName; - size = 80 - (lib.stringLength text); - space = lib.fixedWidthString size " " ""; - in '' - ──────────────────────────────────────────────────────────────────────────────── - ${space}${text} - ''; + environment.etc."sshd/banner-line".text = + let + text = config.networking.hostName; + size = 80 - (lib.stringLength text); + space = lib.fixedWidthString size " " ""; + in + '' + ──────────────────────────────────────────────────────────────────────────────── + ${space}${text} + ''; }) diff --git a/nixos/modules/services/taskwarrior-pushover.nix b/nixos/modules/services/taskwarrior-pushover.nix index 3500ffb..365e842 100644 --- a/nixos/modules/services/taskwarrior-pushover.nix +++ b/nixos/modules/services/taskwarrior-pushover.nix @@ -14,7 +14,7 @@ in default = "4:00:00"; }; recurrence = mkOption { - type = enum["on" "off"]; + type = enum [ "on" "off" ]; default = "off"; }; pushoverApiTokenFile = mkOption { @@ -37,7 +37,7 @@ in certificateFile = mkOption { type = path; }; - credentials= mkOption { + credentials = mkOption { type = str; }; keyFile = mkOption { @@ -55,43 +55,44 @@ in DynamicUser = true; StateDirectory = name; }; - script = let - taskwarriorCommand = pkgs.writers.writeDash "taskwarrior-push" '' - ${pkgs.taskwarrior}/bin/task \ - rc.recurrence=${cfg.recurrence} \ - rc:/var/lib/${name}/.taskrc \ - rc.data.location=/var/lib/${name}/${cfg.dataDir} \ - rc.taskd.ca=${cfg.caFile} \ - rc.taskd.certificate=${cfg.certificateFile} \ - rc.taskd.credentials="${cfg.credentials}" \ - rc.taskd.key=${cfg.keyFile} \ - rc.taskd.server=${cfg.server} \ - "$@" - ''; - in + script = + let + taskwarriorCommand = pkgs.writers.writeDash "taskwarrior-push" '' + ${pkgs.taskwarrior}/bin/task \ + rc.recurrence=${cfg.recurrence} \ + rc:/var/lib/${name}/.taskrc \ + rc.data.location=/var/lib/${name}/${cfg.dataDir} \ + rc.taskd.ca=${cfg.caFile} \ + rc.taskd.certificate=${cfg.certificateFile} \ + rc.taskd.credentials="${cfg.credentials}" \ + rc.taskd.key=${cfg.keyFile} \ + rc.taskd.server=${cfg.server} \ + "$@" + ''; + in '' - if [ -d /var/lib/${name}/${cfg.dataDir} ] - then - echo "synchronize {cfg.dataDir}" - ${taskwarriorCommand} sync - else - echo "initialize ${cfg.dataDir}" - ${pkgs.coreutils}/bin/yes | ${taskwarriorCommand} sync init - fi + if [ -d /var/lib/${name}/${cfg.dataDir} ] + then + echo "synchronize {cfg.dataDir}" + ${taskwarriorCommand} sync + else + echo "initialize ${cfg.dataDir}" + ${pkgs.coreutils}/bin/yes | ${taskwarriorCommand} sync init + fi - ${taskwarriorCommand} '${cfg.query}' export \ - | ${pkgs.jq}/bin/jq -r '.[] | @base64' | while read entry - do - echo $entry | base64 --decode | \ - ${pkgs.jq}/bin/jq '{ - "token": "'`cat ${cfg.pushoverApiTokenFile}`'", - "user": "'`cat ${cfg.pushoverUserKeyFile}`'", - "titel": "taskwarrior", - message: .description - }' \ - | ${pkgs.curl}/bin/curl -sS -X POST -H 'Content-Type: application/json' -d @- \ - "https://api.pushover.net/1/messages.json" - done + ${taskwarriorCommand} '${cfg.query}' export \ + | ${pkgs.jq}/bin/jq -r '.[] | @base64' | while read entry + do + echo $entry | base64 --decode | \ + ${pkgs.jq}/bin/jq '{ + "token": "'`cat ${cfg.pushoverApiTokenFile}`'", + "user": "'`cat ${cfg.pushoverUserKeyFile}`'", + "titel": "taskwarrior", + message: .description + }' \ + | ${pkgs.curl}/bin/curl -sS -X POST -H 'Content-Type: application/json' -d @- \ + "https://api.pushover.net/1/messages.json" + done ''; }; systemd.timers.taskwarrior-pushover = { diff --git a/nixos/modules/services/videoencoder.nix b/nixos/modules/services/videoencoder.nix index 5bf0679..acf4d15 100644 --- a/nixos/modules/services/videoencoder.nix +++ b/nixos/modules/services/videoencoder.nix @@ -30,7 +30,8 @@ let fi ''; -in { +in +{ options.service.videoencoder = { enable = mkEnableOption "enable service.videoencoder"; @@ -91,14 +92,17 @@ in { systemd.services."videoEncoding" = { wantedBy = [ "multi-user.target" ]; enable = true; - script = let - myList = map (value: - createEncoder "/tmp/videoencoder" value.inputFile value.outputFile) - cfg.fileConfig; - in '' - set -x - ${concatStringsSep "\n" myList} - ''; + script = + let + myList = map + (value: + createEncoder "/tmp/videoencoder" value.inputFile value.outputFile) + cfg.fileConfig; + in + '' + set -x + ${concatStringsSep "\n" myList} + ''; }; diff --git a/nixos/modules/system/audio.nix b/nixos/modules/system/audio.nix index 97d4f3b..7f70540 100644 --- a/nixos/modules/system/audio.nix +++ b/nixos/modules/system/audio.nix @@ -41,7 +41,8 @@ let cfg = config.system.custom.audio; -in { +in +{ options.system.custom.audio = { enable = mkEnableOption "use PluseAudio"; diff --git a/nixos/modules/system/bluetooth.nix b/nixos/modules/system/bluetooth.nix index 79088d2..d756b87 100644 --- a/nixos/modules/system/bluetooth.nix +++ b/nixos/modules/system/bluetooth.nix @@ -4,7 +4,8 @@ let cfg = config.system.custom.bluetooth; -in { +in +{ options.system.custom.bluetooth.enable = lib.mkEnableOption "enable bluetooth support"; diff --git a/nixos/modules/system/font.nix b/nixos/modules/system/font.nix index 9cb0ab3..f8d10c3 100644 --- a/nixos/modules/system/font.nix +++ b/nixos/modules/system/font.nix @@ -6,7 +6,8 @@ let cfg = config.system.custom.fonts; -in { +in +{ options.system.custom.fonts = { enable = mkEnableOption "enable fonts"; diff --git a/nixos/modules/system/mainUser.nix b/nixos/modules/system/mainUser.nix index da19e78..b09c8dd 100644 --- a/nixos/modules/system/mainUser.nix +++ b/nixos/modules/system/mainUser.nix @@ -9,12 +9,14 @@ let dockerGroup = if (config.virtualisation.docker.enable) then [ "docker" ] else [ ]; - vboxGroup = if (config.virtualisation.virtualbox.host.enable) then - [ "vboxusers" ] - else - [ ]; + vboxGroup = + if (config.virtualisation.virtualbox.host.enable) then + [ "vboxusers" ] + else + [ ]; -in { +in +{ options.system.custom.mainUser = { diff --git a/nixos/modules/system/on-failure.nix b/nixos/modules/system/on-failure.nix index d45c4e7..1dae774 100644 --- a/nixos/modules/system/on-failure.nix +++ b/nixos/modules/system/on-failure.nix @@ -55,7 +55,8 @@ let ${cfg.url} ''; -in { +in +{ options.on-failure = api; diff --git a/nixos/modules/system/permown.nix b/nixos/modules/system/permown.nix index 7988dfb..791a63b 100644 --- a/nixos/modules/system/permown.nix +++ b/nixos/modules/system/permown.nix @@ -6,7 +6,8 @@ let cfg = config.system.permown; nameGenerator = path: "permown.${replaceStrings [ "/" ] [ "_" ] path}"; -in { +in +{ options.system.permown = mkOption { default = { }; @@ -45,51 +46,54 @@ in { })); }; - config = let plans = lib.attrValues cfg; + config = + let plans = lib.attrValues cfg; - in mkIf (plans != [ ]) { + in mkIf (plans != [ ]) { - system.activationScripts.permown = let - mkdir = { path, ... }: '' - ${pkgs.coreutils}/bin/mkdir -p ${path} - ''; - in concatMapStrings mkdir plans; + system.activationScripts.permown = + let + mkdir = { path, ... }: '' + ${pkgs.coreutils}/bin/mkdir -p ${path} + ''; + in + concatMapStrings mkdir plans; - systemd.services = listToAttrs (flip map plans - ({ path, directory-mode, file-mode, owner, group, umask, ... }: { + systemd.services = listToAttrs (flip map plans + ({ path, directory-mode, file-mode, owner, group, umask, ... }: { + name = nameGenerator path; + value = { + environment = { + DIR_MODE = directory-mode; + FILE_MODE = file-mode; + OWNER_GROUP = "${owner}:${group}"; + ROOT_PATH = path; + }; + path = [ pkgs.coreutils pkgs.findutils pkgs.inotifyTools ]; + serviceConfig = { + ExecStart = pkgs.writers.writeDash "permown" '' + set -efu + find "$ROOT_PATH" -exec chown -h "$OWNER_GROUP" {} + + find "$ROOT_PATH" -type d -exec chmod "$DIR_MODE" {} + + find "$ROOT_PATH" -type f -exec chmod "$FILE_MODE" {} + + ''; + PrivateTmp = true; + Restart = "always"; + RestartSec = 10; + UMask = umask; + }; + wantedBy = [ "multi-user.target" ]; + }; + })); + + systemd.timers = listToAttrs (flip map plans ({ path, timer, ... }: { name = nameGenerator path; value = { - environment = { - DIR_MODE = directory-mode; - FILE_MODE = file-mode; - OWNER_GROUP = "${owner}:${group}"; - ROOT_PATH = path; - }; - path = [ pkgs.coreutils pkgs.findutils pkgs.inotifyTools ]; - serviceConfig = { - ExecStart = pkgs.writers.writeDash "permown" '' - set -efu - find "$ROOT_PATH" -exec chown -h "$OWNER_GROUP" {} + - find "$ROOT_PATH" -type d -exec chmod "$DIR_MODE" {} + - find "$ROOT_PATH" -type f -exec chmod "$FILE_MODE" {} + - ''; - PrivateTmp = true; - Restart = "always"; - RestartSec = 10; - UMask = umask; - }; wantedBy = [ "multi-user.target" ]; + timerConfig.OnCalendar = timer; }; })); - systemd.timers = listToAttrs (flip map plans ({ path, timer, ... }: { - name = nameGenerator path; - value = { - wantedBy = [ "multi-user.target" ]; - timerConfig.OnCalendar = timer; - }; - })); - - }; + }; } diff --git a/nixos/modules/system/wifi.nix b/nixos/modules/system/wifi.nix index d9428ce..8cf14d2 100644 --- a/nixos/modules/system/wifi.nix +++ b/nixos/modules/system/wifi.nix @@ -6,7 +6,8 @@ let cfg = config.system.custom.wifi; -in { +in +{ options.system.custom.wifi = { enable = mkEnableOption "enable wifi"; diff --git a/nixos/modules/system/x11.nix b/nixos/modules/system/x11.nix index 228ca3c..bf05b42 100644 --- a/nixos/modules/system/x11.nix +++ b/nixos/modules/system/x11.nix @@ -6,7 +6,8 @@ let cfg = config.system.custom.x11; -in { +in +{ options.system.custom.x11 = { enable = mkEnableOption "enable x11"; diff --git a/nixos/pkgs/bitwig-studio/bitwig-studio-environment.nix b/nixos/pkgs/bitwig-studio/bitwig-studio-environment.nix index 7805bc5..9fbc9a2 100644 --- a/nixos/pkgs/bitwig-studio/bitwig-studio-environment.nix +++ b/nixos/pkgs/bitwig-studio/bitwig-studio-environment.nix @@ -12,7 +12,8 @@ let # function call # ------------- -in (pkgs.buildFHSUserEnv { +in +(pkgs.buildFHSUserEnv { # name of the programm # -------------------- diff --git a/nixos/pkgs/bitwig-studio/bitwig-studio1.nix b/nixos/pkgs/bitwig-studio/bitwig-studio1.nix index d4e106c..1bc9f1d 100644 --- a/nixos/pkgs/bitwig-studio/bitwig-studio1.nix +++ b/nixos/pkgs/bitwig-studio/bitwig-studio1.nix @@ -1,6 +1,27 @@ -{ stdenv, fetchurl, alsaLib, bzip2, cairo, dpkg, freetype, gdk_pixbuf, glib -, gtk2, harfbuzz, jdk, lib, xorg, libbsd, libjack2, libpng, libxkbcommon -, makeWrapper, pixman, xdg_utils, zenity, zlib }: +{ stdenv +, fetchurl +, alsaLib +, bzip2 +, cairo +, dpkg +, freetype +, gdk_pixbuf +, glib +, gtk2 +, harfbuzz +, jdk +, lib +, xorg +, libbsd +, libjack2 +, libpng +, libxkbcommon +, makeWrapper +, pixman +, xdg_utils +, zenity +, zlib +}: stdenv.mkDerivation rec { name = "bitwig-studio-${version}"; diff --git a/nixos/pkgs/emoji/default.nix b/nixos/pkgs/emoji/default.nix index 9171a77..aba2d04 100644 --- a/nixos/pkgs/emoji/default.nix +++ b/nixos/pkgs/emoji/default.nix @@ -40,9 +40,10 @@ let Yᵒᵘ Oᶰˡʸ Lᶤᵛᵉ Oᶰᶜᵉ | yolo ⊹╰(⌣ʟ⌣)╯⊹ | zen @}-,-`- | rose - ''; + ''; -in writeShellScriptBin "emoticons" '' +in +writeShellScriptBin "emoticons" '' set -efu data=$(${coreutils}/bin/cat ${emoticons}) diff --git a/nixos/pkgs/gitlog2json/default.nix b/nixos/pkgs/gitlog2json/default.nix index 972fca8..db3f91e 100644 --- a/nixos/pkgs/gitlog2json/default.nix +++ b/nixos/pkgs/gitlog2json/default.nix @@ -1,9 +1,11 @@ { pkgs, lib, ... }: -pkgs.writers.writePython3Bin "gitlog2json" { +pkgs.writers.writePython3Bin "gitlog2json" +{ libraries = [ pkgs.python3Packages.GitPython pkgs.python3Packages.click pkgs.python3Packages.elasticsearch ]; -} (lib.fileContents ./gitlog2json.py) +} + (lib.fileContents ./gitlog2json.py) diff --git a/nixos/pkgs/landingpage/default.nix b/nixos/pkgs/landingpage/default.nix index b5305b1..abba95d 100644 --- a/nixos/pkgs/landingpage/default.nix +++ b/nixos/pkgs/landingpage/default.nix @@ -1,5 +1,10 @@ -{ lib, writeTextFile, jsonConfig ? { }, title ? "Landing Page" -, destination ? "/index.html", ... }: +{ lib +, writeTextFile +, jsonConfig ? { } +, title ? "Landing Page" +, destination ? "/index.html" +, ... +}: with lib; diff --git a/nixos/pkgs/otpmenu/default.nix b/nixos/pkgs/otpmenu/default.nix index d0bc555..e2a151b 100644 --- a/nixos/pkgs/otpmenu/default.nix +++ b/nixos/pkgs/otpmenu/default.nix @@ -1,5 +1,12 @@ -{ lib, symlinkJoin, rofi, gnused, pass-otp, writeTextFile, writeShellScriptBin -, xdotool }: +{ lib +, symlinkJoin +, rofi +, gnused +, pass-otp +, writeTextFile +, writeShellScriptBin +, xdotool +}: let @@ -36,7 +43,8 @@ let printf %s "$otp" | ${xdotool}/bin/xdotool type -f - ''; -in symlinkJoin rec { +in +symlinkJoin rec { version = "1.0.0"; name = "otpMenu-${version}"; paths = [ bin desktopFile ]; diff --git a/nixos/pkgs/q/default.nix b/nixos/pkgs/q/default.nix index 3e16b66..034918c 100644 --- a/nixos/pkgs/q/default.nix +++ b/nixos/pkgs/q/default.nix @@ -1,82 +1,93 @@ -{ pkgs, lib -# tzselect is your frind do find timezones -, timeZones ? [ ], timeColor ? 9, timeZoneColor ? 10, calBackgroundColor ? 10 -, calWeekColor ? 13, calDayColor ? 9, enableIntelBacklight ? true -, userHighlight ? [ "palo" ], enableBattery ? true, ... }: +{ pkgs +, lib + # tzselect is your frind do find timezones +, timeZones ? [ ] +, timeColor ? 9 +, timeZoneColor ? 10 +, calBackgroundColor ? 10 +, calWeekColor ? 13 +, calDayColor ? 9 +, enableIntelBacklight ? true +, userHighlight ? [ "palo" ] +, enableBattery ? true +, ... +}: let hrule = "${pkgs.terminal-tools}/bin/hrule"; - q-cal = let + q-cal = + let - # Maximum width of cal's output. - calwidth = 23; + # Maximum width of cal's output. + calwidth = 23; - # Number of space characters between two calendars. - hspace = 2; + # Number of space characters between two calendars. + hspace = 2; - # Return number of columns required to print n calenders side by side. - need_width = n: assert n >= 1; n * calwidth + (n - 1) * hspace; + # Return number of columns required to print n calenders side by side. + need_width = n: assert n >= 1; n * calwidth + (n - 1) * hspace; - lpad = n: c: s: if lib.stringLength s < n then lpad n c (c + s) else s; + lpad = n: c: s: if lib.stringLength s < n then lpad n c (c + s) else s; - pad = '' - { - ${pkgs.gnused}/bin/sed ' - # rtrim - s/ *$// + pad = '' + { + ${pkgs.gnused}/bin/sed ' + # rtrim + s/ *$// - # delete last empty line - ''${/^$/d} + # delete last empty line + ''${/^$/d} + ' \ + | ${pkgs.gawk}/bin/awk '{printf "%-${ + toString calwidth + }s\n", $0}' \ + | ${pkgs.gnused}/bin/sed " + # colorize header + 1,2s/.*/[38;5;${toString calBackgroundColor}m&/ + + # highlight current week + s/^$(${pkgs.coreutils}/bin/date +%W)/[38;5;${ + toString calWeekColor + }m&/ + + # colorize week number + s/^[ 1-9][0-9]/[38;5;${ + toString calBackgroundColor + }m&/ + " + }''; + in + '' + cols=$(${pkgs.ncurses}/bin/tput cols) + ${pkgs.coreutils}/bin/paste \ + <(if test $cols -ge ${toString (need_width 3)}; then + ${pkgs.utillinux}/bin/cal -mw \ + $(${pkgs.coreutils}/bin/date +'%m %Y' -d 'last month') \ + | ${pad} + fi) \ + <(if test $cols -ge ${toString (need_width 1)}; then + ${pkgs.utillinux}/bin/cal -mw \ + | ${pkgs.gnused}/bin/sed ' + # colorize day of month + s/\(^\| \)'"$(${pkgs.coreutils}/bin/date +%e)"'\>/[38;5;${ + toString calDayColor + }m&/ ' \ - | ${pkgs.gawk}/bin/awk '{printf "%-${ - toString calwidth - }s\n", $0}' \ - | ${pkgs.gnused}/bin/sed " - # colorize header - 1,2s/.*/[38;5;${toString calBackgroundColor}m&/ - - # highlight current week - s/^$(${pkgs.coreutils}/bin/date +%W)/[38;5;${ - toString calWeekColor - }m&/ - - # colorize week number - s/^[ 1-9][0-9]/[38;5;${ - toString calBackgroundColor - }m&/ - " - }''; - in '' - cols=$(${pkgs.ncurses}/bin/tput cols) - ${pkgs.coreutils}/bin/paste \ - <(if test $cols -ge ${toString (need_width 3)}; then - ${pkgs.utillinux}/bin/cal -mw \ - $(${pkgs.coreutils}/bin/date +'%m %Y' -d 'last month') \ - | ${pad} - fi) \ - <(if test $cols -ge ${toString (need_width 1)}; then - ${pkgs.utillinux}/bin/cal -mw \ - | ${pkgs.gnused}/bin/sed ' - # colorize day of month - s/\(^\| \)'"$(${pkgs.coreutils}/bin/date +%e)"'\>/[38;5;${ - toString calDayColor - }m&/ - ' \ - | ${pad} - fi) \ - <(if test $cols -ge ${toString (need_width 2)}; then - ${pkgs.utillinux}/bin/cal -mw \ - $(${pkgs.coreutils}/bin/date +'%m %Y' -d 'next month') \ - | ${pad} - fi) \ - | ${pkgs.gnused}/bin/sed ' - s/^\t// - s/\t$// - s/\t/${lpad hspace " " ""}/g - ' - ''; + | ${pad} + fi) \ + <(if test $cols -ge ${toString (need_width 2)}; then + ${pkgs.utillinux}/bin/cal -mw \ + $(${pkgs.coreutils}/bin/date +'%m %Y' -d 'next month') \ + | ${pad} + fi) \ + | ${pkgs.gnused}/bin/sed ' + s/^\t// + s/\t$// + s/\t/${lpad hspace " " ""}/g + ' + ''; q-timeZoneDate = size: zone: let @@ -88,17 +99,19 @@ let comment = lib.optionalString (zone != null) " : ${lib.fixedWidthString size " " zone}"; # sh - in '' + in + '' ${timeZoneVariable} ${pkgs.coreutils}/bin/date ${ dateString comment } | ${pkgs.terminal-tools}/bin/center ''; - q-timeZoneDates = if timeZones == [ ] then - q-timeZoneDate 0 null - else - let size = lib.foldr lib.max 0 (map builtins.stringLength timeZones); - in lib.concatMapStringsSep "\n" (q-timeZoneDate size) timeZones; + q-timeZoneDates = + if timeZones == [ ] then + q-timeZoneDate 0 null + else + let size = lib.foldr lib.max 0 (map builtins.stringLength timeZones); + in lib.concatMapStringsSep "\n" (q-timeZoneDate size) timeZones; q-intel_backlight = '' cd /sys/class/backlight/intel_backlight @@ -116,144 +129,146 @@ let ' ''; - q-power_supply = let - power_supply = pkgs.writers.writeBash "power_supply" '' - set -efu - uevent=$1 - eval "$(${pkgs.gnused}/bin/sed -n ' - s/^\([A-Z_]\+=[0-9A-Za-z_-]*\)$/export \1/p - ' $uevent)" - case $POWER_SUPPLY_NAME in - AC) - exit # not battery - ;; - esac - exec = .42) full_color = "2" - else if (charge >= .23) full_color = "3" - else full_color = "1" - - left_arrow = 1 - middle_arrow = 1 - right_arrow = 1 - if (full_bars == 0) { - left_arrow = 0 - middle_arrow = 0 - } - if (empty_bars == 0) { - middle_arrow = 0 - right_arrow = 0 + q-power_supply = + let + power_supply = pkgs.writers.writeBash "power_supply" '' + set -efu + uevent=$1 + eval "$(${pkgs.gnused}/bin/sed -n ' + s/^\([A-Z_]\+=[0-9A-Za-z_-]*\)$/export \1/p + ' $uevent)" + case $POWER_SUPPLY_NAME in + AC) + exit # not battery + ;; + esac + exec = .42) full_color = "2" + else if (charge >= .23) full_color = "3" + else full_color = "1" + + left_arrow = 1 + middle_arrow = 1 + right_arrow = 1 + if (full_bars == 0) { + left_arrow = 0 + middle_arrow = 0 + } + if (empty_bars == 0) { + middle_arrow = 0 + right_arrow = 0 + } + + empty_color = "0"; + return sgr("38;5;" 8) sgr("48;5;" full_color) strdup("",left_arrow) strdup(" ", full_bars) sgr("48;5;" empty_color) sgr("38;5;" full_color) strdup("",middle_arrow) strdup(" ", empty_bars) sgr() sgr("38;5;" empty_color) strdup("",right_arrow) sgr() } - charge_ratio = charge_now / charge_full - - out = out sprintf("%20s │", name) - out = out sprintf(" %s", print_bar(10, charge_ratio)) - out = out sprintf(" %d%", charge_ratio * 100) - out = out sprintf(" %.2f%s", charge_now, charge_unit) - if (current_now != 0) { - out = out sprintf("/%.1f%s", current_now, current_unit) - } - out = out sprintf(" %d%s", energy_full, energy_unit) - if (power_now != 0) { - out = out sprintf("/%.1f%s", power_now, power_unit) - } - if (current_now != 0) { - out = out sprintf(" %s", print_hm(charge_now / current_now)) + function sgr(p) { + return "\x1b[" p "m" } - print out - } - ' + function strdup(s,n,t) { + t = sprintf("%"n"s","") + gsub(/ /,s,t) + return t + } + + END { + name = ENVIRON["POWER_SUPPLY_NAME"] + + charge_unit = "Ah" + charge_now = ENVIRON["POWER_SUPPLY_CHARGE_NOW"] / 10^6 + charge_full = ENVIRON["POWER_SUPPLY_CHARGE_FULL"] / 10^6 + + current_unit = "A" + current_now = ENVIRON["POWER_SUPPLY_CURRENT_NOW"] / 10^6 + + energy_unit = "Wh" + energy_now = ENVIRON["POWER_SUPPLY_ENERGY_NOW"] / 10^6 + energy_full = ENVIRON["POWER_SUPPLY_ENERGY_FULL"] / 10^6 + + power_unit = "W" + power_now = ENVIRON["POWER_SUPPLY_POWER_NOW"] / 10^6 + + voltage_unit = "V" + voltage_now = ENVIRON["POWER_SUPPLY_VOLTAGE_NOW"] / 10^6 + voltage_min_design = ENVIRON["POWER_SUPPLY_VOLTAGE_MIN_DESIGN"] / 10^6 + + #printf "charge_now: %s\n", charge_now + #printf "charge_full: %s\n", charge_full + #printf "current_now: %s\n", current_now + #printf "energy_now: %s\n", energy_now + #printf "energy_full: %s\n", energy_full + #printf "energy_full: %s\n", ENVIRON["POWER_SUPPLY_ENERGY_FULL"] + #printf "energy_full: %s\n", ENVIRON["POWER_SUPPLY_ENERGY_FULL"] / 10^6 + #printf "power_now: %s\n", power_now + #printf "voltage_now: %s\n", voltage_now + + if (current_now == 0 && voltage_now != 0) { + current_now = power_now / voltage_now + } + if (power_now == 0) { + power_now = current_now * voltage_now + } + if (charge_now == 0 && voltage_min_design != 0) { + charge_now = energy_now / voltage_min_design + } + if (energy_now == 0) { + energy_now = charge_now * voltage_min_design + } + if (charge_full == 0 && voltage_min_design != 0) { + charge_full = energy_full / voltage_min_design + } + if (energy_full == 0) { + energy_full = charge_full * voltage_min_design + } + + if (charge_now == 0 || charge_full == 0) { + die("unknown charge") + } + + charge_ratio = charge_now / charge_full + + out = out sprintf("%20s │", name) + out = out sprintf(" %s", print_bar(10, charge_ratio)) + out = out sprintf(" %d%", charge_ratio * 100) + out = out sprintf(" %.2f%s", charge_now, charge_unit) + if (current_now != 0) { + out = out sprintf("/%.1f%s", current_now, current_unit) + } + out = out sprintf(" %d%s", energy_full, energy_unit) + if (power_now != 0) { + out = out sprintf("/%.1f%s", power_now, power_unit) + } + if (current_now != 0) { + out = out sprintf(" %s", print_hm(charge_now / current_now)) + } + + print out + } + ' + ''; + in + '' + for uevent in /sys/class/power_supply/*/uevent; do + ${power_supply} "$uevent" || : + done ''; - in '' - for uevent in /sys/class/power_supply/*/uevent; do - ${power_supply} "$uevent" || : - done - ''; q-virtualization = '' printf '%20s │ %s\n' "VT" \ @@ -323,7 +338,8 @@ let ''; # bash needed for <(...) -in pkgs.writers.writeBashBin "q" '' +in +pkgs.writers.writeBashBin "q" '' set -eu export PATH=/var/empty ${hrule} diff --git a/nixos/pkgs/sononym-crawler/default.nix b/nixos/pkgs/sononym-crawler/default.nix index bb52774..0ff2812 100644 --- a/nixos/pkgs/sononym-crawler/default.nix +++ b/nixos/pkgs/sononym-crawler/default.nix @@ -32,7 +32,8 @@ let }; -in (pkgs.buildFHSUserEnv { +in +(pkgs.buildFHSUserEnv { # name it # ------- diff --git a/nixos/pkgs/sononym/default.nix b/nixos/pkgs/sononym/default.nix index e417243..9b9d6d4 100644 --- a/nixos/pkgs/sononym/default.nix +++ b/nixos/pkgs/sononym/default.nix @@ -32,7 +32,8 @@ let }; -in (pkgs.buildFHSUserEnv { +in +(pkgs.buildFHSUserEnv { # name it # ------- diff --git a/nixos/system/all/borg-jobs.nix b/nixos/system/all/borg-jobs.nix index 7f07942..5275b75 100644 --- a/nixos/system/all/borg-jobs.nix +++ b/nixos/system/all/borg-jobs.nix @@ -20,58 +20,62 @@ }; }; - config = let + config = + let - servers = [ - { - name = "workhorse"; - host = "workhorse.private"; - } - { - name = "pepe"; - host = "pepe.private"; - } - ]; + servers = [ + { + name = "workhorse"; + host = "workhorse.private"; + } + { + name = "pepe"; + host = "pepe.private"; + } + ]; - dirs = config.backup.dirs; + dirs = config.backup.dirs; - myHostname = config.networking.hostName; + myHostname = config.networking.hostName; + + setup = server: { + paths = config.backup.dirs; + exclude = config.backup.exclude; + doInit = true; + repo = "borg@${server}:./${myHostname}"; + encryption = { + mode = "repokey-blake2"; + passCommand = + "cat ${config.sops.secrets.backup_repository_passphrase.path}"; + }; + environment.BORG_RSH = + "ssh -i ${toString config.sops.secrets.backup_ssh_rsa_private.path}"; + compression = "auto,lzma"; + startAt = "daily"; + prune.keep = { + within = "10d"; # Keep all backups in the last 10 days. + weekly = 8; # Keep 8 additional end of week archives. + monthly = -1; # Keep end of month archive for every month + }; - setup = server: { - paths = config.backup.dirs; - exclude = config.backup.exclude; - doInit = true; - repo = "borg@${server}:./${myHostname}"; - encryption = { - mode = "repokey-blake2"; - passCommand = - "cat ${config.sops.secrets.backup_repository_passphrase.path}"; - }; - environment.BORG_RSH = - "ssh -i ${toString config.sops.secrets.backup_ssh_rsa_private.path}"; - compression = "auto,lzma"; - startAt = "daily"; - prune.keep = { - within = "10d"; # Keep all backups in the last 10 days. - weekly = 8; # Keep 8 additional end of week archives. - monthly = -1; # Keep end of month archive for every month }; + in + { + + sops.secrets.backup_repository_passphrase = { }; + sops.secrets.backup_ssh_rsa_private = { }; + + services.borgbackup.jobs = + let + setups = map ({ name, host }: { "${name}" = setup host; }) servers; + setupAttrs = lib.zipAttrsWith (_: vals: lib.head vals) setups; + nonEmptySetups = + lib.filterAttrs (_: { paths, ... }: builtins.length paths != 0) + setupAttrs; + in + nonEmptySetups; + }; - in { - - sops.secrets.backup_repository_passphrase = { }; - sops.secrets.backup_ssh_rsa_private = { }; - - services.borgbackup.jobs = let - setups = map ({ name, host }: { "${name}" = setup host; }) servers; - setupAttrs = lib.zipAttrsWith (_: vals: lib.head vals) setups; - nonEmptySetups = - lib.filterAttrs (_: { paths, ... }: builtins.length paths != 0) - setupAttrs; - in nonEmptySetups; - - }; - } diff --git a/nixos/system/all/borg-scripts.nix b/nixos/system/all/borg-scripts.nix index 8b991aa..8ad58b0 100644 --- a/nixos/system/all/borg-scripts.nix +++ b/nixos/system/all/borg-scripts.nix @@ -1,20 +1,24 @@ { pkgs, lib, ... }: { - environment.systemPackages = let - createScript = command: host: repository: - pkgs.writers.writeBashBin - "borg-${command}-on-${host}-for-${repository}" '' - ${pkgs.borgbackup}/bin/borg \ - ${command} \ - --rsh='ssh -i ~/.ssh/card_rsa.pub' borg@${host}.private:${repository}/. \ - "$@" - ''; - hosts = [ "workhorse" "pepe" ]; - repositories = [ "workhorse" "pepe" "sterni" "workout" ]; - commands = [ "list" ]; - in lib.flatten (map (command: - map - (host: map (repository: createScript command host repository) repositories) - hosts) commands); + environment.systemPackages = + let + createScript = command: host: repository: + pkgs.writers.writeBashBin + "borg-${command}-on-${host}-for-${repository}" '' + ${pkgs.borgbackup}/bin/borg \ + ${command} \ + --rsh='ssh -i ~/.ssh/card_rsa.pub' borg@${host}.private:${repository}/. \ + "$@" + ''; + hosts = [ "workhorse" "pepe" ]; + repositories = [ "workhorse" "pepe" "sterni" "workout" ]; + commands = [ "list" ]; + in + lib.flatten (map + (command: + map + (host: map (repository: createScript command host repository) repositories) + hosts) + commands); } diff --git a/nixos/system/all/grub.nix b/nixos/system/all/grub.nix index 6424a04..8b3858c 100644 --- a/nixos/system/all/grub.nix +++ b/nixos/system/all/grub.nix @@ -5,7 +5,8 @@ let rev = "fe27cbc99e994d50bb4269a9388e3f7d60492ffa"; sha256 = "1z8zc4k2mh8d56ipql8vfljvdjczrrna5ckgzjsdyrndfkwv8ghw"; }; -in { +in +{ boot.loader.grub.extraConfig = '' set theme=($drive1)//themes/fallout-grub-theme/theme.txt diff --git a/nixos/system/all/networking-qos.nix b/nixos/system/all/networking-qos.nix index 645fca9..82c6213 100644 --- a/nixos/system/all/networking-qos.nix +++ b/nixos/system/all/networking-qos.nix @@ -26,28 +26,30 @@ }; }; - config = let - kbits = number: - import (pkgs.runCommand "round-${toString number}" { } - ''awk 'BEGIN{printf "\"%ikbit\"", ${toString number}}' > $out''); + config = + let + kbits = number: + import (pkgs.runCommand "round-${toString number}" { } + ''awk 'BEGIN{printf "\"%ikbit\"", ${toString number}}' > $out''); - interface = config.configuration.fireqos.interface; - input = "${toString config.configuration.fireqos.input}kbit"; - output = "${toString config.configuration.fireqos.output}kbit"; - tincInput = kbits (config.configuration.fireqos.input * 0.7); - tincOutput = kbits (config.configuration.fireqos.output * 0.7); - useBalancedForExperimenting = false; + interface = config.configuration.fireqos.interface; + input = "${toString config.configuration.fireqos.input}kbit"; + output = "${toString config.configuration.fireqos.output}kbit"; + tincInput = kbits (config.configuration.fireqos.input * 0.7); + tincOutput = kbits (config.configuration.fireqos.output * 0.7); + useBalancedForExperimenting = false; - tincPorts = - lib.mapAttrsToList (name: configuration: toString configuration.port) - config.module.cluster.services.tinc; + tincPorts = + lib.mapAttrsToList (name: configuration: toString configuration.port) + config.module.cluster.services.tinc; - in { + in + { - # https://firehol.org/tutorial/fireqos-new-user/ - services.fireqos.enable = config.configuration.fireqos.enable; - systemd.services.fireqos.wantedBy = [ "multi-user.target" ]; - services.fireqos.config = '' + # https://firehol.org/tutorial/fireqos-new-user/ + services.fireqos.enable = config.configuration.fireqos.enable; + systemd.services.fireqos.wantedBy = [ "multi-user.target" ]; + services.fireqos.config = '' # ------------------- world @@ -121,6 +123,6 @@ ''; - }; + }; } diff --git a/nixos/system/all/nginx-landingpage.nix b/nixos/system/all/nginx-landingpage.nix index 4051593..762b698 100644 --- a/nixos/system/all/nginx-landingpage.nix +++ b/nixos/system/all/nginx-landingpage.nix @@ -228,28 +228,32 @@ } { text = "Syncthings"; - items = map ({ name, host ? "${name}.private", ... }: { - label = name; - href = "http://${host}:8384/"; - image = - "https://media.giphy.com/media/JoyU4vuzwj6ZA7Ging/giphy.gif"; - }) (map (name: { inherit name; }) (lib.attrNames - config.module.cluster.services.tinc."private".hosts)); + items = map + ({ name, host ? "${name}.private", ... }: { + label = name; + href = "http://${host}:8384/"; + image = + "https://media.giphy.com/media/JoyU4vuzwj6ZA7Ging/giphy.gif"; + }) + (map (name: { inherit name; }) (lib.attrNames + config.module.cluster.services.tinc."private".hosts)); } { text = "netdata"; - items = map ({ name, host ? "${name}.private", ... }: { - label = name; - href = "http://${host}:19999/"; - image = "https://media.giphy.com/media/BkjdN6MQCDPaw/giphy.gif"; - }) (map (name: { inherit name; }) [ - "workhorse" - "porani" - "pepe" - "sputnik" - ] - #(lib.attrNames config.module.cluster.services.tinc."private".hosts) - ); + items = map + ({ name, host ? "${name}.private", ... }: { + label = name; + href = "http://${host}:19999/"; + image = "https://media.giphy.com/media/BkjdN6MQCDPaw/giphy.gif"; + }) + (map (name: { inherit name; }) [ + "workhorse" + "porani" + "pepe" + "sputnik" + ] + #(lib.attrNames config.module.cluster.services.tinc."private".hosts) + ); } ]; }; diff --git a/nixos/system/all/nginx.nix b/nixos/system/all/nginx.nix index f9c566f..58b64fc 100644 --- a/nixos/system/all/nginx.nix +++ b/nixos/system/all/nginx.nix @@ -2,7 +2,8 @@ let access_log_sink = "workhorse.private:12304"; error_log_sink = "workhorse.private:12305"; -in { +in +{ security.acme.email = "contact@ingolf-wagner.de"; security.acme.acceptTerms = true; diff --git a/nixos/system/all/packages.nix b/nixos/system/all/packages.nix index 5f2ee52..90a77b5 100644 --- a/nixos/system/all/packages.nix +++ b/nixos/system/all/packages.nix @@ -29,14 +29,17 @@ let EOF ''; - storepath = let - dirname = "${pkgs.coreutils-full}/bin/dirname"; - readlink = "${pkgs.coreutils-full}/bin/readlink"; - in pkgs.writers.writeBashBin "storepath" '' - ${dirname} $( ${readlink} $( type -p "$1" ) ) - ''; + storepath = + let + dirname = "${pkgs.coreutils-full}/bin/dirname"; + readlink = "${pkgs.coreutils-full}/bin/readlink"; + in + pkgs.writers.writeBashBin "storepath" '' + ${dirname} $( ${readlink} $( type -p "$1" ) ) + ''; -in { +in +{ #imports = [ ./packages/llvm-config-dummy.nix ]; diff --git a/nixos/system/all/packages/llvm-config-dummy.nix b/nixos/system/all/packages/llvm-config-dummy.nix index e3f03e6..06f89b3 100644 --- a/nixos/system/all/packages/llvm-config-dummy.nix +++ b/nixos/system/all/packages/llvm-config-dummy.nix @@ -1,41 +1,43 @@ { pkgs, config, lib, ... }: with pkgs.lib; { - environment.systemPackages = let - llvm = pkgs.llvm; - llvm-config = pkgs.writers.writeBashBin "llvm-config" '' - while [[ $# -gt 0 ]]; do - arg="$1" - case $arg in - --assertion-mode) - echo "OFF" - ;; - --bindir) - echo "${getBin llvm}/bin" - ;; - --libdir) - echo "${getLib llvm}/lib" - ;; - --includedir) - echo "${getDev llvm}/include" - ;; - --prefix) - echo "${llvm.out}" - ;; - --src-root) - echo "/build/llvm"; - ;; - --obj-root) - echo "/build/llvm/build"; - ;; - --cmakedir) - echo "${getDev llvm}/lib/cmake/llvm" - ;; - *) - echo "Unhandled argument '$arg' passed to dummy llvm-config!" - exit 1 - esac - shift - done - ''; - in [ llvm-config ]; + environment.systemPackages = + let + llvm = pkgs.llvm; + llvm-config = pkgs.writers.writeBashBin "llvm-config" '' + while [[ $# -gt 0 ]]; do + arg="$1" + case $arg in + --assertion-mode) + echo "OFF" + ;; + --bindir) + echo "${getBin llvm}/bin" + ;; + --libdir) + echo "${getLib llvm}/lib" + ;; + --includedir) + echo "${getDev llvm}/include" + ;; + --prefix) + echo "${llvm.out}" + ;; + --src-root) + echo "/build/llvm"; + ;; + --obj-root) + echo "/build/llvm/build"; + ;; + --cmakedir) + echo "${getDev llvm}/lib/cmake/llvm" + ;; + *) + echo "Unhandled argument '$arg' passed to dummy llvm-config!" + exit 1 + esac + shift + done + ''; + in + [ llvm-config ]; } diff --git a/nixos/system/all/shell.nix b/nixos/system/all/shell.nix index 18d0b32..b70ab71 100644 --- a/nixos/system/all/shell.nix +++ b/nixos/system/all/shell.nix @@ -1,4 +1,2 @@ { config, lib, ... }: -{ - -} +{ } diff --git a/nixos/system/all/sshd-known-hosts-bootup.nix b/nixos/system/all/sshd-known-hosts-bootup.nix index 3ba3693..8a71e8a 100644 --- a/nixos/system/all/sshd-known-hosts-bootup.nix +++ b/nixos/system/all/sshd-known-hosts-bootup.nix @@ -3,47 +3,56 @@ with lib; let computers = { - workhorse = { - onionId = fileContents ../../private_assets/onion_id_workhorse; - publicKey = - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII/I4JBA1HHTH2xsrEM7xtxkhRDE42lZcBrdBvN46WTx"; - }; - porani = { - onionId = fileContents ../../private_assets/onion_id_porani; - publicKey = - "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGFaTRGqMd/rKpyMUP6wVbgiWFOUvUV2qS/B5Xe02UUch/wxR4fTCY+vnzku5K0V/qqJpjYLgHotwZFqO/8lFu4="; - }; + #workhorse = { + # onionId = fileContents ../../private_assets/onion_id_workhorse; + # publicKey = + # "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII/I4JBA1HHTH2xsrEM7xtxkhRDE42lZcBrdBvN46WTx"; + #}; + #porani = { + # onionId = fileContents ../../private_assets/onion_id_porani; + # publicKey = + # "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGFaTRGqMd/rKpyMUP6wVbgiWFOUvUV2qS/B5Xe02UUch/wxR4fTCY+vnzku5K0V/qqJpjYLgHotwZFqO/8lFu4="; + #}; }; -in { +in +{ - services.openssh.knownHosts = mapAttrs' (name: - { onionId, publicKey, ... }: { - name = "${name}-init-ssh"; - value = { - hostNames = [ onionId ]; - inherit publicKey; - }; - }) computers; + services.openssh.knownHosts = mapAttrs' + (name: + { onionId, publicKey, ... }: { + name = "${name}-init-ssh"; + value = { + hostNames = [ onionId ]; + inherit publicKey; + }; + }) + computers; - environment.systemPackages = let + environment.systemPackages = + let - ssh = mapAttrsToList (name: - { onionId, ... }: - pkgs.writers.writeDashBin "ssh-boot-to-${name}" '' - ${pkgs.tor}/bin/torify ${pkgs.openssh}/bin/ssh root@${onionId} -p 23 - '') computers; + ssh = mapAttrsToList + (name: + { onionId, ... }: + pkgs.writers.writeDashBin "ssh-boot-to-${name}" '' + ${pkgs.tor}/bin/torify ${pkgs.openssh}/bin/ssh root@${onionId} -p 23 + '') + computers; - password = mapAttrsToList (name: - { onionId, ... }: - pkgs.writers.writeDashBin "unlock-boot-${name}" '' - ${pkgs.tor}/bin/torify ${pkgs.openssh}/bin/ssh root@${onionId} -p 23 ' - echo -n "enter password : " - read password - echo "$password" > /crypt-ramfs/passphrase - ' - '') computers; + password = mapAttrsToList + (name: + { onionId, ... }: + pkgs.writers.writeDashBin "unlock-boot-${name}" '' + ${pkgs.tor}/bin/torify ${pkgs.openssh}/bin/ssh root@${onionId} -p 23 ' + echo -n "enter password : " + read password + echo "$password" > /crypt-ramfs/passphrase + ' + '') + computers; - in ssh ++ password; + in + ssh ++ password; } diff --git a/nixos/system/all/syncthing.nix b/nixos/system/all/syncthing.nix index 3b4e22f..23e937f 100644 --- a/nixos/system/all/syncthing.nix +++ b/nixos/system/all/syncthing.nix @@ -5,23 +5,25 @@ with lib; { guiAddress = lib.mkDefault "${config.networking.hostName}.private:8384"; declarative = { overrideDevices = true; - devices = let - device = name: id: { - "${name}" = { - name = name; - id = id; - addresses = - [ "tcp://${name}.private:22000" "tcp://${name}.private:21027" ]; + devices = + let + device = name: id: { + "${name}" = { + name = name; + id = id; + addresses = + [ "tcp://${name}.private:22000" "tcp://${name}.private:21027" ]; + }; }; - }; - in (device "workhorse" - "AFSAKB6-JLH4QAS-DSRMPI3-6PVCIHF-IIAVLPC-STPNO3Y-YRDU5NW-QD445QI") - // (device "pepe" - "SZLXFW3-VTAC7UB-V2Z7CHE-3VZAYPL-6D72AK6-OCDMPZP-G4FPY5P-FL6ZVAG") - // (device "workout" - "DZOOAKG-GI2SVOS-QEVMFL7-TRHVTPQ-ADIJEVH-RH5WV3J-6M7MJHC-C53EOAC") - // (device "sterni" - "ZFNNKPD-ZSOAYJQ-VROXXDB-5MD3UTJ-GDCNTSQ-G5POVV3-UZG5HFT-CCAU3AD") // { + in + (device "workhorse" + "AFSAKB6-JLH4QAS-DSRMPI3-6PVCIHF-IIAVLPC-STPNO3Y-YRDU5NW-QD445QI") + // (device "pepe" + "SZLXFW3-VTAC7UB-V2Z7CHE-3VZAYPL-6D72AK6-OCDMPZP-G4FPY5P-FL6ZVAG") + // (device "workout" + "DZOOAKG-GI2SVOS-QEVMFL7-TRHVTPQ-ADIJEVH-RH5WV3J-6M7MJHC-C53EOAC") + // (device "sterni" + "ZFNNKPD-ZSOAYJQ-VROXXDB-5MD3UTJ-GDCNTSQ-G5POVV3-UZG5HFT-CCAU3AD") // { "porani" = { name = "porani"; id = diff --git a/nixos/system/all/tinc.nix b/nixos/system/all/tinc.nix index d5182bc..5782c0c 100644 --- a/nixos/system/all/tinc.nix +++ b/nixos/system/all/tinc.nix @@ -7,7 +7,8 @@ let sha256 = "0kczrr6dr5dmhx2kbanw46w6ig2v3w42rqhjanv87xhwkgw81l08"; }; -in { +in +{ imports = [ ../../modules ]; diff --git a/nixos/system/desktop/audio.nix b/nixos/system/desktop/audio.nix index bdcd85f..3981b13 100644 --- a/nixos/system/desktop/audio.nix +++ b/nixos/system/desktop/audio.nix @@ -11,7 +11,8 @@ let "${pkgs.mixxx}/bin/mixxx --settingsPath ${config.users.users.mainUser.home}/music-library-free/mixxx"; mixxxFreeDesktop = library.desktopFile mixxxFreeBin { longName = "Mixxx"; }; -in { +in +{ system.custom.audio = { enable = true; diff --git a/nixos/system/desktop/browser.nix b/nixos/system/desktop/browser.nix index 4bef675..947e7b0 100644 --- a/nixos/system/desktop/browser.nix +++ b/nixos/system/desktop/browser.nix @@ -2,7 +2,8 @@ let backupFolder = "~/desktop"; homeFolder = "/browsers"; -in { +in +{ programs.custom.browser = { enable = lib.mkDefault true; configList = { diff --git a/nixos/system/desktop/cachix.nix b/nixos/system/desktop/cachix.nix index 64734c3..b81b657 100644 --- a/nixos/system/desktop/cachix.nix +++ b/nixos/system/desktop/cachix.nix @@ -7,7 +7,8 @@ let filterCaches = key: value: value == "regular" && lib.hasSuffix ".nix" key; imports = lib.mapAttrsToList toImport (lib.filterAttrs filterCaches (builtins.readDir folder)); -in { +in +{ inherit imports; nix.binaryCaches = [ "https://cache.nixos.org/" ]; } diff --git a/nixos/system/desktop/home-manager.nix b/nixos/system/desktop/home-manager.nix index 890ef11..13a97f1 100644 --- a/nixos/system/desktop/home-manager.nix +++ b/nixos/system/desktop/home-manager.nix @@ -25,7 +25,8 @@ let keysym u = u U udiaeresis Udiaeresis keysym s = s S ssharp ''; -in { +in +{ imports = [ ./home-manager/dunst.nix @@ -293,21 +294,22 @@ in { }; - environment.systemPackages = let - library = import ../../library { inherit pkgs lib; }; + environment.systemPackages = + let + library = import ../../library { inherit pkgs lib; }; - fixKeyboard = pkgs.writeScriptBin "fix-Keyboard" # sh - '' - ${pkgs.xorg.xmodmap}/bin/xmodmap ${xmodmapConfig} - ''; + fixKeyboard = pkgs.writeScriptBin "fix-Keyboard" # sh + '' + ${pkgs.xorg.xmodmap}/bin/xmodmap ${xmodmapConfig} + ''; - fixXhost = pkgs.writeScriptBin "fix-xhost" # sh - '' - ${pkgs.xorg.xhost}/bin/xhost + &> /dev/null - ''; + fixXhost = pkgs.writeScriptBin "fix-xhost" # sh + '' + ${pkgs.xorg.xhost}/bin/xhost + &> /dev/null + ''; - fixX = pkgs.writeScriptBin "fix-X" # sh - '' + fixX = pkgs.writeScriptBin "fix-X" # sh + '' ${fixKeyboard}/bin/fix-Keyboard @@ -324,12 +326,13 @@ in { done ''; - in [ - fixX - fixXhost - (library.desktopFile fixX { longName = "fix X"; }) - fixKeyboard - (library.desktopFile fixKeyboard { longName = "fix keyboard"; }) - ]; + in + [ + fixX + fixXhost + (library.desktopFile fixX { longName = "fix X"; }) + fixKeyboard + (library.desktopFile fixKeyboard { longName = "fix keyboard"; }) + ]; } diff --git a/nixos/system/desktop/home-manager/spacemacs.nix b/nixos/system/desktop/home-manager/spacemacs.nix index 229a094..00df5cd 100644 --- a/nixos/system/desktop/home-manager/spacemacs.nix +++ b/nixos/system/desktop/home-manager/spacemacs.nix @@ -14,7 +14,8 @@ let ticks = "\"''\""; -in { +in +{ environment.systemPackages = [ # needed for the SPC p g @@ -24,25 +25,27 @@ in { ]; # download git repositories into the home folder - systemd.services = let - clone = repository: folder: branch: { - enable = true; - wantedBy = [ "multi-user.target" ]; - description = "clone ${repository} to ${folder}"; - serviceConfig.User = userName; - unitConfig.ConditionPathExists = "!${folder}"; - script = '' - ${pkgs.git}/bin/git clone ${repository} --branch ${branch} ${folder} - ''; + systemd.services = + let + clone = repository: folder: branch: { + enable = true; + wantedBy = [ "multi-user.target" ]; + description = "clone ${repository} to ${folder}"; + serviceConfig.User = userName; + unitConfig.ConditionPathExists = "!${folder}"; + script = '' + ${pkgs.git}/bin/git clone ${repository} --branch ${branch} ${folder} + ''; + }; + in + { + spacemacs-pull = + clone "https://github.com/syl20bnr/spacemacs" "${home}/.emacs.d" "master"; + # todo move this to spacevim.nix + spacevim-pull = + clone "https://github.com/SpaceVim/SpaceVim.git" "${home}/.SpaceVim" + "master"; }; - in { - spacemacs-pull = - clone "https://github.com/syl20bnr/spacemacs" "${home}/.emacs.d" "master"; - # todo move this to spacevim.nix - spacevim-pull = - clone "https://github.com/SpaceVim/SpaceVim.git" "${home}/.SpaceVim" - "master"; - }; home-manager.users."${user}" = { diff --git a/nixos/system/desktop/home-manager/spacevim.nix b/nixos/system/desktop/home-manager/spacevim.nix index 5530c64..d0505ed 100644 --- a/nixos/system/desktop/home-manager/spacevim.nix +++ b/nixos/system/desktop/home-manager/spacevim.nix @@ -1,38 +1,40 @@ { lib, pkgs, ... }: { - environment.systemPackages = let - spacevimRepo = pkgs.fetchgit { - url = "https://github.com/SpaceVim/SpaceVim.git"; - rev = "9b354e05b4716b645ba6366e1265a5048a0c23d5"; - sha256 = "1mn28hf857kp0jmbgd89cf5mk4dg53jcbqqrbr9zi3b854sa9ads"; - }; + environment.systemPackages = + let + spacevimRepo = pkgs.fetchgit { + url = "https://github.com/SpaceVim/SpaceVim.git"; + rev = "9b354e05b4716b645ba6366e1265a5048a0c23d5"; + sha256 = "1mn28hf857kp0jmbgd89cf5mk4dg53jcbqqrbr9zi3b854sa9ads"; + }; - vimRc = pkgs.writeText "vimrc" '' - " search/grep case insensitive - :set ignorecase + vimRc = pkgs.writeText "vimrc" '' + " search/grep case insensitive + :set ignorecase - " tabs should always be 2 spaces - set et ts=2 sts=2 sw=2 + " tabs should always be 2 spaces + set et ts=2 sts=2 sw=2 - " show Trailing Whitespaces - :set list listchars=tab:»·,trail:¶ + " show Trailing Whitespaces + :set list listchars=tab:»·,trail:¶ - " start spacevim - source ${spacevimRepo}/init.vim + " start spacevim + source ${spacevimRepo}/init.vim - " configure command cross - "":hi CursorLine cterm=NONE ctermbg=0 guibg=#073642 - "":hi CursorColumn cterm=NONE ctermbg=0 guibg=#073642 - ""set cursorline - ""set cursorcolumn + " configure command cross + "":hi CursorLine cterm=NONE ctermbg=0 guibg=#073642 + "":hi CursorColumn cterm=NONE ctermbg=0 guibg=#073642 + ""set cursorline + ""set cursorcolumn - " disable noisy indentLine - let g:indentLine_enabled = 0 - ''; - in [ + " disable noisy indentLine + let g:indentLine_enabled = 0 + ''; + in + [ - # vim - (pkgs.writers.writeDashBin "spacevim" '' - exec ${pkgs.neovim}/bin/nvim -u ${vimRc} "$@" - '') - ]; + # vim + (pkgs.writers.writeDashBin "spacevim" '' + exec ${pkgs.neovim}/bin/nvim -u ${vimRc} "$@" + '') + ]; } diff --git a/nixos/system/desktop/home-manager/xmonad.nix b/nixos/system/desktop/home-manager/xmonad.nix index 1114be5..09a26f9 100644 --- a/nixos/system/desktop/home-manager/xmonad.nix +++ b/nixos/system/desktop/home-manager/xmonad.nix @@ -9,31 +9,32 @@ let nixCommands = { height, width }: pkgs.writeText "NixCommands.hs" # haskell - '' - module NixCommands where + '' + module NixCommands where - nixStartIrc = "${pkgs.rxvt_unicode}/bin/urxvt -e irc" - nixStartAudacious = "${pkgs.audacious}/bin/audacious" - nixStartFlameshot = "${pkgs.flameshot}/bin/flameshot gui -p /share/" - nixInvertColors = "${pkgs.xcalib}/bin/xcalib -invert -alter" - nixStartRedshift = "${pkgs.redshift}/bin/redshift -O 6100 -g 0.9:0.9:0.9 -b 0.9" - nixResetRedshift = "${pkgs.redshift}/bin/redshift -x" - nixSetCursorImage = "${pkgs.xorg.xsetroot}/bin/xsetroot -cursor_name left_ptr" - nixSetBackground = "${pkgs.polygon-art.polygon-art}/bin/rings --height ${ - toString height - } --width ${ - toString width - } /dev/shm/background.png && ${pkgs.feh}/bin/feh --bg-scale /dev/shm/background.png" - nixStartAlbert = "${pkgs.albert}/bin/albert" - nixStartCopyq = "${pkgs.copyq}/bin/copyq" - nixShowCopyq = "${pkgs.copyq}/bin/copyq show" - nixStartTerminal = "${pkgs.rxvt_unicode}/bin/urxvtc" - nixAlsaRaiseVolume = "${pkgs.alsaUtils}/bin/amixer set Master 5%+" - nixAlsaLowerVolume = "${pkgs.alsaUtils}/bin/amixer set Master 5%-" - nixAlsaMute = "${pkgs.alsaUtils}/bin/amixer set Master toggle" - nixNotifySend = "${pkgs.libnotify}/bin/notify-send" - ''; -in { + nixStartIrc = "${pkgs.rxvt_unicode}/bin/urxvt -e irc" + nixStartAudacious = "${pkgs.audacious}/bin/audacious" + nixStartFlameshot = "${pkgs.flameshot}/bin/flameshot gui -p /share/" + nixInvertColors = "${pkgs.xcalib}/bin/xcalib -invert -alter" + nixStartRedshift = "${pkgs.redshift}/bin/redshift -O 6100 -g 0.9:0.9:0.9 -b 0.9" + nixResetRedshift = "${pkgs.redshift}/bin/redshift -x" + nixSetCursorImage = "${pkgs.xorg.xsetroot}/bin/xsetroot -cursor_name left_ptr" + nixSetBackground = "${pkgs.polygon-art.polygon-art}/bin/rings --height ${ + toString height + } --width ${ + toString width + } /dev/shm/background.png && ${pkgs.feh}/bin/feh --bg-scale /dev/shm/background.png" + nixStartAlbert = "${pkgs.albert}/bin/albert" + nixStartCopyq = "${pkgs.copyq}/bin/copyq" + nixShowCopyq = "${pkgs.copyq}/bin/copyq show" + nixStartTerminal = "${pkgs.rxvt_unicode}/bin/urxvtc" + nixAlsaRaiseVolume = "${pkgs.alsaUtils}/bin/amixer set Master 5%+" + nixAlsaLowerVolume = "${pkgs.alsaUtils}/bin/amixer set Master 5%-" + nixAlsaMute = "${pkgs.alsaUtils}/bin/amixer set Master toggle" + nixNotifySend = "${pkgs.libnotify}/bin/notify-send" + ''; +in +{ home-manager.users.mainUser = { home.file.".xmonad/xmonad.hs".source = ./xmonad/Main.hs; diff --git a/nixos/system/desktop/home-manager/xmonad/env.nix b/nixos/system/desktop/home-manager/xmonad/env.nix index 9709729..dd21d29 100644 --- a/nixos/system/desktop/home-manager/xmonad/env.nix +++ b/nixos/system/desktop/home-manager/xmonad/env.nix @@ -1,12 +1,13 @@ { pkgs ? import { - overlays = [ - (self: super: { - haskellPackages = super.haskellPackages.override { - overrides = self: super: { - current-project = super.callPackage ./current-project.nix { }; + overlays = [ + (self: super: { + haskellPackages = super.haskellPackages.override { + overrides = self: super: { + current-project = super.callPackage ./current-project.nix { }; + }; }; - }; - }) - ]; -} }: + }) + ]; + } +}: pkgs.haskellPackages.current-project.env diff --git a/nixos/system/desktop/home-manager/xmonad/lsp.nix b/nixos/system/desktop/home-manager/xmonad/lsp.nix index e4cd960..d3f20a1 100644 --- a/nixos/system/desktop/home-manager/xmonad/lsp.nix +++ b/nixos/system/desktop/home-manager/xmonad/lsp.nix @@ -2,8 +2,9 @@ let all-hies = import (fetchTarball "https://github.com/infinisil/all-hies/tarball/master") - { }; -in pkgs.mkShell { + { }; +in +pkgs.mkShell { buildInputs = with pkgs; [ haskellPackages.hoogle haskellPackages.hindent diff --git a/nixos/system/desktop/home-manager/xmonad/shell.nix b/nixos/system/desktop/home-manager/xmonad/shell.nix index f1e4df2..c695ead 100644 --- a/nixos/system/desktop/home-manager/xmonad/shell.nix +++ b/nixos/system/desktop/home-manager/xmonad/shell.nix @@ -6,4 +6,5 @@ let echo "# created by cabal2nix " > ${toString ./.}/current-project.nix ${pkgs.cabal2nix}/bin/cabal2nix . >> ${toString ./.}/current-project.nix ''; -in pkgs.mkShell { buildInputs = with pkgs; [ updateCabal cabal2nix ]; } +in +pkgs.mkShell { buildInputs = with pkgs; [ updateCabal cabal2nix ]; } diff --git a/nixos/system/desktop/icecast.nix b/nixos/system/desktop/icecast.nix index 38bcee3..99fc427 100644 --- a/nixos/system/desktop/icecast.nix +++ b/nixos/system/desktop/icecast.nix @@ -13,7 +13,8 @@ let mountPoint = "/radio.mp3"; maxListeners = 20; -in { +in +{ services.icecast = { enable = true; diff --git a/nixos/system/desktop/mail-stuff.nix b/nixos/system/desktop/mail-stuff.nix index a16686d..396beb1 100644 --- a/nixos/system/desktop/mail-stuff.nix +++ b/nixos/system/desktop/mail-stuff.nix @@ -3,7 +3,8 @@ let passcmd = id: "${pkgs.pass}/bin/pass ${id}"; ticks = "''"; -in { +in +{ # Maildir <-> Server communication # -------------------------------- # mbsync: MailDir <-> IMAP @@ -137,247 +138,254 @@ in { text/html; ${pkgs.elinks}/bin/elinks -dump ; copiousoutput; ''; - home-manager.users.mainUser.home.file.".muttrc".text = let + home-manager.users.mainUser.home.file.".muttrc".text = + let - index_format = pkgs.writers.writeDash "index_format" '' - # http://www.mutt.org/doc/manual/#formatstrings - recipent="$(echo $1 | sed 's/[^,]*<\([^>]*\)[^,]*/ \1/g')" - echo "%4C %Z %?GI?%GI& ? %[%y-%m-%d %H:%M] %-20.20a %?M?(%3M)& ? %s %> $recipent %?g?%g?%" - ''; - in '' - # gpg - set crypt_use_gpgme=yes - set crypt_autosign=yes - set crypt_verify_sig=yes - set crypt_replysign=yes - set crypt_replyencrypt=yes - set crypt_replysignencrypted=yes + index_format = pkgs.writers.writeDash "index_format" '' + # http://www.mutt.org/doc/manual/#formatstrings + recipent="$(echo $1 | sed 's/[^,]*<\([^>]*\)[^,]*/ \1/g')" + echo "%4C %Z %?GI?%GI& ? %[%y-%m-%d %H:%M] %-20.20a %?M?(%3M)& ? %s %> $recipent %?g?%g?%" + ''; + in + '' + # gpg + set crypt_use_gpgme=yes + set crypt_autosign=yes + set crypt_verify_sig=yes + set crypt_replysign=yes + set crypt_replyencrypt=yes + set crypt_replysignencrypted=yes - # mutt is not smart enough to see if I have a key or not - #set crypt_autoencrypt = yes + # mutt is not smart enough to see if I have a key or not + #set crypt_autoencrypt = yes - set pgp_check_gpg_decrypt_status_fd - set pgp_use_gpg_agent = yes - set pgp_self_encrypt = yes # needs default key - set pgp_default_key = 42AC51C9482D0834CF488AF1389EC2D64AC71EAC + set pgp_check_gpg_decrypt_status_fd + set pgp_use_gpg_agent = yes + set pgp_self_encrypt = yes # needs default key + set pgp_default_key = 42AC51C9482D0834CF488AF1389EC2D64AC71EAC - # read html mails - auto_view text/html - set mailcap_path = ~/.mailcap + # read html mails + auto_view text/html + set mailcap_path = ~/.mailcap - # notmuch - set nm_default_uri="notmuch://$HOME/Maildir" # path to the maildir - set nm_record = yes - set nm_record_tags = "-inbox me archive" - set virtual_spoolfile=yes # enable virtual folders + # notmuch + set nm_default_uri="notmuch://$HOME/Maildir" # path to the maildir + set nm_record = yes + set nm_record_tags = "-inbox me archive" + set virtual_spoolfile=yes # enable virtual folders - set sendmail=${ - pkgs.writers.writeBash "msmtp" '' - ${pkgs.coreutils}/bin/tee >(${pkgs.notmuch}/bin/notmuch insert --create-folder +sent) | \ - ${pkgs.msmtp}/bin/msmtpq "$@" - '' - } + set sendmail=${ + pkgs.writers.writeBash "msmtp" '' + ${pkgs.coreutils}/bin/tee >(${pkgs.notmuch}/bin/notmuch insert --create-folder +sent) | \ + ${pkgs.msmtp}/bin/msmtpq "$@" + '' + } - set from="contact@ingolf-wagner.de" - #alternates ^.*@ingolf-wagner\.de$ ^.*@.*\.r$ - set use_from=yes - set envelope_from=yes - set reverse_name + set from="contact@ingolf-wagner.de" + #alternates ^.*@ingolf-wagner\.de$ ^.*@.*\.r$ + set use_from=yes + set envelope_from=yes + set reverse_name - set sort=threads + set sort=threads - set index_format="${index_format} %r |" - folder-hook 'Discourse.*' 'set sort=reverse-date' + set index_format="${index_format} %r |" + folder-hook 'Discourse.*' 'set sort=reverse-date' - virtual-mailboxes "INBOX" "notmuch://?query=(tag:inbox or (tag:sent and not tag:archive)) AND NOT tag:muted AND NOT tag:list AND NOT tag:fraud AND NOT tag:junk" - virtual-mailboxes "Unread" "notmuch://?query=(tag:unread AND NOT tag:muted)" - virtual-mailboxes "Space left" "notmuch://?query=((tag:spaceleft OR tag:space-lef) AND NOT tag:muted)" - virtual-mailboxes "Sononym" "notmuch://?query=(tag:sononym AND NOT tag:muted)" - virtual-mailboxes "c-base" "notmuch://?query=(tag:cbase AND NOT tag:muted)" - virtual-mailboxes "shopping" "notmuch://?query=((tag:billing OR tag:shopping) AND NOT tag:muted)" - virtual-mailboxes "Immobilien" "notmuch://?query=(tag:immobilien AND NOT tag:muted)" - virtual-mailboxes "NixOS Github" "notmuch://?query=(tag:github AND tag:nixos AND NOT tag:muted)" - virtual-mailboxes "Discourse.all" "notmuch://?query=(tag:discourse AND NOT tag:muted)" - virtual-mailboxes "Discourse.development" "notmuch://?query=(tag:discourse AND tag:development AND NOT tag:muted)" - virtual-mailboxes "Discourse.announcements" "notmuch://?query=(tag:discourse AND tag:announcements AND NOT tag:muted)" - virtual-mailboxes "Discourse.links" "notmuch://?query=(tag:discourse AND tag:links AND NOT tag:muted)" - virtual-mailboxes "Discourse.games" "notmuch://?query=(tag:discourse AND tag:games AND NOT tag:muted)" - virtual-mailboxes "Discourse.meta" "notmuch://?query=(tag:discourse AND tag:meta AND NOT tag:muted)" - virtual-mailboxes "Discourse.events" "notmuch://?query=(tag:discourse AND tag:events AND NOT tag:muted)" - virtual-mailboxes "Flagged" "notmuch://?query=tag:flagged" - virtual-mailboxes "Archive" "notmuch://?query=tag:archive" - virtual-mailboxes "Sent" "notmuch://?query=tag:sent" - virtual-mailboxes "Fraud" "notmuch://?query=(tag:fraud)" - virtual-mailboxes "Junk" "notmuch://?query=(tag:junk)" - virtual-mailboxes "All" "notmuch://?query=*" + virtual-mailboxes "INBOX" "notmuch://?query=(tag:inbox or (tag:sent and not tag:archive)) AND NOT tag:muted AND NOT tag:list AND NOT tag:fraud AND NOT tag:junk" + virtual-mailboxes "Unread" "notmuch://?query=(tag:unread AND NOT tag:muted)" + virtual-mailboxes "Space left" "notmuch://?query=((tag:spaceleft OR tag:space-lef) AND NOT tag:muted)" + virtual-mailboxes "Sononym" "notmuch://?query=(tag:sononym AND NOT tag:muted)" + virtual-mailboxes "c-base" "notmuch://?query=(tag:cbase AND NOT tag:muted)" + virtual-mailboxes "shopping" "notmuch://?query=((tag:billing OR tag:shopping) AND NOT tag:muted)" + virtual-mailboxes "Immobilien" "notmuch://?query=(tag:immobilien AND NOT tag:muted)" + virtual-mailboxes "NixOS Github" "notmuch://?query=(tag:github AND tag:nixos AND NOT tag:muted)" + virtual-mailboxes "Discourse.all" "notmuch://?query=(tag:discourse AND NOT tag:muted)" + virtual-mailboxes "Discourse.development" "notmuch://?query=(tag:discourse AND tag:development AND NOT tag:muted)" + virtual-mailboxes "Discourse.announcements" "notmuch://?query=(tag:discourse AND tag:announcements AND NOT tag:muted)" + virtual-mailboxes "Discourse.links" "notmuch://?query=(tag:discourse AND tag:links AND NOT tag:muted)" + virtual-mailboxes "Discourse.games" "notmuch://?query=(tag:discourse AND tag:games AND NOT tag:muted)" + virtual-mailboxes "Discourse.meta" "notmuch://?query=(tag:discourse AND tag:meta AND NOT tag:muted)" + virtual-mailboxes "Discourse.events" "notmuch://?query=(tag:discourse AND tag:events AND NOT tag:muted)" + virtual-mailboxes "Flagged" "notmuch://?query=tag:flagged" + virtual-mailboxes "Archive" "notmuch://?query=tag:archive" + virtual-mailboxes "Sent" "notmuch://?query=tag:sent" + virtual-mailboxes "Fraud" "notmuch://?query=(tag:fraud)" + virtual-mailboxes "Junk" "notmuch://?query=(tag:junk)" + virtual-mailboxes "All" "notmuch://?query=*" - tag-transforms "junk" "k" \ - "unread" "u" \ - "replied" "↻" \ + tag-transforms "junk" "k" \ + "unread" "u" \ + "replied" "↻" \ - # notmuch bindings - bind index \\\\ noop - bind pager \\ noop - bind pager \\\\ noop - macro index \\\\ "" # looks up a hand made query - macro pager \\\\ "" # looks up a hand made query + # notmuch bindings + bind index \\\\ noop + bind pager \\ noop + bind pager \\\\ noop + macro index \\\\ "" # looks up a hand made query + macro pager \\\\ "" # looks up a hand made query - macro index + "+flagged\n" # tag as starred - macro pager + "+flagged\n" # tag as starred - macro index ! "+flagged\n" # tag as starred - macro pager ! "+flagged\n" # tag as starred - macro index - "-flagged\n" # tag as unstarred - macro pager - "-flagged\n" # tag as unstarred + macro index + "+flagged\n" # tag as starred + macro pager + "+flagged\n" # tag as starred + macro index ! "+flagged\n" # tag as starred + macro pager ! "+flagged\n" # tag as starred + macro index - "-flagged\n" # tag as unstarred + macro pager - "-flagged\n" # tag as unstarred - # Address Book - # ------------ - set query_command="${pkgs.notmuch-addrlookup}/bin/notmuch-addrlookup --mutt '%s'" + # Address Book + # ------------ + set query_command="${pkgs.notmuch-addrlookup}/bin/notmuch-addrlookup --mutt '%s'" - # keys bindings - # ------------- - bind index d noop - bind index D noop - bind pager d noop - bind pager D noop - macro index D "-inbox -unread +deleted\n" # tag as deleted mail - macro index d "-deleted\n" # tag as deleted mail - macro pager D "-inbox -unread +deleted\n" # tag as deleted mail - macro pager d "-deleted\n" # tag as deleted mail + # keys bindings + # ------------- + bind index d noop + bind index D noop + bind pager d noop + bind pager D noop + macro index D "-inbox -unread +deleted\n" # tag as deleted mail + macro index d "-deleted\n" # tag as deleted mail + macro pager D "-inbox -unread +deleted\n" # tag as deleted mail + macro pager d "-deleted\n" # tag as deleted mail - bind index S noop - bind index s noop - bind pager S noop - bind pager s noop - macro index S "-inbox -unread +junk\n" # tag as junk mail - macro index s "-junk\n" # tag as junk mail - macro pager S "-inbox -unread +junk\n" # tag as junk mail - macro pager s "-junk\n" # tag as junk mail + bind index S noop + bind index s noop + bind pager S noop + bind pager s noop + macro index S "-inbox -unread +junk\n" # tag as junk mail + macro index s "-junk\n" # tag as junk mail + macro pager S "-inbox -unread +junk\n" # tag as junk mail + macro pager s "-junk\n" # tag as junk mail - bind index r noop - bind index R noop - bind pager r noop - bind pager R noop - macro index r "" # reply to all - macro index R "" # reply - macro pager r "" # reply to all - macro pager R "" # reply + bind index r noop + bind index R noop + bind pager r noop + bind pager R noop + macro index r "" # reply to all + macro index R "" # reply + macro pager r "" # reply to all + macro pager R "" # reply - bind index A noop - bind index a noop - bind pager A noop - bind pager a noop - macro index A "+archive -unread -inbox\n" # tag as Archived - macro index a "-archive\n" # tag as Archived - macro pager A "+archive -unread -inbox\n" # tag as Archived - macro pager a "-archive\n" # tag as Archived + bind index A noop + bind index a noop + bind pager A noop + bind pager a noop + macro index A "+archive -unread -inbox\n" # tag as Archived + macro index a "-archive\n" # tag as Archived + macro pager A "+archive -unread -inbox\n" # tag as Archived + macro pager a "-archive\n" # tag as Archived - bind index U noop - bind index u noop - bind pager U noop - bind pager u noop - macro index u "+unread\n" - macro index U "-unread\n" - macro pager u "+unread\n" - macro pager U "-unread\n" + bind index U noop + bind index u noop + bind pager U noop + bind pager u noop + macro index u "+unread\n" + macro index U "-unread\n" + macro pager u "+unread\n" + macro pager U "-unread\n" - bind index l noop - bind pager l noop - macro index l "" # set tags manual - macro pager l "" # set tags manual + bind index l noop + bind pager l noop + macro index l "" # set tags manual + macro pager l "" # set tags manual - # taskwarrior - # ----------- - # from https://www.nixternal.com/mark-e-mails-in-mutt-as-tasks-in-taskwarrior/ - bind index t noop - bind pager t noop - bind index T noop - bind pager T noop - macro index T "${ - pkgs.writers.writeDash "mutt2task" '' - ${pkgs.taskwarrior}/bin/task add +email scheduled:today E-mail: $( ${pkgs.gnugrep}/bin/grep 'Subject' $* | awk -F: '{print $2}' ) - '' - }" + # taskwarrior + # ----------- + # from https://www.nixternal.com/mark-e-mails-in-mutt-as-tasks-in-taskwarrior/ + bind index t noop + bind pager t noop + bind index T noop + bind pager T noop + macro index T "${ + pkgs.writers.writeDash "mutt2task" '' + ${pkgs.taskwarrior}/bin/task add +email scheduled:today E-mail: $( ${pkgs.gnugrep}/bin/grep 'Subject' $* | awk -F: '{print $2}' ) + '' + }" - # top index bar in email view - set pager_index_lines=7 - # top_index_bar toggle - macro pager ,@1 " set pager_index_lines=0; macro pager ] ,@2 'Toggle indexbar" - macro pager ,@2 " set pager_index_lines=3; macro pager ] ,@3 'Toggle indexbar" - macro pager ,@3 " set pager_index_lines=7; macro pager ] ,@1 'Toggle indexbar" - macro pager ] ,@1 'Toggle indexbar + # top index bar in email view + set pager_index_lines=7 + # top_index_bar toggle + macro pager ,@1 " set pager_index_lines=0; macro pager ] ,@2 'Toggle indexbar" + macro pager ,@2 " set pager_index_lines=3; macro pager ] ,@3 'Toggle indexbar" + macro pager ,@3 " set pager_index_lines=7; macro pager ] ,@1 'Toggle indexbar" + macro pager ] ,@1 'Toggle indexbar - # sidebar - # ------- - set sidebar_width = 20 - set sidebar_visible = yes # set to "no" to disable sidebar view at startup - color sidebar_new yellow default - # sidebar bindings - bind index sidebar-prev # got to previous folder in sidebar - bind index sidebar-next # got to next folder in sidebar - bind index sidebar-open # open selected folder from sidebar + # sidebar + # ------- + set sidebar_width = 20 + set sidebar_visible = yes # set to "no" to disable sidebar view at startup + color sidebar_new yellow default + # sidebar bindings + bind index sidebar-prev # got to previous folder in sidebar + bind index sidebar-next # got to next folder in sidebar + bind index sidebar-open # open selected folder from sidebar - # sidebar toggle - #macro index,pager ,@) " set sidebar_visible=no; macro index,pager [ ,@( 'Toggle sidebar'" - #macro index,pager ,@( " set sidebar_visible=yes; macro index,pager [ ,@) 'Toggle sidebar'" - #macro index,pager [ ,@( 'Toggle sidebar' # toggle the sidebar - ''; - - environment.systemPackages = let - - mailSync = pkgs.writers.writeDashBin "mail-sync" '' - ${pkgs.muchsync}/bin/muchsync mailfetcher@workhorse.private --nonew - ''; - mailSend = pkgs.writers.writeDashBin "mail-send" '' - ${pkgs.msmtp}/bin/msmtp-queue -r - ''; - mailView = pkgs.writers.writeDashBin "mail-view" '' - ${pkgs.neomutt}/bin/neomutt"$@" - ''; - mutt = pkgs.writers.writeDashBin "mutt" '' - ${pkgs.neomutt}/bin/neomutt"$@" - ''; - mail = pkgs.writers.writeDashBin "mail" '' - ${mailSync}/bin/mail-sync - ${mailView}/bin/mail-view - ${mailSend}/bin/mail-send - ${mailSync}/bin/mail-sync - ''; - mailDelete = let notmuch = "${pkgs.notmuch}/bin/notmuch"; - in pkgs.writers.writeBashBin "mail-delete" '' - set -efu - set -o pipefail - - if ! ${notmuch} search --exclude=false tag:deleted | tac ; then - echo 'No killed mail.' - exit 1 - fi - - printf 'want do rm this mail? \[y/N\] ' - read REPLY - - case "$REPLY" in - y|Y) :;; # continue - *) - echo 'abort.' - exit 2 - ;; - esac - - ${notmuch} search --output=files --exclude=false tag:deleted | while read line; do rm -v "$line" ; done - ${notmuch} new + # sidebar toggle + #macro index,pager ,@) " set sidebar_visible=no; macro index,pager [ ,@( 'Toggle sidebar'" + #macro index,pager ,@( " set sidebar_visible=yes; macro index,pager [ ,@) 'Toggle sidebar'" + #macro index,pager [ ,@( 'Toggle sidebar' # toggle the sidebar ''; - in [ - pkgs.notmuch - pkgs.muchsync - mail - mailSync - mailView - mailSend - pkgs.neomutt - mutt - mailDelete - ]; + environment.systemPackages = + let + + mailSync = pkgs.writers.writeDashBin "mail-sync" '' + ${pkgs.muchsync}/bin/muchsync mailfetcher@workhorse.private \ + --config /home/mailfetcher/.config/notmuch/notmuchrc \ + --nonew + ''; + mailSend = pkgs.writers.writeDashBin "mail-send" '' + ${pkgs.msmtp}/bin/msmtp-queue -r + ''; + mailView = pkgs.writers.writeDashBin "mail-view" '' + ${pkgs.neomutt}/bin/neomutt"$@" + ''; + mutt = pkgs.writers.writeDashBin "mutt" '' + ${pkgs.neomutt}/bin/neomutt"$@" + ''; + mail = pkgs.writers.writeDashBin "mail" '' + ${mailSync}/bin/mail-sync + ${mailView}/bin/mail-view + ${mailSend}/bin/mail-send + ${mailSync}/bin/mail-sync + ''; + mailDelete = + let notmuch = "${pkgs.notmuch}/bin/notmuch"; + in pkgs.writers.writeBashBin "mail-delete" '' + set -efu + set -o pipefail + + if ! ${notmuch} search --exclude=false tag:deleted | tac ; then + echo 'No killed mail.' + exit 1 + fi + + printf 'want do rm this mail? \[y/N\] ' + read REPLY + + case "$REPLY" in + y|Y) :;; # continue + *) + echo 'abort.' + exit 2 + ;; + esac + + ${notmuch} search --output=files --exclude=false tag:deleted | while read line; do rm -v "$line" ; done + ${notmuch} new + ''; + + in + [ + pkgs.notmuch + pkgs.muchsync + mail + mailSync + mailView + mailSend + pkgs.neomutt + mutt + mailDelete + ]; } diff --git a/nixos/system/desktop/mc.nix b/nixos/system/desktop/mc.nix index 413af09..a04ba70 100644 --- a/nixos/system/desktop/mc.nix +++ b/nixos/system/desktop/mc.nix @@ -320,7 +320,8 @@ let ''; -in { +in +{ environment.systemPackages = [ (pkgs.symlinkJoin { name = "mc"; diff --git a/nixos/system/desktop/packages.nix b/nixos/system/desktop/packages.nix index 3f52f9d..75eba2a 100644 --- a/nixos/system/desktop/packages.nix +++ b/nixos/system/desktop/packages.nix @@ -6,12 +6,14 @@ let library = import ../../library { inherit pkgs lib; }; - allLicenses = let - licenses = builtins.map - (license: "echo '${license.shortName} : ${license.fullName}'") - (builtins.attrValues pkgs.lib.licenses); - in pkgs.writers.writeBashBin "all-licenses" - (lib.concatStringsSep "\n" licenses); + allLicenses = + let + licenses = builtins.map + (license: "echo '${license.shortName} : ${license.fullName}'") + (builtins.attrValues pkgs.lib.licenses); + in + pkgs.writers.writeBashBin "all-licenses" + (lib.concatStringsSep "\n" licenses); #joplin = pkgs.joplin-desktop; #joplin = pkgs.joplin-desktop; @@ -72,35 +74,35 @@ let connectToSpeaker = name: id: pkgs.writeShellScriptBin "connect-to-speaker-${name}" # sh - '' - # hacky script because I have problems with - # automatically connecting to trusted bluetooth devices. + '' + # hacky script because I have problems with + # automatically connecting to trusted bluetooth devices. - echo "Connect to Speaker ${name}" + echo "Connect to Speaker ${name}" - bluetoothctl </dev/null; then - echo 'status: online' - else - echo 'status: offline ' - fi + q-online = '' + if ${pkgs.curl}/bin/curl -s google.com >/dev/null; then + echo 'status: online' + else + echo 'status: offline ' + fi + ''; + + q-wireless = '' + for dev in $( + ${pkgs.iw}/bin/iw dev \ + | ${pkgs.gnused}/bin/sed -n 's/^\s*Interface\s\+\([0-9a-z]\+\)$/\1/p' + ); do + inet=$(${pkgs.iproute}/bin/ip addr show $dev \ + | ${pkgs.gnused}/bin/sed -n 's/.*inet \([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p') \ + || unset inet + ssid=$(${pkgs.iw}/bin/iw dev $dev link \ + | ${pkgs.gnused}/bin/sed -n 's/.*\tSSID: \(.*\)/\1/p' \ + | ${pkgs.coreutils}/bin/tr -d '\r') \ + || unset ssid + printf '%s: %s %s\n' $dev ''${inet+ $inet} ''${ssid+ $ssid} + done + ''; + + in + pkgs.writers.writeBash "network-status" '' + ${q-wireless} + ${q-online} + ${pkgs.coreutils}/bin/uptime ''; - q-wireless = '' - for dev in $( - ${pkgs.iw}/bin/iw dev \ - | ${pkgs.gnused}/bin/sed -n 's/^\s*Interface\s\+\([0-9a-z]\+\)$/\1/p' - ); do - inet=$(${pkgs.iproute}/bin/ip addr show $dev \ - | ${pkgs.gnused}/bin/sed -n 's/.*inet \([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p') \ - || unset inet - ssid=$(${pkgs.iw}/bin/iw dev $dev link \ - | ${pkgs.gnused}/bin/sed -n 's/.*\tSSID: \(.*\)/\1/p' \ - | ${pkgs.coreutils}/bin/tr -d '\r') \ - || unset ssid - printf '%s: %s %s\n' $dev ''${inet+ $inet} ''${ssid+ $ssid} - done - ''; - - in pkgs.writers.writeBash "network-status" '' - ${q-wireless} - ${q-online} - ${pkgs.coreutils}/bin/uptime - ''; - taskNextWeek = pkgs.writers.writeDash "taskweek" '' ${pkgs.taskwarrior}/bin/task \ export \ @@ -57,7 +59,7 @@ let userHighlight = map ({ user, ... }: user) (builtins.attrValues config.programs.custom.browser.configList) - ++ [ "steam" ]; + ++ [ "steam" ]; activeUsers = pkgs.writers.writeBash "active-users" '' ${pkgs.procps}/bin/ps -eo user \ @@ -80,7 +82,8 @@ let position.height = height; position.width = width; } // (lib.filterAttrs - (key: _: lib.all (x: x != key) [ "height" "width" "top" "left" ]) args); + (key: _: lib.all (x: x != key) [ "height" "width" "top" "left" ]) + args); # command runner module cmdRunner = args@{ cmd, ... }: @@ -386,7 +389,8 @@ let ${pkgs.unstable.wtf}/bin/wtfutil --config=${toString configuration} ''; -in { +in +{ services.upower.enable = true; diff --git a/nixos/system/desktop/xlock.nix b/nixos/system/desktop/xlock.nix index 11e828f..97d0e17 100644 --- a/nixos/system/desktop/xlock.nix +++ b/nixos/system/desktop/xlock.nix @@ -30,7 +30,8 @@ let ${pkgs.xlockmore}/bin/xlock -mode life1d -size 1 ''; -in { +in +{ environment.systemPackages = [ lockProgram desktopFile ]; } diff --git a/nixos/system/server/initssh.nix b/nixos/system/server/initssh.nix index 7c6dddd..1775a3e 100644 --- a/nixos/system/server/initssh.nix +++ b/nixos/system/server/initssh.nix @@ -6,7 +6,8 @@ let cfg = config.configuration.init-ssh; -in { +in +{ options.configuration.init-ssh = { @@ -22,7 +23,7 @@ in { }; port = mkOption { - default = 23; + default = 22; type = with types; int; }; @@ -30,7 +31,7 @@ in { type = with types; listOf str; default = config.users.users.root.openssh.authorizedKeys.keys ++ (map (keyFile: lib.fileContents keyFile) - config.users.users.root.openssh.authorizedKeys.keyFiles); + config.users.users.root.openssh.authorizedKeys.keyFiles); }; hostKey = mkOption { default = "/etc/ssh/ssh_host_ed25519_key"; @@ -50,7 +51,7 @@ in { services.tor = { enable = true; client.enable = true; - relay.onionServices.bootup.map = [{ port = 23; }]; + relay.onionServices.bootup.map = [{ port = 22; }]; }; }) @@ -65,28 +66,30 @@ in { copy_bin_and_libs ${pkgs.tor}/bin/tor ''; - boot.initrd.network.postCommands = let - torRc = (pkgs.writeText "tor.rc" '' - DataDirectory /etc/tor - SOCKSPort 127.0.0.1:9050 IsolateDestAddr - SOCKSPort 127.0.0.1:9063 - HiddenServiceDir /etc/tor/onion/bootup - HiddenServicePort ${toString cfg.port} 127.0.0.1:${toString cfg.port} - ''); - in '' - echo "tor: preparing onion folder" - # have to do this otherwise tor does not want to start - chmod -R 700 /etc/tor + boot.initrd.network.postCommands = + let + torRc = (pkgs.writeText "tor.rc" '' + DataDirectory /etc/tor + SOCKSPort 127.0.0.1:9050 IsolateDestAddr + SOCKSPort 127.0.0.1:9063 + HiddenServiceDir /etc/tor/onion/bootup + HiddenServicePort ${toString cfg.port} 127.0.0.1:${toString cfg.port} + ''); + in + '' + echo "tor: preparing onion folder" + # have to do this otherwise tor does not want to start + chmod -R 700 /etc/tor - echo "make sure localhost is up" - ip a a 127.0.0.1/8 dev lo - # ifconfig lo up - ip link set lo up + echo "make sure localhost is up" + ip a a 127.0.0.1/8 dev lo + # ifconfig lo up + ip link set lo up - echo "tor: starting tor" - tor -f ${torRc} --verify-config - tor -f ${torRc} & - ''; + echo "tor: starting tor" + tor -f ${torRc} --verify-config + tor -f ${torRc} & + ''; # ssh setup # todo add the ssh host fingerprint to your trusted stuff diff --git a/nixos/system/server/packages.nix b/nixos/system/server/packages.nix index cbdc5f9..e10333b 100644 --- a/nixos/system/server/packages.nix +++ b/nixos/system/server/packages.nix @@ -1,16 +1,20 @@ { pkgs, config, lib, ... }: { # no need to to start a service - environment.systemPackages = let + environment.systemPackages = + let - nginxShowConfig = pkgs.writers.writePython3Bin "nginx-show-config" { - flakeIgnore = [ "E265" "E225" "W292" ]; - } (lib.fileContents ../../assets/nginx-show-config.sh); - in [ - pkgs.mosh + nginxShowConfig = pkgs.writers.writePython3Bin "nginx-show-config" + { + flakeIgnore = [ "E265" "E225" "W292" ]; + } + (lib.fileContents ../../assets/nginx-show-config.sh); + in + [ + pkgs.mosh - # nginxfmt - pkgs.nginx-config-formatter - nginxShowConfig - ]; + # nginxfmt + pkgs.nginx-config-formatter + nginxShowConfig + ]; }