icwmp/scripts/functions/device_hosts
2013-07-17 16:23:54 +02:00

204 lines
No EOL
6.7 KiB
Bash

#!/bin/sh
# Copyright (C) 2012 Luka Perkov <freecwmp@lukaperkov.net>
# Copyright (C) 2012 Ahmed Zribi <ahmed.zribi@pivasoftware.com>
get_device_hosts_number_of_leases() {
local _static=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} show dhcp 2> /dev/null | fgrep 'dhcp.' | fgrep '.mac=' | wc -l`
local _dynamic=`wc -l /var/dhcp.leases | awk '{ print $1 }'`
eval "export -- \"$2=\"\"$_static\"\"\""
eval "export -- \"$3=\"\"$_dynamic\"\"\""
}
get_device_hosts_ip_address() {
local _leases_file=$1
local _num=$2
local _num_static_leases=$3
local _num_dynamic_leases=$4
local _ip
if [ $_num -le $_num_static_leases ]; then
let local _uci_num=$_num-1
_ip=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get dhcp.@host[$_uci_num].ip 2> /dev/null`
fi
let _num=$_num-$_num_static_leases
if [ $_num -gt 0 -a $_num -le $_num_dynamic_leases ]; then
local _sed_cmd=`echo -n \'$_num; echo p\'`
_ip=`eval sed -n $_sed_cmd $_leases_file | awk '{ print $3 }'`
fi
eval "export -- \"$5=\"\"$_ip\"\"\""
}
get_device_hosts() {
local leases_file
if [ -z "$default_dnsmasq_leases_file" ]; then
leases_file="/var/dhcp.leases"
else
leases_file=$default_dnsmasq_leases_file
fi
local num_static_leases
local num_dynamic_leases
get_device_hosts_number_of_leases "$leases_file" "num_static_leases" "num_dynamic_leases"
# internal TR-069 to TR-181 parameter transformation
local parameter=`echo -n $1 | sed "s/InternetGatewayDevice\.LANDevice\.1\./Device\./g"`
case "$parameter" in
Device.Hosts.HostNumberOfEntries)
let local val=$num_static_leases+$num_dynamic_leases
freecwmp_output "$parameter" "$val"
return
;;
esac
local rc
local num
# TODO: Device.Hosts.Host.{i}.Alias (alias support does not exist)
freecwmp_parse_formated_parameter "$parameter" "Device.Hosts.Host.{i}.PhysAddress" "rc" "num"
if [ $rc -eq 0 ]; then
local val
if [ $num -le $num_static_leases ]; then
let local uci_num=$num-1
val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get dhcp.@host[$uci_num].mac 2> /dev/null`
fi
let num=$num-$num_static_leases
if [ $num -gt 0 -a $num -le $num_dynamic_leases ]; then
local sed_cmd=`echo -n \'$num; echo p\'`
val=`eval sed -n $sed_cmd $leases_file | awk '{ print $2 }'`
fi
freecwmp_value_output "$parameter" "$val"
return
fi
freecwmp_parse_formated_parameter "$parameter" "Device.Hosts.Host.{i}.IPAddress" "rc" "num"
if [ $rc -eq 0 ]; then
local val
get_device_hosts_ip_address "$leases_file" "$num" "$num_static_leases" "$num_dynamic_leases" "val"
freecwmp_value_output "$parameter" "$val"
return
fi
freecwmp_parse_formated_parameter "$parameter" "Device.Hosts.Host.{i}.AddressSource" "rc" "num"
if [ $rc -eq 0 ]; then
local val
if [ $num -le $num_static_leases ]; then
val="Static"
fi
let num=$num-$num_static_leases
if [ $num -gt 0 -a $num -le $num_dynamic_leases ]; then
val="DHCP"
fi
freecwmp_value_output "$parameter" "$val"
return
fi
# TODO: Device.Hosts.Host.{i}.DHCPClient (freecwmp needs to support other parameters first)
freecwmp_parse_formated_parameter "$parameter" "Device.Hosts.Host.{i}.LeaseTimeRemaining" "rc" "num"
if [ $rc -eq 0 ]; then
local val
if [ $num -le $num_static_leases ]; then
val="-1"
fi
let num=$num-$num_static_leases
if [ $num -gt 0 -a $num -le $num_dynamic_leases ]; then
local sed_cmd=`echo -n \'$num; echo p\'`
local t1=`eval sed -n $sed_cmd $leases_file | awk '{ print $1 }'`
local t2=`date +%s`
let val=$t1-$t2
fi
freecwmp_value_output "$parameter" "$val"
return
fi
# TODO: Device.Hosts.Host.{i}.AssociatedDevice (freecwmp needs to support other parameters first)
# TODO: Device.Hosts.Host.{i}.Layer1Interface (freecwmp needs to support other parameters first)
# TODO: Device.Hosts.Host.{i}.Layer3Interface (freecwmp needs to support other parameters first)
# TODO: Device.Hosts.Host.{i}.VendorClassID (DHCP option 60 not supported with dnsmasq)
# TODO: Device.Hosts.Host.{i}.ClientID (DHCP option 61 not supported with dnsmasq)
# TODO: Device.Hosts.Host.{i}.UserClassID (DHCP option 77 not supported with dnsmasq)
freecwmp_parse_formated_parameter "$parameter" "Device.Hosts.Host.{i}.HostName" "rc" "num"
if [ $rc -eq 0 ]; then
local val
if [ $num -le $num_static_leases ]; then
let local uci_num=$num-1
val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get dhcp.@host[$uci_num].name 2> /dev/null`
fi
let num=$num-$num_static_leases
if [ $num -gt 0 -a $num -le $num_dynamic_leases ]; then
local sed_cmd=`echo -n \'$num; echo p\'`
val=`eval sed -n $sed_cmd $leases_file | awk '{ print $4 }'`
if [ "x$val" == "x*" ]; then val=""; fi
fi
freecwmp_value_output "$parameter" "$val"
return
fi
# TODO: Device.Hosts.Host.{i}.ClientID (DHCP option 61 not supported with dnsmasq)
freecwmp_parse_formated_parameter "$parameter" "Device.Hosts.Host.{i}.Active" "rc" "num"
if [ $rc -eq 0 ]; then
local val
local ip
get_device_hosts_ip_address "$leases_file" "$num" "$num_static_leases" "$num_dynamic_leases" "ip"
val=`ping -c 1 $ip 2>&1 > /dev/null ; echo $?`
let val=!$val
freecwmp_value_output "$parameter" "$val"
return
fi
# TODO: we support only one IPv4 address per host
freecwmp_parse_formated_parameter "$parameter" "Device.Hosts.Host.{i}.IPv4AddressNumberOfEntries" "rc" "num"
if [ $rc -eq 0 ]; then
local val
let local n=$num_static_leases+$num_dynamic_leases
if [ $num -le $n ]; then
val=1
fi
freecwmp_value_output "$parameter" "$val"
return
fi
# TODO: we do not support IPv6 address
freecwmp_parse_formated_parameter "$parameter" "Device.Hosts.Host.{i}.IPv6AddressNumberOfEntries" "rc" "num"
if [ $rc -eq 0 ]; then
local val
let local n=$num_static_leases+$num_dynamic_leases
if [ $num -le $n ]; then
val=0
fi
freecwmp_value_output "$parameter" "$val"
return
fi
# TODO: we support only one IPv4 address per host
freecwmp_parse_formated_parameter "$parameter" "Device.Hosts.Host.{i}.IPv4Address.{i}.IPAddress" "rc" "num"
if [ $rc -eq 0 ]; then
local val
local num1=`echo $num | awk '{ print $1 }'`
local num2=`echo $num | awk '{ print $2 }'`
let local n=$num_static_leases+$num_dynamic_leases
if [ $num2 -eq 1 ]; then
get_device_hosts_ip_address "$leases_file" "$num1" "$num_static_leases" "$num_dynamic_leases" "val"
fi
freecwmp_value_output "$parameter" "$val"
return
fi
# TODO: Device.Hosts.Host.{i}.IPv6Address.{i}.IPAddress (no IPv6 support yet)
return $FAULT_CPE_INVALID_PARAMETER_NAME
}
get_device_hosts_name() { return $FAULT_CPE_INVALID_PARAMETER_NAME; }
get_device_hosts_notification() { return $FAULT_CPE_INVALID_PARAMETER_NAME; }
set_device_hosts() { return $FAULT_CPE_INVALID_PARAMETER_NAME; }
set_device_hosts_notification() { return $FAULT_CPE_INVALID_PARAMETER_NAME; }
add_device_hosts() { return $FAULT_CPE_INVALID_PARAMETER_NAME; }
delete_device_hosts() { return $FAULT_CPE_INVALID_PARAMETER_NAME; }