ipv4-static: Update hook
[people/stevee/network.git] / src / hooks / configs / ipv4-static
1 #!/bin/bash
2 ###############################################################################
3 #                                                                             #
4 # IPFire.org - A linux based firewall                                         #
5 # Copyright (C) 2010  Michael Tremer & Christian Schmidt                      #
6 #                                                                             #
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.                                         #
11 #                                                                             #
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.                                #
16 #                                                                             #
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/>.       #
19 #                                                                             #
20 ###############################################################################
21
22 . /usr/lib/network/header-config
23
24 HOOK_MANPAGE="network-config-ipv4-static"
25
26 HOOK_SETTINGS="HOOK ADDRESS PREFIX GATEWAY"
27
28 function hook_check() {
29         assert isset ADDRESS
30         assert isinteger PREFIX
31
32         if [ ${PREFIX} -gt 30 ]; then
33                 error "PREFIX is greater than 30."
34                 exit ${EXIT_ERROR}
35         fi
36 }
37
38 function hook_create() {
39         local zone="${1}"
40         assert zone_exists "${zone}"
41         shift
42
43         local arg
44         while read -r arg; do
45                 local key="$(cli_get_key "${arg}")"
46                 local val="$(cli_get_val "${arg}")"
47
48                 case "${key}" in
49                         address)
50                                 if ! ipv4_is_valid "${val}"; then
51                                         error "Invalid IPv4 address: ${val}"
52                                         exit ${EXIT_CONF_ERROR}
53                                 fi
54
55                                 ADDRESS="${val}"
56                                 ;;
57
58                         prefix)
59                                 if ! ipv4_prefix_is_valid "${val}"; then
60                                         error "Invalid IPv4 prefix: ${val}"
61                                         exit ${EXIT_CONF_ERROR}
62                                 fi
63
64                                 PREFIX="${val}"
65                                 ;;
66
67                         gateway)
68                                 if ! ipv4_is_valid "${val}"; then
69                                         error "Invalid IPv4 address for gateway: ${val}"
70                                         exit ${EXIT_CONF_ERROR}
71                                 fi
72
73                                 GATEWAY="${val}"
74                                 ;;
75
76                         # Compatibility switches
77                         netmask)
78                                 if ! ipv4_netmask_is_valid "${val}"; then
79                                         error "Invalid netmask: ${val}"
80                                         exit ${EXIT_CONF_ERROR}
81                                 fi
82
83                                 # The netmask will be converted into a prefix
84                                 PREFIX="$(ipv4_netmask2prefix ${val})"
85                                 ;;
86
87                         # Unknown switches
88                         *)
89                                 error "Unhandled argument: ${arg}"
90                                 exit ${EXIT_CONF_ERROR}
91                                 ;;
92                 esac
93         done <<< "$(args $@)"
94
95         if ! isset ADDRESS; then
96                 error "You need to provide an IPv4 address"
97                 exit ${EXIT_CONF_ERROR}
98         fi
99
100         if ! isset PREFIX; then
101                 error "You need to provide an IPv4 prefix"
102                 exit ${EXIT_CONF_ERROR}
103         fi
104
105         if ! isset GATEWAY && zone_is_nonlocal "${zone}"; then
106                 warning "You did not configure a gateway for a non-local zone"
107         fi
108
109         # XXX maybe we can add some hashing to identify a configuration again
110         zone_config_settings_write "${zone}" "${HOOK}.$(uuid)" ${HOOK_SETTINGS}
111
112         exit ${EXIT_OK}
113 }
114
115 function hook_up() {
116         local zone=${1}
117         local config=${2}
118         shift 2
119
120         if ! device_exists ${zone}; then
121                 error "Zone '${zone}' doesn't exist."
122                 exit ${EXIT_ERROR}
123         fi
124
125         zone_config_settings_read "${zone}" "${config}" ${HOOK_SETTINGS}
126
127         ip_address_add ${zone} ${ADDRESS}/${PREFIX}
128
129         # Save configuration
130         routing_db_set ${zone} ipv4 type "${HOOK}"
131         routing_db_set ${zone} ipv4 local-ip-address "${ADDRESS}/${PREFIX}"
132         routing_db_set ${zone} ipv4 remote-ip-address "${GATEWAY}"
133         routing_db_set ${zone} ipv4 active 1
134
135         routing_update ${zone} ipv4
136         routing_default_update
137
138         exit ${EXIT_OK}
139 }
140
141 function hook_down() {
142         local zone=${1}
143         local config=${2}
144         shift 2
145
146         if ! device_exists ${zone}; then
147                 error "Zone '${zone}' doesn't exist."
148                 exit ${EXIT_ERROR}
149         fi
150         
151         zone_config_settings_read "${zone}" "${config}" ${HOOK_SETTINGS}
152
153         ip_address_del ${zone} ${ADDRESS}/${PREFIX}
154
155         # Update routing tables.
156         routing_default_update
157
158         exit ${EXIT_OK}
159 }
160
161 function hook_status() {
162         local zone=${1}
163         local config=${2}
164         shift 2
165
166         if ! device_exists ${zone}; then
167                 error "Zone '${zone}' doesn't exist."
168                 exit ${EXIT_ERROR}
169         fi
170
171         zone_config_settings_read "${zone}" "${config}" ${HOOK_SETTINGS}
172
173         local status
174         if zone_has_ip ${zone} ${ADDRESS}/${PREFIX}; then
175                 status=${MSG_HOOK_UP}
176         else
177                 status=${MSG_HOOK_DOWN}
178         fi
179         cli_statusline 3 "${HOOK}" "${status}"
180
181         cli_print_fmt1 3 "IPv4 address" "${ADDRESS}/${PREFIX}"
182         if [ -n "${GATEWAY}" ]; then
183                 cli_print_fmt1 3 "Gateway" "${GATEWAY}"
184         fi
185         cli_space
186
187         exit ${EXIT_OK}
188 }
189