Added bmc.sh shell
This "shell" written in BASH provides the basic functionality of the Raspberry Pi BMC, making use of the WiringPi `gpio` command and `sudo` to allow privileged execution of certain functions by a non-root user.
This commit is contained in:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							7c1f6ddedb
						
					
				
				
					commit
					347c65dd1a
				
			
							
								
								
									
										174
									
								
								bmc.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								bmc.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,174 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
stty eof undef
 | 
			
		||||
stty intr undef
 | 
			
		||||
 | 
			
		||||
hostsystem="$( cat /etc/bmchost )"
 | 
			
		||||
packages=( screen wiringpi )
 | 
			
		||||
pkgfail=""
 | 
			
		||||
for package in ${packages[@]}; do
 | 
			
		||||
        dpkg -l | grep "^ii  ${package}" &>/dev/null || pkgfail="true"
 | 
			
		||||
done
 | 
			
		||||
if test -n "$pkgfail"; then
 | 
			
		||||
        echo -n "Installing required packages... "
 | 
			
		||||
        sudo apt update &>/dev/null
 | 
			
		||||
        sudo apt install -y ${packages[@]} &>/dev/null
 | 
			
		||||
        echo "done."
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
help() {
 | 
			
		||||
        echo -e "Available commands:"
 | 
			
		||||
        echo -e "  \e[1mstate\e[0m - Show the system power state"
 | 
			
		||||
        echo -e "  \e[1mconsole\e[0m - Connect to host via serial console; ^A+D to disconnect"
 | 
			
		||||
        echo -e "  \e[1mpowersw\e[0m - Press power switch on host"
 | 
			
		||||
        echo -e "  \e[1mresetsw\e[0m - Press reset switch on host"
 | 
			
		||||
        echo -e "  \e[1mkill\e[0m - Forcibly power off host"
 | 
			
		||||
        echo -e "  \e[1mhelp\e[0m - This help menu"
 | 
			
		||||
        echo -e "  \e[1mbmc\e[0m - Show BMC information"
 | 
			
		||||
        echo -e "  \e[1mhostname\e[0m - Set BMC hostname"
 | 
			
		||||
        echo -e "  \e[1mpassword\e[0m - Set BMC password"
 | 
			
		||||
        echo -e "  \e[1mshell\e[0m - Start a BMC bash shell"
 | 
			
		||||
        echo -e "  \e[1mexit/logout\e[0m - Disconnect from the BMC"
 | 
			
		||||
}
 | 
			
		||||
bmcinfo() {
 | 
			
		||||
        echo -e "BMC information:"
 | 
			
		||||
        echo -e "  IP address: $( ip -4 addr list eth0 | grep inet | awk '{ print $2 }' )"
 | 
			
		||||
        echo -e "  Hostname: $( hostname )"
 | 
			
		||||
        echo -e "  BMC temperature: $( /opt/vc/bin/vcgencmd measure_temp | awk -F'=' '{ print $2 }' )"
 | 
			
		||||
}
 | 
			
		||||
sethostname() {
 | 
			
		||||
        echo -n "Enter new hostname: "
 | 
			
		||||
        read newhostname
 | 
			
		||||
        sudo sed -i '/^127.0.1.1/d' /etc/hosts &>/dev/null
 | 
			
		||||
        sudo tee -a /etc/hosts <<<"127.0.1.1 $newhostname" &>/dev/null
 | 
			
		||||
        sudo hostname $newhostname &>/dev/null
 | 
			
		||||
        sudo tee /etc/hostname <<<"$newhostname" &>/dev/null
 | 
			
		||||
        echo "Hostname set to $newhostname"
 | 
			
		||||
}
 | 
			
		||||
setpassword() {
 | 
			
		||||
        echo -n "Enter new BMC password: "
 | 
			
		||||
        read -s password_1
 | 
			
		||||
        echo
 | 
			
		||||
        echo -n "Reenter new BMC password: "
 | 
			
		||||
        read -s password_2
 | 
			
		||||
        echo
 | 
			
		||||
        if [ "${password_1}" == "${password_2}" ]; then
 | 
			
		||||
                echo -n "Setting BMC password... "
 | 
			
		||||
                sudo chpasswd <<<"bmc:${password_1}"
 | 
			
		||||
                echo "done."
 | 
			
		||||
        else
 | 
			
		||||
                echo "Passwords to not match!"
 | 
			
		||||
        fi
 | 
			
		||||
}
 | 
			
		||||
resetsw() {
 | 
			
		||||
        echo -n "Pressing reset switch... "
 | 
			
		||||
        gpio mode 0 out
 | 
			
		||||
        gpio write 0 1
 | 
			
		||||
        gpio write 0 0
 | 
			
		||||
        sleep 1
 | 
			
		||||
        echo "done."
 | 
			
		||||
}
 | 
			
		||||
powersw() {
 | 
			
		||||
        if [ "$1" == "hard" ]; then
 | 
			
		||||
                delay='sleep 10'
 | 
			
		||||
                echo -n "Holding power switch... "
 | 
			
		||||
        else
 | 
			
		||||
                delay='sleep 1'
 | 
			
		||||
                echo -n "Pressing power switch... "
 | 
			
		||||
        fi
 | 
			
		||||
        gpio mode 1 out
 | 
			
		||||
        gpio write 1 1
 | 
			
		||||
        $delay
 | 
			
		||||
        gpio write 1 0
 | 
			
		||||
        sleep 2
 | 
			
		||||
        echo "done."
 | 
			
		||||
}
 | 
			
		||||
readpower() {
 | 
			
		||||
        gpio mode 2 in
 | 
			
		||||
        powerstate_raw=$(gpio read 2)
 | 
			
		||||
        if [ "${powerstate_raw}" -eq 1 ]; then
 | 
			
		||||
                powerstate="\e[32mOn\e[0m"
 | 
			
		||||
        else
 | 
			
		||||
                powerstate="\e[31mOff\e[0m"
 | 
			
		||||
        fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
readpower
 | 
			
		||||
echo
 | 
			
		||||
echo -e "--------------------"
 | 
			
		||||
echo -e "| Raspberry Pi BMC |"
 | 
			
		||||
echo -e "--------------------"
 | 
			
		||||
echo
 | 
			
		||||
echo -e "Host system: \e[1m${hostsystem}\e[0m"
 | 
			
		||||
echo -e "Host state: $powerstate"
 | 
			
		||||
echo
 | 
			
		||||
help
 | 
			
		||||
echo
 | 
			
		||||
while true; do
 | 
			
		||||
stty eof undef
 | 
			
		||||
stty intr undef
 | 
			
		||||
echo -en "\e[1m\e[34m[$(hostname)]>\e[0m "
 | 
			
		||||
read input
 | 
			
		||||
case $input in
 | 
			
		||||
        'state')
 | 
			
		||||
                readpower
 | 
			
		||||
                echo -e "Host state: $powerstate"
 | 
			
		||||
                echo
 | 
			
		||||
        ;;
 | 
			
		||||
        'console')
 | 
			
		||||
                echo "Starting console..."
 | 
			
		||||
                sudo screen -r serialconsole &>/dev/null || sudo screen -S serialconsole /dev/ttyUSB0 115200
 | 
			
		||||
                echo
 | 
			
		||||
        ;;
 | 
			
		||||
        'powersw')
 | 
			
		||||
                powersw soft
 | 
			
		||||
                readpower
 | 
			
		||||
                echo -e "Host state: $powerstate"
 | 
			
		||||
                echo
 | 
			
		||||
        ;;
 | 
			
		||||
        'resetsw')
 | 
			
		||||
                resetsw
 | 
			
		||||
                readpower
 | 
			
		||||
                echo -e "Host state: $powerstate"
 | 
			
		||||
                echo
 | 
			
		||||
        ;;
 | 
			
		||||
        'kill')
 | 
			
		||||
                powersw hard
 | 
			
		||||
                readpower
 | 
			
		||||
                echo -e "Host state: $powerstate"
 | 
			
		||||
                echo
 | 
			
		||||
        ;;
 | 
			
		||||
        'help')
 | 
			
		||||
                help
 | 
			
		||||
                echo
 | 
			
		||||
        ;;
 | 
			
		||||
        'bmc')
 | 
			
		||||
                bmcinfo
 | 
			
		||||
                echo
 | 
			
		||||
        ;;
 | 
			
		||||
        'hostname')
 | 
			
		||||
                sethostname
 | 
			
		||||
                echo
 | 
			
		||||
        ;;
 | 
			
		||||
        'password')
 | 
			
		||||
                setpassword
 | 
			
		||||
                echo
 | 
			
		||||
        ;;
 | 
			
		||||
        'shell')
 | 
			
		||||
                stty sane
 | 
			
		||||
                /bin/bash
 | 
			
		||||
                help
 | 
			
		||||
                echo
 | 
			
		||||
        ;;
 | 
			
		||||
        'exit'|'logout')
 | 
			
		||||
                exit 0
 | 
			
		||||
        ;;
 | 
			
		||||
        '')
 | 
			
		||||
                continue
 | 
			
		||||
        ;;
 | 
			
		||||
        *)
 | 
			
		||||
                echo "Invalid command."
 | 
			
		||||
                echo
 | 
			
		||||
        ;;
 | 
			
		||||
esac
 | 
			
		||||
done
 | 
			
		||||
		Reference in New Issue
	
	Block a user