summaryrefslogtreecommitdiff
path: root/skel/multistrap-configure.sh
blob: 69a11fb3ba4e36ee6f8c841730a1a884126ee522 (plain)
  1. #!/bin/sh
  2. #
  3. # multistrap-configure.sh
  4. # Copyright 2015 Jonas Smedegaard <dr@jones.dk>
  5. # License: GNU Public License version 3 or newer
  6. #
  7. # multistrap configscript invoked in rootfs to preseed and configure
  8. #
  9. # Recommends: debconf libfakeroot
  10. #
  11. # TODO: avoid need for libfakeroot installed into target system
  12. set -eu
  13. set -x
  14. # silence locale noise (esp. from perl)
  15. export LC_ALL=C LANGUAGE=C LANG=C \
  16. # suppress debconf questions not preseeded
  17. export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
  18. # dirty hack to make dash postinst succeed
  19. -n "$(dpkg-divert --list /bin/sh)" || /var/lib/dpkg/info/dash.preinst
  20. # preseed debconf questions
  21. cat /tmp/preseeds/* 2>&- | debconf-set-selections
  22. cat <<'EOF' >debconf-get
  23. #!/bin/sh
  24. # multistrap debconf wrapper to mimic d-i convenience command
  25. set -eu
  26. debconf-show d-i | grep -Po "(?<=. $1: ).*"
  27. EOF
  28. chmod +x debconf-get
  29. # add hostname file
  30. # FIXME: resolve from debconf
  31. cat <<'EOF' > /etc/hostname
  32. hamlet
  33. EOF
  34. # replace(!) hosts file
  35. # FIXME: resolve from debconf
  36. cat <<'EOF' > /etc/hosts
  37. 127.0.0.1   localhost
  38. 127.0.1.1   hamlet.jones.dk hamlet
  39. # The following lines are desirable for IPv6 capable hosts
  40. ::1     localhost ip6-localhost ip6-loopback
  41. ff02::1 ip6-allnodes
  42. ff02::2 ip6-allrouters
  43. EOF
  44. # add fstab file
  45. # FIXME: resolve from debconf
  46. # TODO: use UUID
  47. # : enable swap
  48. cat <<'EOF' > /etc/fstab
  49. # /etc/fstab: static file system information.
  50. #
  51. # Use 'blkid' to print the universally unique identifier for a
  52. # device; this may be used with UUID= as a more robust way to name devices
  53. # that works even if disks are added and removed. See fstab(5).
  54. #
  55. # <file system> <mount point>   <type>  <options>       <dump>  <pass>
  56. # / was on /dev/mmcblk0p2 during installation
  57. /dev/mmcblk0p2 /               ext4    errors=remount-ro 0       1
  58. # /boot was on /dev/mmcblk0p1 during installation
  59. /dev/mmcblk0p1 /boot           ext2    defaults        0       2
  60. # swap was on /dev/mmcblk0p5 during installation
  61. #/dev/mmcblk0p5 none            swap    sw              0       0
  62. EOF
  63. # configure packages
  64. dpkg --configure -a
  65. ./debconf-get preseed/late_command \
  66.     | PATH="$PATH:." perl -0777 -n \
  67.         -e 's,chroot\s+/target\s+,,g;' \
  68.         -e 's,/target/,/,g;' \
  69.         -e "s,'',,g;" \
  70.         -e 's,^\s+,,;' \
  71.         -e 'system($_) == 0 or die "Broken late_command:\n$_" if ($_);'
  72. # Create user account
  73. # FIXME: resolve from debconf
  74. adduser --disabled-login --gecos 'Debian User' --add_extra_groups debian && echo debian:insecure | chpasswd
  75. # sudo-enable initial user account
  76. # FIXME: resolve from debconf
  77. adduser debian sudo
  78. # FIXME: do this far more flexible!
  79. cat <<'EOF' > /root/init-network-settings
  80. #!/bin/sh
  81. set -eu
  82. set -x
  83. # Add static-IP internal first-port ethernet connection
  84. # network-manager 1.2:
  85. nmcli connection add type ethernet con-name eth0-static ifname eth0 -- ipv4.addresses 192.168.1.1 ipv4.method manual connection.zone internal
  86. nmcli connection modify eth0-static connection.autoconnect on
  87. # network-manager 1.4:
  88. #nmcli connection add type ethernet con-name eth0-static ifname eth0 ip4 192.168.1.1 ipv4.method manual autoconnect on connection.zone internal
  89. # Add dynamic-IP external wildcard ethernet connection
  90. # network-manager 1.2:
  91. nmcli connection add type ethernet con-name dhcp ifname '*' connection.zone external
  92. nmcli connection modify dhcp connection.autoconnect on
  93. # network-manager 1.4:
  94. #nmcli connection add type ethernet con-name dhcp ifname '*' autoconnect on connection.zone external
  95. # Add dynamic-IP external WWAN connection (hardcoded provider for now)
  96. # network-manager 1.2:
  97. nmcli connection add ifname '*' autoconnect yes type gsm apn data.tre.dk -- connection.id gsm-tre.dk-noauth connection.zone external gsm.password-flags 1
  98. #nmcli connection add ifname '*' autoconnect yes type gsm apn internet -- connection.id gsm-internet-noauth connection.zone external gsm.password-flags 1
  99. # network-manager 1.4:
  100. #nmcli connection add ifname '' autoconnect yes type gsm apn data.tre.dk connection.id gsm-tre.dk-noauth connection.zone external gsm.password-flags 1
  101. ##nmcli connection add ifname '' autoconnect yes type gsm apn internet connection.id gsm-internet-noauth connection.zone external gsm.password-flags 1
  102. # Permit mosh from anywhere:
  103. firewall-cmd --permanent --zone external --add-service mosh
  104. firewall-cmd --permanent --zone internal --add-service mosh
  105. firewall-cmd --reload
  106. echo 'Network settings applied succesfully!'
  107. EOF
  108. chmod a+/root/init-network-settings
  109. # FIXME: do this automatically at initial boot (like Armbian?)
  110. cat <<'EOF' > /root/extend-partition
  111. #!/bin/sh
  112. set -eu
  113. disk="${1:-/dev/mmcblk0}"
  114. part="${2:-/dev/mmcblk0p2}"
  115. # Use provided disk device, pick if exactly 1 disk device exists, or fail
  116. if [ -z "$disk" ]; then
  117.     diskcount=$(lsblk --noheadings --raw --nodeps --output TYPE \
  118.         | grep --line-regexp disk --count)
  119.     if [ 1 -eq "$diskcount" ]; then
  120.         disk=$(lsblk --noheadings --raw --nodeps --paths --output NAME)
  121.         echo "INFO: No disk provided - will use \"$disk\"."
  122.     else
  123.         echo "ERROR: Please specify disk device:"
  124.         lsblk --paths --nodeps --output NAME,MODEL,SERIAL,SIZE,TYPE
  125.         exit 1
  126.     fi
  127. fi
  128. # Use provided partition, pick last in supported format, or fail
  129. if [ -z "$part" ]; then
  130.     part=$(lsblk --raw --noheadings --paths --output NAME,FSTYPE "$disk" \
  131.         | grep -Po '^\S+(?= ext[234]\z)' | tail -n 1)
  132.     if [ -n "$part" ]; then
  133.         echo "INFO: No partition provided - will use \"$part\"."
  134.     else
  135.         echo "ERROR: Please specify prtition to extend:"
  136.         lsblk --paths --output NAME,SIZE,TYPE,PARTLABEL,FSTYPE "$disk"
  137.         exit 1
  138.     fi
  139. fi
  140. # Locate end of free space after partition in supported format, or fail
  141. partminor=$(lsblk --noheadings --raw --output MAJ:MIN "$part" | cut -d: -f2)
  142. partnewend=$(parted --script --machine -- "$disk" unit B print free \
  143.     | minor="$partminor" perl -F'[:;]' \
  144.         -e 'if ($seen) {' \
  145.             -e '$F[4] eq "free" && print $F[2];' \
  146.             -e 'exit};' \
  147.         -e 'if ($F[0] == $ENV{minor} and $F[4] =~ /^ext[234]$/) {' \
  148.             -e '$seen++};')
  149. if [ -z "$partnewend" ]; then
  150.     echo "ERROR: Failed to locate free space after partition \"$part\""
  151.     exit 1
  152. fi
  153. echo "INFO: Extending partition \"$part\" on disk \"$disk\"..."
  154. parted "$disk" resizepart 2 Yes "$partnewend"
  155. resize2fs "$part"
  156. echo 'INFO: Disk partition extended succesfully!'
  157. EOF
  158. chmod a+/root/extend-partition
  159. rm -f ./debconf-get
  160. echo 'multistrap-configure.sh completed succesfully!' >&2