diff --git a/README.md b/README.md index 27b1d63..5835d9f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,11 @@ + + # Femtofox    The tiny, low power Linux Meshtastic node +###          [Click here for the Femtofox store](https://www.etsy.com/listing/1861858340/femtofox-pro-v1-kit-compact-arm-linux) + **Femtofox is a Linux-based mesh development platform - a Raspberry Pi sized computer with onboard LoRa radio, capable of being run with only 0.3w, making it *ideal* for solar powered nodes.** The Luckfox Pico Mini is the postage stamp sized heart of the Femtofox - a compact and power efficient Linux board, running Foxbuntu, our own customized version of Ubuntu. Femtofox is an expansion of the Luckfox's capabilities, utilizing a custom PCB with a 30db LoRa radio (over 6x the transmit power of a RAK Wisblock or Heltec V3) to create a power efficient, tiny and highly capable Meshtastic Linux node. @@ -14,6 +18,7 @@ Find out more in the sections below, or in the [Wiki](https://github.com/femtofo - How to order - [Etsy (USA)](https://www.etsy.com/listing/1861858340/femtofox-pro-v1-kit-compact-arm-linux) - [Tindie (UK)](https://www.tindie.com/products/nomdetom/femtofox-pro-v1-kit-linux-meshtastic-node/) + - [Etsy (UK)](https://www.etsy.com/uk/listing/1866094154/femtofox-pro-v1-kit-linux-meshtastic) - [DIY instructions](https://github.com/femtofox/Femtofox_Community_Hardware) - [USB configuration tool](https://github.com/femtofox/femtofox/wiki/USB-Configuration-Tool) - [Building your own Foxbuntu image](https://github.com/femtofox/femtofox/wiki/Building-Foxbuntu-%28WSL%29) diff --git a/environment-setup/foxbuntu-builder.sh b/environment-setup/foxbuntu-builder.sh index 3cb4063..136b3c0 100644 --- a/environment-setup/foxbuntu-builder.sh +++ b/environment-setup/foxbuntu-builder.sh @@ -57,7 +57,8 @@ clone_repos() { fi } - clone_with_retries "https://github.com/LuckfoxTECH/luckfox-pico.git" || return 1 + #clone_with_retries "https://github.com/LuckfoxTECH/luckfox-pico.git" || return 1 + clone_with_retries "https://github.com/Ruledo/luckfox-pico.git" || return 1 clone_with_retries "https://github.com/femtofox/femtofox.git" || return 1 return 0 diff --git a/foxbuntu/sysdrv/out/rootfs_uclibc_rv1106/usr/local/bin/femto-config b/foxbuntu/sysdrv/out/rootfs_uclibc_rv1106/usr/local/bin/femto-config index 2462f15..64ac042 100755 --- a/foxbuntu/sysdrv/out/rootfs_uclibc_rv1106/usr/local/bin/femto-config +++ b/foxbuntu/sysdrv/out/rootfs_uclibc_rv1106/usr/local/bin/femto-config @@ -79,6 +79,71 @@ check_meshtasticd_running() { fi } +service_manager() { + choice="" # zero the choice before loading the submenu + while true; do + local service_name=$1 + local readable_name=$2 + local help=$3 + echo "Checking $readable_name service state..." + local service_state="$(femto-utils.sh -R "$(femto-utils.sh -C "$service_name")")" + choice=$(dialog --no-collapse --colors --help-button --cancel-label "Back" --title "$readable_name Service" --default-item "$choice" --menu "Avahi-Daemon service is $service_state" 16 60 5 \ + "View detailed service status" "x" \ + " " "" \ + "Start/restart service" "x" \ + $(if ! echo "$service_state" | grep -q 'not running'; then echo "Stop service x"; fi) \ + " " "" \ + $(if echo "$service_state" | grep -q 'disabled'; then echo "Enable service x"; fi) \ + $(if echo "$service_state" | grep -q 'enabled'; then echo "Disable service x"; fi) \ + " " "" \ + "Back to previous menu" "x" 3>&1 1>&2 2>&3) + exit_status=$? # This line checks the exit status of the dialog command + if [ $exit_status -eq 1 ]; then # Exit the loop if the user selects "Cancel" or closes the dialog + break + elif [ $exit_status -eq 2 ]; then # Help ("extra") button + dialog --no-collapse --colors --title "$readable_name service help" --msgbox "$3" 0 0 + else + case $choice in + "View detailed service status") + echo "Getting $readable_name service status..." + dialog --no-collapse --title "$readable_name service status" --msgbox "$(systemctl status $service_name)" 0 0 + ;; + "Start/restart service") + dialog --no-collapse --title "$title" --yesno "Start/restart $readable_name service?" 7 45 + if [ $? -eq 0 ]; then #unless cancel/no + systemctl restart $service_name + dialog --no-collapse --colors --msgbox "Sent \`\Zusystemctl restart $service_name\Zn\` command to system.\n\n$readable_name should be running." 10 60 + fi + ;; + "Stop service") + dialog --no-collapse --colors --title "$title" --yesno "Stop $readable_name service?\n\nThis will take the node \Zu\Z1OFFLINE\Zn.\n\n$readable_name will automatically restart on boot service if enabled." 11 50 + if [ $? -eq 0 ]; then #unless cancel/no + systemctl stop $service_name + dialog --no-collapse --colors --msgbox "Sent \`\Zusystemctl stop $service_name\Zn\` command to system.\n\n$readable_name should be stopped." 9 60 + fi + ;; + "Enable service") + dialog --no-collapse --title "$title" --yesno "Enable $readable_name service?" 6 45 + if [ $? -eq 0 ]; then #unless cancel/no + systemctl enable $service_name + systemctl start $service_name + dialog --no-collapse --colors --msgbox "Sent \`\Zusystemctl enable $service_name\Zn\` and \`\Zusystemctl start $service_name\Zn\` commands to system.\n\n$readable_name should be running." 10 60 + fi + ;; + "Disable service") + dialog --no-collapse --colors --title "$title" --yesno "Disable $readable_name service?\n\nThis will take the node \Zu\Z1OFFLINE\Zn and will not restart!" 9 50 + if [ $? -eq 0 ]; then #unless cancel/no + systemctl disable $service_name + systemctl stop $service_name + dialog --no-collapse --colors --msgbox "Sent \`\Zusystemctl disable $service_name\Zn\` and \`\Zusystemctl stop $service_name\Zn\` commands to system.\n\n$readable_name should be disabled and stopped." 10 60 + fi + ;; + "Back to previous menu") break ;; + esac + fi + done +} + wifi_config() { local title2="Wi-Fi (wlan0) Settings" local config=$(dialog --no-collapse --title "$title2" --form "↑ ↓ to navigate, [ESC] to cancel." 10 45 0 \ @@ -122,8 +187,9 @@ networking_settings() { 6 "Set hostname" "" \ 7 "Test internet connection" "" \ 8 "Manage Meshtastic wifi sync" "" \ + 9 "Manage Avahi-Daemon service" "" \ " " "" "" \ - 9 "Back to main menu" "" 3>&1 1>&2 2>&3) + 10 "Back to main menu" "" 3>&1 1>&2 2>&3) [ $? -eq 1 ] && break # Exit the loop if the user selects "Cancel" or closes the dialog case $networking_choice in 1) # Turn Wi-Fi on/off) @@ -174,67 +240,12 @@ networking_settings() { dialog --no-collapse --title "Internet connectivity test" --colors --msgbox "$(femto-utils.sh -R "$(femto-network-config.sh -t)")" 9 40 ;; 8) # Manage Meshtastic wifi sync) - choice="" # zero the choice before loading the submenu - while true; do - echo "Checking Meshtastic wifi sync service state..." - local service_state="$(femto-utils.sh -R "$(femto-utils.sh -C "femto-wifi-mesh-control")")" - choice=$(dialog --no-collapse --colors --help-button --cancel-label "Back" --title "Meshtastic wifi sync Service" --default-item "$choice" --menu "Meshtastic wifi sync service is $service_state" 16 60 5 \ - "View detailed service status" "x" \ - " " "" \ - "Start/restart service" "x" \ - $(if ! echo "$service_state" | grep -q 'not running'; then echo "Stop service x"; fi) \ - " " "" \ - $(if echo "$service_state" | grep -q 'disabled'; then echo "Enable service x"; fi) \ - $(if echo "$service_state" | grep -q 'enabled'; then echo "Disable service x"; fi) \ - " " "" \ - "Back to previous menu" "x" 3>&1 1>&2 2>&3) - exit_status=$? # This line checks the exit status of the dialog command - if [ $exit_status -eq 1 ]; then # Exit the loop if the user selects "Cancel" or closes the dialog - break - elif [ $exit_status -eq 2 ]; then # Help ("extra") button - dialog --no-collapse --colors --title "Meshtastic wifi sync service help" --msgbox "The Meshtastic wifi sync service synchronizes system wifi settings with Meshtastic wifi settings. This allows you to use Meshtastic's remote node administration feature to enable/disable wifi.\n\nIn future, this will also allow you to reconfigure SSID and password.\n" 0 0 - else - case $choice in - "View detailed service status") - echo "Getting Meshtastic wifi sync service status..." - dialog --no-collapse --title "Meshtastic wifi sync service status" --msgbox "$(systemctl status femto-wifi-mesh-control)" 0 0 - ;; - "Start/restart service") - dialog --no-collapse --title "$title" --yesno "Start/restart Meshtastic wifi sync service?" 7 45 - if [ $? -eq 0 ]; then #unless cancel/no - systemctl restart femto-wifi-mesh-control - dialog --no-collapse --colors --msgbox "Sent \`\Zusystemctl restart femto-wifi-mesh-control wifi sync\Zn\` command to system.\n\nMeshtastic wifi sync should be running." 10 60 - fi - ;; - "Stop service") - dialog --no-collapse --colors --title "$title" --yesno "Stop Meshtastic wifi sync service?\n\nThis will take the node \Zu\Z1OFFLINE\Zn.\n\nMeshtastic wifi sync will automatically restart on boot service if enabled." 11 50 - if [ $? -eq 0 ]; then #unless cancel/no - systemctl stop femto-wifi-mesh-control - dialog --no-collapse --colors --msgbox "Sent \`\Zusystemctl stop femto-wifi-mesh-control\Zn\` command to system.\n\nMeshtastic wifi sync should be stopped." 9 60 - fi - ;; - "Enable service") - dialog --no-collapse --title "$title" --yesno "Enable Meshtastic wifi sync service?" 6 45 - if [ $? -eq 0 ]; then #unless cancel/no - systemctl enable femto-wifi-mesh-control - systemctl start femto-wifi-mesh-control - dialog --no-collapse --colors --msgbox "Sent \`\Zusystemctl enable femto-wifi-mesh-control\Zn\` and \`\Zusystemctl start femto-wifi-mesh-control\Zn\` commands to system.\n\nMeshtastic wifi sync should be running." 10 60 - fi - ;; - "Disable service") - dialog --no-collapse --colors --title "$title" --yesno "Disable Meshtastic wifi sync service?\n\nThis will take the node \Zu\Z1OFFLINE\Zn and will not restart!" 9 50 - if [ $? -eq 0 ]; then #unless cancel/no - systemctl disable femto-wifi-mesh-control - systemctl stop femto-wifi-mesh-control - dialog --no-collapse --colors --msgbox "Sent \`\Zusystemctl disable femto-wifi-mesh-control\Zn\` and \`\Zusystemctl stop femto-wifi-mesh-control\Zn\` commands to system.\n\nMeshtastic wifi sync should be disabled and stopped." 10 60 - fi - ;; - "Back to previous menu") break ;; - esac - fi - done + service_manager "femto-wifi-mesh-control" "Meshtastic wifi sync" "The Meshtastic wifi sync service synchronizes system wifi settings with Meshtastic wifi settings. This allows you to use Meshtastic's remote node administration feature to enable/disable wifi.\n\nIn future, this will also allow you to reconfigure SSID and password.\n" ;; - 9) + 9) # Manage avahi) + service_manager "avahi-daemon" "Avahi Daemon" "The Avahi-Daemon service advertises the Meshtastic node on the local LAN (often called a Bonjour service), allowing the Android app to detect it. Without Avahi, you will need to manually enter the Femtofox's IP address in the app to connect.\n" + ;; + 10) return ;; esac diff --git a/foxbuntu/sysdrv/out/rootfs_uclibc_rv1106/usr/local/bin/femto-runonce.sh b/foxbuntu/sysdrv/out/rootfs_uclibc_rv1106/usr/local/bin/femto-runonce.sh index 0968a57..2dd10c9 100755 --- a/foxbuntu/sysdrv/out/rootfs_uclibc_rv1106/usr/local/bin/femto-runonce.sh +++ b/foxbuntu/sysdrv/out/rootfs_uclibc_rv1106/usr/local/bin/femto-runonce.sh @@ -53,7 +53,7 @@ log_message "Resizing filesystem..." resize2fs /dev/mmcblk1p5 resize2fs /dev/mmcblk1p6 resize2fs /dev/mmcblk1p7 -log_message "Resizing filesystem complete" +log_message "Resizing filesystem complete." # allocate swap file if [ ! -f /swapfile ]; then # check if swap file already exists @@ -65,21 +65,21 @@ if [ ! -f /swapfile ]; then # check if swap file already exists echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab > /dev/null log_message "Swap file allocated." else - log_message "Swap file already allocated, skipping" + log_message "Swap file already allocated, skipping..." fi # prevent randomized mac address for eth0. If `eth0`` is already present in /etc/network/interfaces, skip mac="$(awk '/Serial/ {print $3}' /proc/cpuinfo | tail -c 11 | sed 's/^\(.*\)/a2\1/' | sed 's/\(..\)/\1:/g;s/:$//')" file="/etc/network/interfaces" if ! grep -q " hwaddress ether $mac" "$file"; then - log_message "Setting eth0 MAC address to $mac (derivative of CPU s/n)" + log_message "Setting eth0 MAC address to $mac (derivative of CPU s/n)..." awk -v mac="$mac" ' { print } /allow-hotplug eth0/ { count=5 } count && --count == 0 { print " hwaddress ether " mac } ' "$file" > "$file.tmp" && mv "$file.tmp" "$file" else - log_message "eth0 mac address already set in /etc/network/interfaces, skipping" + log_message "eth0 mac address already set in /etc/network/interfaces, skipping..." fi # Add term stuff to .bashrc @@ -87,25 +87,25 @@ lines="export NCURSES_NO_UTF8_ACS=1 export TERM=xterm-256color export LANG=C.UTF-8" if ! grep -Fxq "$lines" /home/femto/.bashrc; then # Check if the lines are already in .bashrc + log_message "Adding TERM, LANG and NCURSES_NO_UTF8_ACS to .bashrc..." echo "$lines" >> /home/femto/.bashrc - log_message "Added TERM, LANG and NCURSES_NO_UTF8_ACS to .bashrc" else - log_message "TERM, LANG and NCURSES_NO_UTF8_ACS already present in .bashrc, skipping" + log_message "TERM, LANG and NCURSES_NO_UTF8_ACS already present in .bashrc, skipping..." fi # Fix Compiler +log_message "Adding compiler support..." cp /usr/lib/arm-linux-gnueabihf/libc_nonshared.a.keep /usr/lib/arm-linux-gnueabihf/libc_nonshared.a -log_message "Added compiler support" # Add a cheeky alias to .bash_aliases if ! grep -Fxq "alias sfc='sudo femto-config'" /home/femto/.bashrc; then # Check if the lines are already in .bash_aliases echo "alias sfc='sudo femto-config'" >> /home/femto/.bashrc log_message "Added \`alias sfc='sudo femto-config'\` to .bashrc" else - log_message "\`alias sfc='sudo femto-config'\` already present in .bashrc, skipping" + log_message "\`alias sfc='sudo femto-config'\` already present in .bashrc, skipping..." fi -log_message "Enabling meshtasticd service" +log_message "Enabling meshtasticd service..." systemctl enable meshtasticd #generate SSH keys diff --git a/foxbuntu/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig b/foxbuntu/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig index 5d91701..2c77d1b 100644 --- a/foxbuntu/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig +++ b/foxbuntu/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig @@ -1326,8 +1326,6 @@ CONFIG_SCSI_LOWLEVEL=y # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_SMARTPQI is not set CONFIG_SCSI_UFSHCD=y -CONFIG_NETDEVICES=y -CONFIG_TUN=m # CONFIG_SCSI_UFSHCD_PCI is not set # CONFIG_SCSI_UFSHCD_PLATFORM is not set # CONFIG_SCSI_UFS_BSG is not set @@ -1370,7 +1368,25 @@ CONFIG_TUN=m CONFIG_NETDEVICES=y CONFIG_MII=y -# CONFIG_NET_CORE is not set +CONFIG_NET_CORE=y +# CONFIG_BONDING is not set +# CONFIG_DUMMY is not set +# CONFIG_WIREGUARD is not set +# CONFIG_EQUALIZER is not set +# CONFIG_NET_FC is not set +# CONFIG_NET_TEAM is not set +# CONFIG_MACVLAN is not set +# CONFIG_IPVLAN is not set +# CONFIG_VXLAN is not set +# CONFIG_GENEVE is not set +# CONFIG_BAREUDP is not set +# CONFIG_GTP is not set +# CONFIG_MACSEC is not set +# CONFIG_NETCONSOLE is not set +CONFIG_TUN=m +# CONFIG_TUN_VNET_CROSS_LE is not set +# CONFIG_VETH is not set +# CONFIG_NLMON is not set # CONFIG_ARCNET is not set # @@ -2988,6 +3004,7 @@ CONFIG_VIDEO_RK_IRCUT=y # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_MIS2031 is not set # CONFIG_VIDEO_MIS4001 is not set +# CONFIG_VIDEO_MIS5001 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set