Compare commits
	
		
			2 Commits
		
	
	
		
			d9cef67dd4
			...
			d2c05a5647
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d2c05a5647 | ||
| 
						 | 
					7c0af76b4f | 
@ -30,6 +30,10 @@ varia[s]=repo
 | 
			
		||||
repo="http://ftp.fr.debian.org/debian"
 | 
			
		||||
#repo="http://localhost:3142/ftp.fr.debian.org/debian"
 | 
			
		||||
 | 
			
		||||
usage[S]="Additional sources to add in source.list. Newline separated."
 | 
			
		||||
varia[S]=repos
 | 
			
		||||
repos="deb http://ftp.fr.debian.org/debian stable main contrib non-free"
 | 
			
		||||
 | 
			
		||||
usage[n]="The hostname"
 | 
			
		||||
varia[n]=hostname
 | 
			
		||||
hostname=""
 | 
			
		||||
@ -39,22 +43,34 @@ varia[b]=boot_device
 | 
			
		||||
boot_device=
 | 
			
		||||
 | 
			
		||||
usage[R]="The device where the system will be installed"
 | 
			
		||||
varia[R]=boot_device
 | 
			
		||||
boot_device=
 | 
			
		||||
varia[R]=root_device
 | 
			
		||||
root_device=
 | 
			
		||||
 | 
			
		||||
usage[l]="System locale"
 | 
			
		||||
varia[l]=locale
 | 
			
		||||
locale="en_US.UTF-8 UTF-8\nfr_FR.UTF-8 UTF-8"
 | 
			
		||||
 | 
			
		||||
usage[w]="Wireguard IP last number (4 for 1.2.3.4)"
 | 
			
		||||
varia[w]=wireguard_number
 | 
			
		||||
wireguard_number=
 | 
			
		||||
 | 
			
		||||
usage[J]="Just mount and chroot it. No installation"
 | 
			
		||||
varia[J]=just_mount
 | 
			
		||||
just_mount=false
 | 
			
		||||
 | 
			
		||||
usage[i]="Packages to install. space separated"
 | 
			
		||||
varia[i]=install
 | 
			
		||||
install=
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
. driglibash-args
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
secret_dir=secrets
 | 
			
		||||
secret_dir="$(realpath -m "$secret_dir/$hostname")"
 | 
			
		||||
install="vim openssh-server git nginx"
 | 
			
		||||
 | 
			
		||||
install="$install vim openssh-server git nginx smartmontool"
 | 
			
		||||
 | 
			
		||||
debootstrap_done_marker="$mnt/etc/debootstrap_done"
 | 
			
		||||
 | 
			
		||||
###############################################################################
 | 
			
		||||
#                              Actual script
 | 
			
		||||
@ -63,8 +79,8 @@ install="vim openssh-server git nginx"
 | 
			
		||||
. driglibash-base
 | 
			
		||||
 | 
			
		||||
chroot_run(){
 | 
			
		||||
  run echo "$@" | chroot "$mnt"
 | 
			
		||||
  if [ "$?" -ne 0 ] ; then
 | 
			
		||||
  chroot "$mnt" $@
 | 
			
		||||
  if [ "$?" -ne 0 ] && [ "$?" != '0' ] ; then
 | 
			
		||||
    die "Error, chroot command [$@] exited with code '$?'"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
@ -77,16 +93,15 @@ wait_for_user(){
 | 
			
		||||
 | 
			
		||||
mount_misc(){
 | 
			
		||||
  run mkdir -p "$mnt"/{proc,dev,sys}
 | 
			
		||||
  run mount -t proc none "$mnt/proc"
 | 
			
		||||
  clean "umount '$mnt/proc'"
 | 
			
		||||
  run mount -t proc /proc "$mnt/proc"
 | 
			
		||||
  #clean "umount '$(realpath "$mnt/proc")'"
 | 
			
		||||
  # To access physical devices
 | 
			
		||||
  run mount -o bind /dev "$mnt/dev"
 | 
			
		||||
  clean "umount '$mnt/dev'"
 | 
			
		||||
  run mount -o bind /dev/pts "$mnt/dev/pts"
 | 
			
		||||
  clean "umount '$mnt/dev/pts'"
 | 
			
		||||
  run mount -o bind /sys "$mnt/sys"
 | 
			
		||||
  clean "umount '$mnt/sys'"
 | 
			
		||||
  # mount /dev/pts ? apt install complain about its absence
 | 
			
		||||
  run mount --rbind --make-rslave /dev "$mnt/dev"
 | 
			
		||||
  # even explicitly mounting /dev/pts makes apt cry for its absence…
 | 
			
		||||
  #clean "umount -R '$(realpath "$mnt/dev")'"
 | 
			
		||||
  run mount --rbind --make-rslave /sys "$mnt/sys"
 | 
			
		||||
  #clean "umount -R '$(realpath "$mnt/sys")'"
 | 
			
		||||
  clean "umount -R '$mnt'"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ -z "$hostname" ] ; then
 | 
			
		||||
@ -104,24 +119,48 @@ if ! [ -d "$secret_dir" ] ; then
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
section "debootstraping"
 | 
			
		||||
# Debootstrap may fail when the target is an existing system
 | 
			
		||||
#if [ -n "$(ls -A $mnt)" ]; then
 | 
			
		||||
#  die "Root dir '$mnt' is not empty. Won’t debootstrap it."
 | 
			
		||||
#fi
 | 
			
		||||
run debootstrap --verbose --arch "$arch" "$release" "$mnt" "$repo"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
section "Mounting additionnal items"
 | 
			
		||||
if [ -n "$(df | grep "$root_device")" ] ; then
 | 
			
		||||
	run umount "$root_device"
 | 
			
		||||
fi
 | 
			
		||||
run mkdir -p "$mnt"
 | 
			
		||||
run mount --make-private "$root_device" "$mnt"
 | 
			
		||||
# bug in driglibash-base. If $mnt got spaces it break
 | 
			
		||||
clean "umount -R $mnt"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if [ "$just_mount" != false ] ; then
 | 
			
		||||
	echo 'Mounted. Exit shell to unmount.'
 | 
			
		||||
	chroot_run
 | 
			
		||||
	die 'You asked to just mount then exit.'
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
section "debootstraping"
 | 
			
		||||
if [ ! -f "$debootstrap_done_marker" ] ; then
 | 
			
		||||
	# Debootstrap may fail when the target is an existing system
 | 
			
		||||
	if [ -n "$(ls -A $mnt)" ]; then
 | 
			
		||||
	  die "Root dir '$mnt' is not empty. Won’t debootstrap it. Is this installation broken?"
 | 
			
		||||
	fi
 | 
			
		||||
	run debootstrap --verbose --arch "$arch" "$release" "$mnt" "$repo"
 | 
			
		||||
	touch "$debootstrap_done_marker"
 | 
			
		||||
else
 | 
			
		||||
	yell "Already done"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
mount_misc
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
section "Generating locales"
 | 
			
		||||
echo -e "$locale" > "$mnt/etc/locale.gen"
 | 
			
		||||
chroot_run locale-gen
 | 
			
		||||
 | 
			
		||||
section "Installing selected software"
 | 
			
		||||
#XXX use chroot_run
 | 
			
		||||
echo "$repos" >> "$mnt/etc/apt/sources.list"
 | 
			
		||||
chroot "$mnt" <<EOF
 | 
			
		||||
  export DEBIAN_FRONTEND=noninteractive
 | 
			
		||||
  apt-get update  -q -y 
 | 
			
		||||
  apt-get install -q -y linux-image-amd64 console-data grub2 locales $install
 | 
			
		||||
  apt-get install -q -y linux-image-amd64 console-data grub2 locales vim wireguard-tools wireguard $install
 | 
			
		||||
EOF
 | 
			
		||||
# TODO watershed ?
 | 
			
		||||
 | 
			
		||||
@ -141,7 +180,6 @@ run echo "$hostname" > "$mnt/etc/hostname"
 | 
			
		||||
run cat > "$mnt/root/.bashrc" <<EOF
 | 
			
		||||
PATH=$PATH:/usr/bin:/bin:/sbin:/usr/sbin:/sbin
 | 
			
		||||
/usr/bin/setterm -blength 0
 | 
			
		||||
xset b off
 | 
			
		||||
EOF
 | 
			
		||||
# Be sure this fucking beep is gone
 | 
			
		||||
echo 'set bell-style none' >> "$mnt/etc/inputrc"
 | 
			
		||||
@ -175,23 +213,10 @@ section "Set up networking"
 | 
			
		||||
# Disable the unpredictable naming (since we are not on the future host)
 | 
			
		||||
run ln -s /dev/null "$mnt/etc/udev/rules.d/80-net-setup-link.rules"
 | 
			
		||||
run cat >> "$mnt/etc/network/interfaces" <<EOF
 | 
			
		||||
    auto enp1s0
 | 
			
		||||
    allow-hotplug enp1s0
 | 
			
		||||
    iface enp1s0 inet dhcp
 | 
			
		||||
    iface enp1s0 inet6 dhcp
 | 
			
		||||
    auto enp2s0
 | 
			
		||||
    allow-hotplug enp2s0
 | 
			
		||||
    iface enp2s0 inet dhcp
 | 
			
		||||
    iface enp2s0 inet6 dhcp
 | 
			
		||||
    auto eth0
 | 
			
		||||
    allow-hotplug eth0
 | 
			
		||||
    iface eth0 inet dhcp
 | 
			
		||||
    iface eth0 inet6 dhcp
 | 
			
		||||
    auto eth1
 | 
			
		||||
    allow-hotplug eth1
 | 
			
		||||
    iface eth1 inet dhcp
 | 
			
		||||
    iface eth1 inet6 dhcp
 | 
			
		||||
EOF
 | 
			
		||||
    #iface eth0 inet6 dhcp
 | 
			
		||||
# TODO add dyndn service
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -199,17 +224,41 @@ EOF
 | 
			
		||||
section "Creating root SSH key to connect"
 | 
			
		||||
if [ -n "$(ls -A $secret_dir)" ]; then
 | 
			
		||||
  #die "Secret dir '$secret_dir' is not empty"
 | 
			
		||||
  yell "Secret dir is not empty. Wont save ssh key."
 | 
			
		||||
else
 | 
			
		||||
  run export HOSTNAME="$hostname" && ssh-keygen -b 4096 -f "$secret_dir/id_rsa" -P ''
 | 
			
		||||
  run mkdir -p "$mnt/root/.ssh/"
 | 
			
		||||
  cat "$secret_dir/id_rsa.pub" >> "$mnt/root/.ssh/authorized_keys"
 | 
			
		||||
  yell "Secret dir is not empty. May erase key."
 | 
			
		||||
fi
 | 
			
		||||
run export HOSTNAME="$hostname" && ssh-keygen -b 4096 -f "$secret_dir/id_rsa" -P ''
 | 
			
		||||
run mkdir -p "$mnt/root/.ssh/"
 | 
			
		||||
cat "$secret_dir/id_rsa.pub" >> "$mnt/root/.ssh/authorized_keys"
 | 
			
		||||
chroot_run systemctl enable ssh
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
section "Generating locales"
 | 
			
		||||
chroot_run echo -e "$locale" > "/etc/locale.gen"
 | 
			
		||||
chroot_run locale-gen
 | 
			
		||||
section "Creating wireguard conf"
 | 
			
		||||
 | 
			
		||||
if [ -n "$wireguard_number" ] ; then
 | 
			
		||||
	run cat >> "$mnt/etc/wireguard/jeancloud.conf" <<EOF
 | 
			
		||||
[Interface]
 | 
			
		||||
PrivateKey = $(wg genkey)
 | 
			
		||||
ListenPort = 51812
 | 
			
		||||
Address = 10.98.1.$wireguard_number/32
 | 
			
		||||
 | 
			
		||||
[Peer] # debug
 | 
			
		||||
PublicKey = OpENQI1ElPuVdNssMySffO8iZEyJsOaSQ9bQLU6Uz2E=
 | 
			
		||||
AllowedIPs = 10.98.1.254/32
 | 
			
		||||
Endpoint = 193.33.56.94:51812
 | 
			
		||||
PersistentKeepalive = 25
 | 
			
		||||
EOF
 | 
			
		||||
wireguard_pubkey="$(cat "$mnt/etc/wireguard/jeancloud.conf" | grep  -oP '^PrivateKey = \K.*' | wg pubkey)"
 | 
			
		||||
 | 
			
		||||
	run cat >> "$secret_dir/wg_conf_part_$hostname" <<EOF
 | 
			
		||||
[Peer] # $hostname
 | 
			
		||||
PublicKey = $wireguard_pubkey
 | 
			
		||||
AllowedIPs = 10.98.1.$wireguard_number/32
 | 
			
		||||
EOF
 | 
			
		||||
	chroot_run systemctl enable wg-quick@jeancloud.service
 | 
			
		||||
 | 
			
		||||
else
 | 
			
		||||
	yell "Passing"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
section "Installing grub"
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user