Linux ip-172-26-2-223 5.4.0-1018-aws #18-Ubuntu SMP Wed Jun 24 01:15:00 UTC 2020 x86_64
Apache
: 172.26.2.223 | : 3.128.205.101
Cant Read [ /etc/named.conf ]
8.1.13
www
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
BLACK DEFEND!
README
+ Create Folder
+ Create File
/
snap /
core /
17200 /
usr /
sbin /
[ HOME SHELL ]
Name
Size
Permission
Action
aa-exec
22.16
KB
-rwxr-xr-x
aa-remove-unknown
2.86
KB
-rwxr-xr-x
aa-status
7.11
KB
-rwxr-xr-x
add-shell
695
B
-rwxr-xr-x
addgroup
36.4
KB
-rwxr-xr-x
adduser
36.4
KB
-rwxr-xr-x
apparmor_status
7.11
KB
-rwxr-xr-x
arp
54.09
KB
-rwxr-xr-x
arpd
46.74
KB
-rwxr-xr-x
chat
26.01
KB
-rwxr-xr-x
chgpasswd
53.33
KB
-rwxr-xr-x
chpasswd
49.43
KB
-rwxr-xr-x
chroot
38.8
KB
-rwxr-xr-x
cpgr
51.48
KB
-rwxr-xr-x
cppw
51.48
KB
-rwxr-xr-x
cron
43.43
KB
-rwxr-xr-x
delgroup
16.13
KB
-rwxr-xr-x
deluser
16.13
KB
-rwxr-xr-x
dnsmasq
379.6
KB
-rwxr-xr-x
dpkg-preconfigure
3.52
KB
-rwxr-xr-x
dpkg-reconfigure
4.23
KB
-rwxr-xr-x
e2freefrag
10.24
KB
-rwxr-xr-x
e4defrag
26.53
KB
-rwxr-xr-x
faillock
14.4
KB
-rwxr-xr-x
fanatic
35.21
KB
-rwxr-xr-x
fanctl
41.97
KB
-rwxr-xr-x
fdformat
22.57
KB
-rwxr-xr-x
filefrag
14.31
KB
-rwxr-xr-x
genl
46.69
KB
-rwxr-xr-x
groupadd
57.42
KB
-rwxr-xr-x
groupdel
65.83
KB
-rwxr-xr-x
groupmod
67.7
KB
-rwxr-xr-x
grpck
53.31
KB
-rwxr-xr-x
grpconv
49.19
KB
-rwxr-xr-x
grpunconv
49.2
KB
-rwxr-xr-x
iconvconfig
26.66
KB
-rwxr-xr-x
invoke-rc.d
19.41
KB
-rwxr-xr-x
ip6tables-apply
6.85
KB
-rwxr-xr-x
iptables-apply
6.85
KB
-rwxr-xr-x
ldattach
26.63
KB
-rwxr-xr-x
logrotate
63.11
KB
-rwxr-xr-x
mkinitramfs
10.24
KB
-rwxr-xr-x
mklost+found
10.25
KB
-rwxr-xr-x
netplan
17.94
KB
-rwxr-xr-x
newusers
73.84
KB
-rwxr-xr-x
nfnl_osf
14.37
KB
-rwxr-xr-x
nologin
5.95
KB
-rwxr-xr-x
pam-auth-update
19.09
KB
-rwxr-xr-x
pam_getenv
2.82
KB
-rwxr-xr-x
pam_timestamp_check
10.38
KB
-rwxr-xr-x
pppd
385.73
KB
-rwsr-xr--
pppdump
18.1
KB
-rwxr-xr-x
pppoe-discovery
18
KB
-rwxr-xr-x
pppstats
13.99
KB
-rwxr-xr-x
pwck
45.36
KB
-rwxr-xr-x
pwconv
41.27
KB
-rwxr-xr-x
pwunconv
36.43
KB
-rwxr-xr-x
readprofile
14.52
KB
-rwxr-xr-x
remove-shell
749
B
-rwxr-xr-x
rfkill
10.29
KB
-rwxr-xr-x
rmt
54.95
KB
-rwxr-xr-x
rmt-tar
54.95
KB
-rwxr-xr-x
rsyslogd
585.28
KB
-rwxr-xr-x
rtcwake
38.8
KB
-rwxr-xr-x
service
9.82
KB
-rwxr-xr-x
setvesablank
10.27
KB
-rwxr-xr-x
sshd
772.48
KB
-rwxr-xr-x
tarcat
936
B
-rwxr-xr-x
tunelp
22.53
KB
-rwxr-xr-x
tzconfig
106
B
-rwxr-xr-x
update-alternatives
46.61
KB
-rwxr-xr-x
update-ca-certificates
5.25
KB
-rwxr-xr-x
update-initramfs
8.38
KB
-rwxr-xr-x
update-mime
8.84
KB
-rwxr-xr-x
update-passwd
30.41
KB
-rwxr-xr-x
update-rc.d
14.1
KB
-rwxr-xr-x
useradd
118.72
KB
-rwxr-xr-x
userdel
81.92
KB
-rwxr-xr-x
usermod
118.5
KB
-rwxr-xr-x
vcstime
6.26
KB
-rwxr-xr-x
vigr
55.7
KB
-rwxr-xr-x
vipw
55.7
KB
-rwxr-xr-x
visudo
187.89
KB
-rwxr-xr-x
zic
50.54
KB
-rwxr-xr-x
Delete
Unzip
Zip
${this.title}
Close
Code Editor : fanctl
#!/bin/sh # # fanctl - control fan bridge devices # fanctl up 15 10.1.0.1 # fanctl down 15 10.1.0.1 # usage() { echo "Usage: $0 <cmd> [<options>...]" 1>&2 echo "Available commands:" 1>&2 echo " up - bring up Fans" 1>&2 echo " down - bring down configured Fans" 1>&2 echo " show - show configured Fans" 1>&2 echo " config - manage local persistent configuration for Fans" 1>&2 echo "Use $0 help [<cmd>] for more details" 1>&2 } run() { last_cmd="$@" [ "$opt_v" ] && echo "$@" "$@" } state_dir="/run/ubuntu-fan" lconfig_dir="/var/lib/ubuntu-fan/config" __ip_split() { eval `echo "$1" | { IFS=./ read a b c d e f echo ip_a="$a" ip_b="$b" ip_c="$c" ip_d="$d" ip_e="$e" }` } width_to_mask() { local width="$1" local mask="" local zeros="$(( (32-$width)/4 ))" while [ "$width" -ge 4 ]; do mask="${mask}F" width="$(($width - 4))" done case "$width" in 3) mask="${mask}E" ;; 2) mask="${mask}C" ;; 1) mask="${mask}8" ;; esac while [ "$zeros" -gt 0 ]; do mask="${mask}0" zeros="$(($zeros - 1))" done #printf "%x %x\n" "$((0x$mask))" "$(( (~0x$mask) & 0xffffffff ))" RET="$(( 0x$mask ))" } ip_to_num_width() { local ip_a local ip_b local ip_c local ip_d local ip_e local ip_f __ip_split "$1" RET="$(( ($ip_a << 24) | ($ip_b << 16) | ($ip_c << 8) | $ip_d ))" RET2="$ip_e" } num_to_ip() { local ip_num="$1" local ip_sep="$2" [ "$ip_sep" = '' ] && ip_sep='.' RET="$(( (($ip_num >> 24) & 0xff) ))$ip_sep$(( (($ip_num >> 16) & 0xff) ))$ip_sep$(( (($ip_num >> 8) & 0xff) ))$ip_sep$(( $ip_num & 0xff ))" } overlay_device() { local format="$1" local a1="$2" case "$format" in A) overlay="$a1" ;; *) fail "$overlay: unknown overlay network format" ;; esac } underlay_device() { local format="$1" local a1="$2" local a2="$3" case "$format" in A) underlay="$a1" ;; B) [ "$a1" = "default" ] && a1=`ip route show 0.0.0.0/0 | awk '{print $5; exit}'` a1="`ip -4 addr show dev "$a1" | grep inet | awk -F '[/ ]*' '{print $3; exit}'`" [ "$a1" = "" ] && fail "$a1: device address not found" underlay="$a1/$a2" ;; *) fail "$underlay: unknown underlay network format" ;; esac } __underlay_lookup_address() { local ipnum="$1" local width="$2" width_to_mask "$width" local tmp local interface local what local address local address_mask="$RET" local address_ipnum local address_ipnum_prefix local address_prefix address_prefix="$(( $ipnum & $address_mask ))" # If an address on the network was specified find exactly that. if [ "$ipnum" -ne "$address_prefix" ]; then address_prefix="$ipnum" address_mask="$(( ~0 ))" fi ip -o addr show | \ while read tmp interface what address tmp do case "$what" in inet) ip_to_num_width "$address" address_ipnum="$RET" address_ipnum_prefix="$(( $RET & $address_mask ))" if [ "$address_ipnum_prefix" -eq "$address_prefix" ]; then num_to_ip "$address_ipnum" echo "$RET/$width" fi ;; esac done } underlay_lookup_address() { local underlay="$1" # Find matching address(es) ... ip_to_num_width "$underlay" local underlay_raw_ipnum="$RET" local underlay_width="$RET2" eval RET=\'$(__underlay_lookup_address "$underlay_raw_ipnum" "$underlay_width")\' } networks_decode_overlay() { local overlay="$1" #echo "APW: networks_decode_overlay <$overlay>" local format="`echo "$overlay" | sed -n \ -e 's@^\([0-9][0-9]*\)$@A \1.0.0.0/8@p' \ -e 's@^\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\/[0-9][0-9]*\)$@A \1@p' `" overlay_device $format RET="$overlay" } networks_decode_underlay() { local underlay="$1" #echo "APW: networks_decode_underlay <$underlay>" local format="`echo "$underlay" | sed -n \ -e 's@^\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\)$@A \1/16@p' \ -e 's@^\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\/[0-9][0-9]*\)$@A \1@p' \ -e 's@^\([a-z][a-z]*[0-9][0-9]*\|default\)$@B \1 16@p' \ -e 's@^\([a-z][a-z]*[0-9][0-9]*\|default\)/\([0-9][0-9]*\)$@B \1 \2@p' \ `" underlay_device $format RET="$underlay" } validate_flags() { local flag for flag in "$@" do case "$flag" in _*) fail "$flag: invalid flag specified" ;; esac done } cmd_decode_init() { C_flag_dhcp='' C_flag_debug='' C_flag_enable='' C_flag_auto='' C_flag_host_reserve=1 C_flag_bridge='' C_flag_type='vxlan' C_flag_mode='compact' C_flag_i_device='' } cmd_decode_legacy() { local name="$1" shift #echo "$0: $name: WARNING using legacy fan format, see fanctl(8) for details ($@)" 1>&2 local addresses=y local args [ "$1" = '--' ] && shift # XXX: we should be using the sed from network_decode_addresses() case "$1" in *.*.*.*/*) ;; *) addresses=n ;; esac case "$2" in *.*.*.*/*) ;; *) addresses=n ;; esac if [ "$addresses" = 'n' ]; then fail "$name: invalid specifier ($1)" fi args="-o '$1' -u '$2'" shift 2 while [ "$#" -gt 0 ] do case "$1" in type|mode|host-reserve|bridge) args="$args --$1='$2'" shift ;; dhcp|off) args="$args --$1" ;; *) fail "$name: invalid specifier ($1)" ;; esac shift done echo "$args" } cmd_decode_payload() { ##echo "cmd_decode_payload($@)" while [ "$#" -gt 0 ] do flag="$1" flagv=`echo "$flag" | sed -e s/^--// -e s/-/_/g` shift #echo "<$flag>" case "$flag" in --) break ;; -u|--underlay) C_underlay="$1" shift ;; -o|--overlay) C_overlay="$1" shift ;; --enable|--on) C_flag_enable=y ;; --disable|--off) C_flag_enable= ;; --dhcp|--auto) eval C_flag_${flagv}=y ;; --host-reserve) arg=`echo "I:$1" | sed -n \ -e 's/^I:\([0-9][0-9]*\)$/\1/p' \ -e 's/^I:.*$/E/p'` [ "$arg" = 'E' ] && fail "$1: malformed $flag flag argument -- integer expected" shift eval C_flag_$flagv=$arg ;; --bridge) C_flag_bridge="$1" shift ;; --type) C_flag_type="$1" shift case "$C_flag_type" in ipip) version='0' [ ! -f /proc/sys/net/fan/version ] && modprobe ipip [ -f /proc/sys/net/fan/version ] && version=`cat /proc/sys/net/fan/version` [ "$version" -eq 0 ] && fail "no ipip fan support availabe in the kernel" [ "$version" -lt 3 ] && C_flag_type="ipip1" ;; vxlan) version='0' [ ! -f /proc/sys/net/fan/vxlan ] && modprobe vxlan [ -f /proc/sys/net/fan/vxlan ] && version=`cat /proc/sys/net/fan/vxlan` [ "$version" -eq 0 ] && fail "no vxlan fan support availabe in the kernel" ;; *) fail "$C_flag_type: unknown tunnel protocol type (ipip or vxlan expected)" ;; esac ;; --mode) C_flag_mode="$1" shift case "$C_flag_mode" in sliced|compact) ;; *) fail "$C_flag_mode: unknown bridge mode" ;; esac ;; --comment) shift ;; --i-device) C_flag_i_device="$1" shift ;; *) fail "$flag: unknown flag" ;; esac done if [ "$#" != 0 ]; then fail "invalid specifier ($@)" fi if [ "$C_overlay" != "" ]; then networks_decode_overlay "$C_overlay" C_overlay="$RET" fi if [ "$C_underlay" != "" ]; then networks_decode_underlay "$C_underlay" C_underlay="$RET" fi return 0 } cmd_decode_short='u:o:' cmd_decode_long_uo='underlay:,overlay:' cmd_decode_long_all='enable,on,disable,off,dhcp,auto,host-reserve:,bridge:,type:,mode:' cmd_decode_long_internal='i-device:' cmd_decode_long_config='comment:' cmd_decode_internal() { TEMP=$(getopt \ -n "$0" \ -o "$cmd_decode_short" -l "$cmd_decode_long_uo" \ -l "$cmd_decode_long_all" \ -l "$cmd_decode_long_internal" \ -- "$@" ) if [ "$?" != 0 ]; then fail "invalid specifier -- parser failure" fi eval set -- "$TEMP" cmd_decode_payload "$@" } cmd_decode_all() { local name="$1" shift 1 #echo "<<$@>>" TEMP=$(getopt \ -n "$0: $name" \ -o "$cmd_decode_short" -l "$cmd_decode_long_uo" \ -l "$cmd_decode_long_all" \ -- "$@" ) if [ "$?" != 0 ]; then fail "$name: invalid fan specifier option" fi #echo "<<<$TEMP>>>" eval set -- "$TEMP" if [ "$1" = '--' ]; then return 1 fi cmd_decode_payload "$@" } cmd_decode_ou() { local name="$1" shift TEMP=$(getopt \ -n "$0: $name" \ -o "$cmd_decode_short" -l "$cmd_decode_long_uo" \ -- "$@" ) if [ "$?" != 0 ]; then fail "$name: invalid fan specifier option" fi eval set -- "$TEMP" if [ "$1" = '--' ]; then return 1 fi cmd_decode_payload "$@" } cmd_decode_config() { local name="$1" shift 1 #echo "<<$@>>" TEMP=$(getopt \ -n "$0: $name" \ -o "$cmd_decode_short" -l "$cmd_decode_long_uo" \ -l "$cmd_decode_long_all" \ -l "$cmd_decode_long_config" \ -- "$@" ) if [ "$?" != 0 ]; then fail "$name: invalid fan specifier option" fi #echo "<<<$TEMP>>>" eval set -- "$TEMP" cmd_decode_payload "$@" } cmd_decode_user() { local name="$1" shift 1 #echo "<<$@>>" TEMP=$(getopt \ -n "$0: $name" \ -o "$cmd_decode_short" -l "$cmd_decode_long_uo" \ -l "$cmd_decode_long_all" \ -l "$cmd_decode_long_config" \ -- "$@" ) if [ "$?" != 0 ]; then fail "$name: invalid fan specifier option" fi #echo "<<<$TEMP>>>" eval set -- "$TEMP" local flag local val RET="" RET2="" while [ "$#" -gt 0 ] do flag="$1" shift case "$flag" in --) break ;; -u|--underlay|-o|--overlay) ;; --enable|--on|--disable|--off|--dhcp|--auto) RET="$RET $flag" RET2="$RET2 $flag" ;; --host-reserve|--bridge|--type|--mode) RET="$RET $flag=$1" RET2="$RET2 $flag=$1" shift ;; --comment) val="$1" case "$val" in *\ *) RET2="$RET2 $flag='$val'" ;; *) RET2="$RET2 $flag=$1" ;; esac shift ;; esac done RET="${RET## }" RET2="${RET2## }" } cmd_decode_show() { RET="" [ "$C_flag_enable" ] && RET="${RET} enable" [ "$C_flag_dhcp" ] && RET="${RET} dhcp" [ "$C_flag_host_reserve" -a "$C_flag_host_reserve" != "1" ] && RET="${RET} host-reserve=${C_flag_host_reserve}" #[ "$C_flag_auto" ] && RET="${RET} auto" [ "$C_flag_bridge" ] && RET="${RET} bridge=${C_flag_bridge}" [ "$C_flag_type" -a "$C_flag_type" != "vxlan" ] && RET="${RET} type=${C_flag_type}" [ "$C_flag_mode" -a "$C_flag_mode" != "compact" ] && RET="${RET} mode=${C_flag_mode}" } networks_decode_one() { C_user_flags="$@" cmd_decode_init cmd_decode_internal "$@" C_flags='' C_i_flags='' [ "$C_flag_enable" ] && C_flags="${C_flags} --enable" [ "$C_flag_dhcp" ] && C_flags="${C_flags} --dhcp" [ "$C_flag_host_reserve" ] && C_flags="${C_flags} --host-reserve=${C_flag_host_reserve}" [ "$C_flag_auto" ] && C_flags="${C_flags} --auto" [ "$C_flag_bridge" ] && C_flags="${C_flags} --bridge=${C_flag_bridge}" [ "$C_flag_type" ] && C_flags="${C_flags} --type=${C_flag_type}" [ "$C_flag_mode" ] && C_flags="${C_flags} --mode=${C_flag_mode}" # Decode and extract the base IP addresses and widths. overlay="$C_overlay" underlay="$C_underlay" ##C_overlay="$overlay" ##C_underlay="$underlay" C_slice_id=`echo "${overlay}-${underlay}" | sed -e 's@/@_@g'` C_slice_oid=`echo "${overlay}" | sed -e 's@/@_@g'` ip_to_num_width "$overlay" local overlay_raw_ipnum="$RET" C_overlay_width="$RET2" ip_to_num_width "$underlay" local underlay_raw_ipnum="$RET" C_underlay_width="$RET2" num_to_ip "$underlay_raw_ipnum" local underlay_raw_ip="$RET" # Mask off the overlay address to the width specified. width_to_mask "$C_overlay_width" local overlay_ipnum="$(( $overlay_raw_ipnum & $RET ))" num_to_ip "$overlay_ipnum" C_overlay_subnet="$RET/$C_overlay_width" # Strip any insignificant octets on the right to make the shortest prefix. RET=${RET%.0}; RET=${RET%.0}; RET=${RET%.0} C_overlay_prefix="$RET" # The underlay prefix. width_to_mask "$C_underlay_width" local underlay_prefix_ipnum="$(( $underlay_raw_ipnum & $RET ))" num_to_ip "$underlay_prefix_ipnum" C_underlay_prefix="$RET" C_underlay_subnet="$C_underlay_prefix/$C_underlay_width" # Mask off the underlay address to the width specified. width_to_mask "$C_underlay_width" RET="$(( ~ $RET ))" local underlay_overlay_ipnum="$(( $underlay_raw_ipnum & $RET ))" # Shift the underlay addresses and merge it with the overlay # to make the bridge subnet addressing and from that the name. local sl="$(( $C_underlay_width - $C_overlay_width ))" local bridge_width="$(( $C_overlay_width + ( 32 - $C_underlay_width ) ))" local slice_width="$bridge_width" local bridge_ipnum="$(( $overlay_ipnum | ($underlay_overlay_ipnum << $sl) ))" local bridge_name_ipnum="$bridge_ipnum" case "$C_flag_mode-$C_flag_type" in compact-vxlan) bridge_name_ipnum="$overlay_ipnum" bridge_width="$C_overlay_width" ;; sliced-vxlan) bridge_width="$C_overlay_width" ;; compact-ipip) bridge_name_ipnum="$overlay_ipnum" ;; esac num_to_ip "$bridge_ipnum" C_bridge_subnet="$RET/$bridge_width" num_to_ip "$(( $bridge_ipnum + 1 ))" C_overlay_address="$RET" # Addresses and route for the bridge (FLAG: local) local n=1 C_bridge_addresses='' while [ "$n" -le "$C_flag_host_reserve" ] do num_to_ip "$(( $bridge_ipnum + $n ))" C_bridge_addresses="$C_bridge_addresses $RET/$bridge_width" n="$(( $n + 1 ))" done # If DHCP is requested, work out address range (FLAG: dhcp) if [ "$C_flag_dhcp" = 'y' ]; then num_to_ip "$(( $bridge_ipnum + 1 ))" C_bridge_dhcp_listen="$RET" # DHCP addresses. num_to_ip "$(( $bridge_ipnum + ${C_flag_host_reserve} + 1 ))" C_bridge_dhcp_low="$RET" width_to_mask "$slice_width" RET="$(( ~ $RET ))" num_to_ip "$(( $bridge_ipnum + (-2 & $RET) ))" C_bridge_dhcp_high="$RET" fi # Work out the bridge name. num_to_ip "$bridge_name_ipnum" "-" RET=${RET%-0}; RET=${RET%-0}; RET=${RET%-0}; C_bridge_state="fan-$RET" if [ "$C_flag_bridge" != '' ]; then C_bridge="$C_flag_bridge" else C_bridge="$C_bridge_state" fi # The raw underlay IP address is our local address on the tunnel. num_to_ip "$underlay_raw_ipnum" C_tun_local="$RET" case "$C_flag_type" in ipip1) # Determine if we have a ftunN associated with this local address. local n if [ ! -f "$state_dir/map-$C_tun_local" ]; then n=0 while [ -f "$state_dir/alloc-ftun$n" ]; do n=$(($n+1)) done echo "$C_tun_local" >"$state_dir/alloc-ftun$n" echo "ftun$n" >"$state_dir/map-$C_tun_local" fi C_tun="`cat "$state_dir/map-$C_tun_local"`" ;; ipip) # We use tunl0 for all overlay mappings. C_tun="tunl0" ;; vxlan) # We need a ftunN per bridge local n if [ ! -f "$state_dir/map-$C_bridge" ]; then n=0 while [ -f "$state_dir/alloc-ftun$n" ]; do n=$(($n+1)) done echo "$C_bridge" >"$state_dir/alloc-ftun$n" echo "ftun$n" >"$state_dir/map-$C_bridge" fi C_tun="`cat "$state_dir/map-$C_bridge"`" ;; esac # Work out the device name for the underlay address. if [ "$C_flag_i_device" = "" ]; then num_to_ip "$underlay_raw_ipnum" C_underlay_dev=`ip -4 -o addr show to "$RET" | awk '{ print $2 }'` else C_underlay_dev="$C_flag_i_device" fi [ "$C_underlay_dev" ] && C_i_flags="${C_i_flags} --i-device=${C_underlay_dev}" case "$C_flag_type" in ipip*) C_tun_control="type ipip" C_bridge_mtu=1480 ;; vxlan) # XXX: check that the overlay width is not more than 24 bits. # Work out the vxlan ID, which is our overlay >> 8 bits to fix in the # vxlan nid. local vxlan_id="$(( $overlay_ipnum >> 8 ))" C_tun_control="type vxlan id $vxlan_id dev $C_underlay_dev dstport 0" C_bridge_mtu=1450 ;; esac if [ "$C_flag_debug" = 'y' ]; then set | grep "^C_" exit 1 fi } fail() { [ "$last_cmd" != '' ] && echo "$0: $last_cmd" 1>&2 echo "$0: $@" 1>&2 exit 1 } warn() { [ "$last_cmd" != '' ] && echo "$0: $last_cmd" 1>&2 echo "$0: WARNING: $@" 1>&2 } mute() { : } slice_down_if_up() { local fail="$1" if [ -f "$state_dir/slice-state-$C_slice_id" ]; then # If we are using the address for the tunnel route, we need to flip it out. rm -f "$state_dir/addr-$C_tun-$C_overlay_prefix-$C_slice_id" if [ -f "$state_dir/net-$C_overlay_prefix" ]; then local N_overlay_subnet local N_tun local N_overlay_address read N_overlay_subnet N_tun N_overlay_address \ <"$state_dir/net-$C_overlay_prefix" # We are using the address of the bridge which is about to go, so flip to # a new one if available. if [ "$N_overlay_address" = "$C_overlay_address" ]; then N_overlay_address=`cat "$state_dir/addr-$C_tun-$C_overlay_prefix"-* 2>/dev/null | head -1` # If we have none, then simply remove the address for now. [ "$N_overlay_address" = '' ] && N_overlay_address='0.0.0.0' case "$C_flag_type" in ipip*) run ip route change "$C_overlay_subnet" dev "$C_tun" src "$N_overlay_address" || \ $fail "$C_tun: failed to switch master route address" ;; esac echo "$N_overlay_subnet $N_tun $N_overlay_address" \ >"$state_dir/net-$C_overlay_prefix" fi fi local bridge_address for bridge_address in $C_bridge_addresses do run ip addr del "$bridge_address" dev "$C_bridge" || \ "$fail" "$C_bridge: failed to remove $bridge_address address" done run iptables -t nat -D POSTROUTING --source "$C_bridge_subnet" -j "fan-egress" || \ $fail "$C_bridge: unable to destroy NAT for bridge (POSTROUTING)" run iptables -t nat -D "fan-egress" -j SNAT --source "$C_bridge_subnet" --to "$C_tun_local" || \ $fail "unable to destroy NAT for bridge (SNAT)" rm -f "$state_dir/slice-state-$C_slice_id" rm -f "$state_dir/slice-display-$C_slice_id" fi } bridge_down_if_free() { local fail="$1" [ ! -f "$state_dir/brg-state-$C_bridge" ] && return slices=`cat "$state_dir/slice-state"-* 2>/dev/null | grep "^$C_bridge " | wc -l` if [ "$slices" -eq 0 ]; then run ip link set dev "$C_bridge" down || \ $fail "$C_bridge: failed to bring interface down" if ! run brctl delbr "$C_bridge"; then $fail "$C_bridge: failed destroy bridge interface" else rm -f "$state_dir/brg-state-$C_bridge" fi fi } route_down_if_free() { local fail="$1" local N_overlay_subnet local N_tun local N_overlay_address [ ! -f "$state_dir/net-$C_overlay_prefix" ] && return read N_overlay_subnet N_tun N_overlay_address \ <"$state_dir/net-$C_overlay_prefix" if [ "$N_overlay_address" = "0.0.0.0" ]; then case "$C_flag_type" in ipip*) run ip route del "$C_overlay_subnet" dev "$C_tun" || \ $fail "$C_tun: failed to remove master route" ;; esac run iptables -t nat -D "fan-egress" --dest "$C_overlay_subnet" -j RETURN || \ $fail "$C_tun: failed to remove master route NAT" rm -f "$state_dir/net-$C_overlay_prefix" fi } tun_down_if_free() { local fail="$1" [ ! -f "$state_dir/tunnel-$C_tun" ] && return mappings=`ls -1 "$state_dir/addr-$C_tun-$C_overlay_prefix"-* 2>/dev/null | wc -l` if [ "$mappings" -eq 0 ]; then case "$C_flag_type" in ipip*) # Note: this is will _after_ removing the last fan mapping, exiting # EINVAL. Therefore while this is investigated, ignore any failures. run ip link change dev "$C_tun" $C_tun_control fan-map "$C_overlay_subnet:0/0" 2>/dev/null ;; esac rm -f "$state_dir/tunnel-$C_tun-$C_overlay_prefix" fi mappings=`ls -1 "$state_dir/tunnel-$C_tun"-* 2>/dev/null | wc -l` if [ "$mappings" -eq 0 ]; then run ip link set dev "$C_tun" down || \ $fail "$C_tun: failed to down interface" case "$C_flag_type" in ipip1|vxlan) run ip link delete "$C_tun" $C_tun_control || \ $fail "$C_tun: unable to destroy address translator" esac rm -f "$state_dir/tunnel-$C_tun" # Deallocate this tunnel allowing its reuse. if [ -f "$state_dir/alloc-$C_tun" ]; then local T_map_name read T_map_name <"$state_dir/alloc-$C_tun" rm -f "$state_dir/map-$T_map_name" rm -f "$state_dir/alloc-$C_tun" fi fi } dhcp_reconfigure() { local fail="$1" local dhcp_state local dhcp_flags local dhcp_flags_current dhcp_flags=` for dhcp_state in "$state_dir/slice-dhcp"-* do [ "$dhcp_state" = "$state_dir/slice-dhcp-*" ] && continue read dhcp_bridge dhcp_listen dhcp_low dhcp_high <"$dhcp_state" echo "--listen-address $dhcp_listen --dhcp-range $dhcp_low,$dhcp_high" done ` dhcp_flags_current=`cat "$state_dir/dnsmasq-flags-$C_bridge_state" 2>&1` # Unchanged, status quo. if [ "$dhcp_flags_current" = "$dhcp_flags" ]; then return fi # Kill off the current dnsmasq, leaving its state files for reuse. dhcp_pid=`cat "$state_dir/dnsmasq-$C_bridge_state.pid" 2>/dev/null` if [ "$dhcp_pid" ]; then kill "$dhcp_pid" 2>/dev/null while kill -0 "$dhcp_pid" 2>/dev/null do sleep 0.1 # XXX: this really needs to timeout. done fi rm -f "$state_dir/dnsmasq-$C_bridge_state.pid" rm -f "$state_dir/dnsmasq-flags-$C_bridge_state" if [ "$dhcp_flags" = '' ]; then return fi echo "$dhcp_flags" >"$state_dir/dnsmasq-flags-$C_bridge_state" for DNSMASQ_USER in fan-dnsmasq dnsmasq nobody do if getent passwd ${DNSMASQ_USER} >/dev/null; then break fi done run dnsmasq -u ${DNSMASQ_USER} \ --strict-order \ --bind-interfaces \ --pid-file="$state_dir/dnsmasq-$C_bridge_state.pid" \ --conf-file= \ $dhcp_flags \ --dhcp-no-override \ --except-interface=lo \ --interface="$C_bridge" \ --dhcp-leasefile=/var/lib/misc/dnsmasq."$C_bridge_state".leases \ --dhcp-authoritative \ || $fail "$C_bridge: failed to start dnsmasq" } dhcp_down_if_up() { local fail="$1" if [ -f "$state_dir/slice-dhcp-$C_slice_id" ]; then rm -f "$state_dir/slice-dhcp-$C_slice_id" dhcp_reconfigure "$fail" fi } nat_down_if_free() { local fail="$1" slices=`ls -1 "$state_dir/slice"-* 2>/dev/null | wc -l` if [ "$slices" -eq 0 ]; then run iptables -t nat -D "fan-egress" -o lo0 -j RETURN || \ $fail "unable to deconfigure NAT core (lo0 exception)" run iptables -t nat -X "fan-egress" || \ $fail "unable to deconfigure NAT core (destroy chain)" rm "$state_dir/nat-core" fi } fail_up() { echo "$0: $last_cmd" 1>&2 echo "$0: WARNING: $@" 1>&2 slice_down_if_up mute bridge_down_if_free mute route_down_if_free mute tun_down_if_free mute dhcp_down_if_up mute nat_down_if_free mute exit 1 } cmd_up_help() { echo "Usage: $0 up -u <underlay> -o <overlay> [<options>...]" 1>&2 echo " $0 up -a" 1>&2 } cmd_up() { if [ "$#" -eq 0 ]; then cmd_up_help exit 1 fi ### HANDLE LECAGY HERE BY CALLING SELF AGAIN cmd_decode_init if ! cmd_decode_all "up" "$@"; then TEMP=$(cmd_decode_legacy "up" "$@") eval set -- "$TEMP" cmd_up "$@" return fi # XXX: this likely should be just spinning all addresses if we have # no underlay address. This would allow us to say like: # fanctl up -o 15.0.0.0/8 #networks_decode_addresses "$C_overlay" "$C_underlay" underlay_lookup_address "$C_underlay" # XXX: we should be checking we have at least some matching # addresses. L_overlay="$C_overlay" ##L_underlays="$RET" # When the caller indicates that they want this brought up in # --auto mode they are saying they want it brought up as if # it was brought up by 'fanctl up -a' which in turn means # they only want enabled Fan Networks brought up. Use # an appropriate selector for this case. if [ "$C_flag_auto" = 'y' ]; then selector='__cmd_up_all_select' else selector='__cmd_up_select' fi ret=0 for L_underlay in $RET do if ! config_scan "$selector" __cmd_up "$@"; then (__cmd_up "$@" -u "$L_underlay") res="$?" if [ "$res" -ne 0 ]; then echo "$0: up $@ -- failed err=$res" fi ret="$res" else # config_scan has processed something, the status # is in $RET. Pick up errors. if [ "$RET" -gt 0 ]; then ret="$RET" fi fi done exit "$ret" } __cmd_up_select() { #echo "<<<$@>>>" local overlay="$1" local underlay="$2" #local flags="$3" #echo "L_overlay<$L_overlay> L_underlay<$L_underlay> overlay<$overlay> underlay<$underlay>" if [ "$L_overlay" != '' -a "$L_overlay" != "$overlay" ]; then return 1 fi if [ "$L_underlay" = "" ]; then return 0 fi # See if any of our direct addresses match this entry. if [ "$L_underlay" = "$underlay" ]; then RET="$underlay" return 0 fi # See if the underlay address is in this mask. ip_to_num_width "$underlay" local ipnum="$RET" local width="$RET2" width_to_mask "$width" local address_mask="$RET" local address_ipnum local address_ipnum_prefix local address_prefix address_prefix="$(( $ipnum & $address_mask ))" # If an address on the network was specified find exactly that. if [ "$ipnum" -ne "$address_prefix" ]; then address_prefix="$ipnum" address_mask="$(( ~0 ))" fi local address="$L_underlay" ip_to_num_width "$address" address_ipnum="$RET" address_ipnum_prefix="$(( $RET & $address_mask ))" # XXX: should we be checking the two widths match if both present? # If the address offered has no width then use the mask width. case "$address" in */*) ;; *) address="$address/$width" ;; esac if [ "$address_ipnum_prefix" -eq "$address_prefix" ]; then RET="$address" return 0 fi return 1 } __cmd_up() { #echo "__cmd_up<$@>" networks_decode_one "$@" # Validation: ensure the bridge is not already configured. [ -f "$state_dir/slice-state-$C_slice_id" ] && fail "$C_bridge: already configured" # Validation: check the flag combinations make sense. case "$C_flag_mode-$C_flag_type" in sliced-vxlan) [ -f "$state_dir/net-$C_overlay_prefix" ] && fail "$C_underlay $C_overlay: cannot configure multiple sliced vxlan bridges on the same overlay" ;; esac # Record this slice as up and using this bridge. echo "$C_bridge $C_overlay $C_underlay -- $@ $C_i_flags" >"$state_dir/slice-state-$C_slice_id" #echo "$C_bridge $C_overlay $C_underlay $C_user_flags" >"$state_dir/slice-display-$C_slice_id" # Record this address as available to the tunnel should it need it. echo "$C_overlay_address" >"$state_dir/addr-$C_tun-$C_overlay_prefix-$C_slice_id" # create the bridge local bridge_created=0 if [ ! -f "$state_dir/brg-state-$C_bridge" ]; then run brctl addbr "$C_bridge" || fail_up "$C_bridge: failed to create bridge" #echo "$C_bridge $C_overlay $C_underlay$C_flags" >"$state_dir/bridge-$C_tun-$C_overlay_prefix-$C_bridge_state" echo "" >"$state_dir/brg-state-$C_bridge" run ip link set dev "$C_bridge" mtu "$C_bridge_mtu" || \ fail_up "$C_bridge: failed to bring interface up" echo 1 >"/proc/sys/net/ipv4/conf/$C_bridge/promote_secondaries" bridge_created=1 fi # ensure the tunnel is up. if [ ! -f "$state_dir/tunnel-$C_tun" ]; then case "$C_flag_type" in ipip1) run ip link add "$C_tun" $C_tun_control local "$C_tun_local" underlay "$C_underlay_prefix" || \ fail_up "$C_tun: failed to configure address translation" ;; vxlan) run ip link add "$C_tun" $C_tun_control local "$C_tun_local" fan-map "$C_overlay_subnet:$C_underlay_subnet" || \ fail_up "$C_tun: failed to configure address translation" ;; esac run ip link set dev "$C_tun" up || \ fail_up "$C_tun: failed to up interface" echo "" >"$state_dir/tunnel-$C_tun" fi # ensure that address tunnelling is enabled for 15 net if [ ! -f "$state_dir/tunnel-$C_tun-$C_overlay_prefix" ]; then case "$C_flag_type" in ipip) run ip link change dev "$C_tun" $C_tun_control fan-map "$C_overlay_subnet:$C_underlay_subnet" || \ fail_up "$C_tun: failed to configure address translation" ;; vxlan) run brctl addif "$C_bridge" "$C_tun" || \ fail_up "$C_tun: failed to add vxlan interface to bridge" ;; esac echo "$C_tun $C_tun_local $C_overlay_subnet" >"$state_dir/tunnel-$C_tun-$C_overlay_prefix" fi # Bring up the nat core rules if [ ! -f "$state_dir/nat-core" ]; then run iptables -t nat -N "fan-egress" || \ fail_up "unable to initialise NAT core (new chain)" echo "" >"$state_dir/nat-core" run iptables -t nat -I "fan-egress" -o lo0 -j RETURN || \ fail_up "unable to initialise NAT core (lo0 exception)" fi # enable SNAT for packets leaving the FANs run iptables -t nat -A POSTROUTING --source "$C_bridge_subnet" -j "fan-egress" || \ fail_up "$C_bridge: unable to initialise NAT for bridge (POSTROUTING)" run iptables -t nat -A "fan-egress" -j SNAT --source "$C_bridge_subnet" --to "$C_tun_local" || \ fail_up "unable to initialise NAT for bridge (SNAT)" # Add the local addressses, do this after any bridge addif occurs as that # strips the addresses. # NOTE: we are relying on the add being a one time deal per bridge else we will # lose addresses. local bridge_address for bridge_address in $C_bridge_addresses do run ip addr add "$bridge_address" dev "$C_bridge" || \ fail_up "$C_bridge: failed to add $bridge_address address" done # Delay bringing the bridge up to allow addresses to be added reliably. if [ "$bridge_created" -eq 1 ]; then run ip link set dev "$C_bridge" up || \ fail_up "$C_bridge: failed to bring interface up" fi # ensure that routing is present for 15 net outgoing if [ ! -f "$state_dir/net-$C_overlay_prefix" ]; then case "$C_flag_type" in ipip*) run ip route add "$C_overlay_subnet" dev "$C_tun" src "$C_overlay_address" || \ fail_up "$C_tun: failed to add master route" ;; esac echo "$C_overlay_subnet $C_tun $C_overlay_address" \ >"$state_dir/net-$C_overlay_prefix" # If we are routing to this FAN then we do not need to NAT run iptables -t nat -I "fan-egress" --dest "$C_overlay_subnet" -j RETURN || \ fail "$C_tun: failed to add master route NAT" fi # Ensure we have ip_forwarding on. echo 1 > /proc/sys/net/ipv4/ip_forward # If dhcp is requested then we need to ensure the current dnsmasq is correctly # reconfigured for this new range. if [ "$C_flag_dhcp" = 'y' ]; then echo "${C_bridge} ${C_bridge_dhcp_listen} ${C_bridge_dhcp_low} ${C_bridge_dhcp_high}" > "$state_dir/slice-dhcp-$C_slice_id" dhcp_reconfigure fail_up fi } config_scan() { local select="$1" local payload="$2" shift 2 # No config is fine. if [ ! -e "/etc/network/fan" ]; then return 1 fi lock -x || fail "unable to lock fan state" local n=0 local err=0 local found=1 local underlay_actual local config local lconfig while read line do n="$((n + 1))" line="${line%%#*}" read underlay overlay flags <<EOL $line EOL [ "$underlay" = "" ] && continue #echo "APW config underlay<$underlay> overlay<$overlay> L_underlay<$L_underlay" # Check if we have any local config before selection. config_filename "${underlay}" "${overlay}" "${underlay}" config="$RET" lconfig='' if [ -f "$config" ]; then lconfig=$(cat "$config") fi # XXX: this should be passed in as a real parameter ... sigh. config_filename "${underlay}" "${overlay}" "${L_underlay}" config="$RET" if [ -f "$config" ]; then lconfig="$lconfig $(cat "$config")" fi #echo "LCONFIG<$lconfig> config<$config>" # Run this in a subshell so we catch its exit. # See if we want this line. ! $select $overlay $underlay "$lconfig $flags" && continue underlay_actual="$RET" found=0 ($payload $flags $lconfig "$@" -o "$overlay" -u "$underlay_actual") res="$?" if [ "$res" -ne 0 ]; then echo "$0: /etc/network/fan:$n $underlay $overlay $flags -- failed err=$res" err="$res" fi done <"/etc/network/fan" RET="$err" return "$found" } slices_scan() { local why="$1" local select="$2" local payload="$3" shift 3 lock -x || fail "unable to lock fan state" err=0 found=1 for state in "$state_dir/slice-state"-* do [ "$state" = "$state_dir/slice-state-*" ] && continue read bridge overlay underlay specifier flags <"$state" # See if we want this line. ! $select "$@" $bridge $overlay $underlay "$flags" && continue found=0 ( networks_decode_one $flags -o "$overlay" -u "$underlay" $payload "$overlay" "$underlay" $flags ) res="$?" if [ "$res" -ne 0 ]; then echo "$0: $why $overlay $underlay -- failed err=$res" err="$res" fi done RET="$err" return $found } __cmd_up_all_select() { #echo "__cmd_up_all_select($@)" #local overlay="$1" #local underlay="$2" local flags="$3" case " $flags " in *\ --enable\ *) ;; *\ --on\ *) ;; *) return 1 ;; esac __cmd_up_select "$@" } cmd_up_all() { for L_underlay in $( ip -4 -o addr show | \ while read x iface which addr x do case "$which" in inet) ;; *) continue ;; esac addr="${addr%/*}" echo "$addr" done ) do #echo "L_underlay<$L_underlay>" config_scan __cmd_up_all_select __cmd_up '--auto' done exit "$RET" } cmd_net_up() { local dev="$1" RET="0" for L_underlay in $( ip -4 -o addr show dev "$dev" | \ while read x iface which addr x do case "$which" in inet) ;; *) continue ;; esac addr="${addr%/*}" echo "$addr" done ) do config_scan __cmd_up_all_select __cmd_up '--auto' done exit "$RET" } cmd_down_help() { echo "Usage: $0 down -u <underlay> -o <overlay>" 1>&2 echo " $0 down -a" 1>&2 echo " $0 down -e" 1>&2 } cmd_down() { if [ "$#" -eq 0 ]; then cmd_down_help exit 1 fi cmd_decode_init if ! cmd_decode_ou "down" "$@"; then TEMP=$(cmd_decode_legacy "down" "$@") eval set -- "$TEMP" cmd_down "$@" return fi #networks_decode_addresses "$C_overlay" "$C_underlay" underlay_lookup_address "$C_underlay" L_overlay="$C_overlay" L_underlays="$RET" if ! slices_scan 'down' __cmd_down_select __cmd_down_payload; then fail "$C_overlay $C_underlay: not configured" RET="1" fi exit "$RET" } __cmd_down_select() { local bridge="$1" local overlay="$2" local underlay="$3" #echo "APW: overlay<$overlay> underlay<$underlay> L_overlay<$L_overlay> L_underlays<$L_underlays>" if [ "$L_underlays" = "" ]; then return 1 fi for select_underlay in $L_underlays do if [ "$select_underlay" = "$underlay" -a "$L_overlay" = "$overlay" ]; then return 0 fi done return 1 } __cmd_down_payload() { # Validation: ensure the bridge is already configured. [ ! -f "$state_dir/slice-state-$C_slice_id" ] && fail "XXX: $C_bridge: not configured" # XXX: not the right check now, we may not have one either. # Validation: confirm the bridge is not in use. count=`ls /sys/class/net/"$C_bridge"/brif 2>/dev/null | \ egrep -v "^$C_tun\$" | \ wc -l` [ "$count" != 0 ] && \ fail "$C_bridge: in use, will not destroy" # if dnsmasq is present for this network terminate it dhcp_down_if_up fail slice_down_if_up fail # remove routing for 15.0.1.0/24 from the bridge # destroy bridge fan-15-0-1 bridge_down_if_free fail # if this is the last bridge using 15 net then: # clear out routing # drop address tunnelling route_down_if_free warn tun_down_if_free warn nat_down_if_free warn } cmd_down_all_auto() { slices_scan 'down' __cmd_down_select_auto __cmd_down_payload exit "$RET" } __cmd_down_select_auto() { #local bridge="$1" #local underlay="$2" #local overlay="$3" local flags="$4" case " $flags " in *\ --auto\ *) return 0 ;; *) return 1 ;; esac } cmd_down_all_full() { slices_scan 'down' true __cmd_down_payload exit "$RET" } cmd_net_down() { L_underlay_dev="$1" slices_scan 'down' __cmd_net_down_select __cmd_net_down_payload exit "$RET" } __cmd_net_down_select() { #local bridge="$1" #local underlay="$2" #local overlay="$3" local flags="$4" case " $flags " in *\ _dev\ $L_underlay_dev\ *) ;; *) return 1 ;; esac case " $flags " in *\ auto\ *) return 0 ;; *) return 1 ;; esac } __cmd_net_down_payload() { C_underlay_dev="$L_underlay_dev" __cmd_down_payload "$@" } cmd_show_help() { echo "Usage: $0 show" 1>&2 } cmd_show() { if [ "$#" -ne 0 ]; then cmd_show_help exit 1 fi printf "%-16s %-20s %-20s %s\n" 'Bridge' 'Underlay' 'Overlay' 'Flags' lock -s || exit 0 for state in "$state_dir/bridge"-* "$state_dir/slice-state"-* do [ "$state" = "$state_dir/bridge-*" ] && continue [ "$state" = "$state_dir/slice-state-*" ] && continue read bridge overlay underlay separator flags <"$state" #echo "<$overlay> <$underlay> <$flags>" cmd_decode_init cmd_decode_internal $flags cmd_decode_show $flags printf "%-16s %-20s %-20s%s\n" $bridge $C_underlay $C_overlay "$RET" done } # # CMD: config set -u <underlay> -o <overlay> [<option>...] # CMD: config show -u <underlay> -o <overlay> # CMD: config list # cmd_config_help() { echo "Usage: $0 config set -u <underlay> -o <overlay> [<options>...]" 1>&2 echo " $0 config show -u <underlay> -o <overlay>" 1>&2 echo " $0 config list" 1>&2 } config_filename() { local underlay="$1" local overlay="$2" local interface="$3" local interface_suffix='' local underlay_ipnum local underlay_width local underlay_mask local interface_ipnum local interface_width local interface_mask # Round the underlay address to the mask. ip_to_num_width "$underlay" underlay_ipnum="$RET" underlay_width="$RET2" width_to_mask "$underlay_width" underlay_mask="$RET" if [ "$(( $underlay_ipnum & ~$underlay_mask ))" -ne 0 ]; then num_to_ip "$(( $underlay_ipnum & $underlay_mask ))" underlay="$RET/$underlay_width" fi # Work out if the host portion of the interface address is 0. case "$interface" in */*) ;; *) interface="$interface/$underlay_width" ;; esac ip_to_num_width "$interface" interface_ipnum="$RET" interface_width="$RET2" width_to_mask "$interface_width" interface_mask="$RET" if [ "$(( $interface_ipnum & ~$interface_mask ))" -ne 0 ]; then num_to_ip "$interface_ipnum" interface_suffix="--${RET}" fi RET="$lconfig_dir/$(echo "${underlay}--${overlay}${interface_suffix}" | sed -e 's@/@-@g').conf" } cmd_config() { if [ "$#" -lt 1 ]; then cmd_config_help exit 1 fi local cmd="$1" shift case "$cmd" in list|ls) ls -1 "$lconfig_dir" | \ while read config do case "$config" in *.conf) ;; *) continue ;; esac config=$( echo "$config" | sed \ -e 's/.conf$//' \ -e 's/--/ /g' \ -e 's@-@/@g' ) echo "$config" done ;; show) cmd_decode_init if ! cmd_decode_ou "config set" "$@"; then fail "invalid config" fi if [ "$C_underlay" = '' -o "$C_overlay" = '' ]; then fail "underlay/overlay required" fi config_filename "${C_underlay}" "${C_overlay}" "${C_underlay}" config="$RET" uconfig="$config-user" [ -f "$uconfig" ] && cat "$uconfig" ;; set) cmd_decode_init if ! cmd_decode_config "config set" "$@"; then fail "invalid config" fi if [ "$C_underlay" = '' -o "$C_overlay" = '' ]; then fail "underlay/overlay required" fi config_filename "${C_underlay}" "${C_overlay}" "${C_underlay}" config="$RET" #config="$lconfig_dir/$(echo "${C_underlay}--${C_overlay}" | sed -e 's@/@-@g').conf" uconfig="$config-user" cmd_decode_user "$@" #echo "@<$@> RET<$RET>" if [ "$RET" = "" ]; then rm -f "$config" "$uconfig" else echo "$RET" >"$config" echo "$RET2" >"$uconfig" fi ;; *) cmd_config_help exit 1 ;; esac } cmd_net_help() { echo "Usage: $0 net start <device>" 1>&2 echo " $0 net stop <device>" 1>&2 } cmd_net() { if [ "$#" != 2 ]; then cmd_net_help exit 1 fi case "$1" in start) cmd_net_up "$2" ;; stop) cmd_net_down "$2" ;; *) cmd_net_help exit 1 ;; esac } cmd_help_help() { echo "Usage: $0 help <command>" 1>&2 } cmd_help() { if [ "$#" != 1 ]; then { echo "Command summary:" cmd_up_help echo "" cmd_down_help echo "" cmd_show_help echo "" cmd_net_help echo "" cmd_config_help echo "" cmd_help_help } 2>&1 | sed -e '2,$s/Usage:/ /' exit 0 fi case "$1" in up) cmd_up_help ;; down) cmd_down_help ;; show) cmd_show_help ;; net) cmd_net_help ;; config) cmd_config_help ;; help) cmd_help_help ;; *) echo "Unknown command." 1>&2 exit 1 ;; esac exit 0 } cmd__upgrade() { # Check if we even have state to convert. [ ! -d "$state_dir" ] && exit 0 echo "fanctl: converting live state" # Needing work: # slice-dhcp-15.0.0.0_8-192.168.122.72_16 # slice-display-15.0.0.0_8-192.168.122.72_16 # slice-state-15.0.0.0_8-192.168.122.72_16 # brg-state-fan-15 # dnsmasq-flags-fan-15 # addr-ftun0-15-15.0.0.0_8-192.168.122.72_16 for state in "$state_dir/bridge"-* do [ "$state" = "$state_dir/bridge-*" ] && exit 0 read bridge overlay underlay flags <"$state" ( networks_decode_one "$overlay" "$underlay" type ipip mode sliced $flags ## XXX: new flags form # Replace the bridge state. echo "$C_bridge $C_overlay $C_underlay $C_user_flags" >"$state_dir/slice-display-$C_slice_id" echo "$C_bridge $C_overlay $C_underlay $C_flags" >"$state_dir/slice-state-$C_slice_id" echo "${C_bridge} ${C_bridge_dhcp_listen} ${C_bridge_dhcp_low} ${C_bridge_dhcp_high}" >"$state_dir/slice-dhcp-$C_slice_id" # Mark the bridge as available. echo "" >"$state_dir/brg-state-$C_bridge_state" # we cannot be sure what the current flags are, but if we have dhcp # then record non-blank current flags so that we will restart/stop the # server correctly on the first change. if [ -f "$state_dir/dnsmasq-$C_bridge_state.pid" ]; then echo "__DUMMY__" >"$state_dir/dnsmasq-flags-$C_bridge_state" fi # See if we have an address recorded for this combination. if [ -f "$state_dir/addr-$C_tun-$C_overlay_prefix-$C_bridge_state" ]; then mv "$state_dir/addr-$C_tun-$C_overlay_prefix-$C_bridge_state" "$state_dir/addr-$C_tun-$C_overlay_prefix-$C_slice_id" fi ) rm "$state" done # Unchanged: # alloc-ftun0 # dnsmasq-fan-15.pid # map-fan-15 # nat-core # net-15 # tunnel-ftun0 # tunnel-ftun0-15 } # Parse the command line. opt_v= while getopts ":vs:" opt do case "$opt" in v) opt_v=1 ;; ?) echo "$0: $opt: unknown flag ??" 2>&1; exit 1 ;; esac done shift $(($OPTIND - 1)) # Validation. if [ "$#" -lt 1 ]; then usage exit 1 fi cmd="$1" shift lock() { local mode="$1" # Ensure we have a lock file if at all possible. [ ! -d "$state_dir" ] && mkdir -p "$state_dir" 2>/dev/null [ ! -f "$state_dir/.lock" ] && touch "$state_dir/.lock" 2>/dev/null [ ! -r "$state_dir/.lock" ] && return 1 exec 9<"$state_dir/.lock" || return 2 flock "$1" 9 } # Validate and execute the command. case "$cmd" in up) [ `id -u` -ne 0 ] && fail "priviledge to alter network configuration required" if [ "$#" -eq 1 -a "$1" = "-a" ]; then cmd_up_all exit 1 fi lock -x || fail "unable to lock fan state" cmd_up "$@" ;; down) [ `id -u` -ne 0 ] && fail "priviledge to alter network configuration required" if [ "$#" -eq 1 -a "$1" = "-a" ]; then cmd_down_all_auto exit 1 fi if [ "$#" -eq 1 -a "$1" = "-e" ]; then cmd_down_all_full exit 1 fi lock -x || fail "unable to lock fan state" cmd_down "$@" ;; net) [ `id -u` -ne 0 ] && fail "priviledge to alter network configuration required" cmd_net "$@" ;; show) cmd_show "$@" ;; config) [ `id -u` -ne 0 ] && fail "priviledge to alter network configuration required" lock -x || fail "unable to lock fan state" cmd_config "$@" ;; __upgrade) [ `id -u` -ne 0 ] && fail "priviledge to alter network configuration required" lock -x || fail "unable to lock fan state" cmd__upgrade ;; help) cmd_help "$@" ;; *) usage echo "$cmd: unknown command" 1>&2 exit 1 ;; esac
Close