diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 36b94d3..0000000 --- a/.gitmodules +++ /dev/null @@ -1,9 +0,0 @@ -[submodule "imports/github/rycee/home-manager"] - path = imports/github/rycee/home-manager - url = https://github.com/rycee/home-manager.git -[submodule "imports/github/michael-ball/base16-horizon-scheme"] - path = imports/github/michael-ball/base16-horizon-scheme - url = https://github.com/michael-ball/base16-horizon-scheme.git -[submodule "imports/github/nana-4/materia-theme"] - path = imports/github/nana-4/materia-theme - url = https://github.com/nana-4/materia-theme diff --git a/default.nix b/default.nix index 4ce5d5b..71c9213 100644 --- a/default.nix +++ b/default.nix @@ -12,13 +12,14 @@ # 3. Log in to application and services where neccesary -device: # This is the device we're on now +device: { config, pkgs, lib, ... }: -{ +let sources = import ./nix/sources.nix; +in { imports = [ /etc/nixos/hardware-configuration.nix - ./imports/github/rycee/home-manager/nixos + "${sources.home-manager}/nixos" ./modules ]; diff --git a/imports/github/michael-ball/base16-horizon-scheme b/imports/github/michael-ball/base16-horizon-scheme deleted file mode 160000 index 644d073..0000000 --- a/imports/github/michael-ball/base16-horizon-scheme +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 644d073863ba9f863eef3b88a8f8607d0ace0063 diff --git a/imports/github/nana-4/materia-theme b/imports/github/nana-4/materia-theme deleted file mode 160000 index b1e4c56..0000000 --- a/imports/github/nana-4/materia-theme +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b1e4c563146ae34fff6a697393b6a1bc66b612f5 diff --git a/imports/github/rycee/home-manager b/imports/github/rycee/home-manager deleted file mode 160000 index 95c8007..0000000 --- a/imports/github/rycee/home-manager +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 95c8007b8fe4433cd217db83ce26b8e29875ba06 diff --git a/modules/applications/packages.nix b/modules/applications/packages.nix index bedfbbf..0e8f9ee 100644 --- a/modules/applications/packages.nix +++ b/modules/applications/packages.nix @@ -24,6 +24,7 @@ in { bc sysstat xdotool + niv lxqt.pavucontrol-qt bibata-cursors @@ -35,7 +36,6 @@ in { # Utils pciutils usbutils - nix-prefetch-git hdparm vdpauinfo libva-utils @@ -81,20 +81,20 @@ in { ]; home-manager.users.alukard.home.packages = with pkgs; [ - nix-zsh-completions qbittorrent - # vscodium vscode - # vscode-with-extensions xarchiver tdesktop spotifywm discord + pulseeffects ] ++ lib.optionals (!isVM) [ steam steam-run protontricks - retroarch + # retroarch + ] ++ lib.optionals (enableDocker) [ + docker-compose ]; } diff --git a/modules/applications/wg-conf.nix b/modules/applications/wg-conf.nix index 38a2fd5..76408c6 100644 --- a/modules/applications/wg-conf.nix +++ b/modules/applications/wg-conf.nix @@ -14,6 +14,6 @@ stdenv.mkDerivation rec { src = myScript; installPhase = '' mkdir -p $out/bin - cp ./bin/wg-conf $out/bin/wg-conf + mv ./bin/wg-conf $out/bin/wg-conf ''; } \ No newline at end of file diff --git a/modules/applications/xonar-fp.nix b/modules/applications/xonar-fp.nix new file mode 100644 index 0000000..bca30be --- /dev/null +++ b/modules/applications/xonar-fp.nix @@ -0,0 +1,19 @@ +{ stdenv, pkgs }: +let + xonar-fp = pkgs.writeShellScriptBin "xonar-fp" '' + CURRENT_STATE=`amixer -c 0 sget "Front Panel" | egrep -o '\[o.+\]'` + if [[ $CURRENT_STATE == '[on]' ]]; then + amixer -c 0 sset "Front Panel" mute + else + amixer -c 0 sset "Front Panel" unmute + fi + ''; +in +stdenv.mkDerivation rec { + name = "xonar-fp"; + src = xonar-fp; + installPhase = '' + mkdir -p $out/bin + mv ./bin/xonar-fp $out/bin/xonar-fp + ''; +} \ No newline at end of file diff --git a/modules/applications/youtube-to-mpv.nix b/modules/applications/youtube-to-mpv.nix index e039532..352a225 100644 --- a/modules/applications/youtube-to-mpv.nix +++ b/modules/applications/youtube-to-mpv.nix @@ -34,6 +34,6 @@ stdenv.mkDerivation rec { src = myScript; installPhase = '' mkdir -p $out/bin - cp ./bin/yt-mpv $out/bin/yt-mpv + mv ./bin/yt-mpv $out/bin/yt-mpv ''; } \ No newline at end of file diff --git a/modules/default.nix b/modules/default.nix index 3ce2438..f3985bf 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -1,39 +1,35 @@ { config, lib, ... }: { imports = [ - ./applications/packages.nix - # ./applications/vivaldi - ./workspace/i3blocks - ./workspace/i3 - ./workspace/zsh.nix - ./workspace/rofi.nix - ./workspace/gtk.nix - # ./workspace/compton.nix - ./workspace/misc.nix - ./workspace/dunst.nix - ./workspace/mpv.nix - ./workspace/kde - ./workspace/locale.nix - ./workspace/fonts.nix - ./workspace/light.nix - ./workspace/xresources.nix - ./workspace/barrier.nix - ./workspace/podman.nix - ./workspace/direnv.nix - ./themes.nix - ./mullvad.nix ./applications.nix - ./secrets.nix ./devices.nix - ./packages.nix - ./nix.nix - ./users.nix - ./hardware.nix - ./services.nix - ./power.nix - ./xserver.nix - ./network.nix - ./wireguard.nix ./filesystems.nix + ./hardware.nix + ./network.nix + ./packages.nix + ./power.nix ./samba.nix + ./secrets.nix + ./services.nix + ./themes.nix + ./users.nix + ./wireguard.nix + ./xserver.nix + + ./applications/packages.nix + + # ./workspace/barrier.nix + ./workspace/dunst.nix + ./workspace/fonts.nix + ./workspace/gtk.nix + ./workspace/i3 + ./workspace/i3blocks + ./workspace/kde + ./workspace/light.nix + ./workspace/locale.nix + ./workspace/misc.nix + ./workspace/mpv.nix + ./workspace/rofi.nix + ./workspace/xresources.nix + ./workspace/zsh.nix ]; } diff --git a/modules/devices.nix b/modules/devices.nix index fd824a6..d0ea579 100644 --- a/modules/devices.nix +++ b/modules/devices.nix @@ -14,19 +14,16 @@ with types; { isLaptop = (!isNull (builtins.match ".*Laptop" device)); isVM = (!isNull (builtins.match ".*VM" device)); smallScreen = (device == "Dell-Laptop"); + isHost = (device == "AMD-Workstation"); isShared = devInfo.isShared; cpu = devInfo.cpu.vendor; video = devInfo.video; isSSD = devInfo.drive.type == "ssd"; - # isGaming = (isNull (builtins.match ".*VM" device)); + enableDocker = devInfo.enableDocker; hostName = if !isNull devInfo.hostName then devInfo.hostName else device; - # goodMachine = devInfo.cpu.clock * devInfo.cpu.cores >= 4000 - # && devInfo.drive.size >= 100 && devInfo.ram - # >= 8; # Whether machine is powerful enough for heavy stuff - isHost = (device == "AMD-Workstation"); }; devices = { diff --git a/modules/mullvad.nix b/modules/mullvad.nix deleted file mode 100644 index e7176a0..0000000 --- a/modules/mullvad.nix +++ /dev/null @@ -1,51 +0,0 @@ -{ config, lib, pkgs, ... }: -with lib; -let - cfg = config.networking.mullvad; -in { - ###### interface - - options = { - networking.mullvad = { - enable = mkOption { - type = types.bool; - default = false; - description = '' - This option enables mullvad vpn daemon. - ''; - }; - enableOnBoot = mkOption { - type = types.bool; - default = true; - description = '' - When enabled mullvad daemon is started on boot. - ''; - }; - }; - }; - - ###### implementation - - config = mkIf cfg.enable { - environment.systemPackages = with pkgs; [ mullvad-vpn openvpn ]; - boot.kernelModules = [ "tun" ]; - - systemd.services.mullvad-daemon = { - description = "Mullvad VPN daemon"; - wantedBy = optional cfg.enableOnBoot "multi-user.target"; - wants = [ "network.target" ]; - after = [ - "network-online.target" - "NetworkManager.service" - "systemd-resolved.service" - ]; - startLimitIntervalSec = 20; - serviceConfig = { - ExecStart = "${pkgs.mullvad-vpn}/bin/mullvad-daemon -v --disable-stdout-timestamps"; - Restart = "always"; - RestartSec = 1; - }; - }; - }; - -} \ No newline at end of file diff --git a/modules/network.nix b/modules/network.nix index 829dacf..e756766 100644 --- a/modules/network.nix +++ b/modules/network.nix @@ -3,7 +3,6 @@ networkmanager.enable = false; wireless = { enable = config.deviceSpecific.isLaptop; - # driver = "wext"; networks.Alukard_5GHz = { pskRaw = "feee27000fb0d7118d498d4d867416d04d1d9a1a7b5dbdbd888060bbde816fe4"; priority = 1; @@ -24,15 +23,10 @@ pskRaw = "6cfdb04f3e2d4279a4651608c9c73277708c67f7f1435b61228ecf00841e5155"; priority = 3; }; - # interfaces = ["wlan0"]; userControlled.enable = true; }; firewall.enable = false; # usePredictableInterfaceNames = false; hostName = config.deviceSpecific.hostName; - - mullvad.enable = false; }; - # systemd.services.dhcpcd.serviceConfig.Type = lib.mkForce - # "simple"; # TODO Make a PR with this change; forking is not acceptable for dhcpcd. } diff --git a/modules/nix.nix b/modules/nix.nix deleted file mode 100644 index ecb23ad..0000000 --- a/modules/nix.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ config, lib, pkgs, ... }: { - - nixpkgs.config = { - allowUnfree = true; - }; - nix = { - useSandbox = true; - autoOptimiseStore = config.deviceSpecific.isSSD; - optimise.automatic = true; - }; -} \ No newline at end of file diff --git a/modules/packages.nix b/modules/packages.nix index d1f121c..105fa3d 100644 --- a/modules/packages.nix +++ b/modules/packages.nix @@ -1,44 +1,33 @@ -{ pkgs, config, lib, ... }: let - moz_overlay = import (builtins.fetchTarball https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz); -in { + imports = import ../nix/sources.nix; + mozilla = import imports.nixpkgs-mozilla { }; +in { pkgs, config, lib, ... }: { nixpkgs.overlays = [ - moz_overlay - (self: old: rec { - # nerdfonts = nur.balsoft.pkgs.roboto-mono-nerd; - youtube-to-mpv = pkgs.callPackage ./applications/youtube-to-mpv.nix {}; - wg-conf = pkgs.callPackage ./applications/wg-conf.nix {}; - podman-compose = pkgs.callPackage ./applications/podman-compose.nix {}; - xonar-fp = pkgs.writers.writeBashBin "xonar-fp" '' - CURRENT_STATE=`amixer -c 0 sget "Front Panel" | egrep -o '\[o.+\]'` - if [[ $CURRENT_STATE == '[on]' ]]; then - amixer -c 0 sset "Front Panel" mute - else - amixer -c 0 sset "Front Panel" unmute - fi - ''; - }) - (self: super: { - vscode-with-extensions = super.vscode-with-extensions.override { - # When the extension is already available in the default extensions set. - vscodeExtensions = with super.vscode-extensions; [ - bbenoist.Nix - ] ++ super.vscode-utils.extensionsFromVscodeMarketplace [ - { - name = "vscode-remote-extensionpack"; - publisher = "ms-vscode-remote"; - version = "0.17.0"; - sha256 = "Dlf9RzNefPilnbezh13C+WAsTJ7GqSCMEhnWhER+u5s="; - } - ]; - }; + (self: super: + rec { + inherit imports; + inherit mozilla; - }) + youtube-to-mpv = pkgs.callPackage ./applications/youtube-to-mpv.nix { }; + + wg-conf = pkgs.callPackage ./applications/wg-conf.nix { }; + + i3lock-fancy = pkgs.callPackage ./applications/i3lock-fancy.nix { }; + + git-with-libsecret = super.git.override { withLibsecret = true; }; + + xonar-fp = pkgs.callPackage ./applications/xonar-fp.nix { }; + } + ) ]; - nixpkgs.config = { - packageOverrides = pkgs: { - i3lock-fancy = pkgs.callPackage ./applications/i3lock-fancy.nix {}; - git-with-libsecret = pkgs.git.override { withLibsecret = true; }; - }; + + nixpkgs.pkgs = import imports.nixpkgs { + config.allowUnfree = true; + } // config.nixpkgs.config; + + nix = rec { + useSandbox = true; + autoOptimiseStore = config.deviceSpecific.isSSD; + optimise.automatic = true; }; } \ No newline at end of file diff --git a/modules/samba.nix b/modules/samba.nix index 48d59db..1729972 100644 --- a/modules/samba.nix +++ b/modules/samba.nix @@ -6,7 +6,7 @@ with deviceSpecific; { users.groups.smbgrp.gid = 2001; # TODO: add nologin shell to this user users.users.smbuser = - lib.mkIf (isHost || config.device == "NixOS-VM") { + lib.mkIf isHost { isNormalUser = false; extraGroups = [ "smbgrp" @@ -14,7 +14,7 @@ with deviceSpecific; { description = "User for samba sharing"; }; services.samba = - lib.mkIf (isHost || config.device == "NixOS-VM") { + lib.mkIf isHost { enable = true; enableNmbd = false; enableWinbindd = false; @@ -50,7 +50,7 @@ with deviceSpecific; { ''; }; environment.systemPackages = - if (isHost || config.device == "NixOS-VM") then + if isHost then [ config.services.samba.package ] else [ ]; diff --git a/modules/services.nix b/modules/services.nix index 2ae7276..1696ecc 100644 --- a/modules/services.nix +++ b/modules/services.nix @@ -1,39 +1,42 @@ -{ config, lib, pkgs, ... }: { +{ config, lib, pkgs, ... }: +let + device = config.devices.${config.device}; +in { # services.acpid.enable = true; - users.users.mopidy = { - isNormalUser = false; - extraGroups = [ - "smbgrp" - ]; - }; - services.mopidy = { - enable = false; - extensionPackages = with pkgs; [ mopidy-local-sqlite ]; - configuration = '' - [local] - enabled = true - library = sqlite - media_dir = /media/files/Music - scan_timeout = 1000 - scan_flush_threshold = 100 - scan_follow_symlinks = false + # users.users.mopidy = { + # isNormalUser = false; + # extraGroups = [ + # "smbgrp" + # ]; + # }; + # services.mopidy = { + # enable = true; + # extensionPackages = with pkgs; [ mopidy-local-sqlite ]; + # configuration = '' + # [local] + # enabled = true + # library = sqlite + # media_dir = /media/files/Music + # scan_timeout = 1000 + # scan_flush_threshold = 100 + # scan_follow_symlinks = false - [local-sqlite] - enabled = true + # [local-sqlite] + # enabled = true - [audio] - output = pulsesink server=127.0.0.1 + # [audio] + # output = pulsesink server=127.0.0.1 - [mpd] - hostname = 0.0.0.0 - ''; - }; - home-manager.users.alukard.home.file.".ncmpcpp/config".text = '' - mpd_host = 127.0.0.1 - mpd_port = 6600 - mpd_music_dir = "/media/files/Music" - ''; + # [mpd] + # hostname = 0.0.0.0 + # ''; + # }; + # home-manager.users.alukard.home.file.".ncmpcpp/config".text = '' + # mpd_host = 127.0.0.1 + # mpd_port = 6600 + # mpd_music_dir = "/media/files/Music" + # ''; # services.mopidy = { # enable = true; @@ -58,7 +61,7 @@ }; services.earlyoom = { - enable = config.devices.${config.device}.ram < 12; + enable = device.ram < 12; freeMemThreshold = 5; freeSwapThreshold = 100; }; @@ -72,12 +75,16 @@ services.accounts-daemon.enable = true; - services.avahi.enable = true; - # services.avahi.ipv6 = true; - services.avahi.nssmdns = true; - services.avahi.publish.enable = true; - services.avahi.publish.addresses = true; - services.avahi.publish.domain = true; + services.avahi = { + enable = true; + # ipv6 = true; + nssmdns = true; + publish = { + enable = true; + addresses = true; + domain = true; + }; + }; systemd.services.systemd-udev-settle.enable = false; @@ -85,10 +92,8 @@ services.gnome3.gnome-keyring.enable = true; - # TODO: move environment.systemPackages to applications/package.nix - virtualisation.docker.enable = config.devices.${config.device}.enableDocker; - environment.systemPackages = lib.mkIf (config.devices.${config.device}.enableDocker) - [ pkgs.docker-compose ]; + virtualisation.docker.enable = device.enableDocker; + # virtualisation.virtualbox.host = lib.mkIf config.deviceSpecific.isHost { # enable = true; # # enableHardening = false; @@ -96,11 +101,11 @@ # }; # Install cdemu for some gaming purposes - programs.cdemu = { - enable = true; - image-analyzer = false; - gui = false; - group = "cdrom"; - }; + # programs.cdemu = { + # enable = true; + # image-analyzer = false; + # gui = false; + # group = "cdrom"; + # }; } diff --git a/modules/themes.nix b/modules/themes.nix index 14be3c8..b1ce029 100644 --- a/modules/themes.nix +++ b/modules/themes.nix @@ -64,6 +64,6 @@ in { }; config = { themes.colors = fromBase16 (fromYAML (builtins.readFile - ../imports/github/michael-ball/base16-horizon-scheme/horizon-dark.yaml)); + "${pkgs.imports.base16-horizon-scheme}/horizon-dark.yaml")); }; } diff --git a/modules/wireguard.nix b/modules/wireguard.nix index 0b37160..0e9100d 100644 --- a/modules/wireguard.nix +++ b/modules/wireguard.nix @@ -42,24 +42,5 @@ in { ip link delete wg0 ''; }; - - # systemd.services."iptables-docker" = lib.mkIf (config.virtualisation.docker.enable) { - # description = "Configure iptables to work with docker"; - # wantedBy = [ "multi-user.target" ]; - # path = [ pkgs.iptables pkgs.iproute pkgs.gnugrep pkgs.gnused ]; - - # serviceConfig = { - # Type = "oneshot"; - # RemainAfterExit = true; - # }; - - # script = '' - # iptables -A FORWARD -i docker0 -o $(ip route | grep default | sed -e "s/^.*dev.//" -e "s/.proto.*//") -j ACCEPT - # iptables -A FORWARD -i $(ip route | grep default | sed -e "s/^.*dev.//" -e "s/.proto.*//") -o docker0 -j ACCEPT - # ''; - # }; - - # virtualisation.docker.extraOptions = lib.mkIf (config.virtualisation.docker.enable) - # "--iptables=false"; }; } \ No newline at end of file diff --git a/modules/workspace/compton.nix b/modules/workspace/compton.nix deleted file mode 100644 index e836a56..0000000 --- a/modules/workspace/compton.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ pkgs, lib, config, ... }: { - home-manager.users.alukard = { - programs.autorandr.hooks.preswitch.compton = "systemctl --user stop compton"; - programs.autorandr.hooks.postswitch.compton = "systemctl --user start compton"; - services.compton = { - enable = true; - backend = "glx"; - noDNDShadow = false; - shadow = true; - shadowExclude = [ "!(I3_FLOATING_WINDOW@:c = 1)" ]; - vSync = "opengl-swc"; - }; - }; -} diff --git a/modules/workspace/direnv.nix b/modules/workspace/direnv.nix deleted file mode 100644 index e446285..0000000 --- a/modules/workspace/direnv.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ pkgs, config, ... }: { - home-manager.users.alukard.programs.direnv = { - enable = true; - enableZshIntegration = true; - }; -} \ No newline at end of file diff --git a/modules/workspace/fonts.nix b/modules/workspace/fonts.nix index c361cbd..e20adee 100644 --- a/modules/workspace/fonts.nix +++ b/modules/workspace/fonts.nix @@ -6,11 +6,10 @@ roboto roboto-mono roboto-slab - # nerdfonts fira-code noto-fonts noto-fonts-emoji - hasklig + # hasklig powerline-fonts material-icons ]; diff --git a/modules/workspace/gtk.nix b/modules/workspace/gtk.nix index cdbe96a..273522c 100644 --- a/modules/workspace/gtk.nix +++ b/modules/workspace/gtk.nix @@ -30,13 +30,13 @@ in { nixpkgs.overlays = [(self: super: { generated-gtk-theme = self.stdenv.mkDerivation rec { name = "generated-gtk-theme"; - src = ../../imports/github/nana-4/materia-theme; + src = pkgs.imports.materia-theme; buildInputs = with self; [ sassc bc which inkscape optipng ]; installPhase = '' HOME=/build chmod 777 -R . - mkdir -p $out/share/themes patchShebangs . + mkdir -p $out/share/themes substituteInPlace change_color.sh --replace "\$HOME/.themes" "$out/share/themes" echo "Changing colours:" ./change_color.sh -o Generated ${materia_colors} @@ -64,4 +64,5 @@ in { }; }; environment.sessionVariables.GTK_THEME = "Generated"; + environment.sessionVariables.GDK_BACKEND = "x11"; } diff --git a/modules/workspace/i3blocks/default.nix b/modules/workspace/i3blocks/default.nix index 4fef952..b6bed5d 100644 --- a/modules/workspace/i3blocks/default.nix +++ b/modules/workspace/i3blocks/default.nix @@ -78,7 +78,6 @@ in { command = '' echo 'location_searching' $(${pkgs.bc}/bin/bc <<< `free | tail -2 | head -1 | awk '{print "scale=2; "$7"/1048576"}'`)GiB ''; - # command = scripts.free; }; n_df = { command = '' diff --git a/modules/workspace/i3blocks/scripts/default.nix b/modules/workspace/i3blocks/scripts/default.nix index e1a5782..089d1c3 100644 --- a/modules/workspace/i3blocks/scripts/default.nix +++ b/modules/workspace/i3blocks/scripts/default.nix @@ -1,18 +1,6 @@ p: c: with p; builtins.mapAttrs (name: value: -stdenv.mkDerivation { - name = "free"; - src = value; - unpackPhase = "true"; - buildInputs = [ghc]; - buildPhase = "ghc -o $out $src"; - installPhase = "true"; -}) { - free = ./free.hs; - temperature = ./temperature.hs; - network = ./network.hs; -} // builtins.mapAttrs (name: value: writeTextFile { inherit name; text = callPackage value { @@ -31,6 +19,4 @@ writeTextFile { sound = ./sound.nix; music = ./music.nix; vpn-status = ./vpn-status.nix; - #temperature = ./temperature.nix; - #free = ./free.nix; } diff --git a/modules/workspace/i3blocks/scripts/free.hs b/modules/workspace/i3blocks/scripts/free.hs deleted file mode 100644 index aea9c7c..0000000 --- a/modules/workspace/i3blocks/scripts/free.hs +++ /dev/null @@ -1,10 +0,0 @@ -import System.Exit - -main :: IO () -main = do - freeMemory <- read - <$> (!!1) <$> words - <$> (!!2) <$> lines - <$> readFile "/proc/meminfo" - putStr $ (take 5 $ show $ freeMemory / ‭1048576‬) ++ "GiB" - exitWith $ if freeMemory > 500000 then ExitSuccess else ExitFailure 33 diff --git a/modules/workspace/i3blocks/scripts/network.hs b/modules/workspace/i3blocks/scripts/network.hs deleted file mode 100644 index 98a8ca8..0000000 --- a/modules/workspace/i3blocks/scripts/network.hs +++ /dev/null @@ -1,40 +0,0 @@ -{-# LANGUAGE BangPatterns #-} - -import Control.Concurrent (threadDelay) -import Control.Monad (mapM) -import System.Directory (listDirectory) - -path :: String -path = "/sys/class/net/" - -data Statistics = Statistics !Float !Float - -instance Semigroup Statistics where - Statistics a b <> Statistics c d = Statistics (a + c) (b + d) - -instance Monoid Statistics where - mempty = Statistics 0 0 - -icon :: String -> String -icon i = "" ++ i ++ "" - -readInterface :: FilePath -> IO Statistics -readInterface interface = do - rx <- read <$> readFile (path ++ interface ++ "/statistics/rx_bytes") - tx <- read <$> readFile (path ++ interface ++ "/statistics/tx_bytes") - return $ Statistics rx tx - -readInterfaces :: [FilePath] -> IO Statistics -readInterfaces interfaces = mconcat <$> (mapM readInterface interfaces) - -main :: IO () -main = do - interfaces <- listDirectory path - Statistics rx tx <- readInterfaces interfaces - threadDelay 1000000 - Statistics rx' tx' <- readInterfaces interfaces - putStrLn - $ (icon "\58052") - ++ show (round $(rx' - rx)/1000) ++ "kBps " - ++ (icon "\58054") - ++ show (round $(tx' - tx)/1000) ++ "kBps" diff --git a/modules/workspace/i3blocks/scripts/temperature.hs b/modules/workspace/i3blocks/scripts/temperature.hs deleted file mode 100644 index 722b7b9..0000000 --- a/modules/workspace/i3blocks/scripts/temperature.hs +++ /dev/null @@ -1,47 +0,0 @@ -import System.Directory -import System.FilePath -import Control.Monad (forM) -import System.Posix.Files -import Data.List (isPrefixOf, isInfixOf) -import System.Exit - - - --- | Traverse from 'top' directory and return all the files by --- filtering with 'include' predicate. -traverseDir :: FilePath -> (FilePath -> Bool) -> IO [FilePath] -traverseDir top include = do - ds <- getDirectoryContents top - paths <- forM (filter include ds) $ \d -> do - let path = top d - s <- getFileStatus path - if isDirectory s - then traverseDir path include - else return [path] - return $ concat paths - - - --- | Get temperatures from hardware sensors in -getTemps :: IO [Int] -getTemps = do - hwmons <- traverseDir "/sys/class/hwmon" - ( - \name - -> ("hwmon" `isPrefixOf` name) - || ("temp" `isInfixOf` name) && ("input" `isInfixOf` name) - ) - fmap (round .(/1000) . read) <$> traverse (readFile) hwmons - --- | Get a symbol corresponding to the temperature -getSymbol :: Integral n => n -> String -getSymbol t - | t < 50 = "\57868" --  - | t < 80 = "\57866" --  - | otherwise = "\57867" --  - -main :: IO () -main = do - maxTemp <- maximum <$> getTemps - putStrLn $ (getSymbol <> show) maxTemp <> "°" - exitWith $ if maxTemp < 80 then ExitSuccess else ExitFailure 33 diff --git a/modules/workspace/i3blocks/scripts/temperature.nix b/modules/workspace/i3blocks/scripts/temperature.nix deleted file mode 100644 index e7af859..0000000 --- a/modules/workspace/i3blocks/scripts/temperature.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ ... }: -'' -temp=$((`cat /sys/class/thermal/thermal_zone*/temp | sort | tail -1`/1000)) -echo $temp ° -[[ $temp -gt 80 ]] && exit 33 -'' diff --git a/modules/workspace/i3blocks/scripts/vpn-status.nix b/modules/workspace/i3blocks/scripts/vpn-status.nix index 8278554..cd709c3 100644 --- a/modules/workspace/i3blocks/scripts/vpn-status.nix +++ b/modules/workspace/i3blocks/scripts/vpn-status.nix @@ -1,5 +1,5 @@ { curl, ... }: '' -API="$(${curl} https://am.i.mullvad.net/connected)" +API="$(${curl}/bin/curl https://am.i.mullvad.net/connected)" if [[ $(echo "$API" | awk -F'[ ()]+' '{print $6}') = 'server' ]]; then echo $(echo "$API" | awk -F'[ ()]+' '{print $7}') else diff --git a/modules/workspace/misc.nix b/modules/workspace/misc.nix index a70b6fa..3d05996 100644 --- a/modules/workspace/misc.nix +++ b/modules/workspace/misc.nix @@ -9,10 +9,12 @@ }; services.atd.enable = true; + home-manager.users.alukard = { xdg.enable = true; services.udiskie.enable = true; + programs.git = { enable = true; package = pkgs.git-with-libsecret; @@ -24,18 +26,22 @@ }; }; }; + programs.direnv = { + enable = true; + enableZshIntegration = true; + }; + news.display = "silent"; - # programs.command-not-found = { - # enable = true; - # dbPath = ../../imports/programs.sqlite; - # }; + home.keyboard = { options = [ "grp:win_space_toogle" ]; layout = "us,ru"; }; + home.file.".icons/default" = { source = "${pkgs.bibata-cursors}/share/icons/Bibata_Oil"; }; + systemd.user.startServices = true; }; } diff --git a/modules/workspace/mpv.nix b/modules/workspace/mpv.nix index 62157a0..e1fe0b1 100644 --- a/modules/workspace/mpv.nix +++ b/modules/workspace/mpv.nix @@ -17,7 +17,6 @@ with deviceSpecific; { "bestvideo+bestaudio/best"; }; }; - # TODO: отвязать от /home/alukard home-manager.users.alukard.home.file.".config/youtube-dl/config" = { text = '' --cookie=/home/alukard/.config/yt-cookie diff --git a/modules/workspace/podman.nix b/modules/workspace/podman.nix deleted file mode 100644 index 2e829a6..0000000 --- a/modules/workspace/podman.nix +++ /dev/null @@ -1,160 +0,0 @@ -# cfg = config.devices.${config.device}.enableDocker; -{ config, pkgs, lib, ... }: -with lib; -let - cfg = config.programs.podman; - - surroundEachWith = str: list: - map (e: str + (toString e) + str) list; - - registriesConf = let - registryList = list: - "registries = [" + (concatStringsSep ", " (surroundEachWith "'" list)) + "]"; - in concatStringsSep "\n" (mapAttrsToList (type: registries: '' - [registries.${type}] - ${registryList registries} - '') { inherit (cfg.registries) block insecure search; }); - -in { - ###### interface - - options = { - programs.podman = { - - enable = mkOption { - type = types.bool; - default = false; - description = "Whenever to configure podman user-wide."; - }; - - installSystemWide = mkOption { - type = types.bool; - default = false; - description = "Install packages system-wide."; - }; - - registries = { - search = mkOption { - type = types.listOf types.str; - default = [ "docker.io" "quay.io" ]; - description = '' - List of repositories to search. - ''; - }; - - insecure = mkOption { - default = [ ]; - type = types.listOf types.str; - description = '' - List of insecure repositories. - ''; - }; - - block = mkOption { - default = [ ]; - type = types.listOf types.str; - description = '' - List of blocked repositories. - ''; - }; - }; - - policy = mkOption { - default = { - default = [ { type = "reject"; }]; - }; - type = types.attrs; - example = literalExample '' - { - default = [ { type = "insecureAcceptAnything"; } ]; - transports = { - docker-daemon = { - "" = [ { type = "insecureAcceptAnything"; } ]; - }; - }; - } - ''; - description = '' - Signature verification policy file - - - The default will simply reject everything. - ''; - }; - }; - }; - - ###### implementation - - config = mkMerge [ - (mkIf cfg.enable { - home-manager.users.alukard.xdg.configFile = { - "containers/libpod.conf".text = '' - cgroup_manager = "systemd" - cni_config_dir = "/etc/cni/net.d/" - cni_default_network = "podman" - cni_plugin_dir = ["${pkgs.cni-plugins}/bin/"] - conmon_path = ["${pkgs.conmon}/bin/conmon"] - image_default_transport = "docker://" - runtime = "${pkgs.crun}/bin/crun" - runtimes = ["${pkgs.crun}/bin/crun", "${pkgs.runc}/bin/runc"] - # pause - pause_image = "k8s.gcr.io/pause:3.1" - pause_command = "/pause" - ''; - "containers/registries.conf".text = registriesConf; - "containers/policy.json".text = builtins.toJSON cfg.policy; - }; - - environment.etc."cni/net.d/87-podman-bridge.conflist".text = (builtins.toJSON { - cniVersion = "0.3.0"; - name = "podman"; - plugins = [ - { - type = "bridge"; - bridge = "cni0"; - isGateway = true; - ipMasq = true; - ipam = { - type = "host-local"; - subnet = "10.88.0.0/16"; - routes = [ - { dst = "0.0.0.0/0"; } - ]; - }; - } - { - type = "portmap"; - capabilities = { - portMappings = true; - }; - } - ]; - }); - - environment.systemPackages = mkIf cfg.installSystemWide - (with pkgs; [ - buildah conmon crun fuse-overlayfs podman runc slirp4netns iptables podman-compose - ]); - - home-manager.users.alukard.home.packages = mkIf (!cfg.installSystemWide) - (with pkgs; [ - buildah conmon crun fuse-overlayfs podman runc slirp4netns iptables podman-compose - ]); - - users.users.alukard = { - subUidRanges = [{ startUid = 100000; count = 65536; }]; - subGidRanges = [{ startGid = 100000; count = 65536; }]; - }; - }) - ({ - programs.podman = { - # enable = config.devices.${config.device}.enableDocker; - enable = false; - policy = { - default = [ { type = "insecureAcceptAnything"; }]; - }; - }; - }) - ]; -} \ No newline at end of file diff --git a/modules/workspace/rofi.nix b/modules/workspace/rofi.nix index 7bad946..d323634 100644 --- a/modules/workspace/rofi.nix +++ b/modules/workspace/rofi.nix @@ -1,146 +1,4 @@ -{ pkgs, config, lib, ... }: -with import ../../support.nix { inherit lib config; }; { -# home-manager.users.alukard.home.file.".config/rofi/custom.rasi".text = '' -# * { -# red: rgba ( ${thmDec.red}, 100 % ); -# blue: rgba ( ${thmDec.blue}, 100 % ); -# lightfg: rgba ( ${thmDec.cyan}, 100 % ); -# lightbg: rgba ( ${thmDec.dark}, 100 % ); -# foreground: rgba ( ${thmDec.purple}, 100 % ); -# background: rgba ( ${thmDec.bg}, 100 % ); -# background-color: rgba ( ${thmDec.bg}, 0 % ); -# separatorcolor: @foreground; -# border-color: @foreground; -# selected-normal-foreground: @background; -# selected-normal-background: @blue; -# selected-active-foreground: @lightbg; -# selected-active-background: @lightfg; -# selected-urgent-foreground: @background; -# selected-urgent-background: @red; -# normal-foreground: @foreground; -# normal-background: @background; -# active-foreground: @blue; -# active-background: @background; -# urgent-foreground: @red; -# urgent-background: @background; -# alternate-normal-foreground: @foreground; -# alternate-normal-background: @lightbg; -# alternate-active-foreground: @blue; -# alternate-active-background: @lightbg; -# alternate-urgent-foreground: @red; -# alternate-urgent-background: @lightbg; -# spacing: 2; -# } -# window { -# background-color: @background; -# border: 1; -# padding: 5; -# } -# mainbox { -# border: 0; -# padding: 0; -# } -# message { -# border: 1px dash 0px 0px ; -# border-color: @separatorcolor; -# padding: 1px ; -# } -# textbox { -# text-color: @foreground; -# } -# listview { -# fixed-height: 0; -# border: 2px dash 0px 0px ; -# border-color: @separatorcolor; -# spacing: 2px ; -# scrollbar: true; -# padding: 2px 0px 0px ; -# } -# element { -# border: 0; -# padding: 1px ; -# } -# element normal.normal { -# background-color: @normal-background; -# text-color: @normal-foreground; -# } -# element normal.urgent { -# background-color: @urgent-background; -# text-color: @urgent-foreground; -# } -# element normal.active { -# background-color: @active-background; -# text-color: @active-foreground; -# } -# element selected.normal { -# background-color: @selected-normal-background; -# text-color: @selected-normal-foreground; -# } -# element selected.urgent { -# background-color: @selected-urgent-background; -# text-color: @selected-urgent-foreground; -# } -# element selected.active { -# background-color: @selected-active-background; -# text-color: @selected-active-foreground; -# } -# element alternate.normal { -# background-color: @alternate-normal-background; -# text-color: @alternate-normal-foreground; -# } -# element alternate.urgent { -# background-color: @alternate-urgent-background; -# text-color: @alternate-urgent-foreground; -# } -# element alternate.active { -# background-color: @alternate-active-background; -# text-color: @alternate-active-foreground; -# } -# scrollbar { -# width: 4px ; -# border: 0; -# handle-color: @normal-foreground; -# handle-width: 8px ; -# padding: 0; -# } -# sidebar { -# border: 2px dash 0px 0px ; -# border-color: @separatorcolor; -# } -# button { -# spacing: 0; -# text-color: @normal-foreground; -# } -# button selected { -# background-color: @selected-normal-background; -# text-color: @selected-normal-foreground; -# } -# inputbar { -# spacing: 0px; -# text-color: @normal-foreground; -# padding: 1px ; -# children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; -# } -# case-indicator { -# spacing: 0; -# text-color: @normal-foreground; -# } -# entry { -# spacing: 0; -# text-color: @normal-foreground; -# } -# prompt { -# spacing: 0; -# text-color: @normal-foreground; -# } -# textbox-prompt-colon { -# expand: false; -# str: ":"; -# margin: 0px 0.3000em 0.0000em 0.0000em ; -# text-color: inherit; -# } -# ''; - # TODO: отвязать от абсолютного пути (/home/user/...) +{ pkgs, config, lib, ... }: { home-manager.users.alukard.programs.rofi = { enable = true; font = "Roboto Mono 14"; diff --git a/modules/workspace/xresources.nix b/modules/workspace/xresources.nix index b7ee3a0..bd16035 100644 --- a/modules/workspace/xresources.nix +++ b/modules/workspace/xresources.nix @@ -47,23 +47,6 @@ "URxvt.keysym.Control-Right" = "\\033[1;5C"; "URxvt.keysym.Control-Left" = "\\033[1;5D"; - # "emacs.color0" = dark; - # "emacs.color1" = red; - # "emacs.color2" = green; - # "emacs.color3" = yellow; - # "emacs.color4" = gray; - # "emacs.color5" = purple; - # "emacs.color6" = cyan; - # "emacs.color7" = gray; - # "emacs.color8" = alt; - # "emacs.color9" = green; - # "emacs.color10" = green; - # "emacs.color11" = yellow; - # "emacs.color12" = green; - # "emacs.color13" = purple; - # "emacs.color14" = cyan; - # "emacs.color15" = fg; - }; home.activation.xrdb = { after = ["linkGeneration"]; diff --git a/modules/workspace/zsh.nix b/modules/workspace/zsh.nix index 02eaef6..94e07f4 100644 --- a/modules/workspace/zsh.nix +++ b/modules/workspace/zsh.nix @@ -15,30 +15,15 @@ { name = "zsh-nix-shell"; file = "nix-shell.plugin.zsh"; - src = pkgs.fetchFromGitHub { - owner = "chisui"; - repo = "zsh-nix-shell"; - rev = "b2609ca787803f523a18bb9f53277d0121e30389"; - sha256 = "01w59zzdj12p4ag9yla9ycxx58pg3rah2hnnf3sw4yk95w3hlzi6"; - }; + src = pkgs.imports.zsh-nix-shell; } { name = "zsh-autosuggestions"; - src = pkgs.fetchFromGitHub { - owner = "zsh-users"; - repo = "zsh-autosuggestions"; - rev = "v0.4.0"; - sha256 = "0z6i9wjjklb4lvr7zjhbphibsyx51psv50gm07mbb0kj9058j6kc"; - }; + src = pkgs.imports.zsh-autosuggestions; } { name = "you-should-use"; - src = pkgs.fetchFromGitHub { - owner = "MichaelAquilina"; - repo = "zsh-you-should-use"; - rev = "2be37f376c13187c445ae9534550a8a5810d4361"; - sha256 = "0yhwn6av4q6hz9s34h4m3vdk64ly6s28xfd8ijgdbzic8qawj5p1"; - }; + src = pkgs.imports.zsh-you-should-use; } ]; shellAliases = { diff --git a/nix/sources.json b/nix/sources.json new file mode 100644 index 0000000..f00a32a --- /dev/null +++ b/nix/sources.json @@ -0,0 +1,110 @@ +{ + "base16-horizon-scheme": { + "branch": "master", + "description": null, + "homepage": null, + "owner": "AlukardBF", + "repo": "base16-horizon-scheme", + "rev": "644d073863ba9f863eef3b88a8f8607d0ace0063", + "sha256": "1c88z0zv5wwc5p6ddvqv9h6681cayvkj5qxyxsig47lndx5zvjq3", + "type": "tarball", + "url": "https://github.com/AlukardBF/base16-horizon-scheme/archive/644d073863ba9f863eef3b88a8f8607d0ace0063.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, + "home-manager": { + "branch": "master", + "description": "Manage a user environment using Nix", + "homepage": "", + "owner": "rycee", + "repo": "home-manager", + "rev": "6cc4fd6ede4909226cb81d3475834251ed1b7210", + "sha256": "123wb940yw8k0qr3gmhdxi4ilzp9d2a7jsb6br6ybz7082dknlx8", + "type": "tarball", + "url": "https://github.com/rycee/home-manager/archive/6cc4fd6ede4909226cb81d3475834251ed1b7210.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, + "materia-theme": { + "branch": "master", + "description": "A Material Design theme for GNOME/GTK based desktop environments", + "homepage": "", + "owner": "nana-4", + "repo": "materia-theme", + "rev": "b1e4c563146ae34fff6a697393b6a1bc66b612f5", + "sha256": "1w65v7jl8v5h41d27gj79rnkbn8rw0avrj4gi57l8lvlhpn9q6a2", + "type": "tarball", + "url": "https://github.com/nana-4/materia-theme/archive/b1e4c563146ae34fff6a697393b6a1bc66b612f5.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, + "niv": { + "branch": "master", + "description": "Easy dependency management for Nix projects", + "homepage": "https://github.com/nmattia/niv", + "owner": "nmattia", + "repo": "niv", + "rev": "2ecfd86b631714b457e56d70dd83fa60435baeb6", + "sha256": "01j6727cws8blg1npp54b4w6xa0gpgyzhyws2vqgp8clnlnmqqhi", + "type": "tarball", + "url": "https://github.com/nmattia/niv/archive/2ecfd86b631714b457e56d70dd83fa60435baeb6.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, + "nixpkgs": { + "branch": "nixos-unstable", + "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to", + "homepage": "https://github.com/NixOS/nixpkgs", + "owner": "NixOS", + "repo": "nixpkgs-channels", + "rev": "a21c2fa3ea2b88e698db6fc151d9c7259ae14d96", + "sha256": "1z3kxlbz6bqx1dlagcazg04vhk67r8byihzf959c3m0laf2a1w7y", + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs-channels/archive/a21c2fa3ea2b88e698db6fc151d9c7259ae14d96.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, + "nixpkgs-mozilla": { + "branch": "master", + "description": "mozilla related nixpkgs (extends nixos/nixpkgs repo)", + "homepage": null, + "owner": "mozilla", + "repo": "nixpkgs-mozilla", + "rev": "5300241b41243cb8962fad284f0004afad187dad", + "sha256": "1h3g3817anicwa9705npssvkwhi876zijyyvv4c86qiklrkn5j9w", + "type": "tarball", + "url": "https://github.com/mozilla/nixpkgs-mozilla/archive/5300241b41243cb8962fad284f0004afad187dad.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, + "zsh-autosuggestions": { + "branch": "master", + "description": "Fish-like autosuggestions for zsh", + "homepage": null, + "owner": "zsh-users", + "repo": "zsh-autosuggestions", + "rev": "ae315ded4dba10685dbbafbfa2ff3c1aefeb490d", + "sha256": "0h52p2waggzfshvy1wvhj4hf06fmzd44bv6j18k3l9rcx6aixzn6", + "type": "tarball", + "url": "https://github.com/zsh-users/zsh-autosuggestions/archive/ae315ded4dba10685dbbafbfa2ff3c1aefeb490d.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, + "zsh-nix-shell": { + "branch": "master", + "description": "zsh plugin that lets you use zsh in nix-shell shell.", + "homepage": "", + "owner": "chisui", + "repo": "zsh-nix-shell", + "rev": "a65382a353eaee5a98f068c330947c032a1263bb", + "sha256": "0l41ac5b7p8yyjvpfp438kw7zl9dblrpd7icjg1v3ig3xy87zv0n", + "type": "tarball", + "url": "https://github.com/chisui/zsh-nix-shell/archive/a65382a353eaee5a98f068c330947c032a1263bb.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, + "zsh-you-should-use": { + "branch": "master", + "description": "📎 ZSH plugin that reminds you to use existing aliases for commands you just typed", + "homepage": "", + "owner": "MichaelAquilina", + "repo": "zsh-you-should-use", + "rev": "888da3af69162c927e0f933ab8dc12395a52ad67", + "sha256": "1gcxm08ragwrh242ahlq3bpfg5yma2cshwdlj8nrwnd4qwrsflgq", + "type": "tarball", + "url": "https://github.com/MichaelAquilina/zsh-you-should-use/archive/888da3af69162c927e0f933ab8dc12395a52ad67.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + } +} diff --git a/nix/sources.nix b/nix/sources.nix new file mode 100644 index 0000000..8a725cb --- /dev/null +++ b/nix/sources.nix @@ -0,0 +1,134 @@ +# This file has been generated by Niv. + +let + + # + # The fetchers. fetch_ fetches specs of type . + # + + fetch_file = pkgs: spec: + if spec.builtin or true then + builtins_fetchurl { inherit (spec) url sha256; } + else + pkgs.fetchurl { inherit (spec) url sha256; }; + + fetch_tarball = pkgs: spec: + if spec.builtin or true then + builtins_fetchTarball { inherit (spec) url sha256; } + else + pkgs.fetchzip { inherit (spec) url sha256; }; + + fetch_git = spec: + builtins.fetchGit { url = spec.repo; inherit (spec) rev ref; }; + + fetch_builtin-tarball = spec: + builtins.trace + '' + WARNING: + The niv type "builtin-tarball" will soon be deprecated. You should + instead use `builtin = true`. + + $ niv modify -a type=tarball -a builtin=true + '' + builtins_fetchTarball { inherit (spec) url sha256; }; + + fetch_builtin-url = spec: + builtins.trace + '' + WARNING: + The niv type "builtin-url" will soon be deprecated. You should + instead use `builtin = true`. + + $ niv modify -a type=file -a builtin=true + '' + (builtins_fetchurl { inherit (spec) url sha256; }); + + # + # Various helpers + # + + # The set of packages used when specs are fetched using non-builtins. + mkPkgs = sources: + let + sourcesNixpkgs = + import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) {}; + hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath; + hasThisAsNixpkgsPath = == ./.; + in + if builtins.hasAttr "nixpkgs" sources + then sourcesNixpkgs + else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then + import {} + else + abort + '' + Please specify either (through -I or NIX_PATH=nixpkgs=...) or + add a package called "nixpkgs" to your sources.json. + ''; + + # The actual fetching function. + fetch = pkgs: name: spec: + + if ! builtins.hasAttr "type" spec then + abort "ERROR: niv spec ${name} does not have a 'type' attribute" + else if spec.type == "file" then fetch_file pkgs spec + else if spec.type == "tarball" then fetch_tarball pkgs spec + else if spec.type == "git" then fetch_git spec + else if spec.type == "builtin-tarball" then fetch_builtin-tarball spec + else if spec.type == "builtin-url" then fetch_builtin-url spec + else + abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}"; + + # Ports of functions for older nix versions + + # a Nix version of mapAttrs if the built-in doesn't exist + mapAttrs = builtins.mapAttrs or ( + f: set: with builtins; + listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set)) + ); + + # fetchTarball version that is compatible between all the versions of Nix + builtins_fetchTarball = { url, sha256 }@attrs: + let + inherit (builtins) lessThan nixVersion fetchTarball; + in + if lessThan nixVersion "1.12" then + fetchTarball { inherit url; } + else + fetchTarball attrs; + + # fetchurl version that is compatible between all the versions of Nix + builtins_fetchurl = { url, sha256 }@attrs: + let + inherit (builtins) lessThan nixVersion fetchurl; + in + if lessThan nixVersion "1.12" then + fetchurl { inherit url; } + else + fetchurl attrs; + + # Create the final "sources" from the config + mkSources = config: + mapAttrs ( + name: spec: + if builtins.hasAttr "outPath" spec + then abort + "The values in sources.json should not have an 'outPath' attribute" + else + spec // { outPath = fetch config.pkgs name spec; } + ) config.sources; + + # The "config" used by the fetchers + mkConfig = + { sourcesFile ? ./sources.json + , sources ? builtins.fromJSON (builtins.readFile sourcesFile) + , pkgs ? mkPkgs sources + }: rec { + # The sources, i.e. the attribute set of spec name to spec + inherit sources; + + # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers + inherit pkgs; + }; +in +mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }