Advertisement
Guest User

Untitled

a guest
Jul 4th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.32 KB | None | 0 0
  1. #!/bin/sh
  2. # note: default alpine shell is ash.
  3.  
  4. ONLN_REPO="http://nl.alpinelinux.org/alpine/latest-stable/main/"
  5. OFLN_REPO="/media/repository/"
  6.  
  7. ONLN_HOST="nl.alpinelinux.org"
  8. CIFS_HOST="sysdata"
  9.  
  10. CDFS_MSRC="/media/cdrom/repo/"
  11. CIFS_MSRC="share/alpine-mirror/latest-stable/main/"
  12.  
  13. CIFS_OPTS="username=share,password=none"
  14. MIRROR=/d/00-systems/linux-x64/00-alpine/00-mirror/
  15.  
  16. usage () {
  17. local out=/dev/stderr tab=$'\t'
  18. let "${1}==0" > /dev/null 2>&1 && out=/dev/stdout
  19. cat <<- EOF > ${out}
  20. setup.sh <help|onln|ofln|cifs|list|dkey>
  21. ${tab}help: show this help.
  22. ${tab}onln: install system from online repository.
  23. ${tab}ofln: install system from cdrom repository.
  24. ${tab}cifs: install system from cifs repository.
  25. ${tab}list: undocummented.
  26. ${tab}dkey: dump public ssh key to standard output.
  27.  
  28. online install does'nt require anything beside this script.
  29. cdrom install require to build the repository on the iso file.
  30. cifs install require a small cdrom repository on the iso file.
  31.  
  32. EOF
  33. exit $1
  34. }
  35.  
  36. main () {
  37. # note:
  38. # up to setup-disk in init_hd, configuration (except apk repository and db)
  39. # will be propagated to installed system, including installed packages.
  40.  
  41. local gotlan
  42. init_net () {
  43. # keyboard and default network interface dhcp setup.
  44. init_kbd_n_net
  45. # HOSTNAME env and secondary network interface static setup.
  46. init_static_net && gotlan=true || gotlan=false
  47. }
  48.  
  49. local repo mode="$1" ; shift
  50. case "$mode" in
  51. ofln|cifs) init_net; mkdir "$OFLN_REPO" && repo="$OFLN_REPO" ;;
  52. onln) init_net; host_test "$ONLN_HOST" && repo="$ONLN_REPO" ;;
  53. list) pkglst; exit $? ;;
  54. dkey) ssh_pubkey ; exit ;;
  55. help) usage 0 ;;
  56. *) usage 1 ;;
  57. esac
  58. [ "$repo" ] || errx repox
  59.  
  60. # if needed, mount repository and generate fstab line.
  61. if [ -d "$repo" ]; then
  62. local msrc
  63. case "$mode" in
  64. ofln) msrc="$CDFS_MSRC" ;;
  65. cifs) msrc="//${CIFS_HOST}/${CIFS_MSRC}" ;;
  66. esac
  67.  
  68. mountx --rbind "$CDFS_MSRC" "$repo"
  69. init_repox "$repo"
  70.  
  71. local mfst="$msrc $repo"
  72. [ "$mode" == "cifs" ] && {
  73. $gotlan || errx cifs_lanx
  74.  
  75. mountx -t cifs -o "$CIFS_OPTS" "$msrc" "$repo"
  76. init_repox "$repo"
  77.  
  78. mfst="$mfst cifs ${CIFS_OPTS},ro,noauto 0 0"
  79. } || mfst="$mfst none rbind,ro,noauto 0 0"
  80. else
  81. init_repox "$repo"
  82. fi
  83.  
  84. init_hd # setup-disk done, configuration propagation ended.
  85.  
  86. # propagate repository setup.
  87. [ -d "$repo" ] && {
  88. mkdir "/mnt${repo}"
  89. printf "${mfst}\n" >> /mnt/etc/fstab
  90. }
  91.  
  92. # initialize system.
  93. system_setup "$HOSTNAME"
  94.  
  95. # remote mount may lock reboot procedure.
  96. [ "$mode" == "cifs" ] && umount "$OFLN_REPO"
  97. }
  98.  
  99. init_kbd_n_net () {
  100. # printf "*** setting keymap\n"
  101. setup-keymap fr fr-latin1
  102.  
  103. # printf "*** setting /etc/network/interfaces\n"
  104. cat <<- EOF > /etc/network/interfaces
  105.  
  106. auto lo
  107. iface lo inet loopback
  108.  
  109. auto eth0
  110. iface eth0 inet dhcp
  111.  
  112. EOF
  113.  
  114. # printf "*** add networking to default rc\n"
  115. rc-update add networking default
  116. openrc
  117. }
  118.  
  119. init_static_net () {
  120. export HOSTNAME=localhost
  121. local wan_ip="$(ifconfig -a)"
  122. { grep -q eth1 || return; } <<- EOF
  123. $wan_ip
  124. EOF
  125.  
  126. wan_ip="$(ifconfig eth0 | sed -n '/inet addr:/s,.*r:\([^ ]*\).*,\1,p')"
  127. [ "$wan_ip" ] || return
  128.  
  129. local hsedexp='s,^[^[:blank:]]*[[:blank:]]*\([^[:blank:]\.]*\).*,\1,p'
  130. local hname="$(getent hosts "$wan_ip" | sed -n "$hsedexp")"
  131. [ "$hname" ] || return
  132.  
  133. local isedexp='s/\([[:digit:]\.]*\).*/\1/p'
  134. local lan_ip="$(getent hosts "${hname}-lan" | sed -n "$isedexp")"
  135. { [ "$lan_ip" ] && [ "$lan_ip" != "$wan_ip" ]; } || return
  136.  
  137. hname="$(getent hosts "$lan_ip" | sed -n "$hsedexp")";
  138. [ "$hname" ] && export HOSTNAME="$hname"
  139.  
  140. local tab=$'\t'
  141. cat <<- EOF >> /etc/network/interfaces
  142. auto eth1
  143. iface eth1 inet static
  144. ${tab}address ${lan_ip}
  145. ${tab}netmask 255.255.255.0
  146.  
  147. EOF
  148. /etc/init.d/networking restart
  149. }
  150.  
  151. init_hd () {
  152. # printf "*** setting partition table\n"
  153. apk_addx sfdisk
  154. sfdisk /dev/sda <<- EOF
  155. label: gpt
  156. label-id: 28062016-00FF-DDFF-0000-000000000000
  157. device: /dev/sda
  158. unit: sectors
  159. first-lba: 34
  160. last-lba: 33554398
  161.  
  162. /dev/sda2 : start= 2048, size= 1048576,\
  163. type=0FC63DAF-8483-4772-8E79-3D69D8477DE4,\
  164. uuid=00000000-0000-0000-0000-0000000000FF,\
  165. name="Linux filesystem"
  166. /dev/sda4 : start=1050624, size=32503775,\
  167. type=0FC63DAF-8483-4772-8E79-3D69D8477DE4,\
  168. uuid=00000000-0000-0000-0000-0000000000EE,\
  169. name="Linux filesystem"
  170. EOF
  171.  
  172. # note: attrs setting using dump input fail.
  173. sfdisk --part-attrs /dev/sda 2 LegacyBIOSBootable
  174. mdev -s
  175. apk del sfdisk # prevent propagation.
  176.  
  177. # printf "*** initializing filesystems\n"
  178. apk_addx e2fsprogs btrfs-progs
  179. mkfs.ext4 -L boot -U 15022016-00EE-DDFF-00FF-000000000000 /dev/sda2
  180. mkfs.btrfs -L root -U 15022016-00EE-DDFF-00EE-000000000000 /dev/sda4
  181. mount -t btrfs /dev/sda4 /mnt
  182. btrfs su create /mnt/57
  183. btrfs su create /mnt/default
  184. btrfs su create /mnt/59
  185. btrfs su create /mnt/default/usr
  186. btrfs su create /mnt/61
  187. btrfs su create /mnt/default/usr/local
  188. btrfs su create /mnt/63
  189. btrfs su create /mnt/default/var
  190. btrfs su create /mnt/default/tmp
  191. btrfs su create /mnt/default/home
  192. for i in 57 59 61 63; do
  193. btrfs su delete -c /mnt/$i
  194. done
  195. btrfs su set-default 258 /mnt
  196. umount /mnt
  197. apk del e2fsprogs btrfs-progs # prevent propagation.
  198.  
  199. # printf "*** mounting filesystems\n"
  200. mount -t btrfs /dev/sda4 /mnt
  201. mkdir /mnt/boot
  202. mount -t ext4 /dev/sda2 /mnt/boot
  203.  
  204. # printf "*** initializing system\n"
  205. setup-disk -s0 -k vanilla /mnt
  206.  
  207. # printf "*** initializing mbr\n"
  208. # note: syslinux pkg is loaded by setup-disk.
  209. dd if=/usr/share/syslinux/gptmbr.bin of=/dev/sda bs=440 count=1
  210. sync
  211. }
  212.  
  213. system_setup () {
  214. # TODO conditionalize setup on installed packages
  215. # install packages first then configure them
  216. # checking with apk -p xxx info
  217.  
  218. # printf "*** set repository for new system\n"
  219. cat /etc/apk/repositories > /mnt/etc/apk/repositories
  220.  
  221. # printf "*** add packages\n"
  222. for p in $(pkgset setup_support); do
  223. apk -p /mnt add "$p"
  224. done
  225.  
  226. # printf "*** set hostname\n"
  227. printf "$1" > /mnt/etc/hostname
  228. shift
  229.  
  230. # # printf "*** add docs packages\n"
  231. # [ "$1" ] && { # TODO clean-up
  232. # for p in $(apk -p /mnt info); do
  233. # apk info ${p}-doc > /dev/null && apk -p /mnt add ${p}-doc
  234. # done
  235. # shift
  236. # }
  237.  
  238. # printf "*** set bash as root shell\n"
  239. sed -i '/^root:/s,/bin/ash,/bin/bash,' /mnt/etc/passwd
  240.  
  241. # printf "*** move root home to /home/root\n"
  242. sed -i '/^root:/s,:/root,:/home/root,' /mnt/etc/passwd
  243. mv /mnt/root /mnt/home/
  244.  
  245. # printf "*** add 'admn': user, group, sudoer, home and ssh key\n"
  246. sed -i '/^guest:/s,.*,\0\nadmn:x:654:654:admn:/home/admn:/bin/bash,' \
  247. /mnt/etc/passwd
  248. sed -i '/^guest:/s,.*,\0\nadmn:::0:::::,' /mnt/etc/shadow
  249.  
  250. sed -i '/^utmp:/s,.*,\0\nadmn:x:654:,' /mnt/etc/group
  251.  
  252. sed -i '/^root/s,.*,\0\nadmn ALL=(ALL) NOPASSWD: ALL,' /mnt/etc/sudoers
  253.  
  254. mkdir /mnt/home/admn
  255. chown 654.654 /mnt/home/admn
  256. chmod 755 /mnt/home/admn
  257.  
  258. mkdir /mnt/home/admn/.ssh
  259. chown 654.654 /mnt/home/admn/.ssh
  260. chmod 700 /mnt/home/admn/.ssh
  261.  
  262. ssh_pubkey > /mnt/home/admn/.ssh/authorized_keys
  263.  
  264. chown 654.654 /mnt/home/admn/.ssh/authorized_keys
  265. chmod 644 /mnt/home/admn/.ssh/authorized_keys
  266.  
  267. # printf "*** ssh server setup\n"
  268. sed -i 's/^#PermitRootLogin.*/PermitRootLogin no/;
  269. s/^#PasswordAuthentication.*/PasswordAuthentication no/;
  270. s/^#PermitEmptyPasswords.*/PermitEmptyPasswords no/' \
  271. /mnt/etc/ssh/sshd_config
  272. chroot /mnt /sbin/rc-update add sshd default
  273.  
  274. # printf "*** cleanup usr/local\n"
  275. rm -rf /mnt/usr/local/*
  276.  
  277. # printf "*** forge and forget root and admn passwords\n"
  278. apk_addx openssh
  279. ssh-keygen -q -t rsa -b 4096 -N '' -f /tmp/passgen
  280. sed -n '4s/.*/root:\0/p;5s/.*/admn:\0/p' < /tmp/passgen > /tmp/newpass
  281. chroot /mnt /usr/sbin/chpasswd < /tmp/newpass
  282.  
  283. # printf "*** set default prompt\n"
  284. sed -i '/export PS1/s,\\h,\\u@\\h,' /mnt/etc/profile
  285.  
  286. # printf "*** set ll alias for bash\n"
  287. echo "[ \"\$BASH_VERSION\" ] && alias ll='ls -la'" \
  288. > /mnt/etc/profile.d/ll.sh
  289.  
  290. # printf "*** cleanup motd\n"
  291. echo 'motd: no news is good news.' > /mnt/etc/motd
  292.  
  293. # printf "*** prevent boot clock skew report\n"
  294. apk_addx coreutils findutils
  295. find /mnt -print0 | xargs -0 touch -c -t 0505050505.05 2> /dev/null
  296. }
  297.  
  298. pkgset () {
  299. while [ "$1" ]; do
  300. case "$1" in
  301. ofln) cat <<- EOF
  302. syslinux blkid mtools linux-vanilla linux-firmware mkinitfs \
  303. kmod xz-libs cryptsetup-libs device-mapper libblkid libuuid \
  304. lddtree alpine-base alpine-keys libc-utils musl-utils scanelf \
  305. busybox-initscripts busybox-suid apk-tools libssl1.0 libcrypto1.0 \
  306. zlib alpine-conf openrc alpine-baselayout busybox acct musl
  307. EOF
  308. ;;
  309. init_hd) cat <<- EOF
  310. sfdisk e2fsprogs btrfs-progs
  311. EOF
  312. ;;
  313. init_hd_dep) cat <<- EOF
  314. lzo libcom_err e2fsprogs-libs libfdisk libsmartcols
  315. EOF
  316. ;;
  317. system_setup) cat <<- EOF
  318. findutils coreutils
  319. EOF
  320. ;;
  321. system_setup_dep) cat <<- EOF
  322. libacl libattr
  323. EOF
  324. ;;
  325. setup_support) cat <<- EOF
  326. sudo bash openssh
  327. EOF
  328. ;;
  329. setup_support_dep) cat <<- EOF
  330. openssh-client openssh-sftp-server readline ncurses-libs \
  331. ncurses-terminfo ncurses-terminfo-base
  332. EOF
  333. ;;
  334. all_recr) cat <<- EOF
  335. ofln init_hd init_hd_dep system_setup system_setup_dep \
  336. setup_support setup_support_dep
  337. EOF
  338. ;;
  339. esac
  340. shift
  341. done
  342. }
  343.  
  344. # small helpers
  345.  
  346. host_test () {
  347. getent hosts "$@" > /dev/null 2>&1
  348. }
  349.  
  350. errx () {
  351. local err="$1" ; shift
  352. local abrt="aborting on:"
  353. case "$err" in
  354. repox)
  355. printf "\n%s unable to define source reposity\n" "$abrt" ;;
  356. cifs_lanx)
  357. printf "\n%s lan unavailable for cifs mountint\n" "$abrt" ;;
  358. mountx)
  359. printf "\n%s mount failure with parameters\n mount" "$abrt"
  360. printf " %s" "$@"
  361. printf "\n" ;;
  362. init_repox)
  363. printf "\n%s packages database update failure\n" "$abrt" ;;
  364. apk_addx)
  365. printf "\n%s packages add failure with parameters\n apk add" "$abrt"
  366. printf " %s" "$@"
  367. printf "\n" ;;
  368. esac > /dev/stderr
  369. exit 1
  370. }
  371.  
  372. mountx () {
  373. mount "$@" || errx mountx "$@"
  374. }
  375.  
  376. init_repox () {
  377. # printf "*** setting package repository\n"
  378. cat <<- EOF > /etc/apk/repositories
  379. $1
  380. EOF
  381. # printf "*** updating packages database\n"
  382. apk update || errx init_repox
  383. }
  384.  
  385. apk_addx () {
  386. apk add "$@" || errx apk_addx "$@"
  387. }
  388.  
  389. ssh_pubkey () {
  390. local key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDHz6HtOdGknQJvSNsFWY"
  391. key="${key}k8Yu9rKhznLVDDgzc9wZgcQOL23R/FqltWoiVVlC4siY8uXni/4AnKpAZo"
  392. key="${key}PokVRrHLo+TE1xgOdgEHszPgdDe/idTaqX8fKWvks0DglJkWu4rnHD8NfI"
  393. key="${key}Fld0Q9ECURbehBS65bw8Msi5Zm9g7FwzuCBxKfmQ4GWcJeWRO9f4VQqneE"
  394. key="${key}XA1wjsPCQdY48PQLQB8Xk9jwctHqQGQDeeJNbkSwE009Z1dThMzEexsU0g"
  395. key="${key}TOB0E01pdrN9QLuSGvfSqlCjEbiioYl2UPXpforQ/0//J6F8WX4cC7kckV"
  396. key="${key}SSJ3qOn9K65qlIF+LKcHGjqLpftemQmz1w/9cQItesoEwBYagaKncUOV72"
  397. key="${key}DMR+4/aLrUSYwR2IDGPGTt4nvfdhBzktEOXey/+DszQ+TkN4VCbChpC5Om"
  398. key="${key}UJtc4sMsDXl9rb/fkrWd1293u/GUragiSimbS6uSNfcEZOLdF82k5I6+n1"
  399. key="${key}HmE1h5aNDJMPYe1CL0CtmJ7biPd/rFilwKTwh68iquiQrcUE+qqWqrab+s"
  400. key="${key}dXiK0K5pfdq/kgUYZOI27ldNCf2Nzg3Q2scEfbu3ZexUjpEiue1MkYV3LU"
  401. key="${key}TzGZgx9O6Uq4Q/5l13lFOmG0Vphuk4njrlbqRbyB+VvfgbSuO0rFWnBvby"
  402. key="${key}najEgSEDZcPyTAi6PTcn+v2vvw== admn@alpine"
  403. printf "%s\n" "${key}"
  404. }
  405.  
  406. [ -n "$BASH_VERSION" ] || {
  407. main "$@"
  408. exit $?
  409. }
  410.  
  411. # assuming bash shell from here
  412.  
  413. pkgerr () {
  414. printf "\nbad package: %s\n" "${@}" > /dev/stderr
  415. exit 1
  416. }
  417.  
  418. pkglst () {
  419. local mirror="$MIRROR"
  420. mirror+=latest-stable/main/x86_64
  421.  
  422. local index=APKINDEX.tar.gz
  423. local plist=( $(pkgset $(pkgset all_recr)) )
  424.  
  425. # printf "checking packages..."
  426. [ -r ${mirror}/${index} ] || pkgerr "${mirror}/${index}"
  427.  
  428. local i pk flist=(${mirror}/${index})
  429. for i in ${plist[@]}; do
  430. pk=(nil $(ls ${mirror}/${i}-[0-9]*.apk 2> /dev/null))
  431. ((${#pk[@]}==2)) || pkgerr "${mirror}/${i}"
  432. [ -r "${pk[1]}" ] || pkgerr "${pk[1]}"
  433. flist+=(${pk[1]})
  434. done
  435. # printf " done.\n"
  436. printf "%s\n" "${flist[@]}"
  437. }
  438.  
  439. main "$@"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement