flake-update-20260201
  1#!/usr/bin/env bash
  2# This scripts aims to detect which system is running, and bootstrap
  3# the home configuration accordingly. So far the current setup are
  4# supported:
  5# - NixOS (>= 19.03 more or less)
  6# - Fedora (>= 30)
  7# - Mac OS X (>= 10.14)
  8
  9set -e
 10
 11# Install nix
 12setup_nix() {
 13    echo "> Install nix"
 14    curl https://nixos.org/nix/install | sh
 15}
 16
 17# Install home-manager (without running it)
 18setup_home-manager() {
 19    echo "> Install home-manager"
 20    mkdir -m 0755 -p /nix/var/nix/{profiles,gcroots}/per-user/$USER
 21    nix-channel --add https://github.com/rycee/home-manager/archive/master.tar.gz home-manager
 22    nix-channel --update
 23}
 24
 25run_home-manager() {
 26    nix-shell '<home-manager>' -A install
 27}
 28
 29# Fedora is "managed" by nix directly
 30# - bootstrap nix + home-manager
 31setup_nixos() {
 32    echo "NixOS detected"
 33    setup_home-manager
 34    run_home-manager
 35}
 36
 37# Fedora is "managed" mainly using ansible
 38# - install ansible
 39# - play the "correct" playbook
 40# - boostrap nix + home-manager
 41setup_fedora() {
 42    echo "Fedora detected"
 43    if hash nix 2>/dev/null; then
 44	echo "> nix already present"
 45    else
 46	setup_nix
 47	echo "if [ -e $HOME/.nix-profile/etc/profile.d/nix.sh ]; then . $HOME/.nix-profile/etc/profile.d/nix.sh; fi # added by Nix installer" >> $HOME/.bashrc
 48	. $HOME/.bashrc
 49    fi
 50    if hash home-manager 2>/dev/null; then
 51	echo "> home-manager already present"
 52    else
 53	setup_home-manager
 54	echo "export NIX_PATH=$HOME/.nix-defexpr/channels\${NIX_PATH:+:}\$NIX_PATH" >> $HOME/.bashrc
 55    fi
 56    if [[ ! -f $HOME/.config/nixpkgs/home.nix ]]; then
 57       echo "> create a temporary home-manager configuration"
 58       mkdir -p $HOME/.config/nixpkgs/
 59       cat > $HOME/.config/nixpkgs/home.nix <<EOF
 60{
 61  programs.home-manager.enable = true;
 62  programs.man.enable = false;
 63  home.extraOutputsToInstall = [ "man" ];
 64}
 65
 66EOF
 67    fi
 68    echo "> setup nix caches"
 69    mkdir -p $HOME/.config/nix/
 70    cat > $HOME/.config/nix/nix.conf <<EOF
 71substituters = http://nix.cache.home https://cache.nixos.org https://shortbrain.cachix.org
 72trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= shortbrain.cachix.org-1:dqXcXzM0yXs3eo9ChmMfmob93eemwNyhTx7wCR4IjeQ=
 73EOF
 74    run_home-manager
 75    echo ". \"$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh\"" >> $HOME/.bashrc
 76    . $HOME/.bashrc
 77    dnf copr enable evana/fira-code-fonts
 78    dnf install fira-code-fonts
 79    echo "> install ansible"
 80    sudo dnf install -y ansible
 81    echo "> run playbook"
 82    ansible-playbook -K ansible/playbook.yml
 83}
 84
 85setup_osx() {
 86    echo "Mac OS X detected"
 87    if [[ "$kernel_name" == "Darwin" ]]; then
 88        IFS=$'\n' read -d "" -ra sw_vers < <(awk -F'<|>' '/key|string/ {print $3}' \
 89                            "/System/Library/CoreServices/SystemVersion.plist")
 90        for ((i=0;i<${#sw_vers[@]};i+=2)) {
 91		case ${sw_vers[i]} in
 92                    ProductName)          darwin_name=${sw_vers[i+1]} ;;
 93                    ProductVersion)       osx_version=${sw_vers[i+1]} ;;
 94                    ProductBuildVersion)  osx_build=${sw_vers[i+1]}   ;;
 95		esac
 96            }
 97     fi
 98}
 99
100IFS=" " read -ra uname <<< "$(uname -srm)"
101kernel_name="${uname[0]}"
102kernel_version="${uname[1]}"
103kernel_machine="${uname[2]}"
104
105case "$kernel_name" in
106    "Linux" | "GNU")
107	if [[ -f "/etc/os-release" || -f "/usr/lib/os-release" ]]; then
108                files=("/etc/os-release" "/usr/lib/os-release")
109
110                # Source the os-release file
111                for file in "${files[@]}"; do
112                    source "$file" && break
113                done
114		case "$ID" in
115		    "nixos")
116			setup_nixos ;;
117		    "fedora")
118			setup_fedora ;;
119		esac
120	fi ;;
121    "Darwin")
122	setup_osx ;;
123esac