2 ###############################################################################
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2012 IPFire Network Development Team #
7 # This program is free software: you can redistribute it and/or modify #
8 # it under the terms of the GNU General Public License as published by #
9 # the Free Software Foundation, either version 3 of the License, or #
10 # (at your option) any later version. #
12 # This program is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
20 ###############################################################################
22 .
/usr
/lib
/network
/header-zone
24 HOOK_SETTINGS
="HOOK ACCESS_CONCENTRATOR AUTH USERNAME PASSWORD"
25 HOOK_SETTINGS
="${HOOK_SETTINGS} SERVICE_NAME MTU IPV6 PREFIX_DELEGATION"
27 # User credentials for the dialin.
31 # Set the authentication mechanism.
34 # Access Concentrator.
35 ACCESS_CONCENTRATOR
=""
40 # Maximum Transmission Unit.
41 # 1492 is a very common value for that.
44 # This hook can work with all authentication methods supported by pppd.
45 PPPOE_SUPPORTED_AUTH_METHODS
="${PPP_SUPPORTED_AUTH_METHODS}"
46 PPPOE_PLUGIN
="rp-pppoe.so"
48 # Request an IPv6 address.
51 # Use IPv6 prefix delegation.
52 PREFIX_DELEGATION
="false"
54 function hook_check_settings
() {
58 isset AUTH
&& assert isoneof AUTH
${PPPOE_SUPPORTED_AUTH_METHODS}
61 assert isset PREFIX_DELEGATION
64 function hook_parse_cmdline
() {
65 while [ $# -gt 0 ]; do
67 --access-concentrator=*)
68 ACCESS_CONCENTRATOR
=$
(cli_get_val
${1})
71 AUTH
=$
(cli_get_val
${1})
74 local value
="$(cli_get_val "${1}")"
75 if enabled value
; then
82 MTU
=$
(cli_get_val
${1})
85 PASSWORD
=$
(cli_get_val
${1})
87 --prefix-delegation=*)
88 PREFIX_DELEGATION
="$(cli_get_bool "${1}")"
91 SERVICE_NAME
=$
(cli_get_val
${1})
94 USERNAME
=$
(cli_get_val
${1})
97 warning
"Unknown argument: ${1}" >&2
108 zone_settings_read
"${zone}"
111 local port
=$
(__hook_get_port
"${zone}")
114 # Start the ppp daemon.
120 function hook_down
() {
124 zone_settings_read
"${zone}"
126 # Stop the ppp daemon.
129 # Bring down the port.
130 log DEBUG
"Bringing down port '${PORT}'."
136 function hook_hotplug
() {
139 case "$(hotplug_action)" in
141 if hotplug_event_interface_is_port_of_zone
"${zone}"; then
142 # Bring up the zone if it is enabled but not active, yet.
143 zone_start_auto
"${zone}"
149 # PPPoE cannot work if the ethernet device has been removed
150 if hotplug_event_interface_is_port_of_zone
"${zone}"; then
151 if zone_is_active
"${zone}"; then
160 exit ${EXIT_NOT_HANDLED}
163 function hook_discover
() {
166 # This obviously only works on ethernet (or compatible) devices
167 if ! device_is_ethernet_compatible
"${device}"; then
172 output
=$
(pppoe-discovery
-I ${device} -U $
(uuid
) 2>&1)
174 # Exit if there was not output
175 [ -z "${output}" ] && exit ${DISCOVER_ERROR}
177 # Exit if PADI timed out
178 grep -q "Timeout" <<<${output} && exit ${DISCOVER_ERROR}
183 Access-Concentrator
:*)
184 ac
="${line#Access-Concentrator: }"
189 echo "ACCESS_CONCENTRATOR=\"$ac\""
194 function hook_status
() {
198 cli_device_headline
${zone}
200 zone_settings_read
"${zone}"
202 cli_headline
2 "Configuration"
203 cli_print_fmt1
2 "Username" "${USERNAME}"
204 cli_print_fmt1
2 "Password" "<hidden>"
206 local port
=$
(__hook_get_port
"${zone}")
208 cli_print_fmt1
2 "Port" "${port}"
212 # Exit if zone is down
213 if ! zone_is_up
${zone}; then
218 # XXX display time since connection started
220 cli_headline
2 "Point-to-Point-over-Ethernet protocol"
222 for proto
in ${IP_SUPPORTED_PROTOCOLS}; do
223 routing_db_exists
${zone} ${proto} ||
continue
228 headline
="Internet Protocol Version 6"
231 headline
="Internet Protocol Version 4"
234 headline
="Unkown protocol"
237 cli_headline
3 "${headline}"
239 cli_print_fmt1
3 "IP address" "$(routing_db_get ${zone} ${proto} local-ip-address)"
240 cli_print_fmt1
3 "Gateway" "$(routing_db_get ${zone} ${proto} remote-ip-address)"
241 cli_print_fmt1
3 "DNS servers" "$(routing_db_get ${zone} ${proto} dns)"
243 cli_print_fmt1
3 "MAC-Remote" "$(routing_db_get ${zone} ${proto} remote-address)"
250 function hook_ppp_write_config
() {
257 # Read in the configuration files.
258 zone_settings_read
"${zone}"
260 # A port has to be assigned for this action
261 local port
=$
(__hook_get_port
"${zone}")
262 if ! isset port
; then
263 error
"No port assigned to pppoe hook of zone '${zone}'"
267 # Prepare the command line options for the pppoe plugin.
270 # Add the access concentrator (if any).
271 if isset ACCESS_CONCENTRATOR
; then
272 plugin_options
="${plugin_options} rp_pppoe_ac '${ACCESS_CONCENTRATOR}'"
275 # Add the service name (if any).
276 if isset SERVICE_NAME
; then
277 plugin_options
="${plugin_options} rp_pppoe_service '${SERVICE_NAME}'"
280 # The last argument must be the interface.
281 plugin_options
="${plugin_options} ${port}"
283 pppd_write_config
${file} \
284 --interface="${zone}" \
285 --username="${USERNAME}" \
286 --password="${PASSWORD}" \
291 --plugin="${PPPOE_PLUGIN}" \
292 --plugin-options="${plugin_options}"
297 function __hook_get_port
() {
301 for port
in $
(zone_get_ports
"${zone}"); do
309 function hook_port_add
() {
310 # Excepting at least two arguments here
317 # PPPoE can only use one port
318 local ports_num
="$(zone_get_ports_num "${zone}")"
319 if [ ${ports_num} -ge 1 ]; then
320 local port
=$
(__hook_get_port
"${zone}")
321 error
"The pppoe zone hook only supports assigning one port"
322 error
" port '${port}' has already been assigned to zone '${zone}'"
326 zone_port_settings_write
"${zone}" "${port}"
327 log INFO
"Port '${port}' has been added to zone '${zone}'"
332 function hook_port_remove
() {
338 # Shut down the port (if possible)
341 log INFO
"Port '${port}' has been removed from zone '${zone}'"
342 zone_port_settings_remove
"${zone}" "${port}"