parent
e4da81c96a
commit
75ae31bd0b
File diff suppressed because it is too large
Load Diff
@ -0,0 +1 @@
|
||||
[ "$ACTION" = "motion" ] && logger webcam motion event
|
@ -0,0 +1,22 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
# Init script for vmodem-cghmn
|
||||
|
||||
USE_PROCD=1
|
||||
|
||||
START=10
|
||||
STOP=15
|
||||
|
||||
start_service () {
|
||||
procd_open_instance vmodem-cghmn
|
||||
procd_set_param command /bin/bash /opt/vmodem-cghmn/vmodem-cghmn.sh
|
||||
|
||||
procd_set_param respawn "${respawn_threshold:-3600}" "${respawn_timeout:-5}" "${respawn_retry:-5}"
|
||||
|
||||
procd_set_param stdout 1
|
||||
procd_set_param stderr 1
|
||||
|
||||
procd_set_param pidfile /var/run/vmodem-cghmn.pid
|
||||
|
||||
procd_set_param term_timeout 3
|
||||
procd_close_instance
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
::sysinit:/etc/init.d/rcS S boot
|
||||
::shutdown:/etc/init.d/rcS K shutdown
|
||||
::askconsole:/usr/libexec/login.sh
|
@ -0,0 +1,8 @@
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/migrations.sh
|
||||
|
||||
remove_devicename_leds "rt2800soc-phy0" "rt2800pci-phy0"
|
||||
|
||||
migrations_apply system
|
||||
|
||||
exit 0
|
@ -0,0 +1,25 @@
|
||||
#
|
||||
# Copyright (C) 2012 OpenWrt.org
|
||||
#
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
fix_checksum() {
|
||||
local kernel_size=$(sed -n 's/mtd[0-9]*: \([0-9a-f]*\).*"kernel".*/\1/p' /proc/mtd)
|
||||
|
||||
[ "$kernel_size" ] && mtd -c 0x$kernel_size fix$1 firmware
|
||||
}
|
||||
|
||||
board=$(board_name)
|
||||
|
||||
case "$board" in
|
||||
dlink,dap-1522-a1)
|
||||
fix_checksum wrg
|
||||
;;
|
||||
dlink,dch-m225|\
|
||||
dlink,dir-645|\
|
||||
dlink,dir-860l-b1|\
|
||||
samsung,cy-swr1100)
|
||||
fix_checksum seama
|
||||
;;
|
||||
esac
|
@ -0,0 +1,193 @@
|
||||
#!/bin/sh
|
||||
# Set router defaults runing first boot
|
||||
|
||||
# Ensure this script is only run once
|
||||
if CONFIGED=$(uci get system.@system[0].cghmn_is_configured 2>/dev/null) && [ "$CONFIGED" = "1" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Get last four letters of eth0 MAC
|
||||
FULL_MAC=$(ip link show eth0 | awk '/link\/ether/ { gsub(":",""); print substr($2,0,4) ":" substr($2,5,4) ":" substr($2,9,4) }')
|
||||
MAC_LASTFOUR=$(echo "${FULL_MAC}" | awk -F':' '{ print $3 }')
|
||||
NEW_HOSTNAME="CGHMN-Node-$MAC_LASTFOUR"
|
||||
|
||||
# Turn last four letters of MAC into IPv4 address suffix
|
||||
LOCAL_IP4_FROM_MAC=$(printf "%d.%d" $(echo "${MAC_LASTFOUR}" | awk '{ print "0x" substr($0,0,2) " 0x" substr($0,3,2) }'))
|
||||
|
||||
# Static variables used to configure the Wireguard tunnel
|
||||
WG_PEER_ADDRESS="insert.target.server.domain"
|
||||
WG_PEER_PUBKEY="VAVFX88DKGoO2naiWml1jepF7MVrIjDAbMhhYq5S1nQ="
|
||||
|
||||
# Wireguard IPv4 variables
|
||||
WG_TUNNEL_INNER_SUBNET4="10.234."
|
||||
WG_TUNNEL_INNER_SUBNET4_SIZE="16"
|
||||
WG_TUNNEL_INNER_LOCAL_IP4="${WG_TUNNEL_INNER_SUBNET4}${LOCAL_IP4_FROM_MAC}"
|
||||
WG_TUNNEL_INNER_PEER_IP4="${WG_TUNNEL_INNER_SUBNET4}.0.1"
|
||||
WG_TUNNEL_REMOTE_SUBNET4="10.201.0.0/23"
|
||||
|
||||
# Wireguard IPv6 variables
|
||||
WG_TUNNEL_INNER_SUBNET6="fd38:f85d:a2fd::"
|
||||
WG_TUNNEL_INNER_SUBNET6_SIZE="64"
|
||||
WG_TUNNEL_INNER_LOCAL_IP6="${WG_TUNNEL_INNER_SUBNET6}${FULL_MAC}"
|
||||
WG_TUNNEL_INNER_PEER_IP6="${WG_TUNNEL_INNER_SUBNET6}ffff:ffff:ffff:ffff"
|
||||
WG_TUNNEL_REMOTE_SUBNET6="2001:470:5168:201::/64"
|
||||
|
||||
# Generate new Wireguard private key for this node
|
||||
WG_PRIVKEY="$(wg genkey)"
|
||||
|
||||
# Static variables used to configure the VXLAN interface
|
||||
VXLAN_LOCAL_IP="${WG_TUNNEL_INNER_LOCAL_IP6}"
|
||||
VXLAN_PEER_IP="${WG_TUNNEL_INNER_PEER_IP6}"
|
||||
VXLAN_ID="101"
|
||||
|
||||
# Before adding new config, clear old firewall zones and rules
|
||||
while uci -q delete firewall.@rule[0]; do :; done
|
||||
while uci -q delete firewall.@zone[0]; do :; done
|
||||
while uci -q delete firewall.@forwarding[0]; do :; done
|
||||
|
||||
# Batch-add most UCI configuration next
|
||||
uci -q batch <<EOUCI
|
||||
set system.@system[0].hostname='${NEW_HOSTNAME}'
|
||||
|
||||
# -- Create firewall zones -- #
|
||||
|
||||
# WAN zone (allow input for management from regular home network)
|
||||
add firewall zone
|
||||
set firewall.@zone[-1].name='wan'
|
||||
set firewall.@zone[-1].input='ACCEPT'
|
||||
set firewall.@zone[-1].output='ACCEPT'
|
||||
set firewall.@zone[-1].forward='REJECT'
|
||||
add_list firewall.@zone[-1].network='wan'
|
||||
|
||||
# Retro LAN zone (default deny any traffic and add firewall rule for forwardings)
|
||||
add firewall zone
|
||||
set firewall.@zone[-1].name='retro_lan'
|
||||
set firewall.@zone[-1].input='REJECT'
|
||||
set firewall.@zone[-1].output='REJECT'
|
||||
set firewall.@zone[-1].forward='REJECT'
|
||||
add_list firewall.@zone[-1].network='cghmn_vxlan'
|
||||
add_list firewall.@zone[-1].network='retro_lan'
|
||||
|
||||
# Outer transport tunnel zone outside of Retro LAN
|
||||
add firewall zone
|
||||
set firewall.@zone[-1].name='tunnel'
|
||||
set firewall.@zone[-1].input='REJECT'
|
||||
set firewall.@zone[-1].output='ACCEPT'
|
||||
set firewall.@zone[-1].forward='REJECT'
|
||||
add_list firewall.@zone[-1].network='cghmn_wg'
|
||||
add_list firewall.@zone[-1].network='cghmn_vxlan'
|
||||
|
||||
# PPP client zone
|
||||
add firewall zone
|
||||
set firewall.@zone[-1].name='ppp_client'
|
||||
set firewall.@zone[-1].input='ACCEPT'
|
||||
set firewall.@zone[-1].output='ACCEPT'
|
||||
set firewall.@zone[-1].forward='REJECT'
|
||||
set firewall.@zone[-1].masq='1'
|
||||
add_list firewall.@zone[-1].network='ppp_daemon'
|
||||
|
||||
# -- Create network forwarding -- #
|
||||
|
||||
# Allow forwarding from local PPP clients to the Retro LAN and WAN
|
||||
add firewall forwarding
|
||||
set firewall.@forwarding[-1].src='ppp_client'
|
||||
add_list firewall.@forwarding[-1].dest='retro_lan'
|
||||
add_list firewall.@forwarding[-1].dest='wan'
|
||||
|
||||
# -- Create firewall rules -- #
|
||||
|
||||
# Allow VXLAN packages on transport network
|
||||
add firewall rule
|
||||
set firewall.@rule[-1].name='Allow incoming VXLAN packets'
|
||||
set firewall.@rule[-1].proto='udp'
|
||||
set firewall.@rule[-1].src='tunnel'
|
||||
set firewall.@rule[-1].target='ACCEPT'
|
||||
set firewall.@rule[-1].family='ipv6'
|
||||
set firewall.@rule[-1].dest_port='4789'
|
||||
set firewall.@rule[-1].src_ip='${WG_TUNNEL_INNER_PEER_IP6}'
|
||||
|
||||
# -- Create interfaces -- #
|
||||
|
||||
# Delete predefined interfaces
|
||||
delete network.wan
|
||||
delete network.wan6
|
||||
delete network.lan
|
||||
|
||||
# Create WAN interface on default WAN network port
|
||||
set network.wan=interface
|
||||
set network.wan.proto='dhcp'
|
||||
set network.wan.device='eth0.2'
|
||||
|
||||
# Create Wireguard tunnel interface
|
||||
set network.cghmn_wg=interface
|
||||
set network.cghmn_wg.proto='wireguard'
|
||||
set network.cghmn_wg.private_key='${WG_PRIVKEY}'
|
||||
set network.cghmn_wg.mtu='1634'
|
||||
add_list network.cghmn_wg.addresses='${WG_TUNNEL_INNER_LOCAL_IP6}/${WG_TUNNEL_INNER_SUBNET6_SIZE}'
|
||||
add_list network.cghmn_wg.addresses='${WG_TUNNEL_INNER_LOCAL_IP4}/${WG_TUNNEL_INNER_SUBNET4_SIZE}'
|
||||
|
||||
# Create VXLAN interface on Wireguard tunnel
|
||||
set network.cghmn_vxlan=interface
|
||||
set network.cghmn_vxlan.proto='vxlan6'
|
||||
set network.cghmn_vxlan.srcportmin='4789'
|
||||
set network.cghmn_vxlan.mtu='1500'
|
||||
set network.cghmn_vxlan.learning='0'
|
||||
set network.cghmn_vxlan.ip6addr='${VXLAN_LOCAL_IP}'
|
||||
set network.cghmn_vxlan.peer6addr='${VXLAN_PEER_IP}'
|
||||
set network.cghmn_vxlan.vid='${VXLAN_ID}'
|
||||
|
||||
# Create unmanaged Retro LAN bridge interface
|
||||
set network.retro_lan=interface
|
||||
set network.retro_lan.proto='none'
|
||||
set network.retro_lan.device='br-retrolan'
|
||||
|
||||
# Create PPP interface for local vmodem dialin
|
||||
set network.ppp_daemon=interface
|
||||
set network.ppp_daemon.proto='none'
|
||||
set network.ppp_daemon.device='ppp0'
|
||||
|
||||
# -- Configure actual network interfaces -- #
|
||||
|
||||
# Create and configure Retro LAN Linux bridge spanning the VXLAN and default LAN network port
|
||||
add network device
|
||||
set network.@device[-1].type='bridge'
|
||||
set network.@device[-1].name='br-retrolan'
|
||||
add_list network.@device[-1].ports='cghmn_vxlan'
|
||||
add_list network.@device[-1].ports='eth0.1'
|
||||
|
||||
# -- Add Wireguard remote peer -- #
|
||||
|
||||
# Remote CGHMN Wireguard peer
|
||||
add network wireguard_cghmn_wg
|
||||
set network.@wireguard_cghmn_wg[-1].description='CGHMN Server'
|
||||
set network.@wireguard_cghmn_wg[-1].persistent_keepalive='15'
|
||||
set network.@wireguard_cghmn_wg[-1].route_allowed_ips='1'
|
||||
set network.@wireguard_cghmn_wg[-1].public_key='${WG_PEER_PUBKEY}'
|
||||
set network.@wireguard_cghmn_wg[-1].endpoint_host='${WG_PEER_ADDRESS}'
|
||||
add_list network.@wireguard_cghmn_wg[-1].allowed_ips='${WG_TUNNEL_INNER_SUBNET6}/${WG_TUNNEL_INNER_SUBNET6_SIZE}'
|
||||
add_list network.@wireguard_cghmn_wg[-1].allowed_ips='${WG_TUNNEL_INNER_SUBNET4}/${WG_TUNNEL_INNER_SUBNET4_SIZE}'
|
||||
add_list network.@wireguard_cghmn_wg[-1].allowed_ips='${WG_TUNNEL_REMOTE_SUBNET6}'
|
||||
add_list network.@wireguard_cghmn_wg[-1].allowed_ips='${WG_TUNNEL_REMOTE_SUBNET4}'
|
||||
|
||||
# -- Set some WiFi defaults -- #
|
||||
delete wireless.default_radio0
|
||||
set wireless.radio0.band='2g'
|
||||
set wireless.radio0.channel='1'
|
||||
set wireless.radio0.legacy_rates='1'
|
||||
set wireless.wifinet0=wifi-iface
|
||||
set wireless.wifinet0.device='radio0'
|
||||
set wireless.wifinet0.mode='ap'
|
||||
set wireless.wifinet0.ssid='retronet'
|
||||
set wireless.wifinet0.encryption='psk-mixed'
|
||||
set wireless.wifinet0.key='${FULL_MAC}'
|
||||
set wireless.wifinet0.network='retro_lan'
|
||||
set wireless.wifinet0.disabled='1'
|
||||
|
||||
# -- DNSmasq config -- #
|
||||
set dhcp.@dnsmasq[0].localservice='0'
|
||||
|
||||
set system.@system[0].cghmn_is_configured=1
|
||||
EOUCI
|
||||
|
||||
# Enable the vmodem init script
|
||||
service vmodem-cghmn enable || true
|
@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "Hello World Demo Box!"
|
||||
echo "---------------------"
|
||||
echo
|
||||
echo "You have just successfully dialed this virtual box!"
|
||||
echo
|
||||
echo "Please enter your name: "
|
||||
read -r -e -p "User? " username
|
||||
echo
|
||||
echo "Hello, $username!"
|
||||
echo
|
||||
echo "Thank you for visiting! Bye!"
|
||||
sleep 1
|
@ -0,0 +1,45 @@
|
||||
#!/bin/bash
|
||||
# RUN PPPD DAEMON
|
||||
#
|
||||
# Original by Oliver Molini 2021
|
||||
# http://www.steptail.com/guides:virtual_modem:script
|
||||
#
|
||||
# Billy Stoughton II for bug fixes and contributions
|
||||
#
|
||||
# Modified and partially rewritten by Snep (contact-snep@diskcat.com) 2025
|
||||
# for the CGHMN project
|
||||
#
|
||||
# Licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License
|
||||
# https://creativecommons.org/licenses/by-nc-sa/4.0/
|
||||
#
|
||||
# Note on PPPD settings:
|
||||
# - Make sure the noauth option is set (instead of auth)
|
||||
# - Make sure DNS servers are defined (add ms-dns 1.2.3.4 twice)
|
||||
#
|
||||
|
||||
# Variable: lcpidle
|
||||
# Specifies the idle timeout period in seconds for lcp-echo-interval.
|
||||
# This is to ensure that pppd will not run indefinitely after sudden
|
||||
# hangup and will relinquish control back to the vmodem.sh.
|
||||
#
|
||||
# Default: lcpidle=5
|
||||
lcpidle=5
|
||||
|
||||
#
|
||||
# Trumpet Winsock 3.0 revision D for Windows 3.1
|
||||
# by default requires a fake login shell.
|
||||
#
|
||||
# Windows 95 and 98 will not care for a login shell
|
||||
# unless specifically told to expect one.
|
||||
#
|
||||
printf "\n%s****\n" "$(uname -sn)"
|
||||
printf "\nUsername: "; sleep 1
|
||||
printf "\nPassword: "; sleep 1
|
||||
printf "\nStarting pppd..."
|
||||
printf "\nPPP>"
|
||||
# End of fake login prompt.
|
||||
|
||||
# Run PPP daemon and establish a link.
|
||||
pppd noauth nodetach local lock lcp-echo-interval $lcpidle lcp-echo-failure 3 proxyarp ms-dns 100.64.0.1 100.64.0.1:100.64.0.2 "/dev/${SERIAL_PORT}" "${BAUD}"
|
||||
|
||||
printf "\nPPP link terminated.\n"
|
@ -0,0 +1,368 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# --------------------------------
|
||||
# VMODEM - Virtual Modem bootstrap
|
||||
# --------------------------------
|
||||
# Original by Oliver Molini 2021
|
||||
# http://www.steptail.com/guides:virtual_modem:script
|
||||
#
|
||||
# Billy Stoughton II for bug fixes and contributions
|
||||
#
|
||||
# Modified and partially rewritten by Snep (contact-snep@diskcat.com) 2025
|
||||
# for the CGHMN project
|
||||
#
|
||||
# Licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License
|
||||
# https://creativecommons.org/licenses/by-nc-sa/4.0/
|
||||
|
||||
# Move to directory of script
|
||||
cd "$(dirname "$0")" || exit
|
||||
|
||||
# Script version
|
||||
vmodver=cghmn-1.0
|
||||
|
||||
# CONFIGURATION
|
||||
# -----------------------
|
||||
# Variable: SERIAL_PORT
|
||||
# SERIAL_PORT specifies which local serial device to use.
|
||||
# For example, "ttyUSB0" will tell the script to use
|
||||
# to use /dev/ttyUSB0 for communication.
|
||||
# Common values: ttyUSB0 or ttyAMA0
|
||||
#
|
||||
SERIAL_PORT="${SERIAL_PORT:-ttyUSB0}"
|
||||
|
||||
# Variable: BAUD
|
||||
# BAUD will tell the script to open the serial port at
|
||||
# specified symbol rate. When connecting, make sure
|
||||
# your client computer uses the same BAUD than what
|
||||
# has been specified here.
|
||||
# Common BAUD rates: 9600, 19200, 38400, 57600
|
||||
#
|
||||
# Default:
|
||||
# BAUD=57600
|
||||
#
|
||||
BAUD="${BAUD:-57600}"
|
||||
|
||||
# Variable: LOGIN_ENABLED
|
||||
# If set to "yes", the LOGIN command is enabled,
|
||||
# which allows remote users to log in to this
|
||||
# machine with their Unix username and password
|
||||
LOGIN_ENABLED="no"
|
||||
|
||||
# Variable: PPP_NUMBER
|
||||
# If set to a number, when this number is called
|
||||
# by the computer on the serial line, a PPP daemon
|
||||
# will be spawned
|
||||
PPP_DIAL_NUMBER="1"
|
||||
|
||||
# Variable: TERM
|
||||
# Tells the script and environment which type of terminal to emulate.
|
||||
# It is only useful to change this, if you're using a serial
|
||||
# terminal to connect to this script. If you're connecting form a ANSI
|
||||
# cabable machine such as DOS, you may want to use TERM="ansi"
|
||||
#
|
||||
TERM="vt100"
|
||||
|
||||
# EXPORT SHELL VARS
|
||||
# -----------------
|
||||
export SERIAL_PORT
|
||||
export BAUD
|
||||
export TERM
|
||||
|
||||
# FUNCTIONS
|
||||
# ---------
|
||||
#
|
||||
|
||||
#INITIALIZE SERIAL SETTINGS
|
||||
ttyinit () {
|
||||
exec 99>&-
|
||||
stty -F "/dev/${SERIAL_PORT}" "${BAUD}"
|
||||
stty -F "/dev/${SERIAL_PORT}" sane
|
||||
stty -F "/dev/${SERIAL_PORT}" raw
|
||||
stty -F "/dev/${SERIAL_PORT}" -echo -icrnl clocal
|
||||
exec 99<>"/dev/${SERIAL_PORT}"
|
||||
}
|
||||
|
||||
# SEND MESSAGE ON SCREEN AND OVER SERIAL
|
||||
sendtty () {
|
||||
NEWLINE_STR_CONSOLE="\n"
|
||||
NEWLINE_STR_SERIAL="\x0d\x0a"
|
||||
if [ "${1}" = "-n" ]; then
|
||||
NEWLINE_STR_CONSOLE=""
|
||||
NEWLINE_STR_SERIAL=""
|
||||
shift
|
||||
fi
|
||||
|
||||
echo -en "${1}${NEWLINE_STR_CONSOLE}";
|
||||
echo -en "${1}${NEWLINE_STR_SERIAL}" > "/dev/${SERIAL_PORT}"
|
||||
}
|
||||
|
||||
# Sends an AT status message or status code as reply
|
||||
sendstatus () {
|
||||
# Default to ERROR if not code given
|
||||
RESULT_CODE="${1:-ERROR}"
|
||||
|
||||
if [ "${VERBOSITY:-verbose}" = "verbose" ]; then
|
||||
sendtty "${RESULT_CODE}";
|
||||
elif [ "${VERBOSITY}" = "numeric" ]; then
|
||||
# Translate readable result codes into numeric ones if requested
|
||||
if [ "${RESULT_CODE}" == "OK" ]; then sendtty 0
|
||||
elif [ "${RESULT_CODE}" == "CONNECT" ]; then sendtty 1
|
||||
elif [ "${RESULT_CODE}" == "RING" ]; then sendtty 2
|
||||
elif [ "${RESULT_CODE}" == "NO CARRIER" ]; then sendtty 3
|
||||
elif [ "${RESULT_CODE}" == "ERROR" ]; then sendtty 4
|
||||
elif [ "${RESULT_CODE}" == "CONNECT 1200" ]; then sendtty 5
|
||||
elif [ "${RESULT_CODE}" == "NO DIALTONE" ]; then sendtty 6
|
||||
elif [ "${RESULT_CODE}" == "BUSY" ]; then sendtty 7
|
||||
elif [ "${RESULT_CODE}" == "NO ANSWER" ]; then sendtty 8
|
||||
else
|
||||
echo "> Unspecified result code '${RESULT_CODE}'" >&2
|
||||
sendtty "${RESULT_CODE}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Launch a script with getty
|
||||
exec_with_getty () {
|
||||
/sbin/getty -L "${SERIAL_PORT}" "${BAUD}" "${TERM}" -n -l "${1}"
|
||||
return $?
|
||||
}
|
||||
|
||||
# Dials a number (calls a number) from an ATD* command
|
||||
dial () {
|
||||
AT_COMMAND="${1}"
|
||||
NUMBER="$( grep -Eo "[0-9]+" <<< "${AT_COMMAND}" )"
|
||||
|
||||
# Ensure number is not blank
|
||||
if [ -z "${NUMBER}" ]; then
|
||||
echo "> Blank number dialed" >&2
|
||||
sendstatus "ERROR"
|
||||
return 1
|
||||
fi
|
||||
|
||||
DIAL_SCRIPT=""
|
||||
|
||||
# Show ringing status if verbose dialing is enabled
|
||||
if [ "${VERBOSE_DIALING:-yes}" = "yes" ]; then
|
||||
sendtty "RINGING"
|
||||
sleep 1
|
||||
fi
|
||||
|
||||
# Check if number is PPP dial number
|
||||
if [ "${NUMBER}" = "${PPP_DIAL_NUMBER}" ]; then
|
||||
if [ -f "${PWD}/ppp-cghmn.sh" ]; then
|
||||
DIAL_SCRIPT="${PWD}/ppp-cghmn.sh"
|
||||
elif [ -f "${PWD}/ppp.sh" ]; then
|
||||
DIAL_SCRIPT="${PWD}/ppp.sh"
|
||||
else
|
||||
echo "> No pppd handler script found in '${PWD}'" >&2
|
||||
sendstatus "NO CARRIER"
|
||||
return
|
||||
fi
|
||||
else
|
||||
# If not a PPP dial number, find script with called number
|
||||
if [ -f "${PWD}/DIAL_${NUMBER}.sh" ]; then
|
||||
DIAL_SCRIPT="${PWD}/DIAL_${NUMBER}.sh"
|
||||
elif [ -f "${PWD}/${NUMBER}.sh" ]; then
|
||||
DIAL_SCRIPT="${PWD}/${NUMBER}.sh"
|
||||
else
|
||||
sendstatus "NO CARRIER"
|
||||
return
|
||||
fi
|
||||
fi
|
||||
|
||||
# For compatibility, explicitly tell the terminal to default to CR/LF
|
||||
# when pressing enter, to avoid cases where the terminal just sends CR.
|
||||
echo -en "\x1b[20h" > "/dev/${SERIAL_PORT}"
|
||||
|
||||
echo "> Executing dial script '${DIAL_SCRIPT}' for number '${NUMBER}'" >&2
|
||||
|
||||
# Show connect message
|
||||
if [ "${VERBOSITY}" = "numeric" ]; then
|
||||
sendtty "1"
|
||||
elif [ "${VERBOSE_DIALING:-yes}" = "yes" ]; then
|
||||
sendtty "CONNECT ${BAUD}"
|
||||
else
|
||||
sendtty "CONNECT"
|
||||
fi
|
||||
|
||||
# Call script with getty
|
||||
exec_with_getty "${DIAL_SCRIPT}"
|
||||
|
||||
echo "> Dial script returned with exit code ${?}" >&2
|
||||
|
||||
ttyinit
|
||||
sendstatus "NO CARRIER"
|
||||
}
|
||||
|
||||
export -f sendtty
|
||||
export -f ttyinit
|
||||
export -f sendstatus
|
||||
|
||||
# Open serial port for use. Allocate file descriptor
|
||||
# and treat the serial port as a file.
|
||||
ttyinit
|
||||
#exec 99<>"/dev/${SERIAL_PORT}"
|
||||
|
||||
# Init message
|
||||
sendtty ""
|
||||
sendtty "VMODEM - Virtual Modem bootstrap for PPP link v${vmodver}"
|
||||
sendtty "Connection speed set to ${BAUD} baud"
|
||||
sendtty ""
|
||||
sendtty "TYPE HELP FOR COMMANDS"
|
||||
sendtty "READY."
|
||||
|
||||
# Main script loop
|
||||
while true; do
|
||||
CHARHEX="$(head -c 1 "/dev/${SERIAL_PORT}" | xxd -p -)"
|
||||
CHAR="$(echo -e "\x${CHARHEX}")"
|
||||
|
||||
# Echo recevied CHARacter to console
|
||||
echo -n "${CHAR}"
|
||||
|
||||
# Echo recevied CHARacter back to serial
|
||||
if [ "${ECHO_SERIAL:-yes}" = "yes" ]; then
|
||||
echo -n "${CHAR}" > "/dev/${SERIAL_PORT}"
|
||||
fi
|
||||
|
||||
# Check for end of line on CR or LF
|
||||
if [ "$CHARHEX" = "0d" ] || [ "$CHARHEX" = "0a" ]; then
|
||||
|
||||
# Upper-case entire line
|
||||
cmd="${BUFFER^^}"
|
||||
|
||||
# Clear temporary BUFFERs
|
||||
BUFFER=
|
||||
CHAR=
|
||||
|
||||
# Write new line to console and serial
|
||||
if [ "${ECHO_SERIAL:-yes}" = "yes" ]; then
|
||||
sendtty ""
|
||||
else
|
||||
echo ""
|
||||
fi
|
||||
|
||||
#
|
||||
# --- HAYES EMULATION ---
|
||||
#
|
||||
if [[ $cmd == AT* ]]; then
|
||||
# Handle known AT commands
|
||||
case "$cmd" in
|
||||
# Commands that do nothing but return OK
|
||||
# <Blank line> shall also return OK
|
||||
# ATA = Answer incoming call
|
||||
# ATH0 = Modem Hang up (Go On-Hook)
|
||||
# ATH1 = Modem Pick up (Go Off-Hook)
|
||||
# ATM0 = Modem speaker always off
|
||||
# ATM1 = Modem speaker on until carrier detected
|
||||
# ATM2 = Modem speaker always on
|
||||
# ATM3 = Modem speaker only on whilst answering
|
||||
# AT&C0 = Force Carrier-Detect high
|
||||
# AT&C1 = Let Modem set Carrier-Detect signal
|
||||
# AT&D0 = Modem ignores DTR line from computer
|
||||
# AT&D1 = Modem switches to AT mode on DTR on->off transition
|
||||
# AT&D1 = Modem hangs up and switches to AT mode on DTR on->off transition
|
||||
# AT&D3 = Modem resets itself on DTR on->off transition
|
||||
# AT&S0 = Force DSR line high
|
||||
# AT&S1 = Modem will set DSR high during connected state
|
||||
# ATSn = Change current register to n
|
||||
# ATSn=i = Change current register to n and store value i
|
||||
""|AT|ATA|ATH*|ATM*|AT\&C*|AT\&S*|ATS*) ;;
|
||||
|
||||
# ATZ = Restore modem
|
||||
# ATZn = Restore modem to profile n
|
||||
# AT&F = Restore modem to factory settings
|
||||
# AT&Fn = Restore modem to factory settings in profile n
|
||||
ATZ*|AT\&F*)
|
||||
ECHO_SERIAL="yes"
|
||||
VERBOSITY="verbose"
|
||||
;;
|
||||
|
||||
# ATE0 = Disable echo
|
||||
# ATE1 = Enable echo
|
||||
ATE|ATE0) ECHO_SERIAL="no" ;;
|
||||
ATE1) ECHO_SERIAL="yes" ;;
|
||||
|
||||
# ATV0 = Disable verbose responses
|
||||
# ATV1 = Enable verbose responses
|
||||
ATV|ATV0) VERBOSITY="numeric" ;;
|
||||
ATV1) VERBOSITY="verbose" ;;
|
||||
|
||||
# ATQ0 = Modem returns result codes
|
||||
# ATQ1 = Modem is quiet, returns no result codes
|
||||
ATQ|ATQ0) VERBOSITY="verbose" ;;
|
||||
ATQ1) VERBOSITY="quiet" ;;
|
||||
|
||||
# ATX0 = Blind dial, no busy detection, CONNECT when connection established (Hayes Smartmodem 300 compatible result code)
|
||||
# ATX1 = Blind dial, no busy detection, CONNECT with BAUD rate appended when connection established
|
||||
# ATX2 = Dial tone detection, no busy detection, CONNECT with BAUD rate appened when connection established
|
||||
# ATX3 = Blind dial, busy detection, CONNECT with BAUD rate appended when connection established
|
||||
# ATX4 = Dial tone detection, busy detection, CONNECT with BAUD rate appended when connection established
|
||||
ATX|ATX0) VERBOSE_DIALING="no" ;;
|
||||
ATX1|ATX2|ATX3|ATX4) VERBOSE_DIALING="yes" ;;
|
||||
|
||||
# ATDn = Dial number
|
||||
ATD*)
|
||||
dial "${cmd}"
|
||||
continue
|
||||
;;
|
||||
|
||||
# Return ERROR on all other (unknown) commands
|
||||
*)
|
||||
sendstatus "ERROR"
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
|
||||
# Send OK if no other status code was returned earlier
|
||||
sendstatus "OK"
|
||||
elif [ "${cmd}" = "HELP" ]; then
|
||||
sendtty "Command Reference for Virtual Modem Bootstrap v$vmodver"
|
||||
sendtty ""
|
||||
sendtty "AT......Tests modem link, prints OK if successful"
|
||||
sendtty "ATE0....Switch terminal echo off"
|
||||
sendtty "ATE1....Switch terminal echo on"
|
||||
sendtty "ATD?....Fork program ?.sh and output on terminal"
|
||||
sendtty "ATDT1...Open PPPD connection"
|
||||
sendtty "ATZ.....Reset modem settings"
|
||||
sendtty "HELP....Display command reference"
|
||||
[ "${LOGIN_ENABLED}" = "yes" ] && \
|
||||
sendtty "LOGIN...Fork a new linux login on serial"
|
||||
sendtty "EXIT....End this script"
|
||||
sendtty ""
|
||||
sendtty "To establish connection over PPP, dial 1 using tone dialing (ATDT1)"
|
||||
sendtty ""
|
||||
sendtty "READY."
|
||||
elif [ "${cmd}" = "LOGIN" ]; then
|
||||
if [ "${LOGIN_ENABLED:-no}" = "yes" ]; then
|
||||
|
||||
# Spawn login command on serial if enabled above
|
||||
exec 99>&-
|
||||
/sbin/getty -L "${SERIAL_PORT}" "${BAUD}" "${TERM}"
|
||||
|
||||
# Reset tty after logout
|
||||
ttyinit
|
||||
sendtty ""
|
||||
sendtty "READY."
|
||||
else
|
||||
sendtty "LOGIN is not enabled on this connection."
|
||||
sendstatus "ERROR"
|
||||
fi
|
||||
elif [ "${cmd}" = "EXIT" ] || [ "${cmd}" = "QUIT" ]; then
|
||||
|
||||
# Exit script
|
||||
# If managed by an init-system, this script *should* restart to serve the next connection
|
||||
sendstatus "OK"
|
||||
sendtty "BYE"
|
||||
|
||||
# Close serial port
|
||||
exec 99>&-
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
# If not CR or LF, append CHARacter to BUFFER
|
||||
BUFFER="${BUFFER}${CHAR}"
|
||||
fi
|
||||
done
|
||||
|
||||
# Close serial port
|
||||
exec 99>&-
|
@ -0,0 +1,63 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
# Quick and dirty command line interface for the most useful commands
|
||||
|
||||
# Show help for this script
|
||||
usage () {
|
||||
echo "$(basename "${0}") - Helper script for the CGHMN"
|
||||
echo ""
|
||||
echo "Usage: $(basename "${0}") <command> [<args>]"
|
||||
echo ""
|
||||
echo "Available commands:"
|
||||
echo " help Show this help"
|
||||
echo " coninfo Show info required to connect to the CGHMN"
|
||||
echo " toggle-ppp-internet Toggle internet access for PPP clients on or off"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# Show info required to connect to the CGHMN
|
||||
coninfo () {
|
||||
MY_WG_PUBKEY="$(uci get network.cghmnd_wg.private_key | wg pubkey)"
|
||||
ETH0_MAC="$(ip link show eth0 | awk '/link\/ether/{ print $2 }')"
|
||||
|
||||
echo "[> The following information is required or at least helpful to know when connecting to the CGHMN <]"
|
||||
echo ""
|
||||
echo "My primary Ethernet address: ${ETH0_MAC}"
|
||||
echo "My Wireguard public key: ${MY_WG_PUBKEY}"
|
||||
echo -n "My Wireguard IP addresses: "
|
||||
for IP in $(uci get network.cghmnd_wg.addresses); do
|
||||
echo -ne "${IP}\n "
|
||||
done
|
||||
echo ""
|
||||
}
|
||||
|
||||
toggle_ppp_internet () {
|
||||
PPP_FOWARD_ID="$(uci show firewall.@forwarding[] | awk -F. "/src='ppp_client'/{ print \$2 }")"
|
||||
|
||||
if uci -d ";" get "firewall.${PPP_FOWARD_ID}.dest" | grep -qE '^wan;|;wan;|;wan$'; then
|
||||
uci del_list firewall."${PPP_FOWARD_ID}".dest='wan'
|
||||
echo "OK, internet is now OFF for PPP clients"
|
||||
else
|
||||
uci add_list firewall."${PPP_FOWARD_ID}".dest='wan'
|
||||
echo "OK, internet is now ON for PPP clients"
|
||||
fi
|
||||
}
|
||||
|
||||
# Parse command selector
|
||||
case "${1}" in
|
||||
-h|--help|help|"")
|
||||
usage
|
||||
;;
|
||||
coninfo)
|
||||
coninfo
|
||||
;;
|
||||
toggle-ppp-internet)
|
||||
toggle_ppp_internet
|
||||
;;
|
||||
*)
|
||||
echo "Unknown command '${1}'"
|
||||
echo ""
|
||||
usage
|
||||
exit 1
|
||||
esac
|
Loading…
Reference in new issue