e50426be990f31df74a03696d9e8a13b1c7d38a4
[selfix.git] / stage0.sh
1 #!/usr/bin/env bash
2 set -euo pipefail
3
4 # Copyright (C) 2017 Jason Self <j@jxself.org>
5 #
6 # You can redistribute and/or modify this file under the terms of the
7 # GNU Affero General Public License as published by the Free Software
8 # Foundation, either version 3 of the License, or (at your option)
9 # any later version.
10 #
11 # This file is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 # Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public
17 # License along with this file. If not, see
18 # <http://www.gnu.org/licenses/>.
19
20 export distro=selfix
21
22 check_if_root () {
23     if [[ $EUID -ne 0 ]]; then
24         echo "This script must be run as root." 1>&2
25         exit 1
26     fi
27 }
28
29 get_source_code () {
30     wget -P /$distro/usr/src/release -i urls
31 }
32
33 install_dependencies () {
34     # TODO: Implement support for other package managers
35     packages=( binutils bison g++ gawk gcc lzip m4 make patch texinfo wget xz-utils )
36     for i in "${packages[@]}"
37     do
38         if ! dpkg -s "$i" &> /dev/null ; then
39             apt -y install $i
40         fi
41     done
42 }
43
44 make_bin_sh_point_to_bash () {
45     # This checks if /bin/sh is a symlink so as to avoid replacing
46     # it in cases where it's not a symlink (i.e., an executable.)
47     if [ -h /bin/sh ]; then
48         ln -sf bash /bin/sh
49     else
50         echo "/bin/sh is not a symlink"
51         exit 1
52     fi
53 }
54
55 prep_host () {
56     if [ ! -d /$distro/toolchain ]; then
57         mkdir -p /$distro/toolchain
58     fi
59     ln -sf /$distro/toolchain /
60     groupadd $distro
61     useradd -s /bin/bash -g $distro -m -k /dev/null $distro
62     chown $distro /$distro/toolchain
63     if [ ! -d /$distro/usr/src/release ]; then
64         mkdir -p /$distro/usr/src/release;
65         chmod a+wt /$distro/usr/src/release
66     fi
67     chown $distro /$distro/usr/src/release
68 cat > /home/$distro/.bash_profile << "EOF"
69 exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
70 EOF
71 cat > /home/$distro/.bashrc << "EOF"
72 set +h
73 umask 022
74 distro=selfix
75 LC_ALL=POSIX
76 SELFIX_TGT=$(uname -m)-selfix-linux-gnu
77 PATH=/toolchain/bin:/bin:/usr/bin
78 export distro LC_ALL SELFIX_TGT PATH
79 EOF
80 }
81
82 check_if_root
83 install_dependencies
84 make_bin_sh_point_to_bash
85 prep_host
86 get_source_code