From 52ecfc3590fc33bff702ec1478ac61378639c849 Mon Sep 17 00:00:00 2001 From: Silvio Rhatto Date: Sat, 26 Sep 2015 11:11:48 -0300 Subject: Provision: raspberry pi script --- lib/hydra/functions | 2 + lib/hydra/provision | 45 ++++++++++++++++ share/hydractl/provision | 39 ++------------ share/hydractl/provision-raspi | 113 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 165 insertions(+), 34 deletions(-) create mode 100644 lib/hydra/provision create mode 100755 share/hydractl/provision-raspi diff --git a/lib/hydra/functions b/lib/hydra/functions index e6cf4a0..84590e5 100644 --- a/lib/hydra/functions +++ b/lib/hydra/functions @@ -10,6 +10,8 @@ source $APP_BASE/lib/hydra/usage source $APP_BASE/lib/hydra/action source $APP_BASE/lib/hydra/backup source $APP_BASE/lib/hydra/config +source $APP_BASE/lib/hydra/deploy +source $APP_BASE/lib/hydra/provision source $APP_BASE/lib/hydra/tmpfile # Setup environment diff --git a/lib/hydra/provision b/lib/hydra/provision new file mode 100644 index 0000000..5c85e04 --- /dev/null +++ b/lib/hydra/provision @@ -0,0 +1,45 @@ +#!/bin/bash + +# Load provision configuration +function hydra_provision_load_config { +if [ ! -z "$1" ]; then + if [ -f "$1" ]; then + echo "Using configuration from file $1..." + source "$1" + elif [ -f "$1.conf" ]; then + echo "Using configuration from file $1.conf..." + source "$1.conf" + elif [ -f "$HYDRA_FOLDER/config/provision/$1" ]; then + echo "Using configuration from $HYDRA_FOLDER/config/provision/$1..." + source "$HYDRA_FOLDER/config/provision/$1" + elif [ -f "$HYDRA_FOLDER/config/provision/$1.conf" ]; then + echo "Using configuration from $HYDRA_FOLDER/config/provision/$1.conf..." + source "$HYDRA_FOLDER/config/provision/$1.conf" + elif [ -f "$APP_BASE/share/config/provision/$1" ]; then + echo "Using configuration from $APP_BASE/share/config/provision/$1..." + source "$APP_BASE/share/config/provision/$1" + elif [ -f "$APP_BASE/share/config/provision/$1.conf" ]; then + echo "Using configuration from $APP_BASE/share/config/provision/$1.conf..." + source "$APP_BASE/share/config/provision/$1.conf" + else + echo "Profile not found: $1" + exit 1 + fi +fi +} + +# Networking. +function hydra_provision_networking { + echo "Doing a basic network config..." + cat <<-EOF | $SUDO tee $WORK/etc/network/interfaces > /dev/null +auto eth0 +allow-hotplug eth0 +iface eth0 inet dhcp +EOF +} + +function hydra_provision_fingerprints { + echo "OpenSSH fingerprints:" + hydra_sudo_run chroot $WORK ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub + hydra_sudo_run chroot $WORK ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub +} diff --git a/share/hydractl/provision b/share/hydractl/provision index f214e0f..79c88cc 100755 --- a/share/hydractl/provision +++ b/share/hydractl/provision @@ -111,31 +111,8 @@ function hydra_provision_config { hydra_user_config mirror http://http.debian.net/debian/ "Debian mirror" } -# Setup. -if [ ! -z "$1" ]; then - if [ -f "$1" ]; then - echo "Using configuration from file $1..." - source "$1" - elif [ -f "$1.conf" ]; then - echo "Using configuration from file $1.conf..." - source "$1.conf" - elif [ -f "$HYDRA_FOLDER/config/provision/$1" ]; then - echo "Using configuration from $HYDRA_FOLDER/config/provision/$1..." - source "$HYDRA_FOLDER/config/provision/$1" - elif [ -f "$HYDRA_FOLDER/config/provision/$1.conf" ]; then - echo "Using configuration from $HYDRA_FOLDER/config/provision/$1.conf..." - source "$HYDRA_FOLDER/config/provision/$1.conf" - elif [ -f "$APP_BASE/share/config/provision/$1" ]; then - echo "Using configuration from $APP_BASE/share/config/provision/$1..." - source "$APP_BASE/share/config/provision/$1" - elif [ -f "$APP_BASE/share/config/provision/$1.conf" ]; then - echo "Using configuration from $APP_BASE/share/config/provision/$1.conf..." - source "$APP_BASE/share/config/provision/$1.conf" - else - echo "Profile not found: $1" - exit 1 - fi -fi +# Load configuration +hydra_provision_load_config # Parameters WORK="/tmp/debootstrap" @@ -434,12 +411,7 @@ echo "Installing basic utilities..." hydra_sudo_run chroot $WORK apt-get install screen cron lsb-release openssl -y # Networking. -echo "Doing a basic network config..." -cat <<-EOF | $SUDO tee $WORK/etc/network/interfaces > /dev/null -auto eth0 -allow-hotplug eth0 -iface eth0 inet dhcp -EOF +hydra_provision_networking # Ssh. echo "Installing OpenSSH daemon..." @@ -452,9 +424,8 @@ hydra_sudo_run chroot $WORK apt-get install sudo -y echo "Choose a root password." hydra_sudo_run chroot $WORK passwd root -echo "OpenSSH fingerprints:" -hydra_sudo_run chroot $WORK ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub -hydra_sudo_run chroot $WORK ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub +# Fingerprints +hydra_provision_fingerprints cat <<-EOF diff --git a/share/hydractl/provision-raspi b/share/hydractl/provision-raspi new file mode 100755 index 0000000..640616f --- /dev/null +++ b/share/hydractl/provision-raspi @@ -0,0 +1,113 @@ +#!/bin/bash +# +# System installer, Raspberry Pi version. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public +# License along with this program. If not, see +# . + +# Load. +source $APP_BASE/lib/hydra/functions || exit 1 +hydra_config_load + +# Make sure there is provision config. +function hydra_provision_config { + hydra_user_config interactive y "Interactive mode? (y/n)" + hydra_user_config device /dev/mmcblk0 "Destination device" + hydra_user_config hostname machine "Hostname" + hydra_user_config domain example.org "Domain" + hydra_user_config arch armel "System arch" + hydra_user_config version jessie "Distro version" + hydra_user_config mirror http://http.debian.net/debian/ "Debian mirror" +} + +# Load configuration +hydra_provision_load_config + +# Parameters +WORK="/media/mmc" +CHROOT="hydra_sudo_run chroot $WORK" +CMDLINE="dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait" +RPI_URL="http://goo.gl/1BOfJ" + +# Get config parameters. +hydra_provision_config + +# Partitioning +# TODO automated +hydra_sudo_run cfdisk $device # bootable VFAT (0B) and linux partitions +hydra_sudo_run mkdir -p $WORK + +# Create filesystems +hydra_sudo_run mkdosfs -F32 "$device"p1 +hydra_sudo_run mkfs.ext4 "$device"p2 +hydra_sudo_run mount "$device"p2 $WORK + +# Bootstrap the system +hydra_sudo_run debootstrap --foreign --arch=$arch $version $WORK +hydra_sudo_run cp /usr/bin/qemu-arm-static $WORK/usr/bin/ +$CHROOT /debootstrap/debootstrap --second-stage + +# Apt configuration +echo "deb http://http.debian.net/debian/ $version main contrib non-free" | hydra_sudo_run tee $WORK/etc/apt/sources.list +echo "deb http://security.debian.org/ $version/updates main contrib non-free" | hydra_sudo_run tee -a $WORK/etc/apt/sources.list + +# Basic packages +$CHROOT apt-get update +$CHROOT apt-get install -y locales && $CHROOT dpkg-reconfigure locales +$CHROOT apt-get install -y screen cron lsb-release openssl openssh-server less ntp + +# Hostname +echo $hostname.$domain | hydra_sudo_run tee $WORK/etc/hostname + +# Temporary root password +$CHROOT passwd + +# USB stick support +$CHROOT apt-get install -y wpasupplicant firmware-ralink # para conexao usando stick usb +hydra_sudo_run chmod 0600 $WORK/etc/network/interfaces + +# Modules +echo "vchiq" | hydra_sudo_run tee -a $WORK/etc/modules +echo "snd_bcm2835" | hydra_sudo_run tee -a $WORK/etc/modules + +# Fstab +echo "Doing a basic network config..." +cat <<-EOF | hydra_sudo_run tee $WORK/etc/fstab > /dev/null +proc /proc proc defaults 0 0 +/dev/mmcblk0p1 /boot vfat defaults 0 2 +/dev/mmcblk0p2 / ext4 defaults,noatime 0 1 +EOF + +# Inittab +echo "T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100" | hydra_sudo_run tee -a $WORK/etc/inittab + +# Networking +hydra_provision_networking + +# Boot setup +hydra_sudo_run mount "$device"p1 /$WORK/boot/ +echo $CMDLINE | hydra_sudo_run tee $WORK/boot/cmdline.txt +$CHROOT apt-get install -y git-core binutils ca-certificates +$CHROOT wget $RPI_URL -O /usr/bin/rpi-update +$CHROOT chmod +x /usr/bin/rpi-update +$CHROOT touch /boot/start.elf +$CHROOT mkdir -p /lib/modules +$CHROOT rpi-update + +# Fingerprints +hydra_provision_fingerprints + +# Teardown +hydra_sudo_run umount $WORK/boot +hydra_sudo_run umount $WORK -- cgit v1.2.3