fedora-csb-system-manager
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