Index: scripts/globals.sh =================================================================== diff -u -rd4988df80c5d03fe46e42c9563043ae281247278 -rb003a83a376146935b9c0f707fc838a471738a9c --- scripts/globals.sh (.../globals.sh) (revision d4988df80c5d03fe46e42c9563043ae281247278) +++ scripts/globals.sh (.../globals.sh) (revision b003a83a376146935b9c0f707fc838a471738a9c) @@ -8,8 +8,8 @@ # # @file globals.sh # -# @author (last) Vy -# @date (last) 20-May-2023 +# @author (last) Behrouz NematiPour +# @date (last) 15-Dec-2022 # @author (original) Behrouz NematiPour # @date (original) 15-Dec-2022 # @@ -26,7 +26,7 @@ DATETIME="$1 $2" -#DO NOT MODIFY VARIABLES, unless the denali applicaiton is updated as well to match. +#DO NOT MODIFY VARIABLES, unless the denali application is updated as well to match. SDCARD_DEV=/dev/mmcblk1 SDCARD_PRT=/dev/mmcblk1p1 SDCARD_MNT=/media/sd-card @@ -68,11 +68,10 @@ DST_PATH_SCRIPTS="/home/$DST_USER/scripts" DST_PATH_CLOUDSYNC="/home/$DST_USER/cloudsync" DST_PATH_FONTS="/usr/share/fonts/truetype" -DST_PATH_BT_CONF="/etc/bluetooth/" -POSTLOG=$HOME/post.log -POSTERR=$HOME/post.err -POSTOUT=$HOME/post.out +POSTLOG=/tmp/post.log +POSTERR=/tmp/post.err +POSTOUT=/tmp/post.out POSTMSG_POSTFIX_PASSED=" passed" POSTMSG_POSTFIX_FAILED=" failed" POSTMSG_CANBUS="CANBus" @@ -84,6 +83,7 @@ POSTMSG_SHASUM="App shasum" POSTMSG_CLOUDSYNC="CloudSync" POSTMSG_CLOUDSYNC_RUNNING="CloudSync app IS running" +POSTMSG_SETTINGSCRC="SettingsCRC" TDCTL_NTP_USED=$FALSE TDCTL_RTC_LOCL=$TRUE @@ -103,6 +103,33 @@ DENALI_BIN=denali LAUNCH_SCR=run.sh +SETUP_CONF_FILE="setup.conf" +SETUP_ENABLE_MANUFACTURING_MODE="ManufacturingMode 1" + +APPLICATION_PARAMS="&" + +CloudSync_DRT_SERVER_IP=172.31.99.117 +CloudSync_DRT_SERVER_PORT=80 + +CLOUD_USER=cloud +CLOUD_HOME=/home/$CLOUD_USER +DENALI_USER=denali +DENALI_HOME=/home/$DENALI_USER + +SETTING_CONF_FOLDER_PATH=/var/configurations +SETTINGS_CRC_FILE_PATH=$DENALI_HOME/settings.crc + +function user_input() { + read -p "$1? $2" -n 1 -r + if [ "$CONTINUE" == "y" ]; then + echo "" + return $TRUE + else + echo "" + return $FALSE + fi +} + function confirm() { read -p "$1? [y,n]" -n 1 -r CONTINUE if [ "$CONTINUE" == "y" ]; then @@ -114,7 +141,7 @@ fi } -string_trim() { +function string_trim() { local var="$*" # remove leading whitespace characters var="${var#"${var%%[![:space:]]*}"}" @@ -163,6 +190,26 @@ return 0 } +# Does the file contain a string? if +# not, add a line at end. +# If $1 not in $2 then append line $3 to end. +# $1 What to look for. +# $2 File name. +# $3 What to add. +function appendIfMissing() { + # q for quiet, F for regular string match, not -x because not full line. + # Done as one command because this is done remotely. + grep -qF $1 $2 || echo $3 >> $2 +} + + +# Remove all lines that contain $1 in file $2 then append $3. +# $1 What to look for. +# $2 File name. +function removeIfFound() { + sed -i /${1}/d $2 +} + function existsFolder() { if [ ! -d "$1" ]; then return "$ERR_MISSING_FOLDER" @@ -176,6 +223,10 @@ } COUT="/dev/null" +function setupConsoleout() { + # /dev/ttymxc1 + COUT="/dev/$(echo $(dmesg | grep "printk: console") | sed 's/.*printk: console.*\(tty.*\)].*/\1/')" +} function post_log_clear () { echo "" > $POSTLOG; } function post_err_clear () { echo "" > $POSTERR; } @@ -198,3 +249,332 @@ echo_dash_message "$1" echo_dash_comment } + + +function disableRootSSH() { + local SSHD_CONFIG="/etc/ssh/sshd_config" + sudo sed -i '/PermitRootLogin/c\PermitRootLogin no' $SSHD_CONFIG +} + + +function setupResolved() { + echo nameserver 8.8.8.8 > /etc/resolv.conf + systemctl start systemd-resolved.service +} + +function cleanupPOSTLogs() { + # cleanup the POST log file + post_log_clear + post_err_clear + post_out_clear + + post_log_star " ***** " + post_log "Start: $(timestamp)" # log the current date, time +} + +function killApplication() { + # ---------------------------------------- STOP denali in case running (sys not rebooted) + killall $DENALI_BIN +} + +function setupEthernet() { + #setting up ethernet----------------------- Ethernet + post_log_dash " Ethernet " + ieth=eth0 + udhcpc --timeout=5 --retries=2 -n -i $ieth + post_log "$(ip addr show $ieth)" # -details -statistics +} + +function setupCANBus() { + #setting up can interface ----------------- CANBus + post_log_dash " CANBus " + #current settings can be retrieved by the command below + #$ ip -details -statistics link show can0 + ip link set can0 up type can bitrate 250000 restart-ms 100 + ifconfig can0 txqueuelen 4000 + candump can0 -T1 # check if candump can successfully use the port. will terminate in 1ms + if [ $? -eq 0 ]; then + post_log_pass "$POSTMSG_CANBUS$POSTMSG_POSTFIX_PASSED" + post_log "$(ip link show can0)" # -details -statistics + else + post_log_fail "$POSTMSG_CANBUS$POSTMSG_POSTFIX_FAILED" + fi +} + +function setupSDCard() { + #mounting sdcard -------------------------- SD-CARD + post_log_dash " SD-CARD " + mkdir -p $SDCARD_MNT + mount $SDCARD_PRT $SDCARD_MNT + SDCTEST="$(mount | grep "$SDCARD_PRT on $SDCARD_MNT type $SDCARD_TYP_NAME (rw,")" + if ! [ -z "$SDCTEST" ]; then + SDINFO="$(df -h | grep -i $SDCARD_MNT)" + post_log_pass "$POSTMSG_SDCARD$POSTMSG_POSTFIX_PASSED" + post_log "$SDCTEST" + post_log "$SDINFO" + else + post_log_fail "$POSTMSG_SDCARD$POSTMSG_POSTFIX_FAILED" + fi +} + +function testRTC() { + #test the RTC ----------------------------- RTC + post_log_dash " RTC" + #may not be an accurate test but sufficient for now + #and could not find a way to get the rtc clock with the higher resolusion + #it should not be confused with date command which is system date/time and not hwclock + hwclock -r # if there is any issue with rtc hwclock will show errors + if [ $? -eq 0 ]; then + RTC1=$($CMD_RTC_EPOCH) + sleep 1 + RTC2=$($CMD_RTC_EPOCH) + if [ $(($RTC2 - $RTC1)) -eq 1 ]; then + post_log_pass "$POSTMSG_RTC$POSTMSG_POSTFIX_PASSED" + else + post_log_fail "$POSTMSG_RTC$POSTMSG_POSTFIX_FAILED" + fi + fi +} + +function setupWiFi() { + # ----------------------------------------- WiFi + post_log_dash " WiFi " + + # create the wpa supplicant folder for conf storing + iwlan=wlan0 + WPA_SUPPLICANT_DIR="/etc/wpa_supplicant/" + WPA_SUPPLICANT_CNF="wpa_supplicant-$iwlan.conf" + mkdir -p $WPA_SUPPLICANT_DIR + + # remove any software blocks + rfkill unblock wlan + + if [[ ! -z $(dmesg | grep "wlan: driver loaded") ]]; then + post_log_pass "$POSTMSG_WIFI$POSTMSG_POSTFIX_PASSED [driver]" + post_log "$(dmesg | grep -i wlan:)" + + # start the wpa_supplicant service + post_log "start wpa_supplicant service" + systemctl start wpa_supplicant@$iwlan.service + if [ $? -eq 0 ]; then + post_log_pass "$POSTMSG_WIFI$POSTMSG_POSTFIX_PASSED [service]" + # try to connect to WiFi + if [ -f $WPA_SUPPLICANT_DIR$WPA_SUPPLICANT_CNF ]; then + post_log_dash " WiFi Connection " + killall udhcpc + post_log "connecting to WiFi" + # run this manually in terminal if didn't work on bootup + udhcpc --timeout=5 --retries=2 -n -i $iwlan + fi + post_log "$(ip link show $iwlan)" # -details -statistics + else + post_log_fail "$POSTMSG_WIFI$POSTMSG_POSTFIX_FAILED" + post_log "$(systemctl --failed | grep wpa)" + fi + else + post_log_fail "$POSTMSG_WIFI$POSTMSG_POSTFIX_FAILED" + fi +} + +function setupBluetooth() { + # ----------------------------------------- Bluetooth + post_log_dash " Bluetooth " + /usr/share/silex-uart/silex-uart.sh stop 1>> $POSTOUT 2>> $POSTERR + sleep 1 + /usr/share/silex-uart/silex-uart.sh start 1>> $POSTOUT 2>> $POSTERR + sleep 5 + hciconfig hci0 up + if [ $? -eq 0 ]; then + post_log_pass "$POSTMSG_BLUETOOTH$POSTMSG_POSTFIX_PASSED" + post_log "$(hciconfig hci0)" + else + post_log_fail "$POSTMSG_BLUETOOTH$POSTMSG_POSTFIX_FAILED" + fi +} + +function testTouchscreen() { + #test the touch screen -------------------- Touch + post_log_dash " Touch " + # when successfully connected and can be loaded + # Sitronix touch driver 2.10.2 Release date: 20180809 + # atmel_mxt_ts 3-004a: Direct firmware load for maxtouch.cfg failed with error -2 + # atmel_mxt_ts 3-004a: Touchscreen size X1279Y799 + # input: Atmel maXTouch Touchscreen as /devices/platform/soc@0/soc@0:bus@30800000/30a50000.i2c/i2c-3/3-004a/input/input2 + # When NOT connected + # Sitronix touch driver 2.10.2 Release date: 20180809 + TSTEST="$(dmesg | grep "input: Atmel maXTouch Touchscreen as ")" + if [ "$?" -eq 0 ]; then + post_log_pass "$POSTMSG_TOUCH$POSTMSG_POSTFIX_PASSED" + post_log "$TSTEST" + else + post_log_fail "$POSTMSG_TOUCH$POSTMSG_POSTFIX_FAILED" + fi +} + + +function testApplicationShasum_setup() { + # ----------------------------------------- Sha256Sum + post_log_dash " Sha256Sum " + #check the denali applicatoin checksum + SHA_ACT=$(tail -c 83 $HOME/$DENALI_BIN | cut -c19-82) + SHA_EXP=$(head -c -83 $HOME/$DENALI_BIN | sha256sum -b --tag | cut -c14-77) + if [ "$SHA_ACT" == "$SHA_EXP" ]; then + post_log_pass "$POSTMSG_SHASUM$POSTMSG_POSTFIX_PASSED" + else + post_log_fail "$POSTMSG_SHASUM$POSTMSG_POSTFIX_FAILED" + fi +} + + +function testApplicationShasum_local() { + # ----------------------------------------- Sha256Sum + post_log_dash " Sha256Sum " + #check the denali applicatoin checksum + SHA_ACT=$(tail -c 83 $DENALI_HOME/$DENALI_BIN | cut -c19-82) + SHA_EXP=$(head -c -83 $DENALI_HOME/$DENALI_BIN | sha256sum -b --tag | cut -c14-77) + if [ "$SHA_ACT" == "$SHA_EXP" ]; then + post_log_pass "$POSTMSG_SHASUM$POSTMSG_POSTFIX_PASSED" + else + post_log_fail "$POSTMSG_SHASUM$POSTMSG_POSTFIX_FAILED" + fi +} + + +function testCloudSystem() { + # ----------------------------------------- CloudSystem + post_log_dash " CloudSystem " + post_log "$(ip addr show $iwlan)" # -details -statistics + post_log "$(ping www.diality.staging.kebormed.com -I $iwlan -c 3 -4)" +} + + +function startCloudSync_setup() { + # ----------------------------------------- CloudSync + post_log_dash " CloudSync " + local CLOUDSYNC_PATH=$HOME/$CLOUDSYNC_FOLDER + if [ -d $CLOUDSYNC_PATH ]; then + + # removing the previous treatment logs so the new buff starts with fresh sequence + echo "Removing CloudSync I/O buff" + local CLOUDSYNC_LOGS="$SDCARD_MNT/$CLOUDSYNC_FOLDER/" + rm $(find $CLOUDSYNC_LOGS -name "*[_inp,_out].buf" ) 1>> $POSTOUT 2>> $POSTERR + + echo "Executing the CloudSync" + cd $CLOUDSYNC_PATH + ./cs.py start debug & + sleep 2 + CLOUDSYNC_STATUS="$(./cs.py status)" + if [ "$CLOUDSYNC_STATUS" == "$POSTMSG_CLOUDSYNC_RUNNING" ]; then + post_log_pass "$POSTMSG_CLOUDSYNC$POSTMSG_POSTFIX_PASSED" + else + post_log_fail "$POSTMSG_CLOUDSYNC$POSTMSG_POSTFIX_FAILED" + fi + post_log "$CLOUDSYNC_STATUS" + cd + else + post_log_fail "$POSTMSG_CLOUDSYNC$POSTMSG_POSTFIX_FAILED" + fi +} + +function startApplication_setup() { + # ----------------------------------------- Denali + post_log_dash " Denali " + #launching denali application + DENALI_VERSION="$($HOME/$DENALI_BIN -v)" + if [[ -n "$DENALI_VERSION" ]]; then + post_log_pass "$($HOME/$DENALI_BIN -v)" # log UI Software version + if [[ "$APPLICATION_PARAMS" == *"-E"* ]]; then + $HOME/$DENALI_BIN $APPLICATION_PARAMS & # do not enclose the APPLICATION_PARAMS in "", then it becomes an empty parameter to the denali which is not accepted. + else + $HOME/$DENALI_BIN $APPLICATION_PARAMS & + fi + else + post_log_fail "Unknown Applicaion Version" + fi +} + +function confirm_reboot() { + read -p "ready to reboot? [y,n]" -n 1 -r CONFIRM + if [ "$CONFIRM" == "y" ]; then + reboot + fi + echo "" +} + + +function startCloudSync_local() { + # ----------------------------------------- CloudSync + post_log_dash " CloudSync " + local CLOUDSYNC_PATH=$CLOUD_HOME/$CLOUDSYNC_FOLDER + local DATE_UTC=$(date -u +%Y_%m_%d) + if [ -d $CLOUDSYNC_PATH ]; then + + # removing the previous treatment logs so the new buff starts with fresh sequence + echo "Removing CloudSync I/O buff" + local CLOUDSYNC_LOGS="$SDCARD_MNT/$CLOUDSYNC_FOLDER/" + sudo -u $CLOUD_USER rm $(find $CLOUDSYNC_LOGS -name "*[_inp,_out].buf" ) 1>> $POSTOUT 2>> $POSTERR + + echo "Creating new bufs for the denali and cloud user" + sudo -u $CLOUD_USER touch "$CLOUDSYNC_LOGS/$DATE_UTC"_out.buf + sudo -u $DENALI_USER touch "$CLOUDSYNC_LOGS/$DATE_UTC"_inp.buf + + echo "Executing the CloudSync" + cd $CLOUDSYNC_PATH + sudo -u $CLOUD_USER ./cs.py start + sleep 2 + CLOUDSYNC_STATUS="$(sudo -u $CLOUD_USER ./cs.py status)" + if [ "$CLOUDSYNC_STATUS" == "$POSTMSG_CLOUDSYNC_RUNNING" ]; then + post_log_pass "$POSTMSG_CLOUDSYNC$POSTMSG_POSTFIX_PASSED" + else + post_log_fail "$POSTMSG_CLOUDSYNC$POSTMSG_POSTFIX_FAILED" + fi + post_log "$CLOUDSYNC_STATUS" + cd + else + post_log_fail "$POSTMSG_CLOUDSYNC$POSTMSG_POSTFIX_FAILED" + fi +} + + +function startApplication_local() { + # ----------------------------------------- Denali + post_log_dash " Denali " + #launching denali application + DENALI_VERSION="$($DENALI_HOME/$DENALI_BIN -v)" + if [ -n "$DENALI_VERSION" ]; then + post_log_pass "$DENALI_VERSION" # log UI Software version + sudo -u $DENALI_USER $DENALI_HOME/$DENALI_BIN $APPLICATION_PARAMS 1>> /tmp/denali.out 2>> /tmp/denali.out & + else + post_log_fail "Unknown Applicaion Version for $DENALI_HOME/$DENALI_BIN" + fi +} + + +function timerStart() { + time_start=$(date +%s) +} + +function timerEndLog() { + # ----------------------------------------- END + # tag the end time in the POST log file + post_log "End: $(timestamp)" + time_end=$(date +%s) + post_log "time spent: "$(( $time_end - $time_start ))" seconds" + post_log_star " ***** " +} + +function applicationPOST() { + setupConsoleout + disableRootSSH + cleanupPOSTLogs + setupCANBus + setupResolved + killApplication + setupEthernet + setupSDCard + testRTC + setupWiFi + setupBluetooth + testTouchscreen + testCloudSystem +}