Archlinux

Gem Version

[!WARNING] this can break your system, don't use it on your running system

A ruby API to manage the state of an Archlinux system.

  • This project is early alpha
  • It aims to have a DSL like NixOS for Archlinux
  • It allow declaring the state of the system then it applies that to the current system
  • The idea is to have simple and user friendly API to declare everything, system and user related

Getting started

The project is a Ruby Gem. Create a ruby file and require the gem:

require 'bundler/inline'

gemfile do
  source "https://rubygems.org"

  gem "archlinux", github: "emad-elsaid/archlinux"
end

Use linux function to define your system state, for example:

linux do
  hostname 'earth'

  timedate timezone: 'Europe/Berlin',
           ntp: true

  locale "en_US.UTF-8"
  keyboard keymap: 'us',
           layout: "us,ara",
           model: "",
           variant: "",
           options: "ctrl:nocaps,caps:lctrl,ctrl:swap_lalt_lctl,grp:alt_space_toggle"

  package %w[
          linux
          linux-firmware
          linux-headers
          base
          base-devel
          bash-completion
          pacman-contrib
          docker
          locate
          syncthing
          ]

  service %w[
          docker
          NetworkManager
          ]

  timer 'plocate-updatedb'

  user 'smith', groups: ['wheel', 'docker'] do
    aur %w[
        kernel-install-mkinitcpio
        google-chrome
        ]

    service %w[
            ssh-agent
            syncthing
            ]

    copy './user/.config/.', '/home/smith/.config'
  end

  firewall :syncthing

  on_finalize do
    sudo 'bootctl install'
    sudo 'reinstall-kernels'
  end

  file '/etc/X11/xorg.conf.d/40-touchpad.conf', <<~EOT
  Section "InputClass"
          Identifier "libinput touchpad catchall"
          MatchIsTouchpad "on"
          MatchDevicePath "/dev/input/event*"
          Driver "libinput"
          Option "Tapping" "on"
          Option "NaturalScrolling" "true"
  EndSection
  EOT

  replace '/etc/mkinitcpio.conf', /^(.*)base udev(.*)$/, '\1systemd\2'
end

Now you can run the script with ruby as root:

sudo ruby <script-name.rb>

It will do the following:

  • Install missing packages, remove any other package
  • Make sure services and timers are running
  • Do other configurations like locale, X11 keyboard settings, hostname
  • Ensure users are created and in specified groups

Concepts

Declarations:

Functions the user will run to declare the state of the system like packages to be present, files, services, user, group...etc

Utilities:

Methods for logging and small predicates, technically any ruby method is a utility. calling it executes the code directly instead of declaring a state.