about summary refs log tree commit diff
path: root/machines/profpatsch/shiki.nix
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2019-03-04 22:45:21 +0100
committerProfpatsch <mail@profpatsch.de>2019-03-25 13:53:46 +0100
commit391210ebe49d03e83a07e613d17465dbe6a2a6b8 (patch)
treea9c247fc67566b5fa90474997580b3e2872df3bb /machines/profpatsch/shiki.nix
parenteb2421221f85cd7048344ce26acea84e39c22db6 (diff)
machines/profpatsch: katara -> shiki (file rename)
Diffstat (limited to 'machines/profpatsch/shiki.nix')
-rw-r--r--machines/profpatsch/shiki.nix471
1 files changed, 471 insertions, 0 deletions
diff --git a/machines/profpatsch/shiki.nix b/machines/profpatsch/shiki.nix
new file mode 100644
index 00000000..98842ecd
--- /dev/null
+++ b/machines/profpatsch/shiki.nix
@@ -0,0 +1,471 @@
+{ config, pkgs, unfreeAndNonDistributablePkgs, lib, ... }:
+let
+
+  myLib  = import ./lib.nix  { inherit pkgs lib; };
+  myPkgs = import ./pkgs.nix { inherit pkgs lib myLib; };
+
+in {
+
+  imports = [
+    ./base-workstation.nix
+  ];
+
+  config = {
+
+    #########
+    # Kernel
+
+    boot.initrd.availableKernelModules = [ "uhci_hcd" "ehci_pci" "ahci" ];
+    boot.loader.grub.device = "/dev/disk/by-id/ata-CT500MX500SSD1_1809E130BEE8";
+
+    # VPN support
+    boot.extraModulePackages = [ config.boot.kernelPackages.wireguard ];
+
+    boot.initrd.luks.devices = [ {
+      device = "/dev/disk/by-uuid/2e1c433f-4a54-4f04-9073-3639b66b975d";
+      name = "cryptroot";
+    } ];
+
+    ###########
+    # Hardware
+
+    fileSystems."/" = {
+      device = "/dev/disk/by-uuid/5339f027-df78-437b-8a4c-39b93abc40b9";
+      fsType = "btrfs";
+      options = [ "ssd" "subvol=/katarafs" ];
+    };
+
+    fileSystems."/boot" = {
+      device = "/dev/disk/by-uuid/53042c4f-bbf2-418b-bf85-5d148ab5dda0";
+      fsType = "ext3";
+    };
+
+    hardware.trackpoint = {
+      speed = 280;
+    };
+
+    hardware.pulseaudio = {
+      enable = true;
+      zeroconf.discovery.enable = true;
+      # for Pillars of Eternity
+      support32Bit = true;
+    };
+    # steam
+    hardware.opengl.driSupport32Bit = true;
+
+    # needed by some games (TODO: general module for games)
+    # hardware.opengl.driSupport32Bit = true;
+
+    vuizvui.hardware.thinkpad.enable = true;
+
+    ######
+    # Nix
+
+    nix.maxJobs = 2;
+    vuizvui.modifyNixPath = false;
+    nix.nixPath = [
+      "vuizvui=${myLib.philip.home}/vuizvui"
+      "nixpkgs=${myLib.philip.home}/nixpkgs"
+      # TODO: nicer?
+      "nixos-config=${pkgs.writeText "katara-configuration.nix" ''
+        (import <vuizvui/machines>).profpatsch.katara.config
+      ''}"
+    ];
+
+    nix.distributedBuilds = true;
+    nix.buildMachines = [
+      # access to the nix-community aarch64 build box
+      {
+        hostName = "aarch64.nixos.community";
+        maxJobs = 64;
+        sshKey = "/root/aarch64-build-box/ssh-key";
+        sshUser = "Profpatsch";
+        system = "aarch64-linux";
+        supportedFeatures = [ "big-parallel" ];
+      }
+      # tweag remote builder
+      {
+        hostName = "build01.tweag.io";
+        maxJobs = 24;
+        sshKey = "/root/.ssh/tweag-nix-builder";
+        sshUser = "nix";
+        system = "x86_64-linux";
+        supportedFeatures = [ "big-parallel" ];
+      }
+    ];
+    nix.extraOptions = ''
+      builders-use-substitutes = true
+      auto-optimise-store = true
+    '';
+
+    ##########
+    # Network
+
+    networking.hostName = "katara";
+
+    networking.networkmanager.enable = true;
+
+    # TODO: bond eth and wifi again
+    # networking.bonds = {
+    #   wifiAndEthernet = {
+    #     interfaces = [ "wlp3s0" "enp0s25" ];
+    #     driverOptions = {
+    #       miimon = "100";
+    #       primary = "enp0s25";
+    #       mode = "active-backup";
+    #     };
+    #   };
+    # };
+
+    ###########
+    # Packages
+
+    environment.extraOutputsToInstall = [ "devdoc" ];
+    environment.systemPackages = with pkgs;
+    let
+      systemPkgs =
+      [
+        atool                # archive tools
+        gnupg gnupg1compat   # PGP encryption
+        imagemagick          # image conversion
+        jmtpfs               # MTP fuse
+        mosh                 # ssh with stable connections
+        sshfsFuse            # mount ssh machines
+        # TODO move into atool deps
+        unzip                # extract zip archives
+        networkmanagerapplet # for nm-connection-editor
+        wpa_supplicant_gui   # configure wireless connections
+      ];
+      xPkgs = [
+        dmenu             # simple UI menu builder
+        dunst             # notification daemon (interfaces with libnotify)
+        # TODO: replace by xscreensaver or i3lock
+        alock             # lock screen
+        libnotify         # notification library
+        xclip             # clipboard thingy
+        xorg.xkill        # X11 application kill
+      ];
+      guiPkgs = [
+        gnome3.adwaita-icon-theme
+        # TODO: get themes to work. See notes.org.
+        gnome3.gnome_themes_standard
+        pavucontrol
+      ];
+      programmingTools = [
+        cabal2nix                    # convert cabal files to nixexprs
+        # myPkgs.fast-init             # fast-init of haskell projects
+        gitAndTools.git-annex        # version controlled binary file storage
+        gitAndTools.git-dit          # decentral issue tracking for git
+
+        # TODO: move to user config
+        go
+        direnv
+        httpie                       # nice http CLI
+        jq                           # json filter
+        telnet                       # tcp debugging
+        pkgs.vuizvui.profpatsch.nix-http-serve # serve nix builds and rebuild on reloads
+        pkgs.vuizvui.profpatsch.nman # open man pages in temporary nix shell
+        pkgs.vuizvui.profpatsch.warpspeed    # trivial http file server
+        pkgs.vuizvui.profpatsch.nix-gen      # generate nix expressions
+        pkgs.vuizvui.profpatsch.watch-server # restart server on code change
+        pkgs.vuizvui.profpatsch.until        # restart until cmd succeeds
+        myPkgs.execlineb-with-builtins
+        dhall
+      ];
+      documentation = [
+        # mustache-spec NOT IN 16.09
+      ];
+      userPrograms = [
+        abcde                # high-level cd-ripper with tag support
+        anki mecab kakasi    # spaced repetition system & japanese analyzer
+        # TODO integrate lame into audacity
+        audacity lame.lib    # audio editor and mp3 codec
+        # myPkgs.beets         # audio file metadata tagger
+        chromium             # browser
+        cups                 # print tools, mainly for lp(1)
+        pkgs.vuizvui.profpatsch.droopy # simple HTML upload server
+        # electrum             # bitcoin client
+        emacs                # pretty neat operating system i guess
+        feh                  # brother of meh, displays images in a meh way, but fast
+        filezilla            # FTP GUI business-ready interface framework
+        myPkgs.saneGhci      # <s>Glorious</s>Glasgow Haskell Compiler, mostly for ghci
+        gimp                 # graphics
+        inkscape             # vector graphics
+        libreoffice          # a giant ball of C++, that sometimes helps with proprietary shitformats
+        lilyterm-git         # terminal emulator, best one around
+        myPkgs.mpv           # you are my sun and my stars, and you play my stuff.
+        pass                 # standard unix password manager
+        picard               # jean-luc, music tagger
+        poppler_utils        # pdfto*
+        ranger               # CLI file browser
+        remind               # calender & reminder program
+        rtorrent             # monster of a bittorrent client
+        unfreeAndNonDistributablePkgs.steam # the one gaming platform
+        youtube-dl           # download videos
+        zathura              # pdf viewer
+      ];
+      userScripts = with pkgs.vuizvui.profpatsch; [
+        display-infos  # show time & battery
+        show-qr-code   # display a QR code
+        backlight      # adjust laptop backlight
+      ];
+      mailPkgs = [
+        elinks               # command line browser
+        msmtp                # SMTP client
+        mu                   # mail indexing w/ emacs mode
+      ];
+      nixPkgs = [
+        nix-diff                  # structurally diff two derivations
+        nix-prefetch-scripts      # prefetch store paths from various destinations
+        pkgs.vuizvui.taalo-build  # build derivation on taalo
+      ];
+      tmpPkgs = [
+        # TODO needs user service
+        redshift   # increases screen warmth at night (so i don’t have to feel cold)
+        # pdfjam is the best CLI pdf modification suite
+        (texlive.combine { inherit (texlive) scheme-small pdfjam; })
+      ];
+    in systemPkgs ++ xPkgs ++ guiPkgs
+    ++ programmingTools ++ documentation
+    ++ userPrograms ++ userScripts
+    ++ mailPkgs ++ nixPkgs ++ tmpPkgs;
+
+    ###########
+    # Services
+
+
+    # Automount
+    services.udisks2.enable = true;
+
+    services.logind.extraConfig = ''
+      # want to be able to listen to music while laptop closed
+      LidSwitchIgnoreInhibited=no
+    '';
+
+    ###################
+    # Graphical System
+
+    services.xserver = {
+      enable = true;
+      layout = "de";
+      xkbVariant = "neo";
+      xkbOptions = "altwin:swap_alt_win";
+      serverFlagsSection = ''
+        Option "StandbyTime" "10"
+        Option "SuspendTime" "20"
+        Option "OffTime" "30"
+      '';
+
+      synaptics = {
+        enable = true;
+        minSpeed = "0.6";
+        maxSpeed = "1.5";
+        accelFactor = "0.015";
+        twoFingerScroll = true;
+        vertEdgeScroll = false;
+      };
+
+
+      videoDrivers = [ "intel" ];
+
+      displayManager = {
+        sessionCommands = with pkgs; ''
+            #TODO add as nixpkg
+            export PATH+=":$HOME/scripts" #add utility scripts
+            export EDITOR=emacsclient
+            export TERMINAL=${lilyterm}/bin/lilyterm
+
+            ${xorg.xset}/bin/xset r rate 250 35
+
+            set-background &
+            # TODO xbindkeys user service file
+            ${lib.getBin xbindkeys}/bin/xbindkeys
+            # synchronize clipboards
+            ${lib.getBin autocutsel}/bin/autocutsel -s PRIMARY &
+          '';
+      };
+
+    };
+
+    fonts.fontconfig = {
+      enable = true;
+      defaultFonts = {
+        monospace = [ "Source Code Pro" "DejaVu Sans Mono" ]; # TODO does not work
+        sansSerif = [ "Liberation Sans" ];
+      };
+      ultimate = {
+        enable = true;
+        substitutions = "combi";
+        preset = "ultimate4";
+      };
+    };
+    fonts.fonts = with pkgs; [
+      unfreeAndNonDistributablePkgs.corefonts
+      source-han-sans-japanese
+      source-han-sans-korean
+      source-han-sans-simplified-chinese
+      source-code-pro
+      hasklig
+      dejavu_fonts
+      ubuntu_font_family
+      league-of-moveable-type
+      symbola # emoji
+    ];
+
+    services.printing = {
+      enable = true;
+      drivers = [ pkgs.gutenprint pkgs.gutenprintBin pkgs.hplip ];
+    };
+
+    ###########
+    # Programs
+
+    vuizvui.programs.gnupg = {
+      enable = true;
+      agent = {
+        enable = true;
+        sshSupport = true;
+      };
+    };
+
+    # TODO: base config?
+    vuizvui.programs.fish.fasd.enable = true;
+
+    vuizvui.user.profpatsch.programs.scanning = {
+      enable = true;
+      #remoteScanners = ''
+      #  hannswurscht.lab
+      #  hippie.lab
+      #'';
+    };
+
+    # virtualisation.docker.enable = true;
+
+    #######
+    # Misc
+
+    security.pki.certificateFiles = [ "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" ];
+
+    ########
+    # Fixes
+
+    # fix for emacs ssh
+    programs.bash.promptInit = "PS1=\"# \"";
+
+    ################
+    # User services
+    systemd.user = lib.mkMerge [
+
+      (lib.mkIf config.vuizvui.programs.gnupg.enable {
+        services.unlock-password-store = {
+          description = "unlock the user password store";
+          wantedBy = [ "default.target" ];
+          # make sure gpg-agent is running
+          wants = [ "gpg-agent.service" ];
+          after = [ "gpg-agent.service" ];
+          serviceConfig = {
+            # use special unlock key in the password store (needs to exist of course)
+            ExecStart = "${lib.getBin pkgs.pass}/bin/pass misc/unlock";
+            StandardOutput = "null";
+          };
+        };
+        timers.unlock-password-store = {
+          description = "unlock password store on system start";
+          wantedBy = [ "timers.target" ];
+          # run ~five seconds after user logs in
+          timerConfig.OnStartupSec = "5s";
+        };
+       })
+
+      {
+        services.mbsync = {
+          description = "mbsync job";
+          wants = [ "notmuch.service" ];
+          before = [ "notmuch.service"];
+          path = [ pkgs.pass ];
+          serviceConfig = {
+            Restart = "no";
+            ExecStart = "${pkgs.isync}/bin/mbsync -a";
+            };
+        };
+        timers.mbsync = {
+          description = "run mbsync job every 15 minutes";
+          wantedBy = [ "timers.target" ];
+          timerConfig = {
+            OnStartupSec="10s";
+            OnUnitActiveSec ="15m";
+          };
+        };
+        services.mu = {
+          description = "mu job";
+          serviceConfig = {
+            Restart = "no";
+            ExecStart = "${pkgs.notmuch}/bin/notmuch new";
+            };
+        };
+      }
+
+      ({
+        services.dunst = {
+          description = "dunst libnotify daemon";
+          serviceConfig = {
+            Type = "dbus";
+            BusName = "org.freedesktop.Notifications";
+            ExecStart =
+              let config = pkgs.writeText "dunst.conf" (lib.generators.toINI {} {});
+              in "${lib.getBin pkgs.dunst}/bin/dunst --config ${config}";
+            Restart = "on-failure";
+          };
+          partOf = [ "graphical-session.target" ];
+          wantedBy = [ "graphical-session.target" ];
+        };
+      })
+
+      ({
+        services.pyrnotify-ssh-connection = {
+          description = "ssh connection to make pyrnotify work";
+          serviceConfig = {
+            # TODO: get out of the gpg-agent service directly
+            Environment = ''"SSH_AUTH_SOCK=%t/gnupg/S.gpg-agent.ssh"'';
+            ExecStart = pkgs.writeScript "pyrnotify-start-ssh" ''
+              #!${pkgs.stdenv.shell}
+              set -e
+              # first delete the socket file if it exists
+              # otherwise the forward doesn’t work
+              ${lib.getBin pkgs.openssh}/bin/ssh \
+                bigmac \
+                "rm /home/bigmac/.weechat/pyrnotify.socket"
+              # forwards the remote socket over ssh
+              # thE options make it disconnect after 45 sec
+              # by sending a keepalive packet every 15 seconds
+              # and retrying 3 times
+              ${lib.getBin pkgs.openssh}/bin/ssh \
+                -o ServerAliveInterval=15 \
+                -o ServerAliveCountMax=3 \
+                -o ExitOnForwardFailure=yes \
+                -R /home/bigmac/.weechat/pyrnotify.socket:localhost:8099 \
+                -N \
+                bigmac
+            '';
+          };
+          requires = [ "gpg-agent.service" ];
+          after = [ "gpg-agent.service" ];
+        };
+        services.pyrnotify-listen = rec {
+          description = "get notified about weechat messages";
+          serviceConfig = {
+            ExecStart = "${lib.getBin pkgs.python
+              }/bin/python ${myPkgs.pyrnotify} 8099";
+            Restart = "on-failure";
+            RestartSec = "5s";
+          };
+          bindsTo = [ "pyrnotify-ssh-connection.service" ];
+          after = [ "pyrnotify-ssh-connection.service" ];
+          wantedBy = [ "default.target" ];
+        };
+      })
+
+    ];
+
+  };
+}