#!/bin/bash ################################################################## # # # # # # # # # ##### # # # # # # # # # # ## # # # # # # # # # # # # # # # # # # # # # ## # # ##### ####### # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##### # # # # # ################################################################## MYPATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" BASE=${MYPATH}/base.txt FUNCTIONS=${MYPATH}/functions ADDITIONAL=${MYPATH}/additional.txt UTILITY=${MYPATH}/utility.txt FLSUITE=${MYPATH}/flsuite.txt CONFIG=${MYPATH}/config LOGO=${MYPATH}/logo.png TEMPCRON=${MYPATH}/cron.tmp VERSION=$(grep "version=" ${MYPATH}/changelog | sed 's/version=//') DATE=$(date) UPDATEFILE=/run/user/1000/bapupdate.txt FINISH() { if [ -f "${BASE}" ]; then rm ${BASE} fi if [ -f "${ADDITIONAL}" ]; then rm ${ADDITIONAL} fi if [ -f "${FLSUITE}" ]; then rm ${FLSUITE} fi if [ -f "${UTILITY}" ]; then rm ${UTILITY} fi } trap FINISH EXIT #remove temp dir if exist #fix issue 108 https://github.com/km4ack/pi-build/issues/108 #Thanks to N5RKS for finding the bug if [ -d ${HOME}/pi-build/temp ]; then rm -rf "${HOME}/pi-build/temp" fi ##################################### # Create autostart dir #used to autostart conky at boot ##################################### mkdir -p ${HOME}/.config/autostart #Check for BAP updates #Check for build a pi updates echo "Checking for Build a Pi updates" CURRENT=$(head -1 ${MYPATH}/changelog | sed s'/version=//') LATEST=$(curl -s https://raw.githubusercontent.com/km4ack/pi-build/master/changelog | tac | tac | head -1 | sed 's/version=//') if (($(echo "$LATEST $CURRENT" | awk '{print ($1 > $2)}'))); then cat <${MYPATH}/updatebap.txt Build a Pi update available. Current version is $CURRENT and the lateest version is $LATEST. Would you like to update? Change log - https://github.com/km4ack/pi-build/blob/master/changelog EOF BAP=$( yad --width=650 --height=250 --text-align=center --center --title="Build-a-Pi" --show-uri \ --image ${LOGO} --window-icon=${LOGO} --image-on-top --separator="|" --item-separator="|" \ --text-info \ --button="Yes":2 \ --button="No":3 <${MYPATH}/updatebap.txt ) BUT=$? echo ${BUT} ########## if [ ${BUT} = 252 ]; then exit elif [ ${BUT} = 2 ]; then wget -q --tries=5 --timeout=10 --spider http://google.com #| yad --center --progress --pulsate --timeout-indicator=top --auto-close --no-buttons --text="Checking internet connection" if [[ $? -eq 1 ]]; then yad --center --timeout=3 --timeout-indicator=top --no-buttons --text="You are not connected to the internet" exit fi echo "Updating Build a Pi to $LATEST" mv ${MYPATH}/config ${HOME}/Documents/config.bap rm -rf "${MYPATH}" cd ~ || ! echo "Failure" git clone https://github.com/km4ack/pi-build.git mv ${HOME}/Documents/config.bap ${MYPATH}/config cat <${MYPATH}/updatebap.txt Build a Pi has been updated to $LATEST. Please restart Build a Pi. EOF BAP=$( yad --width=650 --height=250 --text-align=center --center --title="Build-a-Pi" --show-uri \ --image ${LOGO} --window-icon=${LOGO} --image-on-top --separator="|" --item-separator="|" \ --text-info \ --button="OK":2 <${MYPATH}/updatebap.txt ) BUT=$? exit 0 fi ########## fi rm ${MYPATH}/updatebap.txt >>/dev/null 2>&1 rm ${MYPATH}/complete.txt >>/dev/null 2>&1 clear ##################################### # Patch Check ##################################### #This check first looks at the README.md file to see if the PATCH var is YES. #If PATCH=YES, then it looks to see if the patches that are available have #been applied previously. If so, it skips the patch screen. If not, it gives #the user an option to install the patch(es). PATCHCHECK=$(curl -s https://raw.githubusercontent.com/km4ack/pi-build/dev/patch/README.md | grep PATCH= | sed 's/PATCH=//') if [ ${PATCHCHECK} = "YES" ]; then #Setup temp directory for BAP patches and download patches echo "##########################################################" echo "#Checking for available patches that haven't been applied#" echo "##########################################################" cd /run/user/$UID git init pi-build cd pi-build git remote add -f origin https://github.com/km4ack/pi-build.git git config core.sparseCheckout true echo "/patch" >> .git/info/sparse-checkout git pull origin dev FILES=$(ls -I README.md /run/user/$UID/pi-build/patch) #check if available patches have already been applied to BAP for i in $FILES; do NAME=$(grep PATCHNAME= /run/user/$UID/pi-build/patch/$i | sed 's/PATCHNAME=//') RB=$(grep $NAME $HOME/.config/patch) if [ -z $RB ]; then echo "$NAME" >> /run/user/$UID/avail-patch.txt fi done #end check if [ -f /run/user/$UID/avail-patch.txt ]; then rm /run/user/$UID/avail-patch.txt cat <${MYPATH}/patch.txt One or more patch scripts are currently available for Build a Pi. Full description of each available patch can be found at https://github.com/km4ack/pi-build/tree/dev/patch Would you like to review/apply available patch scripts? EOF INTRO=$(yad --width=650 --height=300 --text-align=center --center --title="Build-a-Pi Patch Tool" --show-uri \ --image ${LOGO} --window-icon=${LOGO} --image-on-top --separator="|" --item-separator="|" --text="Build-a-Pi Patch Tool" \ --text-info \ --button="Yes":1 \ --button="No":2 <${MYPATH}/patch.txt \ >/dev/null 2>&1) BUT=$? if [ ${BUT} = 252 ]; then echo "Button ${BUT} pressed" rm ${MYPATH}/patch.txt rm -rf /run/user/$UID/pi-build exit elif [ ${BUT} = 1 ]; then echo "Button ${BUT} pressed" rm ${MYPATH}/patch.txt lxterminal -e bash $HOME/pi-build/patch-menu && exit elif [ ${BUT} = 2 ]; then echo "Button ${BUT} pressed" rm ${MYPATH}/patch.txt echo "user declined patch updates continuing with Build a Pi update" rm -rf /run/user/$UID/pi-build fi else rm -rf /run/user/$UID/pi-build fi fi #Scan system for updated applications yad --width=550 --height=250 --text-align=center --center --title="Update" \ --image ${LOGO} --window-icon=${LOGO} --image-on-top --separator="|" --item-separator="|" \ --text="Version $VERSION\r\r\r\rFirst we need to scan the system to see what is installed, \ then check for updates on the web. This should take less than a minute. Ready when you are." \ --button="Exit":1 \ --button="Start Scan":2 BUT=$? if [ ${BUT} = 252 ] || [ ${BUT} = 1 ]; then exit fi #install bc if not installed if ! hash bc >/dev/null; then sudo apt install -y bc fi #Run the app check script bash $MYPATH/app-check ##################################### # Get User Call ##################################### CALL() { source ${MYPATH}/config INFO=$(yad --form --width=420 --text-align=center --center --title="Build-a-Pi" \ --image ${LOGO} --window-icon=${LOGO} --image-on-top --separator="|" --item-separator="|" \ --text="version ${VERSION}" \ --field="Call Sign*" "${CALL}" \ --field="* Required":LBL \ --button="Continue":2) BUT=$? if [ ${BUT} = 252 ]; then exit fi } CALL CALL=$(echo $INFO | awk -F "|" '{print $1}') CALL=${CALL^^} echo "CALL=${CALL}" >${CONFIG} #Verify call not empty if [ -z "${CALL}" ]; then yad --form --width=420 --text-align=center --center --title="Build-a-Pi" --text-align=center \ --image ${LOGO} --window-icon=${LOGO} --image-on-top --separator="|" --item-separator="|" \ --text="Call Can't be Blank" \ --button=gtk-ok CALL fi #----------------------------------------------------# # BASE APP MENU #----------------------------------------------------# source $UPDATEFILE yad --center --list --checklist --width=600 --height=600 --separator="" \ --image ${LOGO} --column=Check --column=App --column=status --column=description --print-column=2 \ --window-icon=${LOGO} --image-on-top --text-align=center \ --text="Base Apps" --title="Update" \ false "HAMLIB" "$RIG" "Rig Control" \ false "HOTSPOT" "$HOTSPOT" "Hot Spot Generator for Portable Ops" \ false "HSTOOLS" "$HSTOOLS" "Tools to Manage HotSpot" \ false "GPS" "${GPS}" "GPS Software" \ false "GPSUPDATE" "${GPSUPDATE}" "Tool to Manage GPS Devices" \ false "ARDOP" "$ARDOP" "Mode for HF" \ false "ARDOPGUI" "$ARDOPGUI" "GUI for ARDOP" \ false "DIREWOLF" "$DIRE" "Software TNC" \ false "AX25" "$AX25" "Data Link Layer Protocol" \ false "PULSE" "$PULSE" "Sound server" \ --button="Exit":1 \ --button="Next":2 >${BASE} BUT=$? if [ ${BUT} = 1 ] || [ ${BUT} = 252 ]; then exit fi ############################################################# #check if hotspot is chosen for install & get info if needed# ############################################################# HS=$(cat ${BASE} | grep HOTSPOT) if [ -n "$HS" ]; then HSINFO() { #unblock wifi sudo rfkill unblock all >/dev/null 2>&1 #bring wifi up sudo ifconfig wlan0 up #LIST=$(sudo iw dev "wlan0" scan ap-force | egrep "^BSS|SSID:" | grep SSID: | sed 's/SSID://' | awk '{ print $1 }') #LIST=$(echo $LIST | sed 's/ /|/g') #Thanks to https://github.com/kuperman for fixing wifi space issue with line below. LIST=$(sudo iw dev "wlan0" scan ap-force | sed -ne 's/^.*SSID: \(..*\)/\1/p' | sort | uniq | paste -sd '|') HSINFO=$(yad --center --form --width=400 --height=400 --separator="|" --item-separator="|" \ --image ${LOGO} --column=Check --column=App --column=Description \ --window-icon=${LOGO} --image-on-top --text-align=center \ --text="HotSpot Information\r\rPlease enter the information\rbelow \ for the Hot Spot\rNOTE: The last field is the password for the hotspot. You will use this password to \ connect to your Pi when it is in hotspot mode This password can only contain letters and numbers" \ --title="Build-a-Pi" \ --field="Home Wifi SSID":CB "${LIST}" \ --field="Home Wifi Password" \ --field="Hot Spot Password" \ --button="Exit":1 \ --button="Continue":2 \ --button="Refresh Wifi":3) #} THIS IS WHERE ORIGINAL FUNCTION STOPPED################ #HSINFO SEE COMMENT PREVIOUS LINE BUT=$? if [ ${BUT} = 3 ]; then HSINFO #Call HSINFO function fi if [ ${BUT} = 252 ] || [ ${BUT} = 1 ]; then exit fi } #THIS IS NEW FUNCTION END FOR TESTING#################### HSINFO fi SHACKSSID=$(echo $HSINFO | awk -F "|" '{print $1}') SHACKPASS=$(echo $HSINFO | awk -F "|" '{print $2}') HSPASS=$(echo $HSINFO | awk -F "|" '{print $3}') #Check password length if [ -n "$HS" ]; then COUNT=${#HSPASS} if [ $COUNT -lt 8 ]; then yad --center --form --width=300 --height=200 --separator="|" \ --image ${LOGO} --column=Check --column=App --column=Description \ --window-icon=${LOGO} --image-on-top --text-align=center \ --text="Hotspot password has to be 8-63 characters" --title="Build-a-Pi" \ --button=gtk-ok HSINFO fi fi echo "SHACKSSID=${SHACKSSID}" >>${CONFIG} echo "SHACKPASS=${SHACKPASS}" >>${CONFIG} echo "HSPASS=${HSPASS}" >>${CONFIG} ################################### #CHECK IF GPS IS CHOSEN TO INSTALL# ################################### GPSINSTALL=$(cat ${BASE} | grep GPS) if [ -n "${GPSINSTALL}" ]; then yad --center --height="300" --width="300" --form --separator="|" --item-separator="|" --title="GPS" \ --image ${LOGO} --window-icon=${LOGO} --image-on-top \ --text="\r\r\r\r\rConnect your GPS to the pi" \ --button="Exit":1 \ --button="Continue":2 BUT=$? if [ ${BUT} = 1 ] || [ ${BUT} = 252 ]; then exit fi USB=$(ls /dev/serial/by-id) USB=$(echo $USB | sed "s/\s/|/g") GPS=$(yad --center --height="600" --width="300" --form --separator="|" --item-separator="|" --title="GPS" \ --image ${LOGO} --window-icon=${LOGO} --image-on-top \ --text="Choose Your GPS" \ --field="GPS":CB "$USB") BUT=$? if [ ${BUT} = 252 ] || [ ${BUT} = 1 ]; then echo exiting exit fi GPS=$(echo ${GPS} | awk -F "|" '{print $1}') GPS=/dev/serial/by-id/${GPS} echo "GPS=${GPS}" >>${CONFIG} fi #----------------------------------------------------# # FLSUITE APP MENU #----------------------------------------------------# source $UPDATEFILE yad --center --list --checklist --width=600 --height=600 --separator="" \ --image ${LOGO} --column=Check --column=App --column=status --column=description --print-column=2 \ --window-icon=${LOGO} --image-on-top --text-align=center \ --text="FLDIGI Suite" --title="Update" \ false "FLRIG" "${FLRIG}" "Rig Control GUI" \ false "FLDIGI" "${FLDIGI}" "Digital Software" \ false "FLAMP" "${FLAMP}" "File Transfer Program" \ false "FLNET" "${FLNET}" "Net Control Software" \ false "FLMSG" "${FLMSG}" "Form Manager" \ false "FLWRAP" "${FLWRAP}" "File Encapsulation" \ --button="Exit":1 \ --button="Next":2 >${FLSUITE} BUT=$? if [ ${BUT} = 1 ] || [ ${BUT} = 252 ]; then exit fi #----------------------------------------------------# # HAM APP MENU #----------------------------------------------------# source $UPDATEFILE yad --center --list --checklist --width=600 --height=600 --separator="" \ --image ${LOGO} --column=Check --column=App --column=status --column=description --print-column=2 \ --window-icon=${LOGO} --image-on-top --text-align=center \ --text="HAM Apps" --title="Update" \ false "PAT" "$PAT" "Radio Email Application" \ false "PAT-MENU" "$PATMENU" "Control for Pat Winlink" \ false "CHIRP" "$CHIRP" "Program Radios" \ false "GARIM" "$GARIM" "File Transfer Program " \ false "M0IAX" "$M0IAX" "Tools for JS8Call messages" \ false "CONKY" "$CONKY" "System Information Display" \ false "WSJTX" "$FT8" "Weak signal digital mode software" \ false "JS8CALL" "$JS8" "Weak signal digital mode software" \ false "XASTIR" "$XASTIR" "APRS Client" \ false "YAAC" "$YAAC" "Yet Another APRS Client" \ false "PI-APRS" "$PIAPRS" "APRS Messaging Client" \ false "PYQSO" "$PYQSO" "Logging Software" \ false "CQRLOG" "$CQRLOG" "Logging Software" \ false "HAMRS" "$HAMRS" "Logging Software" \ false "QSSTV" "$QSSTV" "Slow scan TV" \ false "GRIDTRACKER" "$GRIDTRACK" "Track grids in WSJTX" \ false "HAMCLOCK" "$HAMCLOCK" "Clock for Ham Radio Ops" \ false "PROPAGATION" "$PROP" "Propagation prediction" \ false "EES" "$EES" "KM4ACK Emergency Email Server" \ false "GPREDICT" "$GPREDICT" "Satellite Tracking" \ false "TQSL" "$TQSL" "LOTW Software" \ false "GRIDCALC" "$GRIDCALC" "Grid Calculation Software" \ --button="Exit":1 \ --button="Next":2 >${ADDITIONAL} BUT=$? if [ ${BUT} = 1 ] || [ ${BUT} = 252 ]; then exit fi #check if hamclock is being installed HCCHECK=$(cat ${ADDITIONAL} | grep HAMCLOCK) if [ -n "$HCCHECK" ]; then HC=$(yad --form --width=420 --text-align=center --center --title="Build-a-Pi" \ --image ${LOGO} --window-icon=${LOGO} --image-on-top --separator="|" --item-separator="|" \ --text="version $VERSION" \ --field="Ham Clock Size":CB "SMALL|LARGE" \ --button="Continue":2) HC=$(echo $HC | awk -F "|" '{print $1}') sed -i 's/HAMCLOCK//' ${ADDITIONAL} echo $HC >>${ADDITIONAL} fi PATCHECK=$(cat ${ADDITIONAL} | grep PAT) if [ -n "$PATCHECK" ]; then INFO=$(yad --form --width=420 --text-align=center --center --title="Build-a-Pi" \ --image ${LOGO} --window-icon=${LOGO} --image-on-top --separator="|" --item-separator="|" \ --text="version $VERSION" \ --field="Six Character Grid Square" "$GRID" \ --field="Winlink Password" \ --field="Password is case sensitive":LBL \ --button="Continue":2) GRID=$(echo $INFO | awk -F "|" '{print $1}') GRID=${GRID^^} WL2KPASS=$(echo $INFO | awk -F "|" '{print $2}') echo "GRID=$GRID" >>${CONFIG} echo "WL2KPASS=\"$WL2KPASS\"" >>${CONFIG} fi #----------------------------------------------------# # UTILITIES MENU #----------------------------------------------------# source $UPDATEFILE yad --center --list --checklist --width=600 --height=600 --separator="" \ --image ${LOGO} --column=Check --column=App --column=status --column=description --print-column=2 \ --window-icon=${LOGO} --image-on-top --text-align=center \ --text="UTILITIES" --title="Update" \ false "DIPOLE" "$DIPOLE" "Dipole Calculator" \ false "PACKETSEARCH" "$PACKETSEARCH" "Winlink Packet Tool" \ false "CALLSIGN" "${CALLSIGN}" "Call Sign Lookup Utility" \ false "TEMPCONVERT" "$TEMPCONVERT" "Temperature Converter" \ false "GPARTED" "$GPARTED" "Disk Utility Application" \ false "RTC" "$RTC" "Real Time Clock" \ false "SHOWLOG" "$SHOWLOG" "Log File Viewer" \ false "PISTATS" "$PISTATS" "Pi3/4 Stats Monitor" \ false "TELNET" "$TEL" "Telnet Protocol" \ false "PITERM" "$PITERM" "PiQTermTCP Terminal Program" \ false "QTSOUND" "$QTSOUND" "PiQtSoundModem" \ false "SECURITY" "$SECURITY" "File Encryption Software" \ false "YGATE" "$YGATE" "Yaesu APRS Software" \ false "BPQ" "$BPQ" "LinBPQ Software" \ false "BATT" "$BATT" "Battery Test Script" \ false "VNC" "$VNC" "VNC Viewer Application" \ false "ZYGRIB" "$ZYGRIB" "Grib File Viewer" \ --button="Exit":1 \ --button="Install/Update Selected":2 >${UTILITY} BUT=$? if [ ${BUT} = 1 ] || [ ${BUT} = 252 ]; then exit fi #check and exit if nothing selected CKBASE=$(cat ${BASE}) CKFL=$(cat ${FLSUITE}) CKADD=$(cat ${ADDITIONAL}) CKUTIL=$(cat ${UTILITY}) if [ -z "$CKBASE" ] && [ -z "$CKFL" ] && [ -z "$CKADD" ] && [ -z "$CKUTIL" ]; then rm ${BASE} ${FLSUITE} ${ADDITIONAL} ${UTILITY} >/dev/null 2>&1 yad --width=550 --height=250 --text-align=center --center --title="Update" \ --image ${LOGO} --window-icon=${LOGO} --image-on-top --separator="|" --item-separator="|" \ --text="\r\r\r\rNothing selected for install/update" \ --button="CLOSE":1 exit fi #backup crontab crontab -l >${TEMPCRON} echo "@reboot sleep 10 && export DISPLAY=:0 && ${MYPATH}/.complete" >>${TEMPCRON} #update/upgrade the system sudo apt-get -y update sudo apt-get -y upgrade sudo apt -y full-upgrade ##################################### # Install Base Apps ##################################### touch ${HOME}/.config/KM4ACK echo "UPDATE=\"ran $DATE Version $VERSION\"" >> ${HOME}/.config/KM4ACK while read i; do source ${FUNCTIONS}/base.function $i done <${BASE} ##################################### # Install FLSUITE ##################################### source ${FUNCTIONS}/flsuite.function #perform memory increase if needed CHECKFL=$(cat ${MYPATH}/flsuite.txt) if [ -n "$CHECKFL" ]; then FLSTART fi touch ${HOME}/.config/KM4ACK while read i; do source ${FUNCTIONS}/flsuite.function $i done <${FLSUITE} source ${FUNCTIONS}/flsuite.function if [ -n "$CHECKFL" ]; then FLSTOP fi ##################################### # Install ADDITIONAL Apps ##################################### while read i; do source ${FUNCTIONS}/additional.function $i done <${ADDITIONAL} ##################################### # Install KM4ACK Utilites ##################################### while read i; do source ${FUNCTIONS}/utility.function $i done <${UTILITY} #create new menu subcategories. One for FLDIGI Suite and #one for Build a Pi. bash ${HOME}/pi-build/menu-update ##################################### # END CLEANUP ##################################### #Remove temp files rm ${BASE} ${ADDITIONAL} ${UTILITY} ${FLSUITE} >/dev/null 2>&1 #restore crontab crontab ${TEMPCRON} rm ${TEMPCRON} ##################################### # Pat 12 Temp Workaround ##################################### #This will move the user to the "version12" branch of the Pat Menu code #until this can be implemented into the main branch of code. This will #allow Pat Menu to support both the new version of Pat as well as older #versions. This section of code needs to be removed once the "version12" #branch is merged with the master branch PAT_VERSION=$(pat version | awk '{print $2}' | sed 's/v0.//;s/.0//') if [ "$PAT_VERSION" -le 11 ]; then echo "pat version 11 detected" else echo "pat version 12 or greater detected" echo "moving pat menu to the version12 branch" cd $HOME/patmenu2 git pull git checkout version12 fi ##################################### # END Pat 12 Temp Workaround ##################################### #reboot when done yad --width=400 --height=200 --title="Reboot" --image ${LOGO} \ --text-align=center --skip-taskbar --image-on-top \ --wrap --center --window-icon=${LOGO} \ --undecorated --text="Update Finished \rReboot Required\r\r" \ --button="Reboot Now":0 \ --button="Exit":1 BUT=$(echo $?) if [ ${BUT} = 0 ]; then echo rebooting sudo reboot elif [ ${BUT} = 1 ]; then exit fi