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