| 1 | #!/bin/sh
|
|---|
| 2 | #
|
|---|
| 3 | # This file is part of the FreeWRT project. FreeWRT is copyrighted
|
|---|
| 4 | # material, please see the LICENCE file in the top-level directory
|
|---|
| 5 | # or at http://www.freewrt.org/licence for details.
|
|---|
| 6 | #
|
|---|
| 7 | # Christian Fischer <spaetzle@freewrt.org>
|
|---|
| 8 | #
|
|---|
| 9 |
|
|---|
| 10 | CFG_DOWN_IFUP_CHECK_OFF=1
|
|---|
| 11 | CFG_STOP_PRINTING_OFF=1
|
|---|
| 12 |
|
|---|
| 13 | iface_type() {
|
|---|
| 14 | # HACK: use iface name only, no idea how to get the list of existing tuntap ifaces
|
|---|
| 15 | # from system
|
|---|
| 16 | if check_iface_name || \
|
|---|
| 17 | [ "${IF_TUNTAP:-""}" != "" ] || \
|
|---|
| 18 | [ "${IF_TUNTAP_USER:-""}" != "" ]
|
|---|
| 19 | then
|
|---|
| 20 | return 0
|
|---|
| 21 | fi
|
|---|
| 22 | return 1
|
|---|
| 23 | }
|
|---|
| 24 |
|
|---|
| 25 | check_iface_name() {
|
|---|
| 26 | echo $IFACE | grep -q "^tun\|^tap[0-9][1-9]*$"
|
|---|
| 27 | }
|
|---|
| 28 |
|
|---|
| 29 | check_kernel_support() {
|
|---|
| 30 | [ -e /dev/net/tun ] && return
|
|---|
| 31 | insmod tun >/dev/null 2>&1 ; sleep 1
|
|---|
| 32 | [ -e /dev/net/tun ] && return
|
|---|
| 33 | err="Your kernel lacks tuntap support"
|
|---|
| 34 | return 1
|
|---|
| 35 | }
|
|---|
| 36 |
|
|---|
| 37 | check_openvpn_support() {
|
|---|
| 38 | [ -x "$(which openvpn)" ] && return
|
|---|
| 39 | err="openvpn executable not found"
|
|---|
| 40 | return 1
|
|---|
| 41 | }
|
|---|
| 42 |
|
|---|
| 43 | check_tunctl_support() {
|
|---|
| 44 | [ -x "$(which tunctl)" ] && return
|
|---|
| 45 | err="tunctl executable not found"
|
|---|
| 46 | return 1
|
|---|
| 47 | }
|
|---|
| 48 |
|
|---|
| 49 | openvpn_create() {
|
|---|
| 50 | openvpn --mktun --dev $IFACE >/dev/null 2>&1 && return
|
|---|
| 51 | err="Creating openvpn tuntap $IFACE failed"
|
|---|
| 52 | return 1
|
|---|
| 53 | }
|
|---|
| 54 |
|
|---|
| 55 | tunctl_create() {
|
|---|
| 56 | tunctl -u ${IF_TUNTAP_USER:-0} -t $IFACE >/dev/null 2>&1 && return
|
|---|
| 57 | err="Creating tuntap $IFACE failed"
|
|---|
| 58 | return 1
|
|---|
| 59 | }
|
|---|
| 60 |
|
|---|
| 61 | openvpn_destroy() {
|
|---|
| 62 | openvpn --rmtun --dev $IFACE >/dev/null 2>&1 && return
|
|---|
| 63 | err="Destroying openvpn tuntap $IFACE failed"
|
|---|
| 64 | return 1
|
|---|
| 65 | }
|
|---|
| 66 |
|
|---|
| 67 | tunctl_destroy() {
|
|---|
| 68 | tunctl -d "${IFACE}" >/dev/null 2>&1 && return
|
|---|
| 69 | err="Destroying tuntap $IFACE failed"
|
|---|
| 70 | return 1
|
|---|
| 71 | }
|
|---|
| 72 |
|
|---|
| 73 | tuntap_create() {
|
|---|
| 74 | eval $fncreate
|
|---|
| 75 | }
|
|---|
| 76 |
|
|---|
| 77 | tuntap_destroy() {
|
|---|
| 78 | eval $fndestroy
|
|---|
| 79 | }
|
|---|
| 80 |
|
|---|
| 81 | set_methods() {
|
|---|
| 82 | if [ "${IF_TUNTAP:-""}" = "openvpn" ]
|
|---|
| 83 | then
|
|---|
| 84 | check_openvpn_support || return 1
|
|---|
| 85 | fncreate="openvpn_create"
|
|---|
| 86 | fndestroy="openvpn_destroy"
|
|---|
| 87 | else
|
|---|
| 88 | check_tunctl_support || return 1
|
|---|
| 89 | fncreate="tunctl_create"
|
|---|
| 90 | fndestroy="tunctl_destroy"
|
|---|
| 91 | fi
|
|---|
| 92 | return 0
|
|---|
| 93 | }
|
|---|
| 94 |
|
|---|
| 95 | if_preup() {
|
|---|
| 96 | check_iface_name || {
|
|---|
| 97 | mcreate
|
|---|
| 98 | mstate 1
|
|---|
| 99 | merr "Tuntap name $IFACE is not supported, use tun* or tap* instead"
|
|---|
| 100 | return 1
|
|---|
| 101 | }
|
|---|
| 102 |
|
|---|
| 103 | if ! check_kernel_support
|
|---|
| 104 | then
|
|---|
| 105 | mcreate
|
|---|
| 106 | mstate 1
|
|---|
| 107 | merr $err
|
|---|
| 108 | fi
|
|---|
| 109 |
|
|---|
| 110 | if ! set_methods
|
|---|
| 111 | then
|
|---|
| 112 | mcreate
|
|---|
| 113 | mstate 1
|
|---|
| 114 | merr $err
|
|---|
| 115 | fi
|
|---|
| 116 |
|
|---|
| 117 | if iface_exists
|
|---|
| 118 | then
|
|---|
| 119 | mdestroy
|
|---|
| 120 | tuntap_destroy
|
|---|
| 121 | mstate $? || {
|
|---|
| 122 | merr $err
|
|---|
| 123 | return 1
|
|---|
| 124 | }
|
|---|
| 125 | fi
|
|---|
| 126 |
|
|---|
| 127 | mcreate
|
|---|
| 128 | tuntap_create
|
|---|
| 129 | mstate $? || {
|
|---|
| 130 | merr $err
|
|---|
| 131 | return 1
|
|---|
| 132 | }
|
|---|
| 133 | }
|
|---|
| 134 |
|
|---|
| 135 | if_down() {
|
|---|
| 136 | mstop
|
|---|
| 137 | check_iface_name || {
|
|---|
| 138 | mdestroy
|
|---|
| 139 | mstate 1
|
|---|
| 140 | merr "Tuntap name $IFACE is not supported, use tun* or tap* instead"
|
|---|
| 141 | return 1
|
|---|
| 142 | }
|
|---|
| 143 |
|
|---|
| 144 | if ! set_methods
|
|---|
| 145 | then
|
|---|
| 146 | mdestroy
|
|---|
| 147 | mstate 1
|
|---|
| 148 | merr $err
|
|---|
| 149 | fi
|
|---|
| 150 |
|
|---|
| 151 | if ! is_up
|
|---|
| 152 | then
|
|---|
| 153 | mdestroy
|
|---|
| 154 | tuntap_destroy
|
|---|
| 155 | mstate $? || merr $err
|
|---|
| 156 | builtin exit 1
|
|---|
| 157 | fi
|
|---|
| 158 | mdown
|
|---|
| 159 | }
|
|---|
| 160 |
|
|---|
| 161 | if_postdown() {
|
|---|
| 162 | is_up && {
|
|---|
| 163 | mstate 1
|
|---|
| 164 | return 1
|
|---|
| 165 | }
|
|---|
| 166 | mstate 0
|
|---|
| 167 |
|
|---|
| 168 | if ! set_methods
|
|---|
| 169 | then
|
|---|
| 170 | mdestroy
|
|---|
| 171 | mstate 1
|
|---|
| 172 | merr $err
|
|---|
| 173 | fi
|
|---|
| 174 |
|
|---|
| 175 | mdestroy
|
|---|
| 176 | tuntap_destroy
|
|---|
| 177 | mstate $? || {
|
|---|
| 178 | merr $err
|
|---|
| 179 | return 1
|
|---|
| 180 | }
|
|---|
| 181 | }
|
|---|
| 182 |
|
|---|
| 183 | # vim:ts=4
|
|---|