#!/bin/bash ############################################################################### # # # IPFire.org - A linux based firewall # # Copyright (C) 2010 Michael Tremer & Christian Schmidt # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # # # ############################################################################### . /usr/lib/network/header-zone HOOK_SETTINGS="HOOK LOCAL_ADDRESS REMOTE_ADDRESS MSN MTU MRU" HOOK_SETTINGS="${HOOK_SETTINGS} L2PROTO L3PROTO ENCAP" # The peer address of the ISDN server. LOCAL_ADDRESS= REMOTE_ADDRESS= AUTH= ENCAP="syncppp" L2PROTO="hdlc" L3PROTO="trans" LINKNAME="$(uuid)" MSN= MTU=1500 TIMEOUT=10 MODE="persistent" function hook_check() { assert isset LOCAL_ADDRESS assert isset REMOTE_ADDRESS assert isset LINKNAME assert isset TIMEOUT assert isinteger MSN assert isinteger TIMEOUT isset AUTH && assert isoneof AUTH ${ISDN_ALLOWED_AUTHS} } function hook_parse_cmdline() { local value while [ $# -gt 0 ]; do case "$1" in --local-address=*) LOCAL_ADDRESS=${1#--local-address=} ;; --remote-address=*) REMOTE_ADDRESS=${1#--remote-address=} ;; --subnet=*) SUBNET=${1#--subnet=} ;; --linkname=*) LINKNAME=${1#--name=} ;; --mtu=*) MTU=${1#--mtu=} ;; --defaultroute=*) value=${1#--defaultroute=} if enabled value; then DEFAULTROUTE=1 else DEFAULTROUTE=0 fi ;; --dns=*) value=${1#--dns=} if enabled value; then PEERDNS=1 else PEERDNS=0 fi ;; --auth=*) AUTH=${1#--auth=} ;; --device=*) DEVICE=${1#--device=} ;; --msn=*) MSN=${1#--msn=} ;; --timeout=*) TIMEOUT=${1#--timeout=} ;; --phone=*) PHONE="${PHONE} ${1#--phone=}" ;; *) echo "Unknown option: $1" >&2 exit ${EXIT_ERROR} ;; esac shift done } function hook_up() { local zone=${1} shift assert isset zone zone_config_read ${zone} assert [ -e "/dev/${DEVICE}" ] # Creating necessary files # XXX must be PPP_RUN [ -d "${RED_RUN}/${LINKNAME}" ] || mkdir -p ${RED_RUN}/${LINKNAME} # Create device node. isdn_create_device ${zone} # Apply configuration to the ISDN stack. isdn_set_l2proto ${zone} ${L2PROTO} isdn_set_l3proto ${zone} ${L3PROTO} isdn_set_encap ${zone} ${ENCAP} isdn_set_eaz ${zone} ${MSN} isdn_set_huptimeout ${zone} $(( ${TIMEOUT} * 60 )) # Set our ip address. ip_address_add ${zone} ${LOCAL_ADDRESS} device_set_up ${zone} # Start ipppd in server mode and make it listening for # incoming connections: local options # Get a list of all DNS servers. local dns_server for dns_server in ${dns_servers}; do options="${options} --dns-server=${dns_server}" done # Convert netmask. local prefix=$(ip_get_prefix ${LOCAL_ADDRESS}) local netmask=$(ipv4_prefix2netmask ${prefix}) # Split prefix from LOCAL_ADDRESS. local local_address=$(ip_split_prefix ${LOCAL_ADDRESS}) ipppd_start ${zone} \ --mode="server" \ --local-address="${local_address}" \ --remote-address="${REMOTE_ADDRESS}" \ --netmask="${netmask}" \ --mtu=${MTU} \ ${options} exit ${EXIT_OK} } function hook_down() { local zone=${1} shift # Kill ipppd service. ipppd_stop ${zone} # Bring down ISDN interface. device_set_down ${zone} # Remove ISDN device. isdn_remove_device ${zone} exit ${EXIT_OK} } function hook_status() { local zone=${1} assert isset zone cli_device_headline ${zone} zone_config_read ${zone} cli_headline " Configuration:" printf "${DEVICE_PRINT_LINE1}" "User:" "${USER}" printf "${DEVICE_PRINT_LINE1}" "Secret:" "" echo printf "${DEVICE_PRINT_LINE1}" "MTU:" "${MTU}" printf "${DEVICE_PRINT_LINE1}" "Use default route?" "$(enabled DEFAULTROUTE && echo "enabled" || echo "disabled")" printf "${DEVICE_PRINT_LINE1}" "Use peer DNS?" "$(enabled PEERDNS && echo "enabled" || echo "disabled")" echo if device_exists ${zone}; then cli_headline " ISDN information:" printf "${DEVICE_PRINT_LINE1}" "L2 protocol:" "$(isdn_get_l2proto ${zone})" printf "${DEVICE_PRINT_LINE1}" "L3 protocol:" "$(isdn_get_l3proto ${zone})" printf "${DEVICE_PRINT_LINE1}" "Encapsulation:" "$(isdn_get_encap ${zone})" echo fi # Exit if zone is down if ! zone_is_up ${zone}; then echo # Empty line exit ${EXIT_ERROR} fi # XXX display time since connection started cli_headline " Point-to-Point-over-Ethernet protocol:" echo " IP-Address : $(routing_db_get ${zone} local-ip-address)" echo " Gateway : $(routing_db_get ${zone} remote-ip-address)" echo " DNS-Server : $(routing_db_get ${zone} dns)" echo echo " MAC-Remote : $(routing_db_get ${zone} remote-address)" echo echo " MTU : $(device_get_mtu ${zone})" echo # Empty line exit ${EXIT_OK} }