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