commit ea57dea11e8d42f0908dba74199239679bda60d3 Author: Luke Murphy Date: Tue Jun 4 17:13:24 2019 +0200 WIP: A first stab at getting the script out and done diff --git a/README.md b/README.md new file mode 100644 index 0000000..6eb2b84 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# bibliotecha-install + +The script to install Bibliotecha. + +> https://install.bibliotecha.info diff --git a/bibliotecha.sh b/bibliotecha.sh new file mode 100755 index 0000000..60bc101 --- /dev/null +++ b/bibliotecha.sh @@ -0,0 +1,281 @@ +#!/bin/bash +# ____ _ _ _ _ _ _ +# | _ \(_) | | (_) | | | | +# | |_) |_| |__ | |_ ___ | |_ ___ ___| |__ __ _ +# | _ <| | '_ \| | |/ _ \| __/ _ \/ __| '_ \ / _` | +# | |_) | | |_) | | | (_) | || __/ (__| | | | (_| | +# |____/|_|_.__/|_|_|\___/ \__\___|\___|_| |_|\__,_| +# +# Digital books need libraries too +# +# This install script is intended for use with Debian based +# distributions. More specifically, Debian Stretch, which is +# currently the latest distribution release from the Debian +# project. +# +# License +# ======= +# +# Copyright (C) 2019 Bibliotecha Contributors +# +# 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 . +# +# Thanks +# ===== +# +# This script is based on the good work of the Freedombone project: +# https://code.freedombone.net/bashrc/freedombone/src/stretch/src/freedombone + +APT_CMD="apt -q" +APT_INSTALL_CMD="$APT_CMD install -y --no-install-recommends" + +function await_any_key { + echo "" + # shellcheck disable=SC2034 + read -n1 -rsp $"Press any key to continue ..." key + echo "" +} + +function ensure_root_account { + echo "Checking user account ..." + + if ! id | grep -q root; then + echo "" + echo "This script must be run as root" + echo "You can switch to the root user account with:" + echo "$ sudo -i" + echo "" + exit 0 + fi +} + +function show_bibliotecha_banner { + echo "" + echo " ____ _ _ _ _ _ _ " + echo " | _ \(_) | | (_) | | | |" + echo " | |_) |_| |__ | |_ ___ | |_ ___ ___| |__ __ _ " + echo " | _ <| | '_ \| | |/ _ \| __/ _ \/ __| '_ \ / _' |" + echo " | |_) | | |_) | | | (_) | || __/ (__| | | | (_| |" + echo " |____/|_|_.__/|_|_|\___/ \__\___|\___|_| |_|\__,_|" + echo "" + echo " Digital books need libraries too" + echo "" +} + +function show_introduction_text { + echo "" + echo "Welcome to the Bibliotecha installation script" + echo "" + echo "This script will setup the following infrastructure:" + echo "" + echo "* A Python 3 environment" + echo "* A Wifi hotspot, DNS server and DHCP service" + echo "* A Lighttpd web server" + echo "* A Calibre server" + echo "* A Calibre-web service" + echo "" + echo "Once the script is finished, please see post-install steps" + echo "that are documented and available from the Bibliotecha manual:" + echo "" + echo " https://manual.bibliotecha.info/#TODO" + echo "" + + await_any_key +} + +function ensure_stretch_based_distribution { + echo "Checking distribution ..." + + local installing_on_stretch_based=1 + + if [ ! -f /usr/bin/foobar ]; then + installing_on_stretch_based= + fi + + if [ ! -f /etc/apt/sources.list ]; then + installing_on_stretch_based= + else + if ! grep -q 'stretch' /etc/apt/sources.list; then + installing_on_stretch_based= + fi + if ! grep -q 'debian' /etc/apt/sources.list; then + if ! grep -q 'raspbian' /etc/apt/sources.list; then + installing_on_stretch_based= + fi + fi + fi + + if [ ! $installing_on_stretch_based ]; then + echo $"You should only run this on a Debian Stretch based system" + exit 0 + fi +} + +function run_apt_update { + echo "Running a package listing update ..." + + $APT_CMD update +} + +function install_networking_packages { + echo "Installing networking packages ..." + + $APT_INSTALL_CMD \ + dhcpcd \ + dnsmasq \ + dnsutils \ + hostapd \ + wireless-tools +} + +function disable_networking_services { + echo "Stopping the networking services ..." + + local services="dnsmasq hostapd" + + systemctl stop ${services} +} + +function ensure_variable_set { + local variable="${1}" + + if [[ -z "${variable}" ]]; then + echo $"${variable} is not set. Cannot proceed ..." + exit 1 + fi +} + +function configure_network_interfaces { + echo "Configuring networking interfaces ..." + + ethernet_interface=$(ls /sys/class/net/ | grep foo) + local ethernet_filename="/etc/network/interfaces.d/${ethernet_interface}" + + if [[ -z "${ethernet_interface}" ]]; then + echo "" + echo "Could not determine the ethernet interface" + echo "Please ensure you've configure 'predictable network interfaces'" + echo "Please see #TODO for more" + echo "" + exit 1 + fi + + { echo "auto eth0"; + echo "allow-hotplug ${ethernet_interface}"; + echo "iface ${ethernet_interface} inet dhcp"; } > "${ethernet_filename}" + + local wireless_interface=$(ls /sys/class/net/ | grep wl) + local wireless_filename="/etc/network/interfaces.d/${wireless_interface}" + + if [[ -z "${wireless_interface}" ]]; then + echo "" + echo "Could not determine the wireless interface" + echo "Please ensure you've configure 'predictable network interfaces'" + echo "Please see #TODO for more" + echo "" + exit 1 + fi + + { echo "auto ${wireless_interface}"; + echo "iface ${wireless_interface} int static"; + echo " address 10.0.0.1"; + echo " netmask 255.255.255.0"; } > "${wireless_filename}" +} + +function configure_dnsmasq { + echo "Configuring dnsmasq ..." + + local wireless_interface=$(ls /sys/class/net/ | grep wl) + local wireless_filename="/etc/dnsmasq.d/${wireless_interface}.conf" + + if [[ -z "${wireless_interface}" ]]; then + echo "" + echo "Could not determine the wireless interface" + echo "Please ensure you've configure 'predictable network interfaces'" + echo "Please see #TODO for more" + echo "" + exit 1 + fi + + { echo "bogus-priv" + echo "server=/library/10.0.0.1" + echo "local=/library/" + echo "address=/#/10.0.0.1" + echo "interface=${wireless_interface}" + echo "domain=library" + echo "dhcp-range=10.0.0.50,10.0.0.200,255.255.255.0,12h" + echo "dhcp-option=3,10.0.0.1" + echo "dhcp-option=6,10.0.0.1" + echo "dhcp-authoritative"; } > "${wireless_filename}" +} + +function configure_hostapd { + echo "Configuring hostapd ..." + + local wireless_interface=$(ls /sys/class/net/ | grep wl) + local hostapd_filename="/etc/hostapd/hostapd.conf" + + if [[ -z "${wireless_interface}" ]]; then + echo "" + echo "Could not determine the wireless interface" + echo "Please ensure you've configure 'predictable network interfaces'" + echo "Please see #TODO for more" + echo "" + exit 1 + fi + + { echo "interface=${wireless_interface}" + echo "ssid=Bibliotecha" + echo "hw_mode=g" + echo "channel=11" + echo "auth_algs=1"; } > "${hostapd_filename}" + + sed -i \ + 's/#DAEMON_CONF=""/DAEMON_CONF="\/etc\/hostapd\/hostapd.conf"/g' \ + /etc/default/hostapd +} + +function enable_networking_services { + echo "Enabling network services ..." + + local services="dnsmasq hostapd" + + systemctl unmask hostapd + systemctl enable ${services} +} + +function run_installation { + #ensure_root_account + #ensure_stretch_based_distribution + + #show_bibliotecha_banner + #show_introduction_text + + #run_apt_update + + #install_networking_packages + #disable_networking_services + #configure_network_interfaces + #configure_dnsmasq + #configure_hostapd + #enable_networking_services + + # TODO + # install lighttpd and configure it + # install calibre web and configure it + # setup drone and make sure things are being tested +} + +run_installation +exit 0