#!/bin/bash _DetermineMyLANIP() { ( . /var/lib/dhcpcd/dhcpcd-"${UPnP_LAN_Interface}".info echo "${IPADDR}" ) } _DetermineRouterLANIP() { ( . /var/lib/dhcpcd/dhcpcd-"${UPnP_LAN_Interface}".info read IP xtra <<<"${GATEWAYS}" echo "${IP}" ) } UPnP_EnsureURI() { [ -n "${UPnP_URI}" ] && return [ -z "${UPnP_RouterHost}" ] && UPnP_RouterHost="$(_DetermineRouterLANIP)" [ -z "${UPnP_RouterHost}" ] && return # No idea, give up! UPnP_URI="http://${UPnP_RouterHost}/UD/?3" } UPnP_PortMap() { # [UPnP_RemoteHost=] [...] UPnP_PortMap local Action="$1" n v dt UPnP_EnsureURI { cat <<\EOF EOF echo "" set | sed 's:^UPnP_::;t;d' | while IFS='=' read n v; do dt= case "${n}" in RemotePort | ExternalPort | InternalPort) dt='ui2' ;; Enabled) dt='boolean' ;; LeaseDuration) dt='ui4' ;; RemoteHost | Protocol | InternalClient | PortMappingDescription) dt='string' ;; esac [ -n "${dt}" ] && echo "${v}" done echo "" cat <<\EOF EOF } | curl \ --user-agent "Luke-Jr's UPnP Port Forwarding Script (invoked as $0)" \ --header 'SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#${Action}PortMapping"' \ --header 'Content-Type: text/xml; charset="utf-8"' \ --data-binary '@-' \ "${UPnP_URI}" \ >/dev/null } UPnP_PortFwd() { # UPnP_PortFwd [DestIP] [DestPort] local Protocol="$1" Port="$2" Description="$3" DestIP="$4" DestPort="$5" [ -z "$DestIP" ] && DestIP="$(_DetermineMyLANIP)" [ -z "$DestPort" ] && DestPort="${Port}" UPnP_RemoteHost= \ UPnP_ExternalPort="$Port" \ UPnP_Protocol="$Protocol" \ UPnP_PortMap Delete UPnP_RemoteHost= \ UPnP_ExternalPort="$Port" \ UPnP_Protocol="$Protocol" \ UPnP_InternalPort="${DestPort}" \ UPnP_InternalClient="${DestIP}" \ UPnP_Enabled=1 \ UPnP_PortMappingDescription="$Description" \ UPnP_LeaseDuration=0 \ UPnP_PortMap Add } UPnP_LAN_Interface="$2" MyCmd="$3" [ "$1" == '-i' ] || MyCmd= shift 3 if [ -z "$MyCmd" ]; then exec >&2 echo " Usage: $0 -i " echo "Example: $0 -i eth0 PortFwd TCP 22 SSH" echo '' echo 'Commands:' echo " [UPnP_RemoteHost=] [...] $0 -i PortMap " echo " $0 -i PortFwd [DestIP] [DestPort]" exit 1 fi "UPnP_${MyCmd}" "$@"