/ tools / tmp / bootstrap.sh
bootstrap.sh
  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  
  9  set -e
 10  
 11  # Install nix
 12  setup_nix() {
 13      echo "> Install nix"
 14      curl https://nixos.org/nix/install | sh
 15  }
 16  
 17  # Install home-manager (without running it)
 18  setup_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  
 25  run_home-manager() {
 26      nix-shell '<home-manager>' -A install
 27  }
 28  
 29  # Fedora is "managed" by nix directly
 30  # - bootstrap nix + home-manager
 31  setup_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
 41  setup_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  
 66  EOF
 67      fi
 68      echo "> setup nix caches"
 69      mkdir -p $HOME/.config/nix/
 70      cat > $HOME/.config/nix/nix.conf <<EOF
 71  substituters = http://nix.cache.home https://cache.nixos.org https://shortbrain.cachix.org
 72  trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= shortbrain.cachix.org-1:dqXcXzM0yXs3eo9ChmMfmob93eemwNyhTx7wCR4IjeQ=
 73  EOF
 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  
 85  setup_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  
100  IFS=" " read -ra uname <<< "$(uname -srm)"
101  kernel_name="${uname[0]}"
102  kernel_version="${uname[1]}"
103  kernel_machine="${uname[2]}"
104  
105  case "$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 ;;
123  esac