#!/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 . #
# #
###############################################################################
. /lib/network/header-zone
HOOK_SETTINGS="HOOK AUTH DEVICE BAUDRATE LINKNAME USER SECRET PEERDNS DEFAULTROUTE MTU"
AUTH=
BAUDRATE=921600
DEFAULTROUTE=1
DEVICE=
LINKNAME="$(uuid)"
MTU=1492
PEERDNS=1
SECRET=
USER=
MODEM_ALLOWED_AUTHS="chap pap"
function pppd_pid() {
local zone=${1}
shift
cat /var/run/${zone}.pid 2>/dev/null
}
function _check() {
assert isset USER
assert isset SECRET
assert isset LINKNAME
assert isset DEFAULTROUTE
assert isset PEERDNS
assert isset DEVICE
assert isbool DEFAULTROUTE
assert isbool PEERDNS
assert isinteger BAUDRATE
isset AUTH && assert isoneof AUTH ${MODEM_ALLOWED_AUTHS}
}
function _parse_cmdline() {
local value
while [ $# -gt 0 ]; do
case "$1" in
--user=*)
USER=${1#--user=}
;;
--secret=*)
SECRET=${1#--secret=}
;;
--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=}
;;
--baudrate=*)
BAUDRATE=${1#--baudrate=}
;;
*)
echo "Unknown option: $1" >&2
exit ${EXIT_ERROR}
;;
esac
shift
done
}
function _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}
ppp_secret "${USER}" "${SECRET}"
cat <${RED_RUN}/${LINKNAME}/options
# Naming options
ifname ${zone}
name ${LINKNAME}
linkname ${LINKNAME}
# Device configuration
/dev/${DEVICE} ${BAUDRATE}
connect "/usr/sbin/chat -v -f /etc/ppp/dialer"
lock
modem
crtscts
# User configuration
user ${USER}
$(enabled PEERDNS && echo "usepeerdns")
$(enabled DEFAULTROUTE && echo "defaultroute")
noauth
$(isset AUTH && echo "require-${AUTH}")
noipdefault
# Maximum transmission/receive unit
mtu ${MTU}
mru ${MTU}
# Disable the compression
noccp noaccomp nodeflate nopcomp novj novjccomp nobsdcomp nomppe
updetach debug
EOF
pppd_exec file ${RED_RUN}/${LINKNAME}/options
local ret=$?
# Get exit code from ppp daemon and handle it:
case "${ret}" in
0)
log DEBUG "pppd detached successfully"
exit ${EXIT_OK}
;;
esac
error_log "pppd exited with unknown exit code '${ret}'"
exit ${EXIT_ERROR}
}
function _down() {
local zone=${1}
shift
# Kill pppd
# XXX very ugly
kill $(pppd_pid ${zone}) &>/dev/null
exit ${EXIT_OK}
}
function _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
cli_headline " Ports:"
zone_ports_status ${zone}
if [ -z "$(zone_get_ports ${zone})" ]; then
echo -e " ${COLOUR_WARN}No ports attached. Won't be able to start.${COLOUR_NORMAL}"
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}
}