;; GNU Guix operating system configuration for jojen (use-modules (gnu) (gnu services) (guix gexp) (guix store) (guix monads)) (use-package-modules base bash admin wicd pulseaudio avahi vim linux) (use-service-modules xorg avahi dbus networking) (define (temperature-regulation-service) (with-monad %store-monad (return (service (documentation "Regulate temperature on an overclocked Libreboot X60.") (provision '(temperature-regulation)) (requirement '(user-processes)) (start #~(lambda _ (let ((pid (primitive-fork))) (if (positive? pid) pid (let () (define (current-temp) (call-with-input-file "/sys/class/thermal/thermal_zone0/temp" read)) (define (set-cpu1-online! online?) (call-with-output-file "/sys/devices/system/cpu/cpu1/online" (lambda (port) (write (if online? 1 0) port)))) (let loop () (let ((temp (current-temp))) (cond ((< temp 88000) (set-cpu1-online! #t)) ((> temp 92000) (set-cpu1-online! #f)))) (sleep 2) (loop))))))) (stop #~(make-kill-destructor)) (respawn? #t))))) (define (powertop-auto-tune-service) (let ((powertop #~(string-append #$powertop "/sbin/powertop"))) (with-monad %store-monad (return (service (documentation "Run powertop --auto-tune.") (provision '(powertop-auto-tune)) (requirement '(user-processes)) (start #~(lambda _ (zero? (system* #$powertop "--auto-tune"))))))))) (define (hdparm-service device) (let ((hdparm #~(string-append #$hdparm "/sbin/hdparm"))) (with-monad %store-monad (return (service (documentation "Disable power management on drive.") (provision (list (symbol-append 'hdparm- (string->symbol device)))) (requirement '(user-processes)) (start #~(lambda _ (let ((pid (primitive-fork))) (if (positive? pid) pid (let loop () (unless (zero? (system* #$hdparm "-B" "255" #$device)) (format (current-error-port) "hdparm failed!~%")) (sleep 15) (loop)))))) (stop #~(make-kill-destructor)) (respawn? #t)))))) (define (anti-caps-lock-service) (let ((dumpkeys #~(string-append #$kbd "/bin/dumpkeys")) (loadkeys #~(string-append #$kbd "/bin/loadkeys")) (grep #~(string-append #$grep "/bin/grep")) (sed #~(string-append #$sed "/bin/sed")) (bash #~(string-append #$bash "/bin/bash"))) (with-monad %store-monad (return (service (documentation "Change caps-lock to control on the ttys.") (provision '(anti-caps-lock)) (requirement '(user-processes)) (start #~(lambda _ (zero? (system* #$bash "-c" (string-append #$dumpkeys " | " #$grep " Caps_Lock | " #$sed " s/Caps_Lock/Control/g | " #$loadkeys)))))))))) (define (sound-volume-service) (let ((amixer #~(string-append #$alsa-utils "/bin/amixer"))) (with-monad %store-monad (return (service (documentation "Initialize sound volume to maximum.") (provision '(sound-volume-service)) (requirement '(user-processes)) (start #~(lambda _ (zero? (system* #$amixer "-q" "set" "Master" "100%"))))))))) (operating-system (host-name "jojen") (timezone "US/Eastern") (locale "en_US.utf8") (bootloader (grub-configuration (device "/dev/sda") (default-entry 0) (timeout 1))) (swap-devices '("/dev/sda5")) (file-systems (cons* (file-system (device "jojen-root") (title 'label) (mount-point "/") (type "ext4")) (file-system (device "jojen-videos") (title 'label) (mount-point "/home/mhw/Videos") (type "ext4") (flags '(no-dev no-suid))) %base-file-systems)) (users (list (user-account (name "mhw") (uid 1000) (group "mhw") (supplementary-groups '("wheel" "users" "audio" "video" "dialout" "netdev")) (home-directory "/home/mhw")))) (groups (cons* (user-group (name "mhw") (id 1000)) %base-groups)) (name-service-switch (name-service-switch (hosts (list %files (name-service (name "mdns_minimal") (reaction (lookup-specification (not-found => return)))) (name-service (name "dns")) (name-service (name "mdns")))))) (packages (cons* vim iproute iw wicd pulseaudio avahi %base-packages)) (services (let ((motd (text-file "motd" " This is the GNU operating system, welcome!\n\n"))) (list (slim-service) (dbus-service (list avahi pulseaudio wicd)) (wicd-service) (avahi-service) (nscd-service #:name-services (list nss-mdns)) (tor-service) (bitlbee-service) (temperature-regulation-service) (powertop-auto-tune-service) (hdparm-service "/dev/sda") (anti-caps-lock-service) (sound-volume-service) (console-font-service "tty1") (console-font-service "tty2") (console-font-service "tty3") (console-font-service "tty4") (console-font-service "tty5") (console-font-service "tty6") (mingetty-service "tty1" #:motd motd) (mingetty-service "tty2" #:motd motd) (mingetty-service "tty3" #:motd motd) (mingetty-service "tty4" #:motd motd) (mingetty-service "tty5" #:motd motd) (mingetty-service "tty6" #:motd motd) (static-networking-service "lo" "127.0.0.1" #:provision '(loopback)) (syslog-service) (guix-service) ;; The LVM2 rules are needed as soon as LVM2 or the device-mapper is ;; used, so enable them by default. The FUSE and ALSA rules are ;; less critical, but handy. (udev-service #:rules (list lvm2 fuse alsa-utils))))))