[Olsr-dev] [PATCH] [openwrt] add uci-fication and hotplug-script (RESEND v2 with lan's + better hotplugging)

Henning Rogge (spam-protected)
Thu May 22 14:30:29 CEST 2014


Hi,

just a single last comment... do you really want to log into syslog
AND into the temporary file? Maybe making the "option 'file'..."
optional (no pun intended) would be better as a default. Otherwise...

Acked-by: (spam-protected)


Henning

On Thu, May 22, 2014 at 2:36 PM, Bastian Bittorf <(spam-protected)> wrote:
> [openwrt] add uci-fication and hotplug-script
>
> Implementing a small subset for a working native-olsrd2 config-file.
> (logging, telnet, interfaces, lan's and some more)
>
> The file is created during startup into ramdisc and during hotplug-events
> recreated and the daemon rereads to config via sending a signal.
>
> The following is generated on my end from the included UCI-file:
>
> (spam-protected):~ cat /var/etc/olsrd2.conf
> [global]
>         fork            true
>         failfast        no
>
> [log]
>         stderr  true
>         syslog  true
>         file    /var/log/olsrd2.log
>
> [domain=0]
>         table   234
>
> [telnet]
>         port    2007
>
> [interface=lo]          # loopback
> [interface=eth0.2]      # wan
> [interface=eth0.1]      # lan
> [interface=wlan0]       # wlanadhoc
> [interface=wlan1]       # wlanadhocRADIO1
>
> [olsrv2]
>         lan 10.63.21.64/26
>         lan ::/0
>         lan 0.0.0.0/0
>
> Signed-off-by: Bastian Bittorf <(spam-protected)>
> ---
>  openwrt/olsrd2-git/Makefile             |  10 ++-
>  openwrt/olsrd2-git/files/olsrd2.conf    |  13 ----
>  openwrt/olsrd2-git/files/olsrd2.hotplug |  76 +++++++++++++++++++
>  openwrt/olsrd2-git/files/olsrd2.init    | 130 +++++++++++++++++++++++++++++---
>  openwrt/olsrd2-git/files/olsrd2.uci     |  25 ++++++
>  5 files changed, 228 insertions(+), 26 deletions(-)
>  delete mode 100644 openwrt/olsrd2-git/files/olsrd2.conf
>  create mode 100755 openwrt/olsrd2-git/files/olsrd2.hotplug
>  create mode 100644 openwrt/olsrd2-git/files/olsrd2.uci
>
> diff --git a/openwrt/olsrd2-git/Makefile b/openwrt/olsrd2-git/Makefile
> index 8be848f..05f9425 100644
> --- a/openwrt/olsrd2-git/Makefile
> +++ b/openwrt/olsrd2-git/Makefile
> @@ -77,6 +77,7 @@ TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include
>  define Package/olsrd2-git/install
>         $(INSTALL_DIR) $(1)/etc
>         $(INSTALL_DIR) $(1)/etc/init.d
> +       $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
>         $(INSTALL_DIR) $(1)/usr
>         $(INSTALL_DIR) $(1)/usr/sbin
>         $(INSTALL_BIN) \
> @@ -85,13 +86,16 @@ define Package/olsrd2-git/install
>         $(INSTALL_BIN) \
>                 ./files/olsrd2.init \
>                 $(1)/etc/init.d/olsrd2
> +       $(INSTALL_BIN) \
> +               ./files/olsrd2.hotplug \
> +               $(1)/etc/hotplug.d/iface/50-olsrd2
>         $(INSTALL_DATA) \
> -               ./files/olsrd2.conf \
> -               $(1)/etc
> +               ./files/olsrd2.uci \
> +               $(1)/etc/config/olsrd2
>  endef
>
>  define Package/olsrd2-git/conffiles
> -/etc/olsrd2.conf
> +/etc/config/olsrd2
>  endef
>
>  #define Package/olsrd2-git-plugin-ff-ett/install
> diff --git a/openwrt/olsrd2-git/files/olsrd2.conf b/openwrt/olsrd2-git/files/olsrd2.conf
> deleted file mode 100644
> index a855b00..0000000
> --- a/openwrt/olsrd2-git/files/olsrd2.conf
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -#[global]
> -#       fork            no
> -#       failfast        no
> -
> -[log]
> -#       file            /var/log/olsrd2.log
> -       stderr          true
> -       syslog          true
> -#       info            all
> -#       debug           all
> -#
> -
> -[interface=wlan0]
> diff --git a/openwrt/olsrd2-git/files/olsrd2.hotplug b/openwrt/olsrd2-git/files/olsrd2.hotplug
> new file mode 100755
> index 0000000..f6d1d08
> --- /dev/null
> +++ b/openwrt/olsrd2-git/files/olsrd2.hotplug
> @@ -0,0 +1,76 @@
> +#!/bin/sh
> +
> +olsrd2_log()
> +{
> +       local prio="$1"
> +       local message="$2"
> +
> +       logger -t olsrd2_hotplug -p daemon.$prio "$message"
> +}
> +
> +olsrd2_list_configured_interfaces()
> +{
> +       local i=0
> +       local interface
> +
> +       while interface="$( uci -q get (spam-protected)[$i].ifname )"; do {
> +               case "$( uci -q get (spam-protected)[$i].ignore )" in
> +                       1|on|true|enabled|yes)
> +                               # must be ignored
> +                       ;;
> +                       *)
> +                               echo "$interface"       # e.g. 'lan wan wifi'
> +                       ;;
> +               esac
> +
> +               i=$(( $i + 1 ))
> +       } done
> +}
> +
> +olsrd2_interface_already_in_config()
> +{
> +       if grep ^"\[interface=${DEVICE}\]" '/var/etc/olsrd2.conf'; then
> +               olsrd2_log debug "[OK] already_active: '$INTERFACE' => '$DEVICE'"
> +               return 0
> +       else
> +               olsrd2_log info "[OK] ifup/adding: '$INTERFACE' => '$DEVICE'"
> +               return 1
> +       fi
> +}
> +
> +olsrd2_interface_needs_adding()
> +{
> +       local interface
> +
> +       # likely and cheap operation:
> +       olsrd_interface_already_in_config && return 1
> +
> +       for interface in $(olsrd2_list_configured_interfaces); do {
> +               [ "$interface" = "$INTERFACE" ] && {
> +                       olsrd2_interface_already_in_config || return 0
> +               }
> +       } done
> +
> +       olsrd2_log debug "[OK] interface '$INTERFACE' => '$DEVICE' not used for olsrd"
> +       return 1
> +}
> +
> +case "$ACTION" in
> +       ifup)
> +               # only work after the first normal startup
> +               # also: no need to test, if enabled
> +               [ -e '/var/etc/olsrd2.conf' ] && {
> +                       # used global vars:
> +                       # INTERFACE = e.g. 'wlanadhocRADIO1' or 'cfg144d8f'
> +                       # DEVICE    = e.g. 'wlan1-1'
> +                       olsrd2_interface_needs_adding && {
> +                               # UCI-fication
> +                               . /etc/init.d/olsrd2
> +                               output_config >'/var/etc/olsrd2.conf'
> +
> +                               # rereads config
> +                               kill -SIGHUP $(pidof olsrd2)
> +                       }
> +               }
> +       ;;
> +esac
> diff --git a/openwrt/olsrd2-git/files/olsrd2.init b/openwrt/olsrd2-git/files/olsrd2.init
> index 9da236d..b8c5641 100755
> --- a/openwrt/olsrd2-git/files/olsrd2.init
> +++ b/openwrt/olsrd2-git/files/olsrd2.init
> @@ -1,19 +1,129 @@
>  #!/bin/sh /etc/rc.common
>
>  START=82
> -APP=/usr/sbin/olsrd2
> -ARGS="--load /etc/olsrd2.conf --set global.fork=true --set global.failfast=true"
>
> -start() {
> -       service_start $APP $ARGS
> +output_config()
> +{
> +       local keyword value section ifname list_ifname i lan list_lan
> +       local bool_yes='1|on|true|enabled|yes'
> +       local bool_no='0|off|false|disabled|no'
> +       local tab='     '
> +
> +       output_bool()
> +       {
> +               local value="$( uci -q get olsrd2.@${section}[0].$keyword )"
> +
> +               case "$value" in
> +                       '')
> +                               # ignore empty
> +                       ;;
> +                       1|on|true|enabled|yes)
> +                               echo "${tab}${keyword}${tab}true"
> +                       ;;
> +                       0|off|false|disabled|no)
> +                               echo "${tab}${keyword}${tab}no"
> +                       ;;
> +                       *)
> +                               echo "${tab}${keyword}${tab}${value}"
> +                       ;;
> +               esac
> +       }
> +
> +       output_string()
> +       {
> +               local value="$( uci -q get olsrd2.@${section}[0].$keyword )"
> +               [ -n "$value" ] && echo "${tab}${keyword}${tab}${value}"
> +       }
> +
> +       section='global'
> +       echo "[$section]"
> +
> +       for keyword in fork failfast; do {
> +               output_bool "$keyword"
> +       } done
> +
> +
> +       section='log'
> +       echo
> +       echo "[$section]"
> +
> +       for keyword in stderr syslog info debug; do {
> +               output_bool "$keyword"
> +       } done
> +
> +       for keyword in file; do {
> +               output_string "$keyword"
> +       } done
> +
> +       section='global'
> +       echo
> +       echo "[domain=0]"
> +
> +       for keyword in table; do {
> +               output_string "$keyword"
> +       } done
> +
> +       i=0; while uci -q get (spam-protected)[$i] >/dev/null; do {
> +               for value in $( uci show (spam-protected)[$i] | cut -d'.' -f3 ); do {
> +                       case "$value" in
> +                               'name='*)
> +                                       echo
> +                                       echo "[${value#*=}]"
> +                               ;;
> +                               *)
> +                                       echo "${tab}${value%=*}${tab}${value#*=}"
> +                               ;;
> +                       esac
> +               } done
> +
> +               i=$(( $i + 1 ))
> +       } done
> +
> +       i=0; while list_ifname="$( uci -q get (spam-protected)[$i].ifname )"; do {
> +               lan=
> +               for ifname in $list_ifname; do {
> +                       case "$( uci -q get (spam-protected)[$i].ignore )" in
> +                               1|on|true|enabled|yes)
> +                                       # ignore/disabled interfaces, also affects LAN (local attached network)
> +                               ;;
> +                               *)
> +                                       devname="$( ifstatus "$ifname" | fgrep '"device": "' | cut -d'"' -f4 )"
> +                                       [ -n "$devname" ] && {
> +                                               echo
> +                                               echo "[interface=$devname]${tab}# $ifname"
> +
> +                                               # only add once per section and only when at least 1 device per section is up
> +                                               [ -z "$lan" ] && {
> +                                                       for lan in $( uci -q get (spam-protected)[$i].lan ); do {
> +                                                               lan_list="$lan_list $lan"
> +                                                       } done
> +                                               }
> +                                       }
> +                               ;;
> +                       esac
> +               } done
> +
> +               i=$(( $i + 1 ))
> +       } done
> +
> +       [ -n "$lan_list" ] && {
> +               echo
> +               echo "[olsrv2]"
> +
> +               for lan in $lan_list; do {
> +                       echo "${tab}lan $lan"
> +               } done
> +       }
>  }
>
> -stop() {
> -       service_stop $APP $ARGS
> +start()
> +{
> +       output_config >'/var/etc/olsrd2.conf'
> +       echo "$(cat /proc/uptime) firstwrite" >>/tmp/HPO
> +       service_start /usr/sbin/olsrd2 --load /var/etc/olsrd2.conf
>  }
>
> -restart() {
> -       stop
> -       sleep 1
> -       start
> +stop()
> +{
> +       service_stop /usr/sbin/olsrd2
>  }
> diff --git a/openwrt/olsrd2-git/files/olsrd2.uci b/openwrt/olsrd2-git/files/olsrd2.uci
> new file mode 100644
> index 0000000..0dd0a12
> --- /dev/null
> +++ b/openwrt/olsrd2-git/files/olsrd2.uci
> @@ -0,0 +1,25 @@
> +config global
> +       option 'fork'           'yes'
> +       option 'failfast'       'no'
> +       option 'table'          '234'
> +
> +config log
> +       option 'file'           '/var/log/olsrd2.log'
> +       option 'stderr'         'true'
> +       option 'syslog'         'true'
> +#      option 'info'           'all'
> +#      option 'debug'          'all'
> +
> +config plugin
> +       option 'name' 'telnet'
> +       option 'port' '2007'
> +
> +config interface
> +       option 'ifname' 'loopback'
> +#      option 'ignore' '1'
> +#      option 'lan'    '10.63.21.64/26'
> +
> +config interface
> +       list 'ifname' 'wan lan wlanadhoc wlanadhocRADIO1'
> +#      list 'lan'      '::/0'
> +#      list 'lan'      '0.0.0.0/0'
> --
> 1.8.1.2
>
>
> --
> Olsr-dev mailing list
> (spam-protected)
> https://lists.olsr.org/mailman/listinfo/olsr-dev




More information about the Olsr-dev mailing list