about summary refs log tree commit diff
diff options
context:
space:
mode:
authoraszlig <aszlig@redmoonstudios.org>2017-06-22 01:41:02 +0200
committeraszlig <aszlig@redmoonstudios.org>2017-06-22 02:05:31 +0200
commitfc432e46a22494e1cafb53b0555da92301815921 (patch)
tree4d4b2db973c15e2db8a13e8be96929e30492bd56
parentbc67f3bb0f2423829711f89aa2087acf08c9819c (diff)
Factor out devhell's services into vuizvui
I've added another profile called "services", which now resembles the
services_common.nix from the previous configuration.

The machine-specific definitions now reside directly inside the
machine's Nix expressions for now, until they're properly refactored.

Most of these machine-specific values can be easily modularized,
especially the xrdb config, for example having one base xrdb module
and only small machine-specific definitions if stuff needs to be
overridden.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @devhell
-rw-r--r--devhell/services/services_common.nix79
-rw-r--r--devhell/services/services_eris.nix138
-rw-r--r--devhell/services/services_skunkworks.nix162
-rw-r--r--devhell/services/services_titan.nix90
-rw-r--r--machines/devhell/eris.nix139
-rw-r--r--machines/devhell/skunkworks.nix163
-rw-r--r--machines/devhell/titan.nix91
-rw-r--r--modules/module-list.nix1
-rw-r--r--modules/user/devhell/profiles/services.nix88
9 files changed, 482 insertions, 469 deletions
diff --git a/devhell/services/services_common.nix b/devhell/services/services_common.nix
deleted file mode 100644
index 42ba2525..00000000
--- a/devhell/services/services_common.nix
+++ /dev/null
@@ -1,79 +0,0 @@
-{ config, pkgs, lib, ... }:
-
-{
-  virtualisation = {
-    virtualbox = {
-      host = {
-        enable = true;
-        enableHardening = true;
-      };
-    };
-    libvirtd = {
-      enable = true;
-      enableKVM = true;
-    };
-  };
-
-  services = {
-    gpm.enable = true;
-    openssh.enable = true;
-    haveged.enable = true;
-    thermald.enable = true;
-    udisks2.enable = true;
-    redshift = {
-      enable = true;
-      latitude = "51.2750";
-      longitude = "1.0870";
-    };
-  };
-
-  services.xserver = {
-    displayManager.lightdm.enable = true;
-    desktopManager.xterm.enable = false;
-    desktopManager.default = "none";
-  };
-
-  services.xserver.windowManager = {
-    i3.enable = true;
-    default = "i3";
-  };
-
-  services.syncthing = {
-    enable = true;
-    user = "dev";
-  };
-
-  services.journald.extraConfig = ''
-    SystemMaxUse = 50M
-  '';
-
-  services.psd = {
-    enable = false;
-    users = [ "dev" ];
-    browsers = [ "chromium" ];
-  };
-
-  services.mpd = {
-    enable = true;
-    extraConfig = ''
-      input {
-        plugin "curl"
-      }
-
-      audio_output {
-        type "fifo"
-        name "FIFO Output"
-        path "/tmp/mpd.fifo"
-        format "44100:16:2"
-      }
-
-      audio_output {
-        type "pulse"
-        name "Pulse Output"
-        server "127.0.0.1"
-      }
-
-      replaygain "album"
-    '';
-  };
-}
diff --git a/devhell/services/services_eris.nix b/devhell/services/services_eris.nix
deleted file mode 100644
index cfec789f..00000000
--- a/devhell/services/services_eris.nix
+++ /dev/null
@@ -1,138 +0,0 @@
-{ config, pkgs, lib, ... }:
-
-{
-  imports = [ ./services_common.nix ];
-
-  services = {
-    tftpd.enable = true;
-    gnome3.gnome-keyring.enable = true;
-    printing.enable = false;
-  };
-
-  services.udev = {
-    extraRules = ''
-      SUBSYSTEM=="firmware", ACTION=="add", ATTR{loading}="-1"
-    '';
-  };
-
-  services.acpid = {
-    enable = true;
-    lidEventCommands = ''
-      LID="/proc/acpi/button/lid/LID/state"
-      state=`cat $LID | ${pkgs.gawk}/bin/awk '{print $2}'`
-      case "$state" in
-        *open*) ;;
-        *close*) systemctl suspend ;;
-        *) logger -t lid-handler "Failed to detect lid state ($state)" ;;
-      esac
-    '';
-  };
-
-  services.xserver = {
-    enable = true;
-    layout = "gb";
-    videoDrivers = [ "intel" ];
-
-    synaptics = {
-      enable = true;
-      twoFingerScroll = true;
-      palmDetect = true;
-    };
-
-    displayManager.sessionCommands = ''
-      ${pkgs.xorg.xsetroot}/bin/xsetroot -solid black
-      ${pkgs.networkmanagerapplet}/bin/nm-applet &
-      ${pkgs.pasystray}/bin/pasystray &
-      #${pkgs.compton}/bin/compton -f &
-      ${pkgs.rofi}/bin/rofi &
-      ${pkgs.xorg.xrdb}/bin/xrdb "${pkgs.writeText "xrdb.conf" ''
-        Xft.dpi:                     96
-        Xft.antialias:               true
-        Xft.hinting:                 full
-        Xft.hintstyle:               hintslight
-        Xft.rgba:                    rgb
-        Xft.lcdfilter:               lcddefault
-        Xft.autohint:                1
-        Xcursor.theme:               Vanilla-DMZ-AA
-        Xcursor.size:                22
-        *.charClass:33:48,35:48,37:48,43:48,45-47:48,61:48,63:48,64:48,95:48,126:48,35:48,58:48
-        *background:                 #121212
-        *foreground:                 #babdb6
-        ${lib.concatMapStrings (xterm: ''
-            ${xterm}.termName:       xterm-256color
-            ${xterm}*bellIsUrgent:   true
-            ${xterm}*utf8:           1
-            ${xterm}*locale:             true
-            ${xterm}*utf8Title:          true
-            ${xterm}*utf8Fonts:          1
-            ${xterm}*utf8Latin1:         true
-            ${xterm}*dynamicColors:      true
-            ${xterm}*eightBitInput:      true
-            ${xterm}*faceName:           xft:DejaVu Sans Mono for Powerline:pixelsize=9:antialias=true:hinting=true
-            ${xterm}*faceNameDoublesize: xft:Unifont:pixelsize=12:antialias=true:hinting=true
-            ${xterm}*cursorColor:        #545f65
-        '') [ "UXTerm" "XTerm" ]}
-        ! ------------------------------------------------------------------------------
-        ! ROFI Color theme & Settings
-        ! ------------------------------------------------------------------------------
-        rofi.modi: run
-        rofi.opacity: 85
-        rofi.width: 100
-        rofi.lines: 3
-        rofi.padding: 300
-        rofi.bw: 0
-        rofi.eh: 2
-        rofi.color-enabled: true
-        rofi.color-window: #393939, #393939, #268bd2
-        rofi.color-normal: #393939, #ffffff, #393939, #268bd2, #ffffff
-        rofi.color-active: #393939, #268bd2, #393939, #268bd2, #205171
-        rofi.color-urgent: #393939, #f3843d, #393939, #268bd2, #ffc39c
-      ''}"
-    '';
-  };
-
-  services.tlp = {
-    enable = true;
-    extraConfig = ''
-      TLP_ENABLE = 1
-      DISK_IDLE_SECS_ON_BAT=2
-      MAX_LOST_WORK_SECS_ON_AC=15
-      MAX_LOST_WORK_SECS_ON_BAT=60
-      SCHED_POWERSAVE_ON_AC=0
-      SCHED_POWERSAVE_ON_BAT=1
-      NMI_WATCHDOG=0
-      DISK_DEVICES="sda sdb"
-      DISK_APM_LEVEL_ON_AC="254 254"
-      DISK_APM_LEVEL_ON_BAT="254 127"
-      DISK_IOSCHED="noop cfq"
-      SATA_LINKPWR_ON_AC=max_performance
-      SATA_LINKPWR_ON_BAT=min_power
-      PCIE_ASPM_ON_AC=performance
-      PCIE_ASPM_ON_BAT=powersave
-      WIFI_PWR_ON_AC=1
-      WIFI_PWR_ON_BAT=5
-      WOL_DISABLE=Y
-      SOUND_POWER_SAVE_ON_AC=0
-      SOUND_POWER_SAVE_ON_BAT=1
-      SOUND_POWER_SAVE_CONTROLLER=Y
-      RUNTIME_PM_ON_AC=on
-      RUNTIME_PM_ON_BAT=auto
-      RUNTIME_PM_ALL=1
-      USB_AUTOSUSPEND=1
-      USB_BLACKLIST_WWAN=1
-      RESTORE_DEVICE_STATE_ON_STARTUP=0
-      DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wwan"
-      DEVICES_TO_ENABLE_ON_STARTUP="wifi"
-      DEVICES_TO_DISABLE_ON_SHUTDOWN="bluetooth wifi wwan"
-      #DEVICES_TO_ENABLE_ON_SHUTDOWN=""
-      START_CHARGE_THRESH_BAT0=75
-      STOP_CHARGE_THRESH_BAT0=80
-      #DEVICES_TO_DISABLE_ON_LAN_CONNECT="wifi wwan"
-      #DEVICES_TO_DISABLE_ON_WIFI_CONNECT="wwan"
-      #DEVICES_TO_DISABLE_ON_WWAN_CONNECT="wifi"
-      #DEVICES_TO_ENABLE_ON_LAN_DISCONNECT="wifi wwan"
-      #DEVICES_TO_ENABLE_ON_WIFI_DISCONNECT=""
-      #DEVICES_TO_ENABLE_ON_WWAN_DISCONNECT=""
-    '';
-  };
-}
diff --git a/devhell/services/services_skunkworks.nix b/devhell/services/services_skunkworks.nix
deleted file mode 100644
index f0fa4243..00000000
--- a/devhell/services/services_skunkworks.nix
+++ /dev/null
@@ -1,162 +0,0 @@
-{ config, pkgs, lib, ... }:
-
-{
-  imports = [ ./services_common.nix ];
-
-  services = {
-    printing = {
-      enable = true;
-      drivers = [ pkgs.hplipWithPlugin ];
-    };
-    timesyncd.enable = true;
-    resolved.enable = true;
-    canto-daemon.enable = true;
-  };
-
-  services.xserver = {
-    enable = true;
-    layout = "us";
-    xkbVariant = "dvorak";
-    videoDrivers = [ "ati" ];
-
-    serverLayoutSection = ''
-      Screen "Center/Right"
-      Screen "Left" LeftOf "Center/Right"
-    '';
-
-    config = ''
-      Section "ServerLayout"
-        Identifier          "Multihead layout"
-        Screen              "Center/Right"
-        Screen              "Left" LeftOf "Center/Right"
-      EndSection
-
-      Section "Device"
-        Identifier          "Radeon HD 4650 PCIEx8"
-        Driver              "radeon"
-        BusId               "PCI:2:0:0"
-
-        Option              "monitor-DVI-1" "Left monitor"
-      EndSection
-
-      Section "Device"
-        Identifier          "Radeon HD 4650 PCIEx16"
-        Driver              "radeon"
-        BusID               "PCI:1:0:0"
-
-        Option              "monitor-DVI-0" "Center monitor"
-        Option              "monitor-HDMI-0" "Right monitor"
-      EndSection
-
-      Section "Screen"
-        Identifier          "Center/Right"
-        Monitor             "Left monitor"
-        Device              "Radeon HD 4650 PCIEx16"
-      EndSection
-
-      Section "Screen"
-        Identifier          "Left"
-        Device              "Radeon HD 4650 PCIEx8"
-      EndSection
-
-      Section "Monitor"
-        Identifier          "Left monitor"
-      EndSection
-
-      Section "Monitor"
-        Identifier          "Center monitor"
-        Option              "LeftOf" "Right monitor"
-        Option              "Primary" "true"
-      EndSection
-
-      Section "Monitor"
-        Identifier          "Right monitor"
-      EndSection
-    '';
-
-    displayManager.sessionCommands = ''
-      ${pkgs.xorg.xsetroot}/bin/xsetroot -solid black
-      ${pkgs.xscreensaver}/bin/xscreensaver -no-splash &
-      ${pkgs.rofi}/bin/rofi &
-      ${pkgs.xorg.xrdb}/bin/xrdb "${pkgs.writeText "xrdb.conf" ''
-        Xft.dpi:              96
-        Xft.antialias:        true
-        Xft.hinting:          full
-        Xft.hintstyle:        hintslight
-        Xft.rgba:             rgb
-        Xft.lcdfilter:        lcddefault
-        Xft.autohint:         1
-        XTerm.termName:       xterm-256color
-        XTerm*bellIsUrgent:   true
-        XTerm*utf8:           1
-        XTerm*locale:         true
-        XTerm*utf8Title:      true
-        XTerm*utf8Fonts:      true
-        XTerm*utf8Latin1:     true
-        XTerm*dynamicColors:  true
-        XTerm*eightBitInput:  true
-        Xcursor.theme:        Vanilla-DMZ-AA
-        Xcursor.size:         22
-        *.charClass:33:48,35:48,37:48,43:48,45-47:48,61:48,63:48,64:48,95:48,126:48,35:48,58:48
-        XTerm*faceName:       xft:DejaVu Sans Mono for Powerline:pixelsize=12:antialias=true:hinting=true
-        XTerm*faceNameDoublesize: xft:Unifont:pixelsize=12:antialias=true:hinting=true
-        XTerm*cursorColor:    #545f65
-        XTerm*saveLines:      10000
-        ! Base16 Twilight
-        ! Scheme: David Hart (http://hart-dev.com)
-        #define base00 #1e1e1e
-        #define base01 #323537
-        #define base02 #464b50
-        #define base03 #5f5a60
-        #define base04 #838184
-        #define base05 #a7a7a7
-        #define base06 #c3c3c3
-        #define base07 #ffffff
-        #define base08 #cf6a4c
-        #define base09 #cda869
-        #define base0A #f9ee98
-        #define base0B #8f9d6a
-        #define base0C #afc4db
-        #define base0D #7587a6
-        #define base0E #9b859d
-        #define base0F #9b703f
-        *.foreground:   base05
-        *.background:   base00
-        *.cursorColor:  base05
-        *.color0:       base00
-        *.color1:       base08
-        *.color2:       base0B
-        *.color3:       base0A
-        *.color4:       base0D
-        *.color5:       base0E
-        *.color6:       base0C
-        *.color7:       base05
-        *.color8:       base03
-        *.color9:       base09
-        *.color10:      base01
-        *.color11:      base02
-        *.color12:      base04
-        *.color13:      base06
-        *.color14:      base0F
-        *.color15:      base07
-        ! ------------------------------------------------------------------------------
-        ! ROFI Color theme & Settings
-        ! ------------------------------------------------------------------------------
-        rofi.modi: run
-        rofi.opacity: 85
-        rofi.width: 100
-        rofi.lines: 3
-        rofi.padding: 450
-        rofi.bw: 0
-        rofi.eh: 2
-        rofi.color-enabled: true
-        rofi.color-window: #393939, #393939, #268bd2
-        rofi.color-normal: #393939, #ffffff, #393939, #268bd2, #ffffff
-        rofi.color-active: #393939, #268bd2, #393939, #268bd2, #205171
-        rofi.color-urgent: #393939, #f3843d, #393939, #268bd2, #ffc39c
-      ''}"
-
-      DISPLAY=:0.1 ${pkgs.windowmaker}/bin/wmaker &
-    '';
-  };
-}
diff --git a/devhell/services/services_titan.nix b/devhell/services/services_titan.nix
deleted file mode 100644
index a4ed892c..00000000
--- a/devhell/services/services_titan.nix
+++ /dev/null
@@ -1,90 +0,0 @@
-{ config, pkgs, lib, ... }:
-
-{
-  imports = [ ./services_common.nix ];
-
-  services = {
-    tftpd.enable = false;
-    gnome3.gnome-keyring.enable = true;
-    printing.enable = false;
-  };
-
-  services.acpid = {
-    enable = true;
-    lidEventCommands = ''
-      LID="/proc/acpi/button/lid/LID/state"
-      state=`cat $LID | ${pkgs.gawk}/bin/awk '{print $2}'`
-      case "$state" in
-        *open*) ;;
-        *close*) systemctl suspend ;;
-        *) logger -t lid-handler "Failed to detect lid state ($state)" ;;
-      esac
-    '';
-  };
-
-  services.xserver = {
-    enable = true;
-    layout = "gb";
-    videoDrivers = [ "intel" ];
-
-    synaptics = {
-      enable = true;
-      twoFingerScroll = true;
-      palmDetect = true;
-    };
-
-    displayManager.sessionCommands = ''
-      ${pkgs.xbindkeys}/bin/xbindkeys &
-      ${pkgs.nitrogen}/bin/nitrogen --restore &
-      #${pkgs.networkmanagerapplet}/bin/nm-applet &
-      ${pkgs.connmanui}/bin/connman-ui-gtk &
-      ${pkgs.xscreensaver}/bin/xscreensaver -no-splash &
-      ${pkgs.pasystray}/bin/pasystray &
-      ${pkgs.compton}/bin/compton -f &
-      ${pkgs.rofi}/bin/rofi &
-      ${pkgs.xorg.xrdb}/bin/xrdb "${pkgs.writeText "xrdb.conf" ''
-        Xft.dpi:                     96
-        Xft.antialias:               true
-        Xft.hinting:                 full
-        Xft.hintstyle:               hintslight
-        Xft.rgba:                    rgb
-        Xft.lcdfilter:               lcddefault
-        Xft.autohint:                1
-        Xcursor.theme:               Vanilla-DMZ-AA
-        Xcursor.size:                22
-        *.charClass:33:48,35:48,37:48,43:48,45-47:48,61:48,63:48,64:48,95:48,126:48,35:48,58:48
-        *background:                 #121212
-        *foreground:                 #babdb6
-        ${lib.concatMapStrings (xterm: ''
-            ${xterm}.termName:       xterm-256color
-            ${xterm}*bellIsUrgent:   true
-            ${xterm}*utf8:           1
-            ${xterm}*locale:             true
-            ${xterm}*utf8Title:          true
-            ${xterm}*utf8Fonts:          1
-            ${xterm}*utf8Latin1:         true
-            ${xterm}*dynamicColors:      true
-            ${xterm}*eightBitInput:      true
-            ${xterm}*faceName:           xft:DejaVu Sans Mono for Powerline:pixelsize=9:antialias=true:hinting=true
-            ${xterm}*faceNameDoublesize: xft:Unifont:pixelsize=12:antialias=true:hinting=true
-            ${xterm}*cursorColor:        #545f65
-        '') [ "UXTerm" "XTerm" ]}
-        ! ------------------------------------------------------------------------------
-        ! ROFI Color theme & Settings
-        ! ------------------------------------------------------------------------------
-        rofi.modi: run
-        rofi.opacity: 85
-        rofi.width: 100
-        rofi.lines: 3
-        rofi.padding: 300
-        rofi.bw: 0
-        rofi.eh: 2
-        rofi.color-enabled: true
-        rofi.color-window: #393939, #393939, #268bd2
-        rofi.color-normal: #393939, #ffffff, #393939, #268bd2, #ffffff
-        rofi.color-active: #393939, #268bd2, #393939, #268bd2, #205171
-        rofi.color-urgent: #393939, #f3843d, #393939, #268bd2, #ffc39c
-      ''}"
-    '';
-  };
-}
diff --git a/machines/devhell/eris.nix b/machines/devhell/eris.nix
index cce2d6b0..e6c13079 100644
--- a/machines/devhell/eris.nix
+++ b/machines/devhell/eris.nix
@@ -60,4 +60,143 @@
     consoleKeyMap = "uk";
     defaultLocale = "en_GB.UTF-8";
   };
+
+  #### Machine-specific service configuration ####
+
+  vuizvui.user.devhell.profiles.services.enable = true;
+
+  services = {
+    tftpd.enable = true;
+    gnome3.gnome-keyring.enable = true;
+    printing.enable = false;
+  };
+
+  services.udev = {
+    extraRules = ''
+      SUBSYSTEM=="firmware", ACTION=="add", ATTR{loading}="-1"
+    '';
+  };
+
+  services.acpid = {
+    enable = true;
+    lidEventCommands = ''
+      LID="/proc/acpi/button/lid/LID/state"
+      state=`cat $LID | ${pkgs.gawk}/bin/awk '{print $2}'`
+      case "$state" in
+        *open*) ;;
+        *close*) systemctl suspend ;;
+        *) logger -t lid-handler "Failed to detect lid state ($state)" ;;
+      esac
+    '';
+  };
+
+  services.xserver = {
+    enable = true;
+    layout = "gb";
+    videoDrivers = [ "intel" ];
+
+    synaptics = {
+      enable = true;
+      twoFingerScroll = true;
+      palmDetect = true;
+    };
+
+    # XXX: Factor out and make DRY, because a lot of the stuff here is
+    # duplicated in the other machine configurations.
+    displayManager.sessionCommands = ''
+      ${pkgs.xorg.xsetroot}/bin/xsetroot -solid black
+      ${pkgs.networkmanagerapplet}/bin/nm-applet &
+      ${pkgs.pasystray}/bin/pasystray &
+      #${pkgs.compton}/bin/compton -f &
+      ${pkgs.rofi}/bin/rofi &
+      ${pkgs.xorg.xrdb}/bin/xrdb "${pkgs.writeText "xrdb.conf" ''
+        Xft.dpi:                     96
+        Xft.antialias:               true
+        Xft.hinting:                 full
+        Xft.hintstyle:               hintslight
+        Xft.rgba:                    rgb
+        Xft.lcdfilter:               lcddefault
+        Xft.autohint:                1
+        Xcursor.theme:               Vanilla-DMZ-AA
+        Xcursor.size:                22
+        *.charClass:33:48,35:48,37:48,43:48,45-47:48,61:48,63:48,64:48,95:48,126:48,35:48,58:48
+        *background:                 #121212
+        *foreground:                 #babdb6
+        ${lib.concatMapStrings (xterm: ''
+            ${xterm}.termName:       xterm-256color
+            ${xterm}*bellIsUrgent:   true
+            ${xterm}*utf8:           1
+            ${xterm}*locale:             true
+            ${xterm}*utf8Title:          true
+            ${xterm}*utf8Fonts:          1
+            ${xterm}*utf8Latin1:         true
+            ${xterm}*dynamicColors:      true
+            ${xterm}*eightBitInput:      true
+            ${xterm}*faceName:           xft:DejaVu Sans Mono for Powerline:pixelsize=9:antialias=true:hinting=true
+            ${xterm}*faceNameDoublesize: xft:Unifont:pixelsize=12:antialias=true:hinting=true
+            ${xterm}*cursorColor:        #545f65
+        '') [ "UXTerm" "XTerm" ]}
+        ! ------------------------------------------------------------------------------
+        ! ROFI Color theme & Settings
+        ! ------------------------------------------------------------------------------
+        rofi.modi: run
+        rofi.opacity: 85
+        rofi.width: 100
+        rofi.lines: 3
+        rofi.padding: 300
+        rofi.bw: 0
+        rofi.eh: 2
+        rofi.color-enabled: true
+        rofi.color-window: #393939, #393939, #268bd2
+        rofi.color-normal: #393939, #ffffff, #393939, #268bd2, #ffffff
+        rofi.color-active: #393939, #268bd2, #393939, #268bd2, #205171
+        rofi.color-urgent: #393939, #f3843d, #393939, #268bd2, #ffc39c
+      ''}"
+    '';
+  };
+
+  services.tlp = {
+    enable = true;
+    extraConfig = ''
+      TLP_ENABLE = 1
+      DISK_IDLE_SECS_ON_BAT=2
+      MAX_LOST_WORK_SECS_ON_AC=15
+      MAX_LOST_WORK_SECS_ON_BAT=60
+      SCHED_POWERSAVE_ON_AC=0
+      SCHED_POWERSAVE_ON_BAT=1
+      NMI_WATCHDOG=0
+      DISK_DEVICES="sda sdb"
+      DISK_APM_LEVEL_ON_AC="254 254"
+      DISK_APM_LEVEL_ON_BAT="254 127"
+      DISK_IOSCHED="noop cfq"
+      SATA_LINKPWR_ON_AC=max_performance
+      SATA_LINKPWR_ON_BAT=min_power
+      PCIE_ASPM_ON_AC=performance
+      PCIE_ASPM_ON_BAT=powersave
+      WIFI_PWR_ON_AC=1
+      WIFI_PWR_ON_BAT=5
+      WOL_DISABLE=Y
+      SOUND_POWER_SAVE_ON_AC=0
+      SOUND_POWER_SAVE_ON_BAT=1
+      SOUND_POWER_SAVE_CONTROLLER=Y
+      RUNTIME_PM_ON_AC=on
+      RUNTIME_PM_ON_BAT=auto
+      RUNTIME_PM_ALL=1
+      USB_AUTOSUSPEND=1
+      USB_BLACKLIST_WWAN=1
+      RESTORE_DEVICE_STATE_ON_STARTUP=0
+      DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wwan"
+      DEVICES_TO_ENABLE_ON_STARTUP="wifi"
+      DEVICES_TO_DISABLE_ON_SHUTDOWN="bluetooth wifi wwan"
+      #DEVICES_TO_ENABLE_ON_SHUTDOWN=""
+      START_CHARGE_THRESH_BAT0=75
+      STOP_CHARGE_THRESH_BAT0=80
+      #DEVICES_TO_DISABLE_ON_LAN_CONNECT="wifi wwan"
+      #DEVICES_TO_DISABLE_ON_WIFI_CONNECT="wwan"
+      #DEVICES_TO_DISABLE_ON_WWAN_CONNECT="wifi"
+      #DEVICES_TO_ENABLE_ON_LAN_DISCONNECT="wifi wwan"
+      #DEVICES_TO_ENABLE_ON_WIFI_DISCONNECT=""
+      #DEVICES_TO_ENABLE_ON_WWAN_DISCONNECT=""
+    '';
+  };
 }
diff --git a/machines/devhell/skunkworks.nix b/machines/devhell/skunkworks.nix
index 91ed886b..b5d2912d 100644
--- a/machines/devhell/skunkworks.nix
+++ b/machines/devhell/skunkworks.nix
@@ -80,4 +80,167 @@
     ${pkgs.hdparm}/sbin/hdparm -B 255 \
   /dev/disk/by-id/ata-ST31500541AS_6XW0P0CW
   '';
+
+  #### Machine-specific service configuration ####
+
+  vuizvui.user.devhell.profiles.services.enable = true;
+
+  services = {
+    printing = {
+      enable = true;
+      drivers = [ pkgs.hplipWithPlugin ];
+    };
+    timesyncd.enable = true;
+    resolved.enable = true;
+    canto-daemon.enable = true;
+  };
+
+  services.xserver = {
+    enable = true;
+    layout = "us";
+    xkbVariant = "dvorak";
+    videoDrivers = [ "ati" ];
+
+    serverLayoutSection = ''
+      Screen "Center/Right"
+      Screen "Left" LeftOf "Center/Right"
+    '';
+
+    config = ''
+      Section "ServerLayout"
+        Identifier          "Multihead layout"
+        Screen              "Center/Right"
+        Screen              "Left" LeftOf "Center/Right"
+      EndSection
+
+      Section "Device"
+        Identifier          "Radeon HD 4650 PCIEx8"
+        Driver              "radeon"
+        BusId               "PCI:2:0:0"
+
+        Option              "monitor-DVI-1" "Left monitor"
+      EndSection
+
+      Section "Device"
+        Identifier          "Radeon HD 4650 PCIEx16"
+        Driver              "radeon"
+        BusID               "PCI:1:0:0"
+
+        Option              "monitor-DVI-0" "Center monitor"
+        Option              "monitor-HDMI-0" "Right monitor"
+      EndSection
+
+      Section "Screen"
+        Identifier          "Center/Right"
+        Monitor             "Left monitor"
+        Device              "Radeon HD 4650 PCIEx16"
+      EndSection
+
+      Section "Screen"
+        Identifier          "Left"
+        Device              "Radeon HD 4650 PCIEx8"
+      EndSection
+
+      Section "Monitor"
+        Identifier          "Left monitor"
+      EndSection
+
+      Section "Monitor"
+        Identifier          "Center monitor"
+        Option              "LeftOf" "Right monitor"
+        Option              "Primary" "true"
+      EndSection
+
+      Section "Monitor"
+        Identifier          "Right monitor"
+      EndSection
+    '';
+
+    # XXX: Factor out and make DRY, because a lot of the stuff here is
+    # duplicated in the other machine configurations.
+    displayManager.sessionCommands = ''
+      ${pkgs.xorg.xsetroot}/bin/xsetroot -solid black
+      ${pkgs.xscreensaver}/bin/xscreensaver -no-splash &
+      ${pkgs.rofi}/bin/rofi &
+      ${pkgs.xorg.xrdb}/bin/xrdb "${pkgs.writeText "xrdb.conf" ''
+        Xft.dpi:              96
+        Xft.antialias:        true
+        Xft.hinting:          full
+        Xft.hintstyle:        hintslight
+        Xft.rgba:             rgb
+        Xft.lcdfilter:        lcddefault
+        Xft.autohint:         1
+        XTerm.termName:       xterm-256color
+        XTerm*bellIsUrgent:   true
+        XTerm*utf8:           1
+        XTerm*locale:         true
+        XTerm*utf8Title:      true
+        XTerm*utf8Fonts:      true
+        XTerm*utf8Latin1:     true
+        XTerm*dynamicColors:  true
+        XTerm*eightBitInput:  true
+        Xcursor.theme:        Vanilla-DMZ-AA
+        Xcursor.size:         22
+        *.charClass:33:48,35:48,37:48,43:48,45-47:48,61:48,63:48,64:48,95:48,126:48,35:48,58:48
+        XTerm*faceName:       xft:DejaVu Sans Mono for Powerline:pixelsize=12:antialias=true:hinting=true
+        XTerm*faceNameDoublesize: xft:Unifont:pixelsize=12:antialias=true:hinting=true
+        XTerm*cursorColor:    #545f65
+        XTerm*saveLines:      10000
+        ! Base16 Twilight
+        ! Scheme: David Hart (http://hart-dev.com)
+        #define base00 #1e1e1e
+        #define base01 #323537
+        #define base02 #464b50
+        #define base03 #5f5a60
+        #define base04 #838184
+        #define base05 #a7a7a7
+        #define base06 #c3c3c3
+        #define base07 #ffffff
+        #define base08 #cf6a4c
+        #define base09 #cda869
+        #define base0A #f9ee98
+        #define base0B #8f9d6a
+        #define base0C #afc4db
+        #define base0D #7587a6
+        #define base0E #9b859d
+        #define base0F #9b703f
+        *.foreground:   base05
+        *.background:   base00
+        *.cursorColor:  base05
+        *.color0:       base00
+        *.color1:       base08
+        *.color2:       base0B
+        *.color3:       base0A
+        *.color4:       base0D
+        *.color5:       base0E
+        *.color6:       base0C
+        *.color7:       base05
+        *.color8:       base03
+        *.color9:       base09
+        *.color10:      base01
+        *.color11:      base02
+        *.color12:      base04
+        *.color13:      base06
+        *.color14:      base0F
+        *.color15:      base07
+        ! ------------------------------------------------------------------------------
+        ! ROFI Color theme & Settings
+        ! ------------------------------------------------------------------------------
+        rofi.modi: run
+        rofi.opacity: 85
+        rofi.width: 100
+        rofi.lines: 3
+        rofi.padding: 450
+        rofi.bw: 0
+        rofi.eh: 2
+        rofi.color-enabled: true
+        rofi.color-window: #393939, #393939, #268bd2
+        rofi.color-normal: #393939, #ffffff, #393939, #268bd2, #ffffff
+        rofi.color-active: #393939, #268bd2, #393939, #268bd2, #205171
+        rofi.color-urgent: #393939, #f3843d, #393939, #268bd2, #ffc39c
+      ''}"
+
+      DISPLAY=:0.1 ${pkgs.windowmaker}/bin/wmaker &
+    '';
+  };
 }
diff --git a/machines/devhell/titan.nix b/machines/devhell/titan.nix
index abc640da..23b967d2 100644
--- a/machines/devhell/titan.nix
+++ b/machines/devhell/titan.nix
@@ -65,4 +65,95 @@
     consoleKeyMap = "uk";
     defaultLocale = "en_GB.UTF-8";
   };
+
+  #### Machine-specific service configuration ####
+
+  vuizvui.user.devhell.profiles.services.enable = true;
+
+  services = {
+    tftpd.enable = false;
+    gnome3.gnome-keyring.enable = true;
+    printing.enable = false;
+  };
+
+  services.acpid = {
+    enable = true;
+    lidEventCommands = ''
+      LID="/proc/acpi/button/lid/LID/state"
+      state=`cat $LID | ${pkgs.gawk}/bin/awk '{print $2}'`
+      case "$state" in
+        *open*) ;;
+        *close*) systemctl suspend ;;
+        *) logger -t lid-handler "Failed to detect lid state ($state)" ;;
+      esac
+    '';
+  };
+
+  services.xserver = {
+    enable = true;
+    layout = "gb";
+    videoDrivers = [ "intel" ];
+
+    synaptics = {
+      enable = true;
+      twoFingerScroll = true;
+      palmDetect = true;
+    };
+
+    # XXX: Factor out and make DRY, because a lot of the stuff here is
+    # duplicated in the other machine configurations.
+    displayManager.sessionCommands = ''
+      ${pkgs.xbindkeys}/bin/xbindkeys &
+      ${pkgs.nitrogen}/bin/nitrogen --restore &
+      #${pkgs.networkmanagerapplet}/bin/nm-applet &
+      ${pkgs.connmanui}/bin/connman-ui-gtk &
+      ${pkgs.xscreensaver}/bin/xscreensaver -no-splash &
+      ${pkgs.pasystray}/bin/pasystray &
+      ${pkgs.compton}/bin/compton -f &
+      ${pkgs.rofi}/bin/rofi &
+      ${pkgs.xorg.xrdb}/bin/xrdb "${pkgs.writeText "xrdb.conf" ''
+        Xft.dpi:                     96
+        Xft.antialias:               true
+        Xft.hinting:                 full
+        Xft.hintstyle:               hintslight
+        Xft.rgba:                    rgb
+        Xft.lcdfilter:               lcddefault
+        Xft.autohint:                1
+        Xcursor.theme:               Vanilla-DMZ-AA
+        Xcursor.size:                22
+        *.charClass:33:48,35:48,37:48,43:48,45-47:48,61:48,63:48,64:48,95:48,126:48,35:48,58:48
+        *background:                 #121212
+        *foreground:                 #babdb6
+        ${lib.concatMapStrings (xterm: ''
+            ${xterm}.termName:       xterm-256color
+            ${xterm}*bellIsUrgent:   true
+            ${xterm}*utf8:           1
+            ${xterm}*locale:             true
+            ${xterm}*utf8Title:          true
+            ${xterm}*utf8Fonts:          1
+            ${xterm}*utf8Latin1:         true
+            ${xterm}*dynamicColors:      true
+            ${xterm}*eightBitInput:      true
+            ${xterm}*faceName:           xft:DejaVu Sans Mono for Powerline:pixelsize=9:antialias=true:hinting=true
+            ${xterm}*faceNameDoublesize: xft:Unifont:pixelsize=12:antialias=true:hinting=true
+            ${xterm}*cursorColor:        #545f65
+        '') [ "UXTerm" "XTerm" ]}
+        ! ------------------------------------------------------------------------------
+        ! ROFI Color theme & Settings
+        ! ------------------------------------------------------------------------------
+        rofi.modi: run
+        rofi.opacity: 85
+        rofi.width: 100
+        rofi.lines: 3
+        rofi.padding: 300
+        rofi.bw: 0
+        rofi.eh: 2
+        rofi.color-enabled: true
+        rofi.color-window: #393939, #393939, #268bd2
+        rofi.color-normal: #393939, #ffffff, #393939, #268bd2, #ffffff
+        rofi.color-active: #393939, #268bd2, #393939, #268bd2, #205171
+        rofi.color-urgent: #393939, #f3843d, #393939, #268bd2, #ffc39c
+      ''}"
+    '';
+  };
 }
diff --git a/modules/module-list.nix b/modules/module-list.nix
index 33ac6af6..fbd5334c 100644
--- a/modules/module-list.nix
+++ b/modules/module-list.nix
@@ -30,6 +30,7 @@
   ./user/aszlig/services/vlock
   ./user/aszlig/system/kernel.nix
   ./user/devhell/profiles/base.nix
+  ./user/devhell/profiles/services.nix
   ./user/openlab/base.nix
   ./user/openlab/labtops.nix
   ./user/openlab/stackenblocken.nix
diff --git a/modules/user/devhell/profiles/services.nix b/modules/user/devhell/profiles/services.nix
new file mode 100644
index 00000000..86af3eca
--- /dev/null
+++ b/modules/user/devhell/profiles/services.nix
@@ -0,0 +1,88 @@
+{ config, pkgs, lib, ... }:
+
+let
+  cfg = config.vuizvui.user.devhell.profiles.services;
+
+in {
+  options.vuizvui.user.devhell.profiles.services = {
+    enable = lib.mkEnableOption "Services profile for devhell";
+  };
+
+  config = lib.mkIf cfg.enable {
+    virtualisation = {
+      virtualbox = {
+        host = {
+          enable = true;
+          enableHardening = true;
+        };
+      };
+      libvirtd = {
+        enable = true;
+        enableKVM = true;
+      };
+    };
+
+    services = {
+      gpm.enable = true;
+      openssh.enable = true;
+      haveged.enable = true;
+      thermald.enable = true;
+      udisks2.enable = true;
+      redshift = {
+        enable = true;
+        latitude = "51.2750";
+        longitude = "1.0870";
+      };
+    };
+
+    services.xserver = {
+      displayManager.lightdm.enable = true;
+      desktopManager.xterm.enable = false;
+      desktopManager.default = "none";
+    };
+
+    services.xserver.windowManager = {
+      i3.enable = true;
+      default = "i3";
+    };
+
+    services.syncthing = {
+      enable = true;
+      user = "dev";
+    };
+
+    services.journald.extraConfig = ''
+      SystemMaxUse = 50M
+    '';
+
+    services.psd = {
+      enable = false;
+      users = [ "dev" ];
+      browsers = [ "chromium" ];
+    };
+
+    services.mpd = {
+      enable = true;
+      extraConfig = ''
+        input {
+          plugin "curl"
+        }
+
+        audio_output {
+          type "fifo"
+          name "FIFO Output"
+          path "/tmp/mpd.fifo"
+          format "44100:16:2"
+        }
+
+        audio_output {
+          type "pulse"
+          name "Pulse Output"
+          server "127.0.0.1"
+        }
+
+        replaygain "album"
+      '';
+    };
+  };
+}