diff options
Diffstat (limited to 'machines/profpatsch')
-rw-r--r-- | machines/profpatsch/katara.nix | 343 | ||||
-rw-r--r-- | machines/profpatsch/notes.org | 32 | ||||
-rw-r--r-- | machines/profpatsch/pkgs.nix | 25 | ||||
-rw-r--r-- | machines/profpatsch/taffybar.patch | 71 |
4 files changed, 471 insertions, 0 deletions
diff --git a/machines/profpatsch/katara.nix b/machines/profpatsch/katara.nix new file mode 100644 index 00000000..00cbe88b --- /dev/null +++ b/machines/profpatsch/katara.nix @@ -0,0 +1,343 @@ +{ config, pkgs, lib, ... }: +let + + myPkgs = import ./pkgs.nix { inherit pkgs; }; + + mytexlive = with pkgs.texlive; combine { inherit scheme-medium minted units collection-bibtexextra; }; + +in { + + config = rec { + + ######### + # Kernel + + boot.initrd.availableKernelModules = [ "uhci_hcd" "ehci_pci" "ahci" ]; + boot.loader.grub.enable = true; + boot.loader.grub.version = 2; + boot.loader.grub.device = "/dev/sda"; + boot.initrd.luks.devices = [ { device = "/dev/sda2"; name = "cryptroot"; } ]; + + + ########### + # Hardware + + + fileSystems."/" = { + device = "/dev/dm-0"; + fsType = "btrfs"; + options = [ "ssd" ]; + }; + + fileSystems."/boot" = { + device = "/dev/sda1"; + fsType = "ext3"; + }; + + hardware.pulseaudio.enable = true; + vuizvui.hardware.thinkpad.enable = true; + + + ###### + # Nix + + nix.maxJobs = 2; + vuizvui.enableGlobalNixpkgsConfig = true; + + ########## + # Network + + networking.hostName = "katara"; + networking.networkmanager.enable = true; + + networking.firewall = { + enable = true; + # Programmer’s dilemma + allowedTCPPortRanges = [ + { from = 8000; to = 8005; } + { from = 8080; to = 8085; } + ]; + }; + + i18n = { + consoleFont = "lat9w-16"; + consoleKeyMap = "us"; + defaultLocale = "en_US.UTF-8"; + }; + + + ########### + # Packages + + environment.profileRelativeEnvVars = { EDITOR = [ "${pkgs.vim}/bin/vim" ]; }; + + environment.systemPackages = with pkgs; + let + systemPkgs = [ + atool # archive tools + curl # transfer data to/from a URL + diffoscope # diff whole filetrees (and archives) + dos2unix # text file conversion + fdupes # file duplicate finder + file # file information + git # version control system + gnupg # PGP encryption + htop # top replacement + imagemagick # image conversion + jmtpfs # MTP fuse + gnumake # make + manpages # system manpages (not included by default) + mkpasswd # UNIX password creator + mosh # ssh with stable connections + nmap # stats about clients in the network + silver-searcher # file content searcher, > ack > grep + stow # dotfile management + tmux # detachable terminal multiplexer + traceroute # trace ip routes + vim # slight improvement over vi + wget # the other URL file fetcher + ]; + xPkgs = [ + dmenu # simple UI menu builder + dunst # notification daemon (implements libnotify) + i3lock # lock screen + libnotify # notification library + lxappearance # GTK theme chooser + myPkgs.taffybar # status bar + xbindkeys # keybinding manager + 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 + # kde4.oxygen-icons TODO + ]; + userPrograms = [ + abcde # high-level cd-ripper with tag support + anki # spaced repetition system + audacity lame # audio editor and mp3 codec + beets # audio file metadata tagger + # chromium # browser + (chromium.override { enablePepperFlash = true; }) + dropbox-cli # dropbox.com 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 + ghc # Glasgow Haskell Compiler, mostly for ghci + gimp # graphics + gmpc # mpd client and best music player interface in the world + httpie + keepassx # password manager + libreoffice # a giant ball of C++, that sometimes helps with proprietary shitformats + lilyterm # terminal emulator, best one around + # lyx mytexlive # you didn’t see a thing + mpv # you are my sun and my stars. and you play my stuff. + newsbeuter # RSS/Atom feed reader + networkmanagerapplet # NetworkManager status bar widget + poezio # CLI XMPP client + poppler_utils # pdfto* + ranger # CLI file browser + rtorrent # monster of a bittorrent client + stack # haskell package manager + pkgs.vuizvui.show-qr-code # display a QR code + zathura # pdf viewer + ]; + mailPkgs = [ + elinks # command line browser + myPkgs.offlineimap # IMAP client + mutt-with-sidebar # has been sucking less since 1970 + msmtp # SMTP client + notmuch # mail indexer + ]; + nixPkgs = [ + nix-repl # nix REPL + nix-prefetch-scripts # prefetch store paths from various destinations + haskellPackages.cabal2nix # convert cabal files to nix + ]; + tmpPkgs = [ + # needs user service + redshift # increases screen warmth at night (so i don’t have to feel cold) + snapper + ]; + in systemPkgs ++ xPkgs ++ guiPkgs ++ userPrograms ++ nixPkgs ++ mailPkgs ++ nixPkgs ++ tmpPkgs; + system.extraDependencies = with pkgs; lib.singleton ( + # Haskell packages I want to keep around + haskellPackages.ghcWithPackages (hpkgs: with hpkgs; + [ + # frp + frpnow + gloss + gtk + frpnow-gtk + frpnow-gloss + + lens + wreq + aeson-lens + ])) + ++ + # other packages that I use sometimes in a shell + [ + #wkhtmltopdf + rustc + haskellPackages.purescript + ]; + + ########### + # Services + + # Enable the OpenSSH daemon. + services.openssh.enable = true; + + # Enable CUPS to print documents. + services.printing = { + enable = true; + drivers = [ pkgs.gutenprint ]; + }; + + time.timeZone = "Europe/Berlin"; + + # redshift TODO as user + services.redshift = { + # enable = true; + latitude = "48"; + longitude = "10"; + temperature.day = 6300; + }; + + # locate + services.locate = { + enable = true; + }; + + # Automount + services.udisks2.enable = true; + + services.journald.extraConfig = "SystemMaxUse=50M"; + + # TODO: taffybar battery depends on this + services.upower.enable = true; + + ################### + # 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; + synaptics.minSpeed = "0.5"; + synaptics.accelFactor = "0.01"; + videoDrivers = [ "intel" ]; + + # otherwise xterm is enabled, creating an xterm that spawns the window manager. + desktopManager.xterm.enable = false; + + # TODO: include taffybar + windowManager.xmonad = { + enable = true; + enableContribAndExtras = true; + }; + displayManager = { + desktopManagerHandlesLidAndPower = false; + sessionCommands = + '' + #TODO add as nixpkg + export PATH+=":$HOME/scripts" #add utility scripts + export EDITOR=emacsclient + xset r rate 250 35 + set-background & + # TODO xbindkeys user service file + xbindkeys + nice -n19 dropbox start & + nm-applet & + ''; + }; + + startGnuPGAgent = true; + + }; + + fonts.fontconfig = { + defaultFonts = { + monospace = [ "Source Code Pro" "DejaVu Sans Mono" ]; # TODO does not work + sansSerif = [ "Liberation Sans" ]; + }; + # use overkill infinality settings from old Arch installation + ultimate = { + rendering = { + INFINALITY_FT_FILTER_PARAMS = "08 24 36 24 08"; + INFINALITY_FT_FRINGE_FILTER_STRENGTH = "25"; + INFINALITY_FT_USE_VARIOUS_TWEAKS = "true"; + INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH = "25"; + INFINALITY_FT_STEM_ALIGNMENT_STRENGTH = "15"; + INFINALITY_FT_STEM_FITTING_STRENGTH = "15"; + }; + }; + }; + fonts.fonts = with pkgs; [ + corefonts + source-han-sans-japanese + source-han-sans-korean + source-han-sans-simplified-chinese + source-code-pro + dejavu_fonts + ubuntu_font_family + ]; + + + ######## + # Users + + # Nobody wants mutable state. :) + users.mutableUsers = false; + users.extraUsers = + let authKeys = ["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJhthfk38lzDvoI7lPqRneI0yBpZEhLDGRBpcXzpPSu+V0YlgrDix5fHhBl+EKfw4aeQNvQNuAky3pDtX+BDK1b7idbz9ZMCExy2a1kBKDVJz/onLSQxiiZMuHlAljVj9iU4uoTOxX3vB85Ok9aZtMP1rByRIWR9e81/km4HdfZTCjFVRLWfvo0s29H7l0fnbG9bb2E6kydlvjnXJnZFXX+KUM16X11lK53ilPdPJdm87VtxeSKZ7GOiBz6q7FHzEd2Zc3CnzgupQiXGSblXrlN22IY3IWfm5S/8RTeQbMLVoH0TncgCeenXH7FU/sXD79ypqQV/WaVVDYMOirsnh/ philip@nyx"]; + in { + philip = rec { + name = "philip"; + group = "users"; + extraGroups = [ "wheel" "networkmanager" ]; + uid = 1000; + createHome = true; + home = "/home/philip"; + passwordFile = "${home}/.config/passwd"; + # password = "test"; # in case of emergency, break glass + shell = "/run/current-system/sw/bin/fish"; + openssh.authorizedKeys.keys = authKeys; + }; + }; + + ########### + # Programs + + # see gpgAgent + programs.ssh.startAgent = false; + + # friendly user shell + programs.fish.enable = true; + + vuizvui.user.profpatsch.programs.scanning.enable = true; + + ####### + # Misc + + # TODO seems to work only sometimes in chromium + # security.pki.certificateFiles = [ "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" ]; + + ######## + # Fixes + + # fix for emacs ssh + programs.bash.promptInit = "PS1=\"# \""; + + }; +} diff --git a/machines/profpatsch/notes.org b/machines/profpatsch/notes.org new file mode 100644 index 00000000..b5a82651 --- /dev/null +++ b/machines/profpatsch/notes.org @@ -0,0 +1,32 @@ +* GTK themes +this should work: + +#+BEGIN_SRC nix + # https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/x11/desktop-managers/gnome3.nix + xserver.displayManager.session = [ + { + manage = "window"; + name = "awesome"; + start = '' + # Set GTK_DATA_PREFIX so that GTK+ can find the themes + export GTK_DATA_PREFIX=${config.system.path} + # Find theme engines + export GTK_PATH=${config.system.path}/lib/gtk-3.0:${config.system.path}/lib/gtk-2.0 + # Find the mouse + export XCURSOR_PATH=~/.icons:${config.system.path}/share/icons + # Update user dirs as described in http://freedesktop.org/wiki/Software/xdg-user-dirs/ + ${pkgs.xdg-user-dirs}/bin/xdg-user-dirs-update + # Find the mouse + export XCURSOR_PATH=~/.icons:${config.system.path}/share/icons + ${pkgs.awesome}/bin/awesome& + waitPID=$! + ''; + } + ]; + + environment = { + + # Share needed for themes and backgrounds + pathsToLink = [ "/include" "/share"]; + }; +#+END_SRC diff --git a/machines/profpatsch/pkgs.nix b/machines/profpatsch/pkgs.nix new file mode 100644 index 00000000..ef0a2f3f --- /dev/null +++ b/machines/profpatsch/pkgs.nix @@ -0,0 +1,25 @@ +{ pkgs }: + +let + addRuntimeDeps = drv: ds: drv.overrideDerivation (old: { + propagatedNativeBuildInputs = old.propagatedNativeBuildInputs ++ ds; + }); + +in +with pkgs; +{ + + offlineimap = addRuntimeDeps offlineimap [ pythonPackages.pygpgme ]; + + taffybar = taffybar.override { + ghcWithPackages = (haskellPackages.override { + overrides = _: super: { + taffybar = super.taffybar.overrideDerivation (old: { + name = old.name + "foo"; + patches = (old.patches or []) ++ [ ./taffybar.patch ]; + }); + }; + }).ghcWithPackages; + }; + +} diff --git a/machines/profpatsch/taffybar.patch b/machines/profpatsch/taffybar.patch new file mode 100644 index 00000000..a93fca1a --- /dev/null +++ b/machines/profpatsch/taffybar.patch @@ -0,0 +1,71 @@ +diff --git a/src/System/Taffybar/Battery.hs b/src/System/Taffybar/Battery.hs +index 5335eff..32c7efa 100644 +--- a/src/System/Taffybar/Battery.hs ++++ b/src/System/Taffybar/Battery.hs +@@ -9,6 +9,7 @@ + -- more advanced features could be supported if there is interest. + module System.Taffybar.Battery ( + batteryBarNew, ++ batteryIconNew, + textBatteryNew, + defaultBatteryConfig + ) where +@@ -108,30 +109,22 @@ defaultBatteryConfig = + | pct < 0.9 = (0.5, 0.5, 0.5) + | otherwise = (0, 1, 0) + +--- | A fancy graphical battery widget that represents the current +--- charge as a colored vertical bar. There is also a textual +--- percentage readout next to the bar. ++-- | + batteryBarNew :: BarConfig -- ^ Configuration options for the bar display +- -> Double -- ^ Polling period in seconds + -> IO Widget +-batteryBarNew battCfg pollSeconds = do ++batteryBarNew battCfg = do + battCtxt <- batteryContextNew +- case battCtxt of +- Nothing -> do +- let lbl :: Maybe String +- lbl = Just "No battery" +- labelNew lbl >>= return . toWidget +- Just ctxt -> do +- -- This is currently pretty inefficient - each poll period it +- -- queries the battery twice (once for the label and once for +- -- the bar). +- -- +- -- Converting it to combine the two shouldn't be hard. +- b <- hBoxNew False 1 +- txt <- textBatteryNew "$percentage$%" pollSeconds +- r <- newIORef ctxt +- bar <- pollingBarNew battCfg pollSeconds (battPct r) +- boxPackStart b bar PackNatural 0 +- boxPackStart b txt PackNatural 0 +- widgetShowAll b +- return (toWidget b) ++ let noBat = toWidget <$> labelNew (Just "No battery" :: Maybe String) ++ maybe noBat (batteryIconNew battCfg) battCtxt ++ ++-- | A fancy graphical battery widget that represents the current ++-- charge as a colored vertical bar. ++batteryIconNew :: BarConfig ++ -> BatteryContext ++ -> IO Widget ++batteryIconNew cfg ctxt = do ++ icon <- pollingBarNew cfg pollSeconds . battPct =<< newIORef ctxt ++ widgetShowAll icon ++ return icon ++ where ++ pollSeconds = 5 +diff --git a/src/System/Taffybar/Widgets/PollingBar.hs b/src/System/Taffybar/Widgets/PollingBar.hs +index d30adaf..01f161c 100644 +--- a/src/System/Taffybar/Widgets/PollingBar.hs ++++ b/src/System/Taffybar/Widgets/PollingBar.hs +@@ -16,6 +16,7 @@ import Control.Monad ( forever ) + import Graphics.UI.Gtk + + import System.Taffybar.Widgets.VerticalBar ++import Debug.Trace + + pollingBarNew :: BarConfig -> Double -> IO Double -> IO Widget + pollingBarNew cfg pollSeconds action = do |