| #!/bin/bash |
| |
| # Copyright 2019 Google Inc. All rights reserved. |
| |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| if [[ "$OSTYPE" != "linux-gnu" ]]; then |
| echo "error: must be running linux" |
| exit 1 |
| fi |
| |
| # escalate to superuser |
| if [ "$UID" -ne 0 ]; then |
| exec sudo bash "$0" |
| fi |
| |
| cleanup() { |
| echo "Starting up network-manager..." |
| service network-manager start |
| if [ $? != 0 ]; then |
| echo "error: failed to start network-manager" |
| exit 1 |
| fi |
| |
| echo "Starting up networking..." |
| service networking start |
| if [ $? != 0 ]; then |
| echo "error: failed to start networking" |
| exit 1 |
| fi |
| if [ ! -z "$1" ]; then |
| exit $1 |
| fi |
| } |
| |
| sleep_time=0.1 |
| max_attempts=100 |
| DEFAULTNET=$1 |
| if [ "$DEFAULTNET" == "" ]; then |
| warn_no_default_network=0 |
| warn_disconnect_rockpi=0 |
| attempts=0 |
| while true; do |
| NETLIST=`ip link | grep "state UP" | sed 's/[0-9]*: \([^:]*\):.*/\1/'` |
| if [[ "${NETLIST}" == "" ]]; then |
| if [[ $warn_no_default_network -eq 0 ]]; then |
| echo "error: couldn't detect any connected default network" |
| warn_no_default_network=1 |
| fi |
| continue |
| elif [ `echo "${NETLIST}" | wc -l` -eq 1 ]; then |
| DEFAULTNET=${NETLIST} |
| break |
| elif [ `echo "${NETLIST}" | wc -l` -ne 1 ]; then |
| if [[ $warn_disconnect_rockpi -eq 0 ]]; then |
| echo "Please disconnect the network cable from the Rock Pi" |
| warn_disconnect_rockpi=1 |
| fi |
| if [[ ${attempts} -gt ${max_attempts} ]]; then |
| echo -e "\nerror: detected multiple connected networks, please tell me what to do:" |
| count=1 |
| for net in ${NETLIST}; do |
| echo "${count}) $net" |
| let count+=1 |
| done |
| read -p "Enter the number of your default network connection: " num_default |
| count=1 |
| for net in ${NETLIST}; do |
| if [ ${count} -eq ${num_default} ]; then |
| echo "Setting default to: ${net}" |
| DEFAULTNET=${net} |
| fi |
| let count+=1 |
| done |
| warn_no_default_network=0 |
| break |
| fi |
| echo -ne "\r" |
| printf "Manual configuration in %.1f seconds..." "$(( max_attempts-attempts ))e-1" |
| sleep $sleep_time |
| fi |
| let attempts+=1 |
| done |
| fi |
| echo "Found default network at ${DEFAULTNET}" |
| |
| if [ "${ROCKNET}" == "" ]; then |
| echo "Please reconnect network cable from Rock Pi to PC's spare network port" |
| attempts=0 |
| while true; do |
| NETLIST=`ip link | grep "state UP" | grep -v $DEFAULTNET | sed 's/[0-9]*: \([^:]*\):.*/\1/' | awk 'NF'` |
| networks=`echo "$NETLIST" | wc -l` |
| if [[ "${NETLIST}" == "" ]]; then |
| networks=0 |
| fi |
| if [ $networks -eq 1 ]; then |
| ROCKNET=${NETLIST} |
| break |
| elif [ $networks -gt 1 ]; then |
| if [[ ${attempts} -gt ${max_attempts} ]]; then |
| echo -e "\nerror: detected multiple connected networks, please tell me what to do:" |
| count=1 |
| for net in ${NETLIST}; do |
| echo "${count}) $net" |
| let count+=1 |
| done |
| read -p "Enter the number of your rock pi network connection: " num_rockpi |
| count=1 |
| for net in ${NETLIST}; do |
| if [ ${count} -eq ${num_rockpi} ]; then |
| echo "Setting rock pi to: ${net}" |
| ROCKNET=${net} |
| fi |
| let count+=1 |
| done |
| break |
| fi |
| echo -ne "\r" |
| printf "Manual configuration in %.1f seconds..." "$(( max_attempts-attempts ))e-1" |
| let attempts+=1 |
| fi |
| sleep $sleep_time |
| done |
| fi |
| echo "Found Rock Pi network at ${ROCKNET}" |
| sudo ifconfig ${ROCKNET} down |
| |
| echo "Downloading dnsmasq..." |
| apt-get install -d -y dnsmasq >/dev/null |
| |
| echo "Shutting down network-manager to prevent interference..." |
| service network-manager stop |
| if [ $? != 0 ]; then |
| echo "error: failed to stop network-manager" |
| cleanup 1 |
| fi |
| |
| echo "Shutting down networking to prevent interference..." |
| service networking stop |
| if [ $? != 0 ]; then |
| echo "error: failed to stop networking" |
| cleanup 1 |
| fi |
| |
| echo "Installing dnsmasq..." |
| apt-get install dnsmasq >/dev/null |
| |
| echo "Enabling dnsmasq daemon..." |
| cat /etc/default/dnsmasq | grep "ENABLED" >/dev/null |
| if [ $? == 0 ]; then |
| sed -i 's/.*ENABLED.*/ENABLED=1/' /etc/default/dnsmasq |
| else |
| echo "ENABLED=1" >> /etc/default/dnsmasq |
| fi |
| |
| echo "Configuring dnsmasq for Rock Pi network..." |
| cat >/etc/dnsmasq.d/${ROCKNET}.conf << EOF |
| interface=${ROCKNET} |
| bind-interfaces |
| except-interface=lo |
| dhcp-authoritative |
| leasefile-ro |
| port=0 |
| dhcp-range=192.168.0.100,192.168.0.199 |
| EOF |
| |
| echo "Configuring udev rules..." |
| cat >/etc/udev/rules.d/82-${ROCKNET}.rules <<EOF |
| ACTION=="add", SUBSYSTEM=="net", KERNEL=="${ROCKNET}", ENV{NM_UNMANAGED}="1" |
| EOF |
| |
| echo "Configuring network interface..." |
| cat >/etc/network/interfaces.d/${ROCKNET}.conf <<EOF |
| auto ${ROCKNET} |
| iface ${ROCKNET} inet static |
| address 192.168.0.1 |
| netmask 255.255.255.0 |
| EOF |
| |
| echo "Enabling IP forwarding..." |
| echo 1 >/proc/sys/net/ipv4/ip_forward |
| |
| echo "Creating IP tables rules script..." |
| cat > /usr/local/sbin/iptables-rockpi.sh << EOF |
| #!/bin/bash |
| /sbin/iptables -A FORWARD -i ${ROCKNET} -o ${DEFAULTNET} -m state --state RELATED,ESTABLISHED -j ACCEPT |
| /sbin/iptables -A FORWARD -i ${ROCKNET} -o ${DEFAULTNET} -j ACCEPT |
| /sbin/iptables -t nat -A POSTROUTING -o ${DEFAULTNET} -j MASQUERADE |
| EOF |
| sudo chown root:root /usr/local/sbin/iptables-rockpi.sh |
| sudo chmod 750 /usr/local/sbin/iptables-rockpi.sh |
| |
| echo "Creating IP tables rules service..." |
| cat > /etc/systemd/system/iptables-rockpi.service << EOF |
| [Unit] |
| Description=iptables rockpi service |
| After=network.target |
| |
| [Service] |
| Type=oneshot |
| ExecStart=/usr/local/sbin/iptables-rockpi.sh |
| RemainAfterExit=true |
| StandardOutput=journal |
| |
| [Install] |
| WantedBy=multi-user.target |
| EOF |
| |
| echo "Reloading systemd manager configuration..." |
| sudo systemctl daemon-reload |
| |
| echo "Start IP tables rules service..." |
| sudo systemctl enable iptables-rockpi |
| sudo systemctl start iptables-rockpi |
| |
| cleanup |
| |
| echo "Restarting dnsmasq service..." |
| service dnsmasq restart |
| if [ $? != 0 ]; then |
| echo "error: failed to restart dnsmasq" |
| exit 1 |
| fi |
| |
| # Verify the Rock Pi was configured correctly |
| ip link show ${ROCKNET} >/dev/null |
| if [ $? != 0 ]; then |
| echo "error: wasn't able to successfully configure connection to Rock Pi" |
| exit 1 |
| fi |
| |
| echo "Searching for Rock Pi's IP address..." |
| while true; do |
| rockip=`cat /proc/net/arp | grep ${ROCKNET} | grep -v 00:00:00:00:00:00 | cut -d" " -f1` |
| if [[ ${#rockip} -ge 7 ]] && [[ ${#rockip} -le 15 ]]; then |
| break |
| fi |
| sleep 0.1 |
| done |
| |
| echo "Writing Rock Pi configuration to ~/.ssh/config..." |
| USER_HOME=$(getent passwd $SUDO_USER | cut -d: -f6) |
| grep -w "Host rock01" $USER_HOME/.ssh/config > /dev/null 2>&1 |
| if [ $? != 0 ]; then |
| cat >>$USER_HOME/.ssh/config << EOF |
| Host rock01 |
| HostName ${rockip} |
| User vsoc-01 |
| IdentityFile ~/.ssh/rock01_key |
| LocalForward 6520 127.0.0.1:6520 |
| LocalForward 6444 127.0.0.1:6444 |
| EOF |
| else |
| sed -i '/Host rock01/{n;s/.*/ HostName '${rockip}'/}' $USER_HOME/.ssh/config |
| fi |
| grep -w "Host rockpi01" $USER_HOME/.ssh/config > /dev/null 2>&1 |
| if [ $? != 0 ]; then |
| cat >>$USER_HOME/.ssh/config << EOF |
| Host rockpi01 |
| HostName ${rockip} |
| User vsoc-01 |
| IdentityFile ~/.ssh/rock01_key |
| EOF |
| else |
| sed -i '/Host rockpi01/{n;s/.*/ HostName '${rockip}'/}' $USER_HOME/.ssh/config |
| fi |
| |
| sudo chown $SUDO_USER:`id -ng $SUDO_USER` $USER_HOME/.ssh/config |
| sudo chmod 600 $USER_HOME/.ssh/config |
| |
| echo "Creating ssh key..." |
| sudo -u $SUDO_USER echo "n" | sudo -u $SUDO_USER ssh-keygen -q -t rsa -b 4096 -f $USER_HOME/.ssh/rock01_key -N '' >/dev/null 2>&1 |
| tmpfile=`mktemp` |
| echo "echo cuttlefish" > "$tmpfile" |
| chmod a+x "$tmpfile" |
| chown $SUDO_USER "$tmpfile" |
| sudo SSH_ASKPASS="${tmpfile}" DISPLAY=:0 su $SUDO_USER -c "setsid -w ssh-copy-id -i ${USER_HOME}/.ssh/rock01_key -o StrictHostKeyChecking=no vsoc-01@${rockip} >/dev/null 2>&1" |
| if [ $? != 0 ]; then |
| sed -i "/${rockip}/d" ${USER_HOME}/.ssh/known_hosts |
| sudo SSH_ASKPASS="${tmpfile}" DISPLAY=:0 su $SUDO_USER -c "setsid -w ssh-copy-id -i ${USER_HOME}/.ssh/rock01_key -o StrictHostKeyChecking=no vsoc-01@${rockip} >/dev/null 2>&1" |
| if [ $? != 0 ]; then |
| echo "error: wasn't able to connect to Rock Pi over ssh" |
| exit 1 |
| fi |
| fi |
| |
| echo "Successfully configured!" |
| echo " Host: 192.168.0.1" |
| echo "RockPi: ${rockip}" |
| echo "SSH Alias: rock01 (auto port-forwarding)" |
| echo "SSH Alias: rockpi01 (no port-forwarding)" |