luci-app-olsrd2: upgrade uci-defaults for ucitrack handling to use json master
authorFlorian Eckert <fe@dev.tdt.de>
Thu, 11 Apr 2024 14:37:28 +0000 (16:37 +0200)
committerJosef Schlehofer <pepe.schlehofer@gmail.com>
Tue, 16 Apr 2024 06:53:10 +0000 (08:53 +0200)
Conversion of the 'uci-defaults' script for ucitrack handling to the new
json processing.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
251 files changed:
.github/issue_template [new file with mode: 0644]
.github/pull_request_template [new file with mode: 0644]
.github/workflows/Dockerfile [new file with mode: 0644]
.github/workflows/check-autorelease-deprecation.yml [new file with mode: 0644]
.github/workflows/ci_helpers.sh [new file with mode: 0644]
.github/workflows/entrypoint.sh [new file with mode: 0755]
.github/workflows/formal.yml [new file with mode: 0644]
.github/workflows/multi-arch-test-build.yml [new file with mode: 0644]
README [deleted file]
README.md [new file with mode: 0644]
ahcpd/Makefile
alfred/Makefile
alfred/files/alfred.config
alfred/files/alfred.init
babeld/Makefile
babeld/files/babeld.config
babeld/files/babeld.init
babeld/patches/600-add-ubus.patch [new file with mode: 0644]
babeld/src/ubus.c [new file with mode: 0644]
babeld/src/ubus.h [new file with mode: 0644]
batctl/Makefile
batman-adv/Config.in
batman-adv/Makefile
batman-adv/files/etc/config/batman-adv [deleted file]
batman-adv/files/etc/hotplug.d/net/99-batman-adv [deleted file]
batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif [new file with mode: 0755]
batman-adv/files/lib/batman-adv/config.sh [deleted file]
batman-adv/files/lib/netifd/proto/batadv.sh
batman-adv/files/lib/netifd/proto/batadv_hardif.sh [new file with mode: 0755]
batman-adv/files/lib/netifd/proto/batadv_vlan.sh
batman-adv/patches/0001-Revert-batman-adv-Migrate-to-linux-container_of.h.patch [new file with mode: 0644]
batman-adv/patches/0001-compat-hacks.patch [deleted file]
batman-adv/patches/0002-fix-batadv_is_cfg80211_netdev.patch [new file with mode: 0644]
batman-adv/patches/0003-Revert-batman-adv-Switch-to-linux-sprintf.h.patch [new file with mode: 0644]
batman-adv/patches/0004-Revert-batman-adv-Switch-to-linux-array_size.h.patch [new file with mode: 0644]
batman-adv/src/compat-hacks.h
batmand/Makefile
batmand/files/etc/config/batmand
batmand/files/etc/init.d/batmand
batmand/patches/0001-Allow-one-to-disable-forking-to-background-in-debug_.patch [new file with mode: 0644]
batmand/patches/100-2.6.36.patch [deleted file]
bird1-openwrt/LUCI-DOCUMENTATION.md [deleted file]
bird1-openwrt/README.md [deleted file]
bird1-openwrt/UCI-DOCUMENTATION.md [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/Makefile [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/config/bird4 [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/controller/bird4.lua [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/init.d/bird4 [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/init.d/bird4-lib.sh [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/model/bgp_proto.lua [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/model/filters.lua [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/model/functions.lua [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/model/gen_proto.lua [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/model/overview.lua [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/model/status.lua [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/uci-defaults/99-relocate-filters [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/uci-defaults/bird-uci-install-init.d [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/view/log.htm [deleted file]
bird1-openwrt/bird1-ipv4-openwrt/src/view/tvalue.htm [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/Makefile [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/config/bird6 [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/controller/bird6.lua [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/init.d/bird6 [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/init.d/bird6-lib.sh [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/model/bgp_proto.lua [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/model/filters.lua [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/model/functions.lua [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/model/gen_proto.lua [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/model/overview.lua [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/model/status.lua [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/uci-defaults/99-relocate-filters [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/uci-defaults/bird-uci-install-init.d [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/view/log.htm [deleted file]
bird1-openwrt/bird1-ipv6-openwrt/src/view/tvalue.htm [deleted file]
bird1/Makefile [deleted file]
bird1/files/bird4.conf [deleted file]
bird1/files/bird4.init [deleted file]
bird1/files/bird6.conf [deleted file]
bird1/files/bird6.init [deleted file]
bird2/Makefile
bird2/files/bird.init
bird2/patches/000-ospf-bus-error.patch [new file with mode: 0644]
bird2/patches/0001-BGP-Fix-extended-next-hop-handling.patch [deleted file]
bird2/patches/0002-Filter-Added-missing-instruction-comparators.patch [deleted file]
bird2/patches/0003-babel-Fix-type-of-route-entry-router-ID.patch [deleted file]
bird2/patches/0004-Babel-Add-option-to-randomize-router-ID.patch [deleted file]
bird2/patches/0005-Better-initialization-of-random-generator.patch [deleted file]
bird2/patches/0006-babel-Set-onlink-flag-for-IPv4-routes-with-unreachab.patch [deleted file]
bird2/patches/0007-Fix-build-version.patch [deleted file]
bird2/patches/0008-Filter-Add-support-for-src-filter-op-to-access-SADR-.patch [deleted file]
bmx6/Makefile [deleted file]
bmx6/files/etc/config/bmx6 [deleted file]
bmx6/files/etc/init.d/bmx6 [deleted file]
bmx7/Makefile
bmx7/files/etc/config/bmx7
bmx7/files/etc/init.d/bmx7
bmx7/patches/010-gcc10.patch [new file with mode: 0644]
bmx7/patches/020-siocgstamp.patch [new file with mode: 0644]
bmx7/patches/100-rename-list_add_tail-and-struct-list_head.patch [deleted file]
cjdns/Makefile
cjdns/files/cjdns.defaults
cjdns/files/luci-app-cjdns.json [new file with mode: 0644]
cjdns/lua/cjdns/uci.lua
cjdns/patches/001-five-mins-builder-zonk.patch [new file with mode: 0644]
cjdns/patches/020-prefer-python2.patch [new file with mode: 0644]
cjdns/patches/030-fix-invalid-pointer.patch [new file with mode: 0644]
cjdns/patches/040-gyp-python_310.patch [new file with mode: 0644]
hnetd/Makefile
hnetd/patches/010-openssl-deprecated.patch [new file with mode: 0644]
hnetd/patches/020-unused.patch [new file with mode: 0644]
luci-app-bmx6/COPYING [deleted file]
luci-app-bmx6/Makefile [deleted file]
luci-app-bmx6/bmx6/etc/config/luci-bmx6 [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/controller/bmx6.lua [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/model/bmx6json.lua [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/advanced.lua [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/hna.lua [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/interfaces.lua [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/main.lua [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/plugins.lua [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/tunnels.lua [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/view/admin_status/index/neighbours_simple.htm [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/chat.htm [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/error.htm [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/gateways_j.htm [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/graph.htm [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/links.htm [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/nodes_j.htm [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/status_j.htm [deleted file]
luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/tunnels_j.htm [deleted file]
luci-app-bmx6/bmx6/www/cgi-bin/bmx6-info [deleted file]
luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/bmx6logo.png [deleted file]
luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/js/bmx6-graph.js [deleted file]
luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/js/polling.js [deleted file]
luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/link.png [deleted file]
luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/style.css [deleted file]
luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/wifi.png [deleted file]
luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/world.png [deleted file]
luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/world_small.png [deleted file]
luci-app-bmx6/dracula/dracula_graffle.js [deleted file]
luci-app-bmx6/dracula/dracula_graph.js [deleted file]
luci-app-bmx6/dracula/raphael-min.js [deleted file]
luci-app-bmx6/jquery/jquery-1.4.js [deleted file]
luci-app-bmx7/COPYING [deleted file]
luci-app-bmx7/Makefile [deleted file]
luci-app-bmx7/files/etc/config/luci-bmx7 [deleted file]
luci-app-bmx7/files/usr/lib/lua/luci/controller/bmx7.lua [deleted file]
luci-app-bmx7/files/usr/lib/lua/luci/view/bmx7/nodes_j.htm [deleted file]
luci-app-bmx7/files/usr/lib/lua/luci/view/bmx7/status_j.htm [deleted file]
luci-app-bmx7/files/www/cgi-bin/bmx7-info [deleted file]
luci-app-bmx7/files/www/luci-static/resources/bmx7/bmx7logo.png [deleted file]
luci-app-bmx7/files/www/luci-static/resources/bmx7/js/polling.js [deleted file]
luci-app-bmx7/files/www/luci-static/resources/bmx7/world.png [deleted file]
luci-app-bmx7/files/www/luci-static/resources/bmx7/world_small.png [deleted file]
luci-app-cjdns/Makefile
luci-app-cjdns/files/luci-app-cjdns.json [new file with mode: 0644]
luci-app-cjdns/luasrc/model/cbi/cjdns/peering.lua
luci-app-olsrd2/Makefile [new file with mode: 0644]
luci-app-olsrd2/htdocs/cgi-bin-olsrd2-neigh.html [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/attachednetwork.js [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/domain.js [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/global.js [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/interface.js [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/lan_import.js [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/log.js [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/luci.js [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/mesh.js [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/neighbors.js [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/node.js [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/olsrv2.js [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/olsrv2_lan.js [new file with mode: 0644]
luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/overview.js [new file with mode: 0644]
luci-app-olsrd2/root/etc/config/luci_olsrd2 [new file with mode: 0644]
luci-app-olsrd2/root/lib/functions/olsrd2.sh [new file with mode: 0644]
luci-app-olsrd2/root/usr/libexec/rpcd/status.olsrd2 [new file with mode: 0644]
luci-app-olsrd2/root/usr/share/luci/menu.d/luci-app-olsrd2.json [new file with mode: 0644]
luci-app-olsrd2/root/usr/share/rpcd/acl.d/luci-app-olsrd2.json [new file with mode: 0644]
luci-app-olsrd2/root/usr/share/ucitrack/luci-app-olsrd2.json [new file with mode: 0644]
mcproxy/Makefile
mcproxy/files/mcproxy.config
mcproxy/patches/0003-add-sourcefilter.patch
mcproxy/patches/0004-add-defs.patch
mcproxy/patches/0005-fix-match-filter-calls.patch [new file with mode: 0644]
mcproxy/patches/0006-block-ingress.patch [new file with mode: 0644]
mcproxy/patches/0007-igmpv2-queries.patch [new file with mode: 0644]
mesh11sd/Makefile [new file with mode: 0644]
minimalist-pcproxy/Makefile
minimalist-pcproxy/files/minimalist-pcproxy.defaults
mrd6/Makefile [deleted file]
mrd6/files/mrd6.conf [deleted file]
mrd6/files/mrd6.init [deleted file]
mrd6/patches/002-missing_netlink_defs.patch [deleted file]
mrd6/patches/101-Accept-default-routes-without-RTA_DST.patch [deleted file]
mrd6/patches/102-Metric-should-be-more-important-than-distance.patch [deleted file]
mrd6/patches/103-Make-build-reproducible.patch [deleted file]
nat46/Makefile [deleted file]
nat46/files/464xlat.sh [deleted file]
nat46/src/464xlatcfg.c [deleted file]
nat46/src/Makefile [deleted file]
naywatch/Makefile [new file with mode: 0644]
naywatch/files/naywatch.config [new file with mode: 0644]
naywatch/files/naywatch.init [new file with mode: 0644]
naywatch/files/naywatch.sh [new file with mode: 0644]
ndppd/Makefile
nodogsplash/Makefile
nodogsplash/files/etc/config/nodogsplash
nodogsplash/files/etc/init.d/nodogsplash
ohybridproxy/Makefile
ohybridproxy/patches/0001-find-libubox.patch [deleted file]
olsrd/Makefile
olsrd/files/olsrd-neigh.sh [new file with mode: 0755]
olsrd/files/olsrd.config
olsrd/files/olsrd.hotplug.sh [deleted file]
olsrd/files/olsrd.init [deleted file]
olsrd/files/olsrd.sh [new file with mode: 0644]
olsrd/files/olsrd4.init
olsrd/files/olsrd6.config
olsrd/files/olsrd6.init
olsrd/patches/.gitignore [deleted file]
olsrd/patches/102-olsrd-prevent-storm-patches.patch [new file with mode: 0644]
olsrd/patches/600-add-ubus-support.patch [new file with mode: 0644]
olsrd/src/src/ubus.c [new file with mode: 0644]
olsrd/src/src/ubus.h [new file with mode: 0644]
oonf-dlep-proxy/Makefile
oonf-dlep-proxy/files/dlep_proxy.init
oonf-dlep-radio/Makefile
oonf-dlep-radio/files/dlep_radio.init
oonf-init-scripts/files/oonf_init.sh
oonf-olsrd2/Config.in
oonf-olsrd2/Makefile
oonf-olsrd2/files/olsrd2.init
oonf-olsrd2/patches/100-enable-lan-import-plugin.patch [new file with mode: 0644]
opennds/Makefile [new file with mode: 0644]
pimbd/Makefile
pimbd/files/pimb.config [new file with mode: 0644]
pimbd/files/pimbd.init
prince/Makefile
prince/patches/010-gcc10.patch [new file with mode: 0644]
quagga/Makefile [deleted file]
quagga/files/quagga [deleted file]
quagga/files/quagga.conf [deleted file]
quagga/files/quagga.init [deleted file]
quagga/patches/140-holdtimer-set.patch [deleted file]
quagga/patches/150-no-cross-fs-link.patch [deleted file]
quagga/patches/170-use-supported-pagers.patch [deleted file]
smcroute/Makefile [deleted file]
smcroute/files/smcroute.init [deleted file]
smcroute/patches/001-Make-output-of-build-id-optional.patch [deleted file]
vis/Makefile
vis/files/etc/init.d/vis
vis/patches/0001-Allow-one-to-disable-forking-to-background-in-debug_.patch [new file with mode: 0644]

diff --git a/.github/issue_template b/.github/issue_template
new file mode 100644 (file)
index 0000000..539337a
--- /dev/null
@@ -0,0 +1,16 @@
+Please make sure that the issue subject starts with `<package-name>: `
+
+Also make sure that the package is maintained in this repository and not in OpenWrt-base, OpenWrt-packages or OpenWrt-LuCI.
+
+Issues related to releases below 18.06 and forks are not supported or maintained and will be closed.
+
+# Issue template (remove lines from top till here)
+
+Maintainer: @\<github-user> (find it by checking history of the package Makefile)
+Environment: (put here arch, model, OpenWrt version)
+
+Description:
+
+```
+Formating code blocks by wrapping them with pairs of ```
+```
diff --git a/.github/pull_request_template b/.github/pull_request_template
new file mode 100644 (file)
index 0000000..4bc4af6
--- /dev/null
@@ -0,0 +1,5 @@
+Maintainer: me / @\<github-user> (find it by checking history of the package Makefile)
+Compile tested: (put here arch, model, OpenWrt version)
+Run tested: (put here arch, model, OpenWrt version, tests done)
+
+Description:
diff --git a/.github/workflows/Dockerfile b/.github/workflows/Dockerfile
new file mode 100644 (file)
index 0000000..fbd17fc
--- /dev/null
@@ -0,0 +1,6 @@
+ARG ARCH=x86-64
+FROM openwrt/rootfs:$ARCH
+
+ADD entrypoint.sh /entrypoint.sh
+
+CMD ["/entrypoint.sh"]
diff --git a/.github/workflows/check-autorelease-deprecation.yml b/.github/workflows/check-autorelease-deprecation.yml
new file mode 100644 (file)
index 0000000..b85b324
--- /dev/null
@@ -0,0 +1,91 @@
+name: Check autorelease deprecation
+
+on:
+  pull_request_target:
+    types: [opened, synchronize, converted_to_draft, ready_for_review, edited]
+
+jobs:
+  build:
+    name: Check autorelease deprecation
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+
+    permissions:
+      pull-requests: write
+
+    steps:
+      - uses: actions/checkout@v3
+        with:
+          ref: ${{ github.event.pull_request.head.sha }}
+          fetch-depth: 0
+
+      - name: Determine branch name
+        run: |
+          BRANCH="${GITHUB_BASE_REF#refs/heads/}"
+          echo "Building for $BRANCH"
+          echo "BRANCH=$BRANCH" >> $GITHUB_ENV
+
+      - name: Determine changed packages
+        run: |
+          RET=0
+
+          # only detect packages with changes
+          PKG_ROOTS=$(find . -name Makefile | \
+            grep -v ".*/src/Makefile" | \
+            sed -e 's@./\(.*\)/Makefile@\1/@')
+          CHANGES=$(git diff --diff-filter=d --name-only origin/$BRANCH...)
+
+          for ROOT in $PKG_ROOTS; do
+            for CHANGE in $CHANGES; do
+              if [[ "$CHANGE" == "$ROOT"* ]]; then
+                if grep -q '$(AUTORELEASE)' "$ROOT/Makefile"; then
+                  CONTAINS_AUTORELEASE+="$ROOT"
+                fi
+                break
+              fi
+            done
+          done
+
+          if [ -n "$CONTAINS_AUTORELEASE" ]; then
+            RET=1
+            cat > "$GITHUB_WORKSPACE/pr_comment.md" << EOF
+          Please do no longer set *PKG_RELEASE* to *AUTORELEASE* as the
+          feature is deprecated. Please use an integer instead. Below is a
+          list of affected packages including correct *PKG_RELEASE*:
+
+          EOF
+          fi
+
+          for ROOT in $CONTAINS_AUTORELEASE; do
+            echo -n "  - ${ROOT}Makefile: PKG_RELEASE:=" >> "$GITHUB_WORKSPACE/pr_comment.md"
+            last_bump="$(git log --pretty=format:'%h %s' "$ROOT" |
+              grep --max-count=1 -e ': [uU]pdate to ' -e ': [bB]ump to ' |
+              cut -f 1 -d ' ')"
+
+            if [ -n "$last_bump" ]; then
+              echo -n $(($(git rev-list --count "$last_bump..HEAD" "$ROOT") + 2)) >> "$GITHUB_WORKSPACE/pr_comment.md"
+            else
+              echo -n $(($(git rev-list --count HEAD "$ROOT") + 2)) >> "$GITHUB_WORKSPACE/pr_comment.md"
+            fi
+            echo >> "$GITHUB_WORKSPACE/pr_comment.md"
+          done
+
+          exit $RET
+
+      - name: Find Comment
+        uses: peter-evans/find-comment@v2
+        if: ${{ failure() }}
+        id: fc
+        with:
+          issue-number: ${{ github.event.pull_request.number }}
+          comment-author: 'github-actions[bot]'
+
+      - name: Create or update comment
+        uses: peter-evans/create-or-update-comment@v2
+        if: ${{ failure() }}
+        with:
+          comment-id: ${{ steps.fc.outputs.comment-id }}
+          issue-number: ${{ github.event.pull_request.number }}
+          body-file: 'pr_comment.md'
+          edit-mode: replace
diff --git a/.github/workflows/ci_helpers.sh b/.github/workflows/ci_helpers.sh
new file mode 100644 (file)
index 0000000..60dcd4e
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+color_out() {
+       printf "\e[0;$1m$PKG_NAME: %s\e[0;0m\n" "$2"
+}
+
+success() {
+       color_out 32 "$1"
+}
+
+info() {
+       color_out 36 "$1"
+}
+
+err() {
+       color_out 31 "$1"
+}
+
+warn() {
+       color_out 33 "$1"
+}
+
+err_die() {
+       err "$1"
+       exit 1
+}
diff --git a/.github/workflows/entrypoint.sh b/.github/workflows/entrypoint.sh
new file mode 100755 (executable)
index 0000000..a0fdae3
--- /dev/null
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+# not enabling `errtrace` and `pipefail` since those are bash specific
+set -o errexit # failing commands causes script to fail
+set -o nounset # undefined variables causes script to fail
+
+echo "src/gz packages_ci file:///ci" >> /etc/opkg/distfeeds.conf
+
+FINGERPRINT="$(usign -F -p /ci/packages_ci.pub)"
+cp /ci/packages_ci.pub "/etc/opkg/keys/$FINGERPRINT"
+
+mkdir -p /var/lock/
+
+opkg update
+
+[ -n "${CI_HELPER:=''}" ] || CI_HELPER="/ci/.github/workflows/ci_helpers.sh"
+
+for PKG in /ci/*.ipk; do
+       tar -xzOf "$PKG" ./control.tar.gz | tar xzf - ./control
+       # package name including variant
+       PKG_NAME=$(sed -ne 's#^Package: \(.*\)$#\1#p' ./control)
+       # package version without release
+       PKG_VERSION=$(sed -ne 's#^Version: \(.*\)-[0-9]*$#\1#p' ./control)
+       # package source contianing test.sh script
+       PKG_SOURCE=$(sed -ne 's#^Source: .*/\(.*\)$#\1#p' ./control)
+
+       echo "Testing package $PKG_NAME in version $PKG_VERSION from $PKG_SOURCE"
+
+       export PKG_NAME PKG_VERSION CI_HELPER
+
+       PRE_TEST_SCRIPT=$(find /ci/ -name "$PKG_SOURCE" -type d)/pre-test.sh
+
+       if [ -f "$PRE_TEST_SCRIPT" ]; then
+               echo "Use package specific pre-test.sh"
+               if sh "$PRE_TEST_SCRIPT" "$PKG_NAME" "$PKG_VERSION"; then
+                       echo "Pre-test successful"
+               else
+                       echo "Pre-test failed"
+                       exit 1
+               fi
+       else
+               echo "No pre-test.sh script available"
+       fi
+
+       opkg install "$PKG"
+
+       TEST_SCRIPT=$(find /ci/ -name "$PKG_SOURCE" -type d)/test.sh
+
+       if [ -f "$TEST_SCRIPT" ]; then
+               echo "Use package specific test.sh"
+               if sh "$TEST_SCRIPT" "$PKG_NAME" "$PKG_VERSION"; then
+                       echo "Test succesful"
+               else
+                       echo "Test failed"
+                       exit 1
+               fi
+       else
+               echo "No test.sh script available"
+       fi
+
+       opkg remove "$PKG_NAME" --force-removal-of-dependent-packages --force-remove --autoremove || true
+done
diff --git a/.github/workflows/formal.yml b/.github/workflows/formal.yml
new file mode 100644 (file)
index 0000000..c1a039d
--- /dev/null
@@ -0,0 +1,55 @@
+name: Test Formalities
+
+on:
+  pull_request:
+
+jobs:
+  build:
+    name: Test Formalities
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+
+    steps:
+      - uses: actions/checkout@v3
+        with:
+          ref: ${{ github.event.pull_request.head.sha }}
+          fetch-depth: 0
+
+      - name: Determine branch name
+        run: |
+          BRANCH="${GITHUB_BASE_REF#refs/heads/}"
+          echo "Building for $BRANCH"
+          echo "BRANCH=$BRANCH" >> $GITHUB_ENV
+
+      - name: Test formalities
+        run: |
+          source .github/workflows/ci_helpers.sh
+
+          RET=0
+          for commit in $(git rev-list HEAD ^origin/$BRANCH); do
+            info "=== Checking commit '$commit'"
+            if git show --format='%P' -s $commit | grep -qF ' '; then
+              err "Pull request should not include merge commits"
+              RET=1
+            fi
+
+            subject="$(git show -s --format=%s $commit)"
+            if echo "$subject" | grep -q -e '^[0-9A-Za-z,+/_-]\+: ' -e '^Revert '; then
+              success "Commit subject line seems ok ($subject)"
+            else
+              err "Commit subject line MUST start with '<package name>: ' ($subject)"
+              RET=1
+            fi
+
+            body="$(git show -s --format=%b $commit)"
+            sob="$(git show -s --format='Signed-off-by: %aN <%aE>' $commit)"
+            if echo "$body" | grep -qF "$sob"; then
+              success "Signed-off-by match author"
+            else
+              err "Signed-off-by is missing or doesn't match author (should be '$sob')"
+              RET=1
+            fi
+          done
+
+          exit $RET
diff --git a/.github/workflows/multi-arch-test-build.yml b/.github/workflows/multi-arch-test-build.yml
new file mode 100644 (file)
index 0000000..03aafc7
--- /dev/null
@@ -0,0 +1,157 @@
+name: Test Build
+
+on:
+  pull_request:
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.ref }}
+  cancel-in-progress: ${{ github.event_name == 'pull_request' }}
+
+jobs:
+  build:
+    name: Test ${{ matrix.arch }}
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+          - arch: aarch64_generic
+            target: armsr-armv8
+            runtime_test: true
+
+          - arch: arm_cortex-a15_neon-vfpv4
+            target: armsr-armv7
+            runtime_test: true
+
+          - arch: arm_cortex-a9_vfpv3-d16
+            target: mvebu-cortexa9
+            runtime_test: false
+
+          - arch: i386_pentium-mmx
+            target: x86-geode
+            runtime_test: true
+
+          - arch: mips_24kc
+            target: ath79-generic
+            runtime_test: true
+
+          - arch: powerpc_464fp
+            target: apm821xx-nand
+            runtime_test: false
+
+          - arch: powerpc_8548
+            target: mpc85xx-p1010
+            runtime_test: false
+
+          - arch: riscv64_riscv64
+            target: sifiveu-generic
+            runtime_test: false
+
+          - arch: x86_64
+            target: x86-64
+            runtime_test: true
+
+    steps:
+      - uses: actions/checkout@v3
+        with:
+          fetch-depth: 0
+
+      - name: Determine branch name
+        run: |
+          BRANCH="${GITHUB_BASE_REF#refs/heads/}"
+          echo "Building for $BRANCH"
+          echo "BRANCH=$BRANCH" >> $GITHUB_ENV
+
+      - name: Determine changed packages
+        run: |
+          # only detect packages with changes
+          PKG_ROOTS=$(find . -name Makefile | \
+            grep -v ".*/src/Makefile" | \
+            sed -e 's@./\(.*\)/Makefile@\1/@')
+          CHANGES=$(git diff --diff-filter=d --name-only origin/$BRANCH)
+
+          for ROOT in $PKG_ROOTS; do
+            for CHANGE in $CHANGES; do
+              if [[ "$CHANGE" == "$ROOT"* ]]; then
+                PACKAGES+=$(echo "$ROOT" | sed -e 's@\(.*\)/@\1 @')
+                break
+              fi
+            done
+          done
+
+          # fallback to test packages if nothing explicitly changes this is
+          # should run if other mechanics in packages.git changed
+          PACKAGES="${PACKAGES:-bird2 cjdns olsrd}"
+
+          echo "Building $PACKAGES"
+          echo "PACKAGES=$PACKAGES" >> $GITHUB_ENV
+
+      - name: Generate build keys
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y signify-openbsd
+          signify-openbsd -G -n -c 'DO NOT USE - OpenWrt packages feed CI' -p packages_ci.pub -s packages_ci.sec
+          EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
+          echo "KEY_BUILD<<$EOF" >> $GITHUB_ENV
+          cat packages_ci.sec >> $GITHUB_ENV
+          echo "$EOF" >> $GITHUB_ENV
+
+      - name: Build
+        uses: openwrt/gh-action-sdk@v5
+        env:
+          ARCH: ${{ matrix.arch }}-${{ env.BRANCH }}
+          FEEDNAME: packages_ci
+          INDEX: 1
+          KEY_BUILD: ${{ env.KEY_BUILD }}
+
+      - name: Move created packages to project dir
+        run: cp bin/packages/${{ matrix.arch }}/packages_ci/* . || true
+
+      - name: Store packages
+        uses: actions/upload-artifact@v3
+        with:
+          name: ${{env.ARCHIVE_NAME}}-packages
+          path: |
+            Packages
+            Packages.*
+            *.ipk
+            PKG-INFO
+
+      - name: Store logs
+        uses: actions/upload-artifact@v3
+        with:
+          name: ${{ matrix.arch}}-logs
+          path: logs/
+
+      - name: Remove logs
+        run: sudo rm -rf logs/ || true
+
+      - name: Check if any packages were built
+        run: |
+          if [ -n "$(find . -maxdepth 1 -type f -name '*.ipk' -print -quit)" ]; then
+            echo "Found *.ipk files"
+            HAVE_IPKS=true
+          else
+            echo "No *.ipk files found"
+            HAVE_IPKS=false
+          fi
+          echo "HAVE_IPKS=$HAVE_IPKS" >> $GITHUB_ENV
+
+      - name: Register QEMU
+        if: ${{ matrix.runtime_test && fromJSON(env.HAVE_IPKS) }}
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y qemu-user-static binfmt-support
+          sudo update-binfmts --import
+
+      - name: Build Docker container
+        if: ${{ matrix.runtime_test && fromJSON(env.HAVE_IPKS) }}
+        run: |
+          docker build --platform linux/${{ matrix.arch }} -t test-container --build-arg ARCH .github/workflows/
+        env:
+          ARCH: ${{ matrix.arch }}-${{ env.BRANCH }}
+
+      - name: Test via Docker container
+        if: ${{ matrix.runtime_test && fromJSON(env.HAVE_IPKS) }}
+        run: |
+          docker run --platform linux/${{ matrix.arch }} --rm -v $GITHUB_WORKSPACE:/ci test-container
diff --git a/README b/README
deleted file mode 100644 (file)
index 72b7fcc..0000000
--- a/README
+++ /dev/null
@@ -1,18 +0,0 @@
-This is an OpenWrt package feed containing community maintained routing packages.
-
-To use these packages, add the following line to the feeds.conf
-in the OpenWrt buildroot:
-
-  src-git routing git://github.com/openwrt-routing/packages.git
-  
-Update the feed:
-
-  ./scripts/feeds update routing
-  
-Activate the package:
-
-  ./scripts/feeds install -a -p routing
-  
-The routing packages should now appear in menuconfig.
-
-
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..6c393b6
--- /dev/null
+++ b/README.md
@@ -0,0 +1,21 @@
+# OpenWrt Routing Feed
+
+## Description
+
+This OpenWrt package feed contains community maintained routing packages.
+
+## Usage
+
+
+This repository is intended to be layered on-top of an OpenWrt buildroot.
+If you do not have an OpenWrt buildroot installed, see the documentation at:
+[OpenWrt Buildroot – Installation][1] on the OpenWrt support site.
+
+This feed is enabled by default. To install all its package definitions, run:
+
+```
+./scripts/feeds update routing
+./scripts/feeds install -a -p routing
+```
+
+[1]: https://openwrt.org/docs/guide-developer/build-system/install-buildsystem
index 043c60997fcb86475c3c9dc567d28fd21f3dbd9b..18d2e95e1d6033a3369061683357e99cec6b157b 100644 (file)
@@ -9,13 +9,15 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ahcpd
 PKG_VERSION:=0.53
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/files/
-PKG_MD5SUM:=a1a610bf20965aa522cd766bf3d5829a
-PKG_LICENSE:=MIT
+PKG_SOURCE_URL:=https://www.irif.fr/~jch/software/files/
+PKG_HASH:=a4622e817d2b2a9b878653f085585bd57f3838cc546cca6028d3b73ffcac0d52
 
+PKG_MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>
+PKG_LICENSE:=MIT
+PKG_LICENSE_FILES:=LICENCE
 
 include $(INCLUDE_DIR)/package.mk
 
@@ -23,8 +25,7 @@ define Package/ahcpd
   SECTION:=net
   CATEGORY:=Network
   TITLE:=Ad-Hoc Configuration Protocol daemon
-  URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/ahcp/
-  MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>
+  URL:=https://www.irif.fr/~jch/software/ahcp/
   DEPENDS:=@IPV6 +ip +librt
 endef
 
index f468abc5dfa9f96d8724cb66ecf6bcc5239c8869..34b695837a03ff8b2255f030f9fd3535b11f182d 100644 (file)
@@ -1,49 +1,55 @@
-#
-# Copyright (C) 2013 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
+# SPDX-License-Identifier: GPL-2.0-only
 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=alfred
-PKG_VERSION:=2018.3
+PKG_VERSION:=2024.1
 PKG_RELEASE:=1
-PKG_HASH:=6265b8a3e99186ecb6e0cf7dde84fe8b67c66d9fefa6286f9f12110e98f28b1a
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
-PKG_LICENSE:=GPL-2.0
+PKG_HASH:=262dad39c9be122ac7f061705c8a3e3b6d462782bbe3372e6dfc9ace0c384db9
 
-include $(INCLUDE_DIR)/package.mk
+PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
+PKG_LICENSE:=GPL-2.0-only MIT
+PKG_LICENSE_FILES:=LICENSES/preferred/GPL-2.0 LICENSES/preferred/MIT
+
+PKG_BUILD_PARALLEL:=1
+PKG_BUILD_FLAGS:=gc-sections lto
 
-init-y := alfred
+PKG_CONFIG_DEPENDS += \
+       CONFIG_ALFRED_NEEDS_lua \
+       CONFIG_ALFRED_NEEDS_libgps \
+       CONFIG_PACKAGE_ALFRED_VIS \
+       CONFIG_PACKAGE_ALFRED_BATHOSTS \
+       CONFIG_PACKAGE_ALFRED_GPSD
+
+include $(INCLUDE_DIR)/package.mk
 
 define Package/alfred
-  URL:=https://www.open-mesh.org/
   SECTION:=net
   CATEGORY:=Network
   TITLE:=A.L.F.R.E.D. - Almighty Lightweight Fact Remote Exchange Daemon
+  URL:=https://www.open-mesh.org/
   DEPENDS:= +libc @IPV6 +libnl-tiny +librt \
-         +ALFRED_NEEDS_lua:lua \
-         +ALFRED_NEEDS_libgps:libgps
+            +ALFRED_NEEDS_lua:lua \
+            +ALFRED_NEEDS_libgps:libgps
 endef
 
 define Package/alfred/description
-alfred is a user space daemon for distributing arbitrary local information over
-the mesh/network in a decentralized fashion. This data can be anything which
-appears to be useful - originally designed to replace the batman-adv
-visualization (vis), you may distribute hostnames, phone books, administration
-information, DNS information, the local weather forecast ...
+  alfred is a user space daemon for distributing arbitrary local information
+  over the mesh/network in a decentralized fashion. This data can be anything
+  which appears to be useful - originally designed to replace the batman-adv
+  visualization (vis), you may distribute hostnames, phone books, administration
+  information, DNS information, the local weather forecast ...
 
-alfred runs as daemon in the background of the system. A user may insert
-information by using the alfred binary on the command line, or use special
-programs to communicate with alfred (done via unix sockets). alfred then takes
-care of distributing the local information to other alfred servers on other
-nodes. This is done via IPv6 link-local multicast, and does not require any
-configuration. A user can request data from alfred, and will receive the
-information available from all alfred servers in the network.
+  alfred runs as daemon in the background of the system. A user may insert
+  information by using the alfred binary on the command line, or use special
+  programs to communicate with alfred (done via unix sockets). alfred then takes
+  care of distributing the local information to other alfred servers on other
+  nodes. This is done via IPv6 link-local multicast, and does not require any
+  configuration. A user can request data from alfred, and will receive the
+  information available from all alfred servers in the network.
 endef
 
 define Package/alfred/conffiles
@@ -54,22 +60,13 @@ define Package/alfred/config
        source "$(SOURCE)/Config.in"
 endef
 
-MAKE_ALFRED_FLAGS=\
+MAKE_FLAGS += \
        CONFIG_ALFRED_VIS=$(if $(CONFIG_PACKAGE_ALFRED_VIS),y,n) \
        CONFIG_ALFRED_GPSD=$(if $(CONFIG_PACKAGE_ALFRED_GPSD),y,n) \
        CONFIG_ALFRED_CAPABILITIES=n \
         LIBNL_NAME="libnl-tiny" \
         LIBNL_GENL_NAME="libnl-tiny" \
-        REVISION="openwrt-$(PKG_VERSION)-$(PKG_RELEASE)"
-
-TARGET_CFLAGS  += -ffunction-sections -fdata-sections -flto
-TARGET_LDFLAGS += -Wl,--gc-sections -fuse-linker-plugin
-
-define Build/Compile
-       CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \
-       LDFLAGS="$(TARGET_LDFLAGS)" \
-       $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_FLAGS) $(MAKE_ALFRED_FLAGS) all
-endef
+        REVISION="$(PKG_VERSION)-openwrt-$(PKG_RELEASE)"
 
 define Package/alfred/install
        $(INSTALL_DIR) $(1)/usr/sbin
index 9d3fff6801ad1a0272d8af301e0129090010dcea..704adf13b2641800100588314c81f0aa15c56227 100644 (file)
@@ -1,5 +1,5 @@
 config 'alfred' 'alfred'
-       option interface 'br-lan'
+       list interface 'br-lan'
        option mode 'master'
        option batmanif 'bat0'
        option start_vis '1'
index 89e33ab55a0bd301fcd6ae490a5e93b7f92c2bd2..f191827fd0af2977a9b9cbd2fa7ce0c8ead4f9e5 100755 (executable)
@@ -13,60 +13,29 @@ facters_dir="/etc/alfred"
 enable=0
 vis_enable=0
 
-wait_for_dir() {
-       local ifce="$1" dir="$2"
-
-       if ! [ -d "$dir" ] ; then
-               timeout=30
-               echo "waiting $timeout secs for $ifce interface..."
-               for i in $(seq $timeout); do
-                       sleep 1
-                       [ -d "$dir" ] && break
-                       if [ $i = $timeout ] ; then
-                               echo "$ifce not detected, alfred not starting."
-                               exit 1
-                       fi
-               done
-       fi
-}
-
-wait_for_ll_address() {
-       local iface="$1"
-       local timeout=30
-
-       echo "waiting $timeout secs for $iface address..."
-       for i in $(seq $timeout); do
-               # We look for
-               # - the link-local address (starts with fe80)
-               # - without tentative flag (bit 0x40 in the flags field; the first char of the fifth field is evaluated)
-               # - on interface $iface
-               if awk '
-                       BEGIN { RET=1 }
-                       $1 ~ /^fe80/ && $5 ~ /^[012389ab]/ && $6 == "'"$iface"'" { RET=0 }
-                       END { exit RET }
-               ' /proc/net/if_inet6; then
-                       return
-               fi
-               sleep 1
-       done
-
-       echo "$iface address not detected, alfred not starting."
-       exit 1
+append_interface()
+{
+       append "interfaces" "$1" ","
 }
 
 alfred_start() {
        local args=""
        local section="$1"
        local disabled interface mode
+       local interfaces
 
        # check if section is disabled
        config_get_bool disabled "$section" disabled 0
        [ $disabled = 0 ] || return 1
 
-       args=""
+       args="-f"
 
-       config_get interface "$section" interface
-       append args "-i $interface"
+       config_list_foreach "$section" "interface" append_interface
+       if [ -z "$interfaces" ]; then
+               config_get interface "$section" interface
+               append_interface "$interface"
+       fi
+       append args "-i $interfaces"
 
        config_get mode "$section" mode
        [ "$mode" = "master" ] && append args "-m"
@@ -74,12 +43,6 @@ alfred_start() {
        config_get batmanif "$section" batmanif
        append args "-b $batmanif"
 
-       if [ "$batmanif" != "none" ]; then
-               wait_for_dir "$batmanif" "/sys/class/net/$batmanif/mesh"
-       fi
-
-       wait_for_ll_address "$interface"
-
        append alfred_args "$args"
        enable=1
 
@@ -98,7 +61,7 @@ start_service() {
        config_load "alfred"
        config_foreach alfred_start alfred
 
-       [ "$enable" = "0" ] && exit 0
+       [ "$enable" = "0" ] && return 0
 
        procd_open_instance "alfred"
        procd_set_param command /usr/sbin/alfred
index 075c2c00f44aefe828c274e5e376f8b7586f3d74..e3d0f5cd74730d21aa3ce6ebb0cf49a5e400e4b1 100644 (file)
@@ -1,20 +1,23 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
 #
-# Copyright (C) 2007-2009 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
+# Copyright (C) 2007-2021 OpenWrt.org
 #
 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=babeld
-PKG_VERSION:=1.8.3
+PKG_VERSION:=1.13.1
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://www.irif.fr/~jch/software/files/
-PKG_HASH:=368cc56812e07bbb64d0b609b6f411292e46b15610fe947501d4b310377366bd
+PKG_HASH:=15f24d26da0ccfc073abcdef0309f281e4684f2aa71126f826572c4c845e8dd9
+
+PKG_MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>, \
+       Baptiste Jonglez <openwrt-pkg@bitsofnetworks.org>, \
+       Nick Hainke <vincent@systemli.org>
 PKG_LICENSE:=MIT
+PKG_LICENSE_FILES:=LICENCE
 
 include $(INCLUDE_DIR)/package.mk
 
@@ -22,21 +25,17 @@ define Package/babeld
   SECTION:=net
   CATEGORY:=Network
   SUBMENU:=Routing and Redirection
-  TITLE:=A loop-free distance-vector routing protocol
+  TITLE:=A loop-avoiding distance-vector routing protocol
   URL:=https://www.irif.fr/~jch/software/babel/
-  MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>, \
-              Baptiste Jonglez <openwrt-pkg@bitsofnetworks.org>
-  DEPENDS:=@IPV6
+  DEPENDS:=@IPV6 +libubus +libubox
 endef
 
 define Package/babeld/description
- Babel is a loop-avoiding distance-vector routing protocol roughly based
- on DSDV and AODV, but with provisions for link cost estimation and
- redistribution of routes from other routing protocols.
- While it is optimised for wireless mesh networks, Babel will also work
- efficiently on wired networks. It will generate between 1.2 and 2.4 times
- the amount of routing traffic that RIPng would generate, while
- never counting to infinity.
+  Babel is a loop-avoiding distance-vector routing protocol for IPv6 and IPv4
+  with fast convergence properties. It is based on the ideas in DSDV, AODV and
+  Cisco's EIGRP, but is designed to work well not only in wired networks but
+  also in wireless mesh networks, and has been extended with support for
+  overlay networks. Babel is an IETF standard protocol (RFC 8966).
 endef
 
 define Package/babeld/conffiles
@@ -47,6 +46,7 @@ endef
 MAKE_FLAGS+= \
        CFLAGS="$(TARGET_CFLAGS)" \
        LDLIBS="" \
+       LDLIBS+="-lubus -lubox"
 
 define Package/babeld/install
        $(INSTALL_DIR) $(1)/usr/sbin
index 0073f73f5667a49137a49fb48eb7f0edcde94a38..1e9367e7cfa7af0dd2bf1749b14f27b4ecc4a1ce 100644 (file)
@@ -1,5 +1,7 @@
 package babeld
 
+# Detailed documentation: https://openwrt.org/docs/guide-user/services/babeld
+
 # Babeld reads options from the following files (the last one takes precedence
 # if an option is defined in several places):
 # - the file defined by the option conf_file (default: /etc/babeld.conf),
@@ -22,6 +24,7 @@ config general
        ## See comment at the top of this file for more details.
        # option 'conf_file' '/etc/babeld.conf'
        # option 'conf_dir' '/tmp/babel.d/'
+       # option 'ubus_bindings' 'false'
 
 config interface
        ## Remove this line to enable babeld on this interface
@@ -39,7 +42,10 @@ config interface
        option 'ignore' 'true'
        ## Physical interface name
        option 'ifname' 'tun-example'
-       # option 'max_rtt_penalty' '90'
+        ## Specify the type of interface: tunnels use the RTT-based metric.
+       option 'type' 'tunnel'
+       ## Other options that can be overriden.
+       # option 'max_rtt_penalty' '96'
 
 # A config interface without "option ifname" will set default options
 # for all interfaces.  Interface-specific configuration always overrides
@@ -49,27 +55,49 @@ config interface
        # option 'update_interval' '30'
 
 
-# A filter consists of a type ('in', 'out' or 'redistribute'), an action
-# ('allow', 'deny' or 'metric xxx') and a set of selectors ('ip', 'eq',
-# etc.).  See babeld man page ("Filtering rules") for more details.
-# Here is a sample filter wich redistributes the default route if its
-# protocol number is "boot", e.g. when it installed by dhcp.  It is
-# disabled by default.
+# A filter consists of a type ('in', 'out', 'redistribute' or 'install'),
+# a set of selectors ('ip', 'eq', etc.) and a set of actions to perform
+# ('allow', 'deny', 'metric xxx', 'src-prefix xxx', 'table xxx', 'pref-src xxx').
+# See babeld man page ("Filtering rules") for more details.
+
+# Below is a sample filter that redistributes the default route if its
+# protocol number is "boot", e.g. when it is installed by dhcp (see
+# /etc/iproute2/rt_protos).  This filter is disabled thanks to the 'ignore'
+# setting.
 config filter
        option 'ignore' 'true'
-       # Type
+       # Type of filter
        option 'type'   'redistribute'
        # Selectors: ip, eq, le, ge, src_ip, src_eq, src_le, src_ge, neigh, id,
        # proto, local, if.
        option 'ip'     '0.0.0.0/0'
        option 'eq'     '0'
        option 'proto'  '3'
-       # Action (one of: allow, deny, metric XXX, src-prefix XXX).
+       # Action, which can be any of: allow, deny, metric <NUMBER>, src-prefix <PREFIX>,
+       # table <ID>, pref-src <IP>.
+       # The action defaults to "allow" if not specified.  Here, we specify a higher
+       # redistribution metric than the default (0).
        option 'action' 'metric 128'
 
-# Notice that the 'local' selector is a boolean.
+# Another example filter: don't redistribute local addresses in a certain IP prefix.
+# By default, babeld redistributes *all* local addresses.
 config filter
        option 'ignore' 'true'
        option 'type'   'redistribute'
+       # Only apply to routes/addresses within this prefix.
+       option 'ip'     '198.51.100.0/24'
+       # Notice that the 'local' selector is a boolean.
        option 'local'  'true'
-       # No action means "allow"
+       # Don't redistribute.
+       option 'action' 'deny'
+
+# Example install filter, to change or filter routes before they are inserted
+# into the kernel.
+config filter
+       option 'ignore'         'true'
+       option 'type'           'install'
+       # Optional: only apply to routes within 2001:db8:cafe::/48
+       option 'ip'             '2001:db8:cafe::/48'
+       # We specify the kernel routing table and the preferred source address to use for these routes.
+       # "Allow" is implicit.
+       option 'action'         'table 200  pref-src 2001:db8:ba:be1::42'
index 7b25ef48c6b0a5cea6861824b5221ea1e11f64f2..378a8abcdb7e5e337d1e1e26ea3ad3fe9eb80cf5 100755 (executable)
@@ -197,10 +197,6 @@ start_service() {
        procd_close_instance
 }
 
-stop_service() {
-       killall -9 babeld
-}
-
 service_triggers() {
        procd_add_reload_trigger babeld
 }
diff --git a/babeld/patches/600-add-ubus.patch b/babeld/patches/600-add-ubus.patch
new file mode 100644 (file)
index 0000000..2f70a57
--- /dev/null
@@ -0,0 +1,132 @@
+--- a/babeld.c
++++ b/babeld.c
+@@ -54,6 +54,8 @@ THE SOFTWARE.
+ #include "local.h"
+ #include "version.h"
++#include "ubus.h"
++
+ struct timeval now;
+ unsigned char myid[8];
+@@ -505,6 +507,9 @@ main(int argc, char **argv)
+         }
+     }
++    if(ubus_bindings)
++        babeld_add_ubus();
++
+     init_signals();
+     rc = resize_receive_buffer(1500);
+     if(rc < 0)
+@@ -597,6 +602,8 @@ main(int argc, char **argv)
+                 FD_SET(local_sockets[i].fd, &readfds);
+                 maxfd = MAX(maxfd, local_sockets[i].fd);
+             }
++            if(ubus_bindings)
++                maxfd = babeld_ubus_add_read_sock(&readfds, maxfd);
+             rc = select(maxfd + 1, &readfds, NULL, NULL, &tv);
+             if(rc < 0) {
+                 if(errno != EINTR) {
+@@ -665,6 +672,9 @@ main(int argc, char **argv)
+             i++;
+         }
++        if(ubus_bindings)
++            babeld_ubus_receive(&readfds);
++
+         if(reopening) {
+             kernel_dump_time = now.tv_sec;
+             check_neighbours_timeout = now;
+--- a/generate-version.sh
++++ b/generate-version.sh
+@@ -10,4 +10,4 @@ else
+     version="unknown"
+ fi
+-echo "#define BABELD_VERSION \"$version\""
++echo "#define BABELD_VERSION \"$version-ubus-mod\""
+--- a/configuration.c
++++ b/configuration.c
+@@ -42,6 +42,8 @@ THE SOFTWARE.
+ #include "hmac.h"
+ #include "configuration.h"
++#include "ubus.h"
++
+ static struct filter *input_filters = NULL;
+ static struct filter *output_filters = NULL;
+ static struct filter *redistribute_filters = NULL;
+@@ -1024,7 +1026,8 @@ parse_option(int c, gnc_t gnc, void *clo
+               strcmp(token, "daemonise") == 0 ||
+               strcmp(token, "skip-kernel-setup") == 0 ||
+               strcmp(token, "ipv6-subtrees") == 0 ||
+-              strcmp(token, "reflect-kernel-metric") == 0) {
++              strcmp(token, "reflect-kernel-metric") == 0 ||
++              strcmp(token, "ubus-bindings") == 0) {
+         int b;
+         c = getbool(c, &b, gnc, closure);
+         if(c < -1)
+@@ -1042,6 +1045,8 @@ parse_option(int c, gnc_t gnc, void *clo
+             has_ipv6_subtrees = b;
+         else if(strcmp(token, "reflect-kernel-metric") == 0)
+             reflect_kernel_metric = b;
++        else if(strcmp(token, "ubus-bindings") == 0)
++            ubus_bindings = b;
+         else
+             abort();
+     } else if(strcmp(token, "protocol-group") == 0) {
+--- a/local.c
++++ b/local.c
+@@ -42,6 +42,8 @@ THE SOFTWARE.
+ #include "local.h"
+ #include "version.h"
++#include "ubus.h"
++
+ int local_server_socket = -1;
+ struct local_socket local_sockets[MAX_LOCAL_SOCKETS];
+ int num_local_sockets = 0;
+@@ -191,6 +193,8 @@ local_notify_neighbour(struct neighbour
+         if(local_sockets[i].monitor)
+             local_notify_neighbour_1(&local_sockets[i], neigh, kind);
+     }
++    if(ubus_bindings)
++          ubus_notify_neighbour(neigh, kind);
+ }
+ static void
+@@ -228,6 +232,8 @@ local_notify_xroute(struct xroute *xrout
+         if(local_sockets[i].monitor)
+             local_notify_xroute_1(&local_sockets[i], xroute, kind);
+     }
++    if(ubus_bindings)
++          ubus_notify_xroute(xroute, kind);
+ }
+ static void
+@@ -273,6 +279,8 @@ local_notify_route(struct babel_route *r
+         if(local_sockets[i].monitor)
+             local_notify_route_1(&local_sockets[i], route, kind);
+     }
++    if(ubus_bindings)
++          ubus_notify_route(route, kind);
+ }
+ static void
+--- a/Makefile
++++ b/Makefile
+@@ -11,11 +11,11 @@ LDLIBS = -lrt
+ SRCS = babeld.c net.c kernel.c util.c interface.c source.c neighbour.c \
+        route.c xroute.c message.c resend.c configuration.c local.c \
+-       hmac.c rfc6234/sha224-256.c BLAKE2/ref/blake2s-ref.c
++       hmac.c ubus.c rfc6234/sha224-256.c BLAKE2/ref/blake2s-ref.c
+ OBJS = babeld.o net.o kernel.o util.o interface.o source.o neighbour.o \
+        route.o xroute.o message.o resend.o configuration.o local.o \
+-       hmac.o rfc6234/sha224-256.o BLAKE2/ref/blake2s-ref.o
++       hmac.o ubus.o rfc6234/sha224-256.o BLAKE2/ref/blake2s-ref.o
+ babeld: $(OBJS)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o babeld $(OBJS) $(LDLIBS)
diff --git a/babeld/src/ubus.c b/babeld/src/ubus.c
new file mode 100644 (file)
index 0000000..17d823b
--- /dev/null
@@ -0,0 +1,535 @@
+#include <stdint.h>
+#include <stdlib.h>
+#include <sys/select.h>
+
+#include <libubox/blob.h>
+#include <libubox/blobmsg.h>
+#include <libubox/list.h>
+#include <libubus.h>
+
+#include <arpa/inet.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+
+#include "babeld.h"
+#include "configuration.h"
+#include "interface.h"
+#include "kernel.h"
+#include "local.h"
+#include "message.h"
+#include "neighbour.h"
+#include "net.h"
+#include "resend.h"
+#include "route.h"
+#include "source.h"
+#include "util.h"
+#include "version.h"
+#include "xroute.h"
+
+#include "ubus.h"
+
+// Definition of header variable whether to enable ubus bindings.
+int ubus_bindings = 0;
+
+// Shared state maintained throughout calls to handle ubus messages.
+static struct ubus_context *shared_ctx;
+
+// List of exported routes (to be used with ubox's list helpers).
+struct xroute_list_entry {
+  struct list_head list;
+  struct xroute *xroute;
+};
+
+// List of received routes (to be used with ubox's list helpers).
+struct route_list_entry {
+  struct list_head list;
+  struct babel_route *route;
+};
+
+// List of neighbours (to be used with ubox's list helpers).
+struct neighbour_list_entry {
+  struct list_head list;
+  struct neighbour *neighbour;
+};
+
+// Definition of interface function enums (to be used with ubox's blobmsg
+// helpers).
+enum { INTERFACE_IFNAME, __INTERFACE_MAX };
+
+// Definition of interface parsing (to be used with ubox's blobmsg helpers).
+static const struct blobmsg_policy interface_policy[__INTERFACE_MAX] = {
+    [INTERFACE_IFNAME] = {"ifname", BLOBMSG_TYPE_STRING},
+};
+
+// Definition of filter function enums (to be used with ubox's blobmsg
+// helpers).
+enum { FILTER_IFNAME, FILTER_TYPE, FILTER_METRIC, __FILTER_MAX };
+
+// Definition of filter parsing (to be used with ubox's blobmsg helpers).
+static const struct blobmsg_policy filter_policy[__FILTER_MAX] = {
+    [FILTER_IFNAME] = {"ifname", BLOBMSG_TYPE_STRING},
+    [FILTER_TYPE] = {"type", BLOBMSG_TYPE_INT32},
+    [FILTER_METRIC] = {"metric", BLOBMSG_TYPE_INT32},
+};
+
+// Adds a filter (ubus equivalent to "filter"-function).
+static int babeld_ubus_add_filter(struct ubus_context *ctx_local,
+                                  struct ubus_object *obj,
+                                  struct ubus_request_data *req,
+                                  const char *method, struct blob_attr *msg) {
+  struct blob_attr *tb[__FILTER_MAX];
+  struct blob_buf b = {0};
+  struct filter *filter = NULL;
+  char *ifname;
+  int metric, type;
+
+  blobmsg_parse(filter_policy, __FILTER_MAX, tb, blob_data(msg), blob_len(msg));
+
+  if (!tb[FILTER_IFNAME])
+    return UBUS_STATUS_INVALID_ARGUMENT;
+
+  if (!tb[FILTER_TYPE])
+    return UBUS_STATUS_INVALID_ARGUMENT;
+
+  type = blobmsg_get_u32(tb[FILTER_TYPE]);
+
+  if (tb[FILTER_METRIC])
+    metric = blobmsg_get_u32(tb[FILTER_METRIC]);
+
+  filter = calloc(1, sizeof(struct filter));
+  if (filter == NULL)
+    return UBUS_STATUS_UNKNOWN_ERROR;
+
+  filter->af = AF_INET6;
+  filter->proto = 0;
+  filter->plen_le = 128;
+  filter->src_plen_le = 128;
+  filter->action.add_metric = metric;
+
+  ifname = blobmsg_get_string(tb[FILTER_IFNAME]);
+  filter->ifname = strdup(ifname);
+  filter->ifindex = if_nametoindex(filter->ifname);
+
+  add_filter(filter, type);
+
+  return UBUS_STATUS_OK;
+}
+
+// Adds an inteface (ubus equivalent to "interface"-function).
+static int babeld_ubus_add_interface(struct ubus_context *ctx_local,
+                                     struct ubus_object *obj,
+                                     struct ubus_request_data *req,
+                                     const char *method,
+                                     struct blob_attr *msg) {
+  struct blob_attr *tb[__INTERFACE_MAX];
+  struct blob_buf b = {0};
+  struct interface *ifp = NULL;
+  char *ifname;
+
+  blobmsg_parse(interface_policy, __INTERFACE_MAX, tb, blob_data(msg),
+                blob_len(msg));
+
+  if (!tb[INTERFACE_IFNAME])
+    return UBUS_STATUS_INVALID_ARGUMENT;
+
+  ifname = blobmsg_get_string(tb[INTERFACE_IFNAME]);
+
+  ifp = add_interface(ifname, NULL);
+  if (ifp == NULL)
+    return UBUS_STATUS_UNKNOWN_ERROR;
+
+  return UBUS_STATUS_OK;
+}
+
+// Sends a babel info message on ubus socket.
+static int babeld_ubus_babeld_info(struct ubus_context *ctx_local,
+                                   struct ubus_object *obj,
+                                   struct ubus_request_data *req,
+                                   const char *method, struct blob_attr *msg) {
+  struct blob_buf b = {0};
+  void *prefix;
+  char host[64];
+  int ret;
+
+  blob_buf_init(&b, 0);
+  blobmsg_add_string(&b, "babeld-version", BABELD_VERSION);
+  blobmsg_add_string(&b, "my-id", format_eui64(myid));
+  if (!gethostname(host, sizeof(host)))
+    blobmsg_add_string(&b, "host", host);
+
+  ret = ubus_send_reply(ctx_local, req, b.head);
+  if (ret)
+    fprintf(stderr, "Failed to send reply: %s\n", ubus_strerror(ret));
+
+  blob_buf_free(&b);
+
+  return ret;
+}
+
+// Appends an exported route message entry to the buffer.
+static void babeld_add_xroute_buf(struct xroute *xroute, struct blob_buf *b) {
+  void *prefix;
+
+  prefix = blobmsg_open_table(b, format_prefix(xroute->prefix, xroute->plen));
+
+  blobmsg_add_string(b, "src-prefix",
+                     format_prefix(xroute->src_prefix, xroute->src_plen));
+  blobmsg_add_u32(b, "metric", xroute->metric);
+  blobmsg_close_table(b, prefix);
+}
+
+// Sends an exported routes message on ubus socket, splitting apart IPv4 and
+// IPv6 routes.
+static int babeld_ubus_get_xroutes(struct ubus_context *ctx_local,
+                                   struct ubus_object *obj,
+                                   struct ubus_request_data *req,
+                                   const char *method, struct blob_attr *msg) {
+  struct blob_buf b = {0};
+  struct xroute_stream *xroutes;
+  struct xroute_list_entry *cur, *tmp;
+  void *ipv4, *ipv6;
+  int ret;
+  LIST_HEAD(xroute_ipv4_list);
+  LIST_HEAD(xroute_ipv6_list);
+
+  blob_buf_init(&b, 0);
+
+  xroutes = xroute_stream();
+  if (xroutes) {
+    while (1) {
+      struct xroute *xroute = xroute_stream_next(xroutes);
+      if (xroute == NULL)
+        break;
+
+      struct xroute_list_entry *xr =
+          calloc(1, sizeof(struct xroute_list_entry));
+      xr->xroute = xroute;
+
+      if (v4mapped(xroute->prefix)) {
+        list_add(&xr->list, &xroute_ipv4_list);
+      } else {
+        list_add(&xr->list, &xroute_ipv6_list);
+      }
+    }
+    xroute_stream_done(xroutes);
+  }
+
+  ipv4 = blobmsg_open_table(&b, "IPv4");
+  list_for_each_entry_safe(cur, tmp, &xroute_ipv4_list, list) {
+    babeld_add_xroute_buf(cur->xroute, &b);
+    list_del(&cur->list);
+    free(cur);
+  }
+  blobmsg_close_table(&b, ipv4);
+
+  ipv6 = blobmsg_open_table(&b, "IPv6");
+  list_for_each_entry_safe(cur, tmp, &xroute_ipv6_list, list) {
+    babeld_add_xroute_buf(cur->xroute, &b);
+    list_del(&cur->list);
+    free(cur);
+  }
+  blobmsg_close_table(&b, ipv6);
+
+  ret = ubus_send_reply(ctx_local, req, b.head);
+  if (ret)
+    fprintf(stderr, "Failed to send reply: %s\n", ubus_strerror(ret));
+
+  blob_buf_free(&b);
+
+  return ret;
+}
+
+// Appends an route message entry to the buffer.
+static void babeld_add_route_buf(struct babel_route *route,
+                                 struct blob_buf *b) {
+  void *prefix;
+
+  prefix = blobmsg_open_table(
+      b, format_prefix(route->src->prefix, route->src->plen));
+
+  blobmsg_add_string(
+      b, "src-prefix",
+      format_prefix(route->src->src_prefix, route->src->src_plen));
+  blobmsg_add_u32(b, "route_metric", route_metric(route));
+  blobmsg_add_u32(b, "route_smoothed_metric", route_smoothed_metric(route));
+  blobmsg_add_u32(b, "refmetric", route->refmetric);
+  blobmsg_add_string(b, "id", format_eui64(route->src->id));
+  blobmsg_add_u32(b, "seqno", (uint32_t)route->seqno);
+  blobmsg_add_u32(b, "age", (int)(now.tv_sec - route->time));
+  blobmsg_add_string(b, "via", format_address(route->neigh->address));
+  if (memcmp(route->nexthop, route->neigh->address, 16) != 0)
+    blobmsg_add_string(b, "nexthop", format_address(route->nexthop));
+
+  blobmsg_add_u8(b, "installed", route->installed);
+  blobmsg_add_u8(b, "feasible", route_feasible(route));
+
+  blobmsg_close_table(b, prefix);
+}
+
+// Sends received routes message on ubus socket, splitting apart IPv4 and IPv6
+// routes.
+static int babeld_ubus_get_routes(struct ubus_context *ctx_local,
+                                  struct ubus_object *obj,
+                                  struct ubus_request_data *req,
+                                  const char *method, struct blob_attr *msg) {
+  struct blob_buf b = {0};
+  struct route_stream *routes;
+  struct route_list_entry *cur, *tmp;
+  void *prefix, *ipv4, *ipv6;
+  int ret;
+  LIST_HEAD(route_ipv4_list);
+  LIST_HEAD(route_ipv6_list);
+
+  blob_buf_init(&b, 0);
+
+  routes = route_stream(0);
+  if (routes) {
+    while (1) {
+      struct babel_route *route = route_stream_next(routes);
+      if (route == NULL)
+        break;
+      struct route_list_entry *r = calloc(1, sizeof(struct route_list_entry));
+      r->route = route;
+
+      if (v4mapped(route->src->prefix)) {
+        list_add(&r->list, &route_ipv4_list);
+      } else {
+        list_add(&r->list, &route_ipv6_list);
+      }
+    }
+    route_stream_done(routes);
+  }
+
+  ipv4 = blobmsg_open_table(&b, "IPv4");
+  list_for_each_entry_safe(cur, tmp, &route_ipv4_list, list) {
+    babeld_add_route_buf(cur->route, &b);
+    list_del(&cur->list);
+    free(cur);
+  }
+  blobmsg_close_table(&b, ipv4);
+
+  ipv6 = blobmsg_open_table(&b, "IPv6");
+  list_for_each_entry_safe(cur, tmp, &route_ipv6_list, list) {
+    babeld_add_route_buf(cur->route, &b);
+    list_del(&cur->list);
+    free(cur);
+  }
+  blobmsg_close_table(&b, ipv6);
+
+  ret = ubus_send_reply(ctx_local, req, b.head);
+  if (ret)
+    fprintf(stderr, "Failed to send reply: %s\n", ubus_strerror(ret));
+
+  blob_buf_free(&b);
+
+  return ret;
+}
+
+// Appends an neighbour entry to the buffer.
+static void babeld_add_neighbour_buf(struct neighbour *neigh,
+                                     struct blob_buf *b) {
+  void *neighbour;
+
+  neighbour = blobmsg_open_table(b, format_address(neigh->address));
+  blobmsg_add_string(b, "dev", neigh->ifp->name);
+  blobmsg_add_u32(b, "hello-reach", neigh->hello.reach);
+  blobmsg_add_u32(b, "uhello-reach", neigh->uhello.reach);
+  blobmsg_add_u32(b, "rxcost", neighbour_rxcost(neigh));
+  blobmsg_add_u32(b, "txcost", neigh->txcost);
+  blobmsg_add_string(b, "rtt", format_thousands(neigh->rtt));
+  blobmsg_add_u8(b, "if_up", if_up(neigh->ifp));
+  blobmsg_close_table(b, neighbour);
+}
+
+// Sends neighbours message on ubus socket, splitting apart IPv4 and IPv6
+// neighbours.
+static int babeld_ubus_get_neighbours(struct ubus_context *ctx_local,
+                                      struct ubus_object *obj,
+                                      struct ubus_request_data *req,
+                                      const char *method,
+                                      struct blob_attr *msg) {
+  struct blob_buf b = {0};
+  struct neighbour *neigh;
+  struct neighbour_list_entry *cur, *tmp;
+  void *ipv4, *ipv6;
+  int ret;
+  LIST_HEAD(neighbour_ipv4_list);
+  LIST_HEAD(neighbour_ipv6_list);
+
+  blob_buf_init(&b, 0);
+
+  FOR_ALL_NEIGHBOURS(neigh) {
+    struct neighbour_list_entry *n =
+        calloc(1, sizeof(struct neighbour_list_entry));
+    n->neighbour = neigh;
+    if (v4mapped(neigh->address)) {
+      list_add(&n->list, &neighbour_ipv4_list);
+    } else {
+      list_add(&n->list, &neighbour_ipv6_list);
+    }
+  }
+
+  ipv4 = blobmsg_open_table(&b, "IPv4");
+  list_for_each_entry_safe(cur, tmp, &neighbour_ipv4_list, list) {
+    babeld_add_neighbour_buf(cur->neighbour, &b);
+    list_del(&cur->list);
+    free(cur);
+  }
+  blobmsg_close_table(&b, ipv4);
+
+  ipv6 = blobmsg_open_table(&b, "IPv6");
+  list_for_each_entry_safe(cur, tmp, &neighbour_ipv6_list, list) {
+    babeld_add_neighbour_buf(cur->neighbour, &b);
+    list_del(&cur->list);
+    free(cur);
+  }
+  blobmsg_close_table(&b, ipv6);
+
+  ret = ubus_send_reply(ctx_local, req, b.head);
+  if (ret)
+    fprintf(stderr, "Failed to send reply: %s\n", ubus_strerror(ret));
+
+  blob_buf_free(&b);
+
+  return ret;
+}
+
+// List of functions we expose via the ubus bus.
+static const struct ubus_method babeld_methods[] = {
+    UBUS_METHOD("add_interface", babeld_ubus_add_interface, interface_policy),
+    UBUS_METHOD("add_filter", babeld_ubus_add_filter, filter_policy),
+    UBUS_METHOD_NOARG("get_info", babeld_ubus_babeld_info),
+    UBUS_METHOD_NOARG("get_xroutes", babeld_ubus_get_xroutes),
+    UBUS_METHOD_NOARG("get_routes", babeld_ubus_get_routes),
+    UBUS_METHOD_NOARG("get_neighbours", babeld_ubus_get_neighbours),
+};
+
+// Definition of the ubus object type.
+static struct ubus_object_type babeld_object_type =
+    UBUS_OBJECT_TYPE("babeld", babeld_methods);
+
+// Object we announce via the ubus bus.
+static struct ubus_object babeld_object = {
+    .name = "babeld",
+    .type = &babeld_object_type,
+    .methods = babeld_methods,
+    .n_methods = ARRAY_SIZE(babeld_methods),
+};
+
+// Registers handlers for babel methods in the global ubus context.
+static bool ubus_init_object() {
+  int ret;
+
+  ret = ubus_add_object(shared_ctx, &babeld_object);
+  if (ret) {
+    fprintf(stderr, "Failed to add object: %s\n", ubus_strerror(ret));
+    return false;
+  }
+
+  return true;
+}
+
+// Initializes the global ubus context, connecting to the bus to be able to
+// receive and send messages.
+static bool babeld_ubus_init(void) {
+  if (shared_ctx)
+    return true;
+
+  shared_ctx = ubus_connect(NULL);
+  if (!shared_ctx)
+    return false;
+
+  return true;
+}
+
+void ubus_notify_route(struct babel_route *route, int kind) {
+  struct blob_buf b = {0};
+  char method[50]; // possible methods are route.change, route.add, route.flush
+
+  if (!babeld_object.has_subscribers)
+    return;
+
+  if (!route)
+    return;
+
+  if (!shared_ctx)
+    return;
+
+  blob_buf_init(&b, 0);
+  babeld_add_route_buf(route, &b);
+  snprintf(method, sizeof(method), "route.%s", local_kind(kind));
+  ubus_notify(shared_ctx, &babeld_object, method, b.head, -1);
+  blob_buf_free(&b);
+}
+
+void ubus_notify_xroute(struct xroute *xroute, int kind) {
+  struct blob_buf b = {0};
+  char method[50]; // possible methods are xroute.change, xroute.add,
+                   // xroute.flush
+
+  if (!babeld_object.has_subscribers)
+    return;
+
+  if (!xroute)
+    return;
+
+  if (!shared_ctx)
+    return;
+
+  blob_buf_init(&b, 0);
+  babeld_add_xroute_buf(xroute, &b);
+  snprintf(method, sizeof(method), "xroute.%s", local_kind(kind));
+  ubus_notify(shared_ctx, &babeld_object, method, b.head, -1);
+  blob_buf_free(&b);
+}
+
+void ubus_notify_neighbour(struct neighbour *neigh, int kind) {
+  struct blob_buf b = {0};
+  char method[50]; // possible methods are neigh.change, neigh.add, neigh.flush
+
+  if (!babeld_object.has_subscribers)
+    return;
+
+  if (!neigh)
+    return;
+
+  if (!shared_ctx)
+    return;
+
+  blob_buf_init(&b, 0);
+  babeld_add_neighbour_buf(neigh, &b);
+  snprintf(method, sizeof(method), "neigh.%s", local_kind(kind));
+  ubus_notify(shared_ctx, &babeld_object, method, b.head, -1);
+  blob_buf_free(&b);
+}
+
+void babeld_ubus_receive(fd_set *readfds) {
+  if (!shared_ctx)
+    return;
+  if (FD_ISSET(shared_ctx->sock.fd, readfds))
+    ubus_handle_event(shared_ctx);
+}
+
+int babeld_ubus_add_read_sock(fd_set *readfds, int maxfd) {
+  if (!shared_ctx)
+    return maxfd;
+
+  FD_SET(shared_ctx->sock.fd, readfds);
+  return MAX(maxfd, shared_ctx->sock.fd);
+}
+
+bool babeld_add_ubus() {
+  if (!babeld_ubus_init()) {
+    fprintf(stderr, "Failed to initialize ubus!\n");
+    return false;
+  }
+
+  if (!ubus_init_object()) {
+    fprintf(stderr, "Failed to add objects to ubus!\n");
+    return false;
+  }
+
+  return true;
+}
diff --git a/babeld/src/ubus.h b/babeld/src/ubus.h
new file mode 100644 (file)
index 0000000..08aeb52
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+    IPC integration of babeld with OpenWrt.
+
+    The ubus interface offers following functions:
+    - add_filter '{"ifname":"eth0", "type":0, "metric":5000}'
+        type:
+            0: FILTER_TYPE_INPUT
+            1: FILTER_TYPE_OUTPUT
+            2: FILTER_TYPE_REDISTRIBUTE
+            3: FILTER_TYPE_INSTALL
+    - add_interface '{"ifname":"eth0"}'
+    - get_info
+    - get_neighbours
+    - get_xroutes
+    - get_routes
+
+    All output is divided into IPv4 and IPv6.
+
+    Ubus notifications are sent if we receive updates for
+    - xroutes
+    - routes
+    - neighbours
+
+    The format is:
+    - {route,xroute,neighbour}.add: Object was added
+    - {route,xroute,neighbour}.change: Object was changed
+    - {route,xroute,neighbour}.flush: Object was flushed
+
+*/
+
+#include <stdbool.h>
+#include <sys/select.h>
+
+struct babel_route;
+struct neighbour;
+struct xroute;
+
+// Whether to enable ubus bindings (boolean option).
+extern int ubus_bindings;
+
+/**
+ * Initialize ubus interface.
+ *
+ * Connect to the ubus daemon and expose the ubus functions.
+ *
+ * @return if initializing ubus was successful
+ */
+bool babeld_add_ubus();
+
+/**
+ * Add ubus socket to given filedescriptor set.
+ *
+ * We need to check repeatedly if the ubus socket has something to read.
+ * The functions allows to add the ubus socket to the normal while(1)-loop of
+ * babeld.
+ *
+ * @param readfs: the filedescriptor set
+ * @param maxfd: the current maximum file descriptor
+ * @return the maximum file descriptor
+ */
+int babeld_ubus_add_read_sock(fd_set *readfds, int maxfd);
+
+/**
+ * Check and process ubus socket.
+ *
+ * If the ubus-socket signals that data is available, the ubus_handle_event is
+ * called.
+ */
+void babeld_ubus_receive(fd_set *readfds);
+
+/***
+ * Notify the ubus bus that a new xroute is received.
+ *
+ * If a new xroute is received or changed, we will notify subscribers.
+ *
+ * @param xroute: xroute that experienced some change
+ * @param kind: kind that describes if we have a flush, add or change
+ */
+void ubus_notify_xroute(struct xroute *xroute, int kind);
+
+/***
+ * Notify the ubus bus that a new route is received.
+ *
+ * If a new route is received or changed, we will notify subscribers.
+ *
+ * @param route: route that experienced some change
+ * @param kind: kind that describes if we have a flush, add or change
+ */
+void ubus_notify_route(struct babel_route *route, int kind);
+
+/***
+ * Notify the ubus bus that a new neighbour is received.
+ *
+ * If a new neighbour is received or changed, we will notify subscribers.
+ *
+ * @param neigh: neighbour that experienced some change
+ * @param kind: kind that describes if we have a flush, add or change
+ */
+void ubus_notify_neighbour(struct neighbour *neigh, int kind);
index 8765d15206a991c655bfa34cf76bfb818b6fb9c9..971cd3d1a017e7bdbbae760ba9efd916da89af97 100644 (file)
-#
-# Copyright (C) 2014 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
+# SPDX-License-Identifier: GPL-2.0-only
 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=batctl
-
-PKG_VERSION:=2018.3
+PKG_VERSION:=2024.1
 PKG_RELEASE:=1
-PKG_HASH:=24e32d3fe8268ce0951903546e71b925b78b17acc8809ba899940f48a5e892e6
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
-PKG_LICENSE:=GPL-2.0
+PKG_HASH:=683dda9d6054eb260a1ac0022c642798ff4048d6c53a672ea0b3178e6b757a09
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
+
+PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
+PKG_LICENSE:=GPL-2.0-only ISC MIT
+PKG_LICENSE_FILES:=LICENSES/preferred/GPL-2.0 LICENSES/preferred/MIT LICENSES/deprecated/ISC
+
+PKG_BUILD_PARALLEL:=1
+PKG_BUILD_FLAGS:=gc-sections lto
 
 include $(INCLUDE_DIR)/package.mk
 
-define Package/batctl
-  URL:=https://www.open-mesh.org/
+define Package/batctl/Default
   SECTION:=net
   CATEGORY:=Network
-  DEPENDS:=+kmod-batman-adv +libnl-tiny +libc +librt
-  TITLE:=B.A.T.M.A.N. Advanced user space configuration tool batctl
-  MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
+  URL:=https://www.open-mesh.org/
+  DEPENDS:=+libnl-tiny +libc +librt
+  PROVIDES:=batctl
 endef
 
 define Package/batctl/description
-batctl is a more intuitive managment utility for B.A.T.M.A.N.-Advanced.
-It is an easier method for configuring batman-adv and provides some
-additional tools for debugging as well. This package builds
-version $(PKG_VERSION) of the user space utility.
+  batctl is a more intuitive managment utility for B.A.T.M.A.N.-Advanced.
+  It is an easier method for configuring batman-adv and provides some
+  additional tools for debugging as well. This package builds
+  version $(PKG_VERSION) of the user space utility.
+endef
+
+define Package/batctl-tiny
+$(call Package/batctl/Default)
+  TITLE:=B.A.T.M.A.N. Advanced user space configuration tool (Minimal)
+  VARIANT:=tiny
+  ALTERNATIVES:=100:/usr/sbin/batctl:/usr/libexec/batctl-tiny
+endef
+
+define Package/batctl-tiny/description
+$(Package/batctl/description)
+  Only configuration relevant subcommands are enabled.
 endef
 
-# The linker can identify unused sections of a binary when each symbol is stored
-# in a separate section. This mostly removes unused linker sections and reduces
-# the size by ~3% on mipsel.
+define Package/batctl-default
+$(call Package/batctl/Default)
+  TITLE:=B.A.T.M.A.N. Advanced user space configuration tool (Default)
+  VARIANT:=default
+  ALTERNATIVES:=200:/usr/sbin/batctl:/usr/libexec/batctl-default
+endef
 
-TARGET_CFLAGS  += -ffunction-sections -fdata-sections
-TARGET_LDFLAGS += -Wl,--gc-sections
+define Package/batctl-default/description
+$(Package/batctl/description)
+  Standard subcommands for configuration and online debugging are enabled.
+endef
 
-# Link-time optimization allows to move parts of the optimization from the single
-# source file to the global source view. This is done by emitting the GIMPLE
-# representation in each object file and analyzing it again during the link step.
+define Package/batctl-full
+$(call Package/batctl/Default)
+  TITLE:=B.A.T.M.A.N. Advanced user space configuration tool (Full)
+  VARIANT:=full
+  ALTERNATIVES:=300:/usr/sbin/batctl:/usr/libexec/batctl-full
+endef
 
-TARGET_CFLAGS  += -flto
-TARGET_LDFLAGS += -fuse-linker-plugin
+define Package/batctl-full/description
+$(Package/batctl/description)
+  Subcommands for configuration, online and offline debugging are enabled.
+endef
 
-MAKE_BATCTL_ENV += \
-        CPPFLAGS="$(TARGET_CPPFLAGS)" \
-        CFLAGS="$(TARGET_CFLAGS)" \
-        LDFLAGS="$(TARGET_LDFLAGS)" \
+MAKE_VARS += \
         LIBNL_NAME="libnl-tiny" \
         LIBNL_GENL_NAME="libnl-tiny"
 
-MAKE_BATCTL_ARGS += \
-        REVISION="$(PKG_BATCTL_SHORTREV)" \
-        CC="$(TARGET_CC)" \
-        DESTDIR="$(PKG_INSTALL_DIR)" \
-        batctl install \
-        REVISION="openwrt-$(PKG_VERSION)-$(PKG_RELEASE)"
+MAKE_FLAGS += \
+        REVISION="$(PKG_VERSION)-openwrt-$(PKG_RELEASE)"
+
+config-n := \
+       aggregation \
+       ap_isolation \
+       backbonetable \
+       bisect_iv \
+       bonding \
+       bla_backbone_json \
+       bla_claim_json \
+       bridge_loop_avoidance \
+       claimtable \
+       dat_cache \
+       dat_cache_json \
+       distributed_arp_table \
+       elp_interval \
+       event \
+       fragmentation \
+       gateways \
+       gateways_json \
+       gw_mode \
+       hardif_json \
+       hardifs_json \
+       hop_penalty \
+       interface \
+       isolation_mark \
+       loglevel \
+       mcast_flags \
+       mcast_flags_json \
+       mesh_json \
+       multicast_fanout \
+       multicast_forceflood \
+       multicast_mode \
+       neighbors \
+       neighbors_json \
+       network_coding \
+       orig_interval \
+       originators \
+       originators_json \
+       ping \
+       routing_algo \
+       statistics \
+       tcpdump \
+       throughput_override \
+       throughputmeter \
+       traceroute \
+       transglobal \
+       translate \
+       translocal \
+       transtable_global_json \
+       transtable_local_json \
+       vlan_json \
+
+config-settings := \
+       aggregation \
+       ap_isolation \
+       bonding \
+       bridge_loop_avoidance \
+       distributed_arp_table \
+       elp_interval \
+       fragmentation \
+       gw_mode \
+       hop_penalty \
+       interface \
+       isolation_mark \
+       loglevel \
+       multicast_fanout \
+       multicast_forceflood \
+       multicast_mode \
+       network_coding \
+       orig_interval \
+       routing_algo \
+       throughput_override \
+
+config-tables := \
+       backbonetable \
+       claimtable \
+       dat_cache \
+       gateways \
+       mcast_flags \
+       neighbors \
+       originators \
+       statistics \
+       transglobal \
+       translocal \
+
+config-json := \
+       bla_backbone_json \
+       bla_claim_json \
+       dat_cache_json \
+       gateways_json \
+       hardif_json \
+       hardifs_json \
+       mcast_flags_json \
+       mesh_json \
+       neighbors_json \
+       originators_json \
+       transtable_global_json \
+       transtable_local_json \
+       vlan_json \
+
+config-tools := \
+       event \
+       ping \
+       tcpdump \
+       throughputmeter \
+       traceroute \
+       translate \
+
+config-extratools := \
+       bisect_iv \
+
+ifeq ($(BUILD_VARIANT),tiny)
+
+config-y := \
+       $(config-settings) \
+
+endif
+
+ifeq ($(BUILD_VARIANT),default)
+
+config-y := \
+       $(config-settings) \
+       $(config-tables) \
+       $(config-json) \
+       $(config-tools) \
+
+endif
+
+ifeq ($(BUILD_VARIANT),full)
+
+config-y := \
+       $(config-settings) \
+       $(config-tables) \
+       $(config-json) \
+       $(config-tools) \
+       $(config-extratools) \
+
+endif
+
+define ConfigVars
+$(subst $(space),,$(foreach opt,$(config-$(1)),CONFIG_$(opt)=$(1)
+))
+endef
 
+define batctl_config
+$(call ConfigVars,n)$(call ConfigVars,y)
+endef
+$(eval $(call shexport,batctl_config))
+
+MAKE_FLAGS += $$$$$(call shvar,batctl_config)
+
+define Package/batctl-tiny/install
+       $(INSTALL_DIR) $(1)/usr/libexec
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/libexec/batctl-tiny
+endef
 
-define Build/Compile
-       $(MAKE_BATCTL_ENV) $(MAKE) -C "$(PKG_BUILD_DIR)" $(MAKE_BATCTL_ARGS)
+define Package/batctl-default/install
+       $(INSTALL_DIR) $(1)/usr/libexec
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/libexec/batctl-default
 endef
 
-define Package/batctl/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/sbin/
+define Package/batctl-full/install
+       $(INSTALL_DIR) $(1)/usr/libexec
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/libexec/batctl-full
 endef
 
-$(eval $(call BuildPackage,batctl))
+$(eval $(call BuildPackage,batctl-default))
+$(eval $(call BuildPackage,batctl-tiny))
+$(eval $(call BuildPackage,batctl-full))
index 52a688bb78a41e14845e3078c480844b6f3edcae..81163366012acf57be24854496f6217cf78e33d4 100644 (file)
@@ -1,19 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
-# Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+# Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
 #
 # Marek Lindner, Simon Wunderlich
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of version 2 of the GNU General Public
-# License as published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
 
 #
 # B.A.T.M.A.N meshing protocol
@@ -71,27 +59,30 @@ config BATMAN_ADV_NC
 config BATMAN_ADV_MCAST
        bool "Multicast optimisation"
        depends on PACKAGE_kmod-batman-adv
+       default y
        help
          This option enables the multicast optimisation which aims to
          reduce the air overhead while improving the reliability of
          multicast messages.
 
-config BATMAN_ADV_DEBUGFS
-       bool "batman-adv debugfs entries"
-       depends on PACKAGE_kmod-batman-adv
-       select KERNEL_DEBUG_FS
-       help
-         Enable this to export routing related debug tables via debugfs.
-         The information for each soft-interface and used hard-interface can be
-         found under batman_adv/
-
-         If unsure, say N.
-
 config BATMAN_ADV_DEBUG
        bool "B.A.T.M.A.N. debugging"
-       depends on BATMAN_ADV_DEBUGFS
+       depends on PACKAGE_kmod-batman-adv
        help
          This is an option for use by developers; most people should
          say N here. This enables compilation of support for
-         outputting debugging information to the kernel log. The
-         output is controlled via the module parameter debug.
+         outputting debugging information to the debugfs log or tracing
+         buffer. The output is controlled via the batadv netdev specific
+         log_level setting.
+
+config BATMAN_ADV_TRACING
+       bool "B.A.T.M.A.N. tracing support"
+       depends on PACKAGE_kmod-batman-adv
+       select KERNEL_FTRACE
+       select KERNEL_ENABLE_DEFAULT_TRACERS
+       help
+         This is an option for use by developers; most people should
+         say N here. Select this option to gather traces like the debug
+         messages using the generic tracing infrastructure of the kernel.
+         BATMAN_ADV_DEBUG must also be selected to get trace events for
+         batadv_dbg.
index 36c764e125f31ed5d476349855e2a3e24cf5f17c..125089dd3d04cf5c3f99fbc47b4af3cb1a68b0a9 100644 (file)
@@ -1,45 +1,52 @@
-#
-# Copyright (C) 2010 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
+# SPDX-License-Identifier: GPL-2.0-only
 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=batman-adv
-
-PKG_VERSION:=2018.3
+PKG_VERSION:=2024.1
 PKG_RELEASE:=1
-PKG_HASH:=33f3f942203732e0568a6bc0226a0fe8eb147c961f0d0c13b2e6b16237d412ff
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
-PKG_LICENSE:=GPL-2.0
-PKG_EXTMOD_SUBDIRS=net/batman-adv
+PKG_HASH:=a714329c6251f4830e9cf03f53cbfb2280f0678471b54c5d46fae61a782d4325
+PKG_EXTMOD_SUBDIRS:=net/batman-adv
+
+PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
+PKG_LICENSE:=GPL-2.0-only MIT
+PKG_LICENSE_FILES:=LICENSES/preferred/GPL-2.0 LICENSES/preferred/MIT
+
+PKG_BUILD_PARALLEL:=1
 
 STAMP_CONFIGURED_DEPENDS := $(STAGING_DIR)/usr/include/mac80211-backport/backport/autoconf.h
 
+PKG_CONFIG_DEPENDS += \
+       CONFIG_BATMAN_ADV_BATMAN_V \
+       CONFIG_BATMAN_ADV_BLA \
+       CONFIG_BATMAN_ADV_DAT \
+       CONFIG_BATMAN_ADV_NC \
+       CONFIG_BATMAN_ADV_MCAST \
+       CONFIG_BATMAN_ADV_DEBUG \
+       CONFIG_BATMAN_ADV_TRACING
+
 include $(INCLUDE_DIR)/kernel.mk
 include $(INCLUDE_DIR)/package.mk
 
 define KernelPackage/batman-adv
-  URL:=https://www.open-mesh.org/
-  MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
   SUBMENU:=Network Support
-  DEPENDS:=+kmod-lib-crc32c +kmod-cfg80211
   TITLE:=B.A.T.M.A.N. Adv
+  URL:=https://www.open-mesh.org/
+  DEPENDS:=+BATMAN_ADV_BLA:kmod-lib-crc16 +kmod-lib-crc32c +kmod-cfg80211 +batctl
   FILES:=$(PKG_BUILD_DIR)/net/batman-adv/batman-adv.$(LINUX_KMOD_SUFFIX)
   AUTOLOAD:=$(call AutoProbe,batman-adv)
 endef
 
 define KernelPackage/batman-adv/description
-B.A.T.M.A.N. (better approach to mobile ad-hoc networking) is
-a routing protocol for multi-hop ad-hoc mesh networks. The
-networks may be wired or wireless. See
-https://www.open-mesh.org/ for more information and user space
-tools. This package builds version $(PKG_VERSION) of the kernel
-module.
+  B.A.T.M.A.N. (better approach to mobile ad-hoc networking) is
+  a routing protocol for multi-hop ad-hoc mesh networks. The
+  networks may be wired or wireless. See
+  https://www.open-mesh.org/ for more information and user space
+  tools. This package builds version $(PKG_VERSION) of the kernel
+  module.
 endef
 
 define KernelPackage/batman-adv/config
@@ -53,39 +60,34 @@ endef
 PKG_EXTRA_KCONFIG:= \
        CONFIG_BATMAN_ADV=m \
        CONFIG_BATMAN_ADV_DEBUG=$(if $(CONFIG_BATMAN_ADV_DEBUG),y,n) \
-       CONFIG_BATMAN_ADV_DEBUGFS=$(if $(CONFIG_BATMAN_ADV_DEBUGFS),y,n) \
        CONFIG_BATMAN_ADV_BLA=$(if $(CONFIG_BATMAN_ADV_BLA),y,n) \
        CONFIG_BATMAN_ADV_DAT=$(if $(CONFIG_BATMAN_ADV_DAT),y,n) \
        CONFIG_BATMAN_ADV_MCAST=$(if $(CONFIG_BATMAN_ADV_MCAST),y,n) \
        CONFIG_BATMAN_ADV_NC=$(if $(CONFIG_BATMAN_ADV_NC),y,n) \
        CONFIG_BATMAN_ADV_BATMAN_V=$(if $(CONFIG_BATMAN_ADV_BATMAN_V),y,n) \
+       CONFIG_BATMAN_ADV_TRACING=$(if $(CONFIG_BATMAN_ADV_TRACING),y,n) \
 
 PKG_EXTRA_CFLAGS:= \
        $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(PKG_EXTRA_KCONFIG)))) \
        $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(PKG_EXTRA_KCONFIG)))) \
 
 NOSTDINC_FLAGS = \
+       $(KERNEL_NOSTDINC_FLAGS) \
        -I$(PKG_BUILD_DIR)/net/batman-adv \
        -I$(STAGING_DIR)/usr/include/mac80211-backport \
        -I$(STAGING_DIR)/usr/include/mac80211-backport/uapi \
        -I$(STAGING_DIR)/usr/include/mac80211 \
        -I$(STAGING_DIR)/usr/include/mac80211/uapi \
        -I$(PKG_BUILD_DIR)/include/ \
+       -include backport/autoconf.h \
        -include backport/backport.h \
        -include $(PKG_BUILD_DIR)/compat-hacks.h \
-       -DBATADV_SOURCE_VERSION=\\\"openwrt-$(PKG_VERSION)-$(PKG_RELEASE)\\\"
-
-COMPAT_SOURCES = \
-       $(if $(CONFIG_BATMAN_ADV_MCAST),../../compat-sources/net/core/skbuff.o,) \
-       $(if $(CONFIG_BATMAN_ADV_MCAST),../../compat-sources/net/ipv4/igmp.o,) \
-       $(if $(CONFIG_BATMAN_ADV_MCAST),../../compat-sources/net/ipv6/mcast_snoop.o,) \
+       -DBATADV_SOURCE_VERSION=\\\"$(PKG_VERSION)-openwrt-$(PKG_RELEASE)\\\"
 
 define Build/Compile
-       +env "batman-adv-y=$(COMPAT_SOURCES)" \
        $(MAKE) $(PKG_JOBS) -C "$(LINUX_DIR)" \
-               ARCH="$(LINUX_KARCH)" \
-               CROSS_COMPILE="$(TARGET_CROSS)" \
-               SUBDIRS="$(PKG_BUILD_DIR)/net/batman-adv" \
+               $(KERNEL_MAKE_FLAGS) \
+               M="$(PKG_BUILD_DIR)/net/batman-adv" \
                $(PKG_EXTRA_KCONFIG) \
                EXTRA_CFLAGS="$(PKG_EXTRA_CFLAGS)" \
                NOSTDINC_FLAGS="$(NOSTDINC_FLAGS)" \
diff --git a/batman-adv/files/etc/config/batman-adv b/batman-adv/files/etc/config/batman-adv
deleted file mode 100644 (file)
index 21138cb..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-
-config 'mesh' 'bat0'
-       #option 'aggregated_ogms' 1
-       #option 'ap_isolation' 0
-       #option 'bonding' 0
-       #option 'fragmentation' 1
-       #option 'gw_bandwidth' '10000/2000'
-       #option 'gw_mode' 'off'
-       #option 'gw_sel_class' 20
-       #option 'log_level' 0
-       #option 'orig_interval' 1000
-       #option 'bridge_loop_avoidance' 1
-       #option 'distributed_arp_table' 1
-       #option 'multicast_mode' 1
-       #option 'network_coding' 0
-       #option 'hop_penalty' 30
-       #option 'isolation_mark' '0x00000000/0x00000000'
-
-# yet another batX instance
-# config 'mesh' 'bat5'
diff --git a/batman-adv/files/etc/hotplug.d/net/99-batman-adv b/batman-adv/files/etc/hotplug.d/net/99-batman-adv
deleted file mode 100644 (file)
index f0c391f..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-. /lib/batman-adv/config.sh
-
-bat_load_module
-config_load batman-adv
-
-case "$ACTION" in
-       add)
-               [ -d /sys/class/net/$INTERFACE/mesh/ ] && bat_config "$INTERFACE"
-               ;;
-esac
diff --git a/batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif b/batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif
new file mode 100755 (executable)
index 0000000..258b7bd
--- /dev/null
@@ -0,0 +1,97 @@
+#!/bin/sh
+
+# This UCI-Defaults script will split the batadv proto network interfaces
+# in batadv_hardif and batadv proto. The configuration options from
+# /etc/config/batman-adv will be moved to the latter.
+
+. /lib/functions.sh
+
+proto_batadv_to_batadv_hardif() {
+    local section="$1"
+    local proto
+    local mesh
+    local routing_algo
+
+    config_get proto "${section}" proto
+    config_get mesh "${section}" mesh
+    config_get routing_algo "${section}" routing_algo
+
+    if [ -z "$mesh" -o "${proto}" != "batadv" ]; then
+        continue
+    fi
+
+    uci set network."${section}".proto="batadv_hardif"
+    uci rename network."${section}".mesh="master"
+    uci delete network."${section}".routing_algo
+
+    # create new section or adjust existing one
+    uci set network."${mesh}"=interface
+    uci set network."${mesh}".proto=batadv
+    [ -n "${routing_algo}" ]  && uci set network."${mesh}".routing_algo="${routing_algo}"
+}
+
+mv_batadv_config_section() {
+    local section="$1"
+    local aggregated_ogms
+    local ap_isolation
+    local bonding
+    local bridge_loop_avoidance
+    local distributed_arp_table
+    local fragmentation
+    local gw_bandwidth
+    local gw_mode
+    local gw_sel_class
+    local hop_penalty
+    local isolation_mark
+    local log_level
+    local multicast_mode
+    local network_coding
+    local orig_interval
+
+    config_get aggregated_ogms "${section}" aggregated_ogms
+    config_get ap_isolation "${section}" ap_isolation
+    config_get bonding "${section}" bonding
+    config_get bridge_loop_avoidance "${section}" bridge_loop_avoidance
+    config_get distributed_arp_table "${section}" distributed_arp_table
+    config_get fragmentation "${section}" fragmentation
+    config_get gw_bandwidth "${section}" gw_bandwidth
+    config_get gw_mode "${section}" gw_mode
+    config_get gw_sel_class "${section}" gw_sel_class
+    config_get hop_penalty "${section}" hop_penalty
+    config_get isolation_mark "${section}" isolation_mark
+    config_get log_level "${section}" log_level
+    config_get multicast_mode "${section}" multicast_mode
+    config_get network_coding "${section}" network_coding
+    config_get orig_interval "${section}" orig_interval
+
+    # update section in case it exists
+    [ -n "${aggregated_ogms}" ]  && uci set network."${section}".aggregated_ogms="${aggregated_ogms}"
+    [ -n "${ap_isolation}" ]  && uci set network."${section}".ap_isolation="${ap_isolation}"
+    [ -n "${bonding}" ]  && uci set network."${section}".bonding="${bonding}"
+    [ -n "${bridge_loop_avoidance}" ]  && uci set network."${section}".bridge_loop_avoidance="${bridge_loop_avoidance}"
+    [ -n "${distributed_arp_table}" ]  && uci set network."${section}".distributed_arp_table="${distributed_arp_table}"
+    [ -n "${fragmentation}" ]  && uci set network."${section}".fragmentation="${fragmentation}"
+    [ -n "${gw_bandwidth}" ]  && uci set network."${section}".gw_bandwidth="${gw_bandwidth}"
+    [ -n "${gw_mode}" ]  && uci set network."${section}".gw_mode="${gw_mode}"
+    [ -n "${gw_sel_class}" ]  && uci set network."${section}".gw_sel_class="${gw_sel_class}"
+    [ -n "${hop_penalty}" ]  && uci set network."${section}".hop_penalty="${hop_penalty}"
+    [ -n "${isolation_mark}" ]  && uci set network."${section}".isolation_mark="${isolation_mark}"
+    [ -n "${log_level}" ]  && uci set network."${section}".log_level="${log_level}"
+    [ -n "${multicast_mode}" ]  && uci set network."${section}".multicast_mode="${multicast_mode}"
+    [ -n "${network_coding}" ]  && uci set network."${section}".network_coding="${network_coding}"
+    [ -n "${orig_interval}" ]  && uci set network."${section}".orig_interval="${orig_interval}"
+}
+
+if [ -f /etc/config/batman-adv ]; then
+    config_load network
+    config_foreach proto_batadv_to_batadv_hardif 'interface'
+    uci commit network
+
+    config_load batman-adv
+    config_foreach mv_batadv_config_section 'mesh'
+    uci commit network
+
+    rm -f /etc/config/batman-adv
+fi
+
+exit 0
diff --git a/batman-adv/files/lib/batman-adv/config.sh b/batman-adv/files/lib/batman-adv/config.sh
deleted file mode 100644 (file)
index 3a746a3..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/sh
-
-bat_load_module()
-{
-       [ -d "/sys/module/batman_adv/" ] && return
-
-       . /lib/functions.sh
-       load_modules /etc/modules.d/*-crc16 /etc/modules.d/*-crypto* /etc/modules.d/*-lib-crc* /etc/modules.d/*-batman-adv*
-}
-
-bat_config()
-{
-       local mesh="$1"
-       local aggregated_ogms ap_isolation bonding bridge_loop_avoidance distributed_arp_table fragmentation
-       local gw_bandwidth gw_mode gw_sel_class isolation_mark hop_penalty multicast_mode network_coding log_level
-       local orig_interval
-
-       config_get aggregated_ogms "$mesh" aggregated_ogms
-       config_get ap_isolation "$mesh" ap_isolation
-       config_get bonding "$mesh" bonding
-       config_get bridge_loop_avoidance "$mesh" bridge_loop_avoidance
-       config_get distributed_arp_table "$mesh" distributed_arp_table
-       config_get fragmentation "$mesh" fragmentation
-       config_get gw_bandwidth "$mesh" gw_bandwidth
-       config_get gw_mode "$mesh" gw_mode
-       config_get gw_sel_class "$mesh" gw_sel_class
-       config_get hop_penalty "$mesh" hop_penalty
-       config_get isolation_mark "$mesh" isolation_mark
-       config_get multicast_mode "$mesh" multicast_mode
-       config_get network_coding "$mesh" network_coding
-       config_get log_level "$mesh" log_level
-       config_get orig_interval "$mesh" orig_interval
-
-       [ ! -f "/sys/class/net/$mesh/mesh/orig_interval" ] && echo "batman-adv mesh $mesh does not exist - check your interface configuration" && return 1
-
-       [ -n "$aggregated_ogms" ] && echo $aggregated_ogms > /sys/class/net/$mesh/mesh/aggregated_ogms
-       [ -n "$ap_isolation" ] && echo $ap_isolation > /sys/class/net/$mesh/mesh/ap_isolation
-       [ -n "$bonding" ] && echo $bonding > /sys/class/net/$mesh/mesh/bonding
-       [ -n "$bridge_loop_avoidance" ] && echo $bridge_loop_avoidance > /sys/class/net/$mesh/mesh/bridge_loop_avoidance 2>&-
-       [ -n "$distributed_arp_table" ] && echo $distributed_arp_table > /sys/class/net/$mesh/mesh/distributed_arp_table 2>&-
-       [ -n "$fragmentation" ] && echo $fragmentation > /sys/class/net/$mesh/mesh/fragmentation
-       [ -n "$gw_bandwidth" ] && echo $gw_bandwidth > /sys/class/net/$mesh/mesh/gw_bandwidth
-       [ -n "$gw_mode" ] && echo $gw_mode > /sys/class/net/$mesh/mesh/gw_mode
-       [ -n "$gw_sel_class" ] && echo $gw_sel_class > /sys/class/net/$mesh/mesh/gw_sel_class
-       [ -n "$hop_penalty" ] && echo $hop_penalty > /sys/class/net/$mesh/mesh/hop_penalty
-       [ -n "$isolation_mark" ] && echo $isolation_mark > /sys/class/net/$mesh/mesh/isolation_mark
-       [ -n "$multicast_mode" ] && echo $multicast_mode > /sys/class/net/$mesh/mesh/multicast_mode 2>&-
-       [ -n "$network_coding" ] && echo $network_coding > /sys/class/net/$mesh/mesh/network_coding 2>&-
-       [ -n "$log_level" ] && echo $log_level > /sys/class/net/$mesh/mesh/log_level 2>&-
-       [ -n "$orig_interval" ] && echo $orig_interval > /sys/class/net/$mesh/mesh/orig_interval
-}
index 1e0c9d0fe24d44c7f7cc9bddaf8065c60f680862..edc14f4cbd5485ede408e897fada8eae6f8f09d3 100755 (executable)
 #!/bin/sh
 
-. /lib/functions.sh
-. ../netifd-proto.sh
-init_proto "$@"
+[ -n "$INCLUDE_ONLY" ] || {
+       . /lib/functions.sh
+       . ../netifd-proto.sh
+       init_proto "$@"
+}
 
 proto_batadv_init_config() {
-       proto_config_add_string "mesh"
-       proto_config_add_string "routing_algo"
+       no_device=1
+       available=1
+
+       proto_config_add_boolean 'aggregated_ogms:bool'
+       proto_config_add_boolean 'ap_isolation:bool'
+       proto_config_add_boolean 'bonding:bool'
+       proto_config_add_boolean 'bridge_loop_avoidance:bool'
+       proto_config_add_boolean 'distributed_arp_table:bool'
+       proto_config_add_boolean 'fragmentation:bool'
+       proto_config_add_string 'gw_bandwidth'
+       proto_config_add_string 'gw_mode'
+       proto_config_add_int 'gw_sel_class'
+       proto_config_add_int 'hop_penalty'
+       proto_config_add_string 'isolation_mark'
+       proto_config_add_string 'log_level'
+       proto_config_add_int 'multicast_fanout'
+       proto_config_add_boolean 'multicast_mode:bool'
+       proto_config_add_boolean 'network_coding:bool'
+       proto_config_add_int 'orig_interval'
+       proto_config_add_string 'routing_algo'
 }
 
 proto_batadv_setup() {
        local config="$1"
-       local iface="$2"
+       local iface="$config"
+
+       local aggregated_ogms
+       local ap_isolation
+       local bonding
+       local bridge_loop_avoidance
+       local distributed_arp_table
+       local fragmentation
+       local gw_bandwidth
+       local gw_mode
+       local gw_sel_class
+       local hop_penalty
+       local isolation_mark
+       local log_level
+       local multicast_fanout
+       local multicast_mode
+       local network_coding
+       local orig_interval
+       local routing_algo
+
+       json_get_vars aggregated_ogms
+       json_get_vars ap_isolation
+       json_get_vars bonding
+       json_get_vars bridge_loop_avoidance
+       json_get_vars distributed_arp_table
+       json_get_vars fragmentation
+       json_get_vars gw_bandwidth
+       json_get_vars gw_mode
+       json_get_vars gw_sel_class
+       json_get_vars hop_penalty
+       json_get_vars isolation_mark
+       json_get_vars log_level
+       json_get_vars multicast_fanout
+       json_get_vars multicast_mode
+       json_get_vars network_coding
+       json_get_vars orig_interval
+       json_get_vars routing_algo
+
+       set_default routing_algo 'BATMAN_IV'
+
+       batctl routing_algo "$routing_algo"
+       batctl meshif "$iface" interface create
+
+       [ -n "$aggregated_ogms" ] && batctl meshif "$iface" aggregation "$aggregated_ogms"
+       [ -n "$ap_isolation" ] && batctl meshif "$iface" ap_isolation "$ap_isolation"
+       [ -n "$bonding" ] && batctl meshif "$iface" bonding "$bonding"
+       [ -n "$bridge_loop_avoidance" ] &&  batctl meshif "$iface" bridge_loop_avoidance "$bridge_loop_avoidance" 2>&-
+       [ -n "$distributed_arp_table" ] && batctl meshif "$iface" distributed_arp_table "$distributed_arp_table" 2>&-
+       [ -n "$fragmentation" ] && batctl meshif "$iface" fragmentation "$fragmentation"
 
-       local mesh routing_algo
-       json_get_vars mesh routing_algo
+       case "$gw_mode" in
+       server)
+               if [ -n "$gw_bandwidth" ]; then
+                       batctl meshif "$iface" gw_mode "server" "$gw_bandwidth"
+               else
+                       batctl meshif "$iface" gw_mode "server"
+               fi
+               ;;
+       client)
+               if [ -n "$gw_sel_class" ]; then
+                       batctl meshif "$iface" gw_mode "client" "$gw_sel_class"
+               else
+                       batctl meshif "$iface" gw_mode "client"
+               fi
+               ;;
+       *)
+               batctl meshif "$iface" gw_mode "off"
+               ;;
+       esac
 
-       [ -n "$routing_algo" ] || routing_algo="BATMAN_IV"
-       echo "$routing_algo" > "/sys/module/batman_adv/parameters/routing_algo"
+       [ -n "$hop_penalty" ] && batctl meshif "$iface" hop_penalty "$hop_penalty"
+       [ -n "$isolation_mark" ] && batctl meshif "$iface" isolation_mark "$isolation_mark"
+       [ -n "$multicast_fanout" ] && batctl meshif "$iface" multicast_fanout "$multicast_fanout"
+       [ -n "$multicast_mode" ] && batctl meshif "$iface" multicast_mode "$multicast_mode" 2>&-
+       [ -n "$network_coding" ] && batctl meshif "$iface" network_coding "$network_coding" 2>&-
+       [ -n "$log_level" ] && batctl meshif "$iface" loglevel "$log_level" 2>&-
+       [ -n "$orig_interval" ] && batctl meshif "$iface" orig_interval "$orig_interval"
 
-       echo "$mesh" > "/sys/class/net/$iface/batman_adv/mesh_iface"
        proto_init_update "$iface" 1
        proto_send_update "$config"
 }
 
 proto_batadv_teardown() {
        local config="$1"
-       local iface="$2"
+       local iface="$config"
 
-       echo "none" > "/sys/class/net/$iface/batman_adv/mesh_iface" || true
+       batctl meshif "$iface" interface destroy
 }
 
 add_protocol batadv
diff --git a/batman-adv/files/lib/netifd/proto/batadv_hardif.sh b/batman-adv/files/lib/netifd/proto/batadv_hardif.sh
new file mode 100755 (executable)
index 0000000..b2f87dd
--- /dev/null
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+[ -n "$INCLUDE_ONLY" ] || {
+       . /lib/functions.sh
+       . ../netifd-proto.sh
+       init_proto "$@"
+}
+
+proto_batadv_hardif_init_config() {
+       proto_config_add_int 'elp_interval'
+       proto_config_add_int 'hop_penalty'
+       proto_config_add_string "master"
+       proto_config_add_string 'throughput_override'
+}
+
+proto_batadv_hardif_setup() {
+       local config="$1"
+       local iface="$2"
+
+       local elp_interval
+       local hop_penalty
+       local master
+       local throughput_override
+
+       json_get_vars elp_interval
+       json_get_vars hop_penalty
+       json_get_vars master
+       json_get_vars throughput_override
+
+       ( proto_add_host_dependency "$config" '' "$master" )
+
+       batctl meshif "$master" interface -M add "$iface"
+
+       [ -n "$elp_interval" ] && batctl hardif "$iface" elp_interval "$elp_interval"
+       [ -n "$hop_penalty" ] && batctl hardif "$iface" hop_penalty "$hop_penalty"
+       [ -n "$throughput_override" ] && batctl hardif "$iface" throughput_override "$throughput_override"
+
+       proto_init_update "$iface" 1
+       proto_send_update "$config"
+}
+
+proto_batadv_hardif_teardown() {
+       local config="$1"
+       local iface="$2"
+
+       local master
+
+       json_get_vars master
+
+       batctl meshif "$master" interface -M del "$iface" || true
+}
+
+add_protocol batadv_hardif
index 85002c35e76f9a426358832204b16ae3ca519913..5b0c76fd2efcdeb46765792dcbb43c741665372b 100755 (executable)
@@ -5,25 +5,25 @@
 init_proto "$@"
 
 proto_batadv_vlan_init_config() {
-       proto_config_add_string "ap_isolation"
+       proto_config_add_boolean 'ap_isolation:bool'
 }
 
 proto_batadv_vlan_setup() {
        local config="$1"
        local iface="$2"
 
-       # VLAN specific variables
-       local device="${iface%.*}"
-       local vid="${iface#*.}"
-
        # batadv_vlan options
        local ap_isolation
 
        json_get_vars ap_isolation
 
-       echo "$ap_isolation" > "/sys/class/net/${device}/mesh/vlan${vid}/ap_isolation"
+       [ -n "$ap_isolation" ] && batctl vlan "$iface" ap_isolation "$ap_isolation"
        proto_init_update "$iface" 1
        proto_send_update "$config"
 }
 
+proto_batadv_vlan_teardown() {
+       local cfg="$1"
+}
+
 add_protocol batadv_vlan
diff --git a/batman-adv/patches/0001-Revert-batman-adv-Migrate-to-linux-container_of.h.patch b/batman-adv/patches/0001-Revert-batman-adv-Migrate-to-linux-container_of.h.patch
new file mode 100644 (file)
index 0000000..30d30d0
--- /dev/null
@@ -0,0 +1,274 @@
+From: Sven Eckelmann <sven@narfation.org>
+Date: Fri, 6 May 2022 22:03:29 +0200
+Subject: Revert "batman-adv: Migrate to linux/container_of.h"
+
+The original patch requires Linux 5.16.0 or a mac80211 compat header with this
+name. But the mac80211 package is currently not providing this header and
+OpenWrt main is still using older Linux kernel versions for some targets.
+
+This reverts commit 043ae5634bdfd4c4dd8b95a22890752495080bb5.
+
+--- a/compat-include/linux/container_of.h
++++ /dev/null
+@@ -1,20 +0,0 @@
+-/* SPDX-License-Identifier: GPL-2.0 */
+-/* Copyright (C) B.A.T.M.A.N. contributors:
+- *
+- * Marek Lindner, Simon Wunderlich
+- *
+- * This file contains macros for maintaining compatibility with older versions
+- * of the Linux kernel.
+- */
+-
+-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_CONTAINER_OF_H_
+-#define _NET_BATMAN_ADV_COMPAT_LINUX_CONTAINER_OF_H_
+-
+-#include <linux/version.h>
+-#if LINUX_VERSION_IS_GEQ(5, 16, 0)
+-#include_next <linux/container_of.h>
+-#else
+-#include <linux/kernel.h>
+-#endif
+-
+-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_CONTAINER_OF_H_ */
+--- a/net/batman-adv/bat_iv_ogm.c
++++ b/net/batman-adv/bat_iv_ogm.c
+@@ -13,13 +13,13 @@
+ #include <linux/bug.h>
+ #include <linux/byteorder/generic.h>
+ #include <linux/cache.h>
+-#include <linux/container_of.h>
+ #include <linux/errno.h>
+ #include <linux/etherdevice.h>
+ #include <linux/gfp.h>
+ #include <linux/if_ether.h>
+ #include <linux/init.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/list.h>
+ #include <linux/lockdep.h>
+--- a/net/batman-adv/bat_v_elp.c
++++ b/net/batman-adv/bat_v_elp.c
+@@ -10,13 +10,13 @@
+ #include <linux/atomic.h>
+ #include <linux/bitops.h>
+ #include <linux/byteorder/generic.h>
+-#include <linux/container_of.h>
+ #include <linux/errno.h>
+ #include <linux/etherdevice.h>
+ #include <linux/ethtool.h>
+ #include <linux/gfp.h>
+ #include <linux/if_ether.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/minmax.h>
+ #include <linux/netdevice.h>
+--- a/net/batman-adv/bat_v_ogm.c
++++ b/net/batman-adv/bat_v_ogm.c
+@@ -9,12 +9,12 @@
+ #include <linux/atomic.h>
+ #include <linux/byteorder/generic.h>
+-#include <linux/container_of.h>
+ #include <linux/errno.h>
+ #include <linux/etherdevice.h>
+ #include <linux/gfp.h>
+ #include <linux/if_ether.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/list.h>
+ #include <linux/lockdep.h>
+--- a/net/batman-adv/bridge_loop_avoidance.c
++++ b/net/batman-adv/bridge_loop_avoidance.c
+@@ -10,7 +10,6 @@
+ #include <linux/atomic.h>
+ #include <linux/byteorder/generic.h>
+ #include <linux/compiler.h>
+-#include <linux/container_of.h>
+ #include <linux/crc16.h>
+ #include <linux/errno.h>
+ #include <linux/etherdevice.h>
+--- a/net/batman-adv/distributed-arp-table.c
++++ b/net/batman-adv/distributed-arp-table.c
+@@ -11,7 +11,6 @@
+ #include <linux/atomic.h>
+ #include <linux/bitops.h>
+ #include <linux/byteorder/generic.h>
+-#include <linux/container_of.h>
+ #include <linux/errno.h>
+ #include <linux/etherdevice.h>
+ #include <linux/gfp.h>
+@@ -21,6 +20,7 @@
+ #include <linux/in.h>
+ #include <linux/ip.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/list.h>
+ #include <linux/netlink.h>
+--- a/net/batman-adv/gateway_client.c
++++ b/net/batman-adv/gateway_client.c
+@@ -9,7 +9,6 @@
+ #include <linux/atomic.h>
+ #include <linux/byteorder/generic.h>
+-#include <linux/container_of.h>
+ #include <linux/errno.h>
+ #include <linux/etherdevice.h>
+ #include <linux/gfp.h>
+--- a/net/batman-adv/hard-interface.c
++++ b/net/batman-adv/hard-interface.c
+@@ -10,12 +10,12 @@
+ #include <linux/atomic.h>
+ #include <linux/byteorder/generic.h>
+ #include <linux/compiler.h>
+-#include <linux/container_of.h>
+ #include <linux/errno.h>
+ #include <linux/gfp.h>
+ #include <linux/if.h>
+ #include <linux/if_arp.h>
+ #include <linux/if_ether.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/limits.h>
+ #include <linux/list.h>
+--- a/net/batman-adv/main.c
++++ b/net/batman-adv/main.c
+@@ -10,7 +10,6 @@
+ #include <linux/atomic.h>
+ #include <linux/build_bug.h>
+ #include <linux/byteorder/generic.h>
+-#include <linux/container_of.h>
+ #include <linux/crc32c.h>
+ #include <linux/device.h>
+ #include <linux/errno.h>
+--- a/net/batman-adv/multicast.c
++++ b/net/batman-adv/multicast.c
+@@ -11,7 +11,6 @@
+ #include <linux/bitops.h>
+ #include <linux/bug.h>
+ #include <linux/byteorder/generic.h>
+-#include <linux/container_of.h>
+ #include <linux/errno.h>
+ #include <linux/etherdevice.h>
+ #include <linux/gfp.h>
+--- a/net/batman-adv/network-coding.c
++++ b/net/batman-adv/network-coding.c
+@@ -11,7 +11,6 @@
+ #include <linux/bitops.h>
+ #include <linux/byteorder/generic.h>
+ #include <linux/compiler.h>
+-#include <linux/container_of.h>
+ #include <linux/errno.h>
+ #include <linux/etherdevice.h>
+ #include <linux/gfp.h>
+@@ -20,6 +19,7 @@
+ #include <linux/init.h>
+ #include <linux/jhash.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/list.h>
+ #include <linux/lockdep.h>
+--- a/net/batman-adv/originator.c
++++ b/net/batman-adv/originator.c
+@@ -8,11 +8,11 @@
+ #include "main.h"
+ #include <linux/atomic.h>
+-#include <linux/container_of.h>
+ #include <linux/errno.h>
+ #include <linux/etherdevice.h>
+ #include <linux/gfp.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/list.h>
+ #include <linux/lockdep.h>
+--- a/net/batman-adv/send.c
++++ b/net/batman-adv/send.c
+@@ -10,13 +10,13 @@
+ #include <linux/atomic.h>
+ #include <linux/bug.h>
+ #include <linux/byteorder/generic.h>
+-#include <linux/container_of.h>
+ #include <linux/errno.h>
+ #include <linux/etherdevice.h>
+ #include <linux/gfp.h>
+ #include <linux/if.h>
+ #include <linux/if_ether.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/list.h>
+ #include <linux/netdevice.h>
+--- a/net/batman-adv/soft-interface.c
++++ b/net/batman-adv/soft-interface.c
+@@ -11,7 +11,6 @@
+ #include <linux/byteorder/generic.h>
+ #include <linux/cache.h>
+ #include <linux/compiler.h>
+-#include <linux/container_of.h>
+ #include <linux/cpumask.h>
+ #include <linux/errno.h>
+ #include <linux/etherdevice.h>
+@@ -20,6 +19,7 @@
+ #include <linux/if_ether.h>
+ #include <linux/if_vlan.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/list.h>
+ #include <linux/lockdep.h>
+--- a/net/batman-adv/tp_meter.c
++++ b/net/batman-adv/tp_meter.c
+@@ -12,13 +12,13 @@
+ #include <linux/byteorder/generic.h>
+ #include <linux/cache.h>
+ #include <linux/compiler.h>
+-#include <linux/container_of.h>
+ #include <linux/err.h>
+ #include <linux/etherdevice.h>
+ #include <linux/gfp.h>
+ #include <linux/if_ether.h>
+ #include <linux/init.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/kthread.h>
+ #include <linux/limits.h>
+--- a/net/batman-adv/translation-table.c
++++ b/net/batman-adv/translation-table.c
+@@ -13,7 +13,6 @@
+ #include <linux/byteorder/generic.h>
+ #include <linux/cache.h>
+ #include <linux/compiler.h>
+-#include <linux/container_of.h>
+ #include <linux/crc32c.h>
+ #include <linux/errno.h>
+ #include <linux/etherdevice.h>
+@@ -22,6 +21,7 @@
+ #include <linux/init.h>
+ #include <linux/jhash.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/list.h>
+ #include <linux/lockdep.h>
+--- a/net/batman-adv/tvlv.c
++++ b/net/batman-adv/tvlv.c
+@@ -7,10 +7,10 @@
+ #include "main.h"
+ #include <linux/byteorder/generic.h>
+-#include <linux/container_of.h>
+ #include <linux/etherdevice.h>
+ #include <linux/gfp.h>
+ #include <linux/if_ether.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/list.h>
+ #include <linux/lockdep.h>
diff --git a/batman-adv/patches/0001-compat-hacks.patch b/batman-adv/patches/0001-compat-hacks.patch
deleted file mode 100644 (file)
index 0a9994d..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
---- a/net/batman-adv/main.c
-+++ b/net/batman-adv/main.c
-@@ -19,7 +19,7 @@
- #include "main.h"
- #include <linux/atomic.h>
--#include <linux/build_bug.h>
-+#include <linux/bug.h>
- #include <linux/byteorder/generic.h>
- #include <linux/crc32c.h>
- #include <linux/errno.h>
---- a/net/batman-adv/tp_meter.c
-+++ b/net/batman-adv/tp_meter.c
-@@ -20,7 +20,7 @@
- #include "main.h"
- #include <linux/atomic.h>
--#include <linux/build_bug.h>
-+#include <linux/bug.h>
- #include <linux/byteorder/generic.h>
- #include <linux/cache.h>
- #include <linux/compiler.h>
---- a/net/batman-adv/translation-table.c
-+++ b/net/batman-adv/translation-table.c
-@@ -21,7 +21,7 @@
- #include <linux/atomic.h>
- #include <linux/bitops.h>
--#include <linux/build_bug.h>
-+#include <linux/bug.h>
- #include <linux/byteorder/generic.h>
- #include <linux/cache.h>
- #include <linux/compiler.h>
diff --git a/batman-adv/patches/0002-fix-batadv_is_cfg80211_netdev.patch b/batman-adv/patches/0002-fix-batadv_is_cfg80211_netdev.patch
new file mode 100644 (file)
index 0000000..ae70c85
--- /dev/null
@@ -0,0 +1,19 @@
+From: Alexandru Gagniuc <mr.nuke.me@gmail.com>
+Date: Thu, 6 Apr 2023 18:05:50 -0500
+Subject: fix batadv_is_cfg80211_netdev
+
+Replace CONFIG_CFG80211 with CPTCFG_CFG80211, which is the correct
+macro to use when building under backports.
+
+--- a/net/batman-adv/hard-interface.c
++++ b/net/batman-adv/hard-interface.c
+@@ -308,8 +308,7 @@ static bool batadv_is_cfg80211_netdev(st
+ {
+       if (!net_device)
+               return false;
+-
+-#if IS_ENABLED(CONFIG_CFG80211)
++#if IS_ENABLED(CPTCFG_CFG80211)
+       /* cfg80211 drivers have to set ieee80211_ptr */
+       if (net_device->ieee80211_ptr)
+               return true;
diff --git a/batman-adv/patches/0003-Revert-batman-adv-Switch-to-linux-sprintf.h.patch b/batman-adv/patches/0003-Revert-batman-adv-Switch-to-linux-sprintf.h.patch
new file mode 100644 (file)
index 0000000..3692433
--- /dev/null
@@ -0,0 +1,97 @@
+From: Sven Eckelmann <sven@narfation.org>
+Date: Fri, 2 Feb 2024 22:49:00 +0100
+Subject: Revert "batman-adv: Switch to linux/sprintf.h"
+
+The original patch requires Linux 6.6.0 or a mac80211 compat header with this
+name. But the mac80211 package is currently not providing this header and
+OpenWrt main is still using older Linux kernel versions for some targets.
+
+This reverts commit f0fb49c5ab70dfa064f0aa8d1c5d84f65e8cbc86.
+
+--- a/compat-include/linux/sprintf.h
++++ /dev/null
+@@ -1,20 +0,0 @@
+-/* SPDX-License-Identifier: GPL-2.0 */
+-/* Copyright (C) B.A.T.M.A.N. contributors:
+- *
+- * Marek Lindner, Simon Wunderlich
+- *
+- * This file contains macros for maintaining compatibility with older versions
+- * of the Linux kernel.
+- */
+-
+-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_SPRINTF_H_
+-#define _NET_BATMAN_ADV_COMPAT_LINUX_SPRINTF_H_
+-
+-#include <linux/version.h>
+-#if LINUX_VERSION_IS_GEQ(6, 6, 0)
+-#include_next <linux/sprintf.h>
+-#else
+-#include <linux/kernel.h>
+-#endif
+-
+-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_SPRINTF_H_ */
+--- a/net/batman-adv/bridge_loop_avoidance.c
++++ b/net/batman-adv/bridge_loop_avoidance.c
+@@ -19,6 +19,7 @@
+ #include <linux/if_vlan.h>
+ #include <linux/jhash.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/list.h>
+ #include <linux/lockdep.h>
+@@ -29,7 +30,6 @@
+ #include <linux/skbuff.h>
+ #include <linux/slab.h>
+ #include <linux/spinlock.h>
+-#include <linux/sprintf.h>
+ #include <linux/stddef.h>
+ #include <linux/string.h>
+ #include <linux/workqueue.h>
+--- a/net/batman-adv/gateway_client.c
++++ b/net/batman-adv/gateway_client.c
+@@ -17,6 +17,7 @@
+ #include <linux/in.h>
+ #include <linux/ip.h>
+ #include <linux/ipv6.h>
++#include <linux/kernel.h>
+ #include <linux/kref.h>
+ #include <linux/list.h>
+ #include <linux/lockdep.h>
+@@ -27,7 +28,6 @@
+ #include <linux/skbuff.h>
+ #include <linux/slab.h>
+ #include <linux/spinlock.h>
+-#include <linux/sprintf.h>
+ #include <linux/stddef.h>
+ #include <linux/udp.h>
+ #include <net/sock.h>
+--- a/net/batman-adv/main.c
++++ b/net/batman-adv/main.c
+@@ -32,7 +32,6 @@
+ #include <linux/skbuff.h>
+ #include <linux/slab.h>
+ #include <linux/spinlock.h>
+-#include <linux/sprintf.h>
+ #include <linux/stddef.h>
+ #include <linux/string.h>
+ #include <linux/workqueue.h>
+--- a/net/batman-adv/multicast.c
++++ b/net/batman-adv/multicast.c
+@@ -24,6 +24,7 @@
+ #include <linux/ip.h>
+ #include <linux/ipv6.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
+ #include <linux/list.h>
+ #include <linux/lockdep.h>
+ #include <linux/netdevice.h>
+@@ -34,7 +35,6 @@
+ #include <linux/skbuff.h>
+ #include <linux/slab.h>
+ #include <linux/spinlock.h>
+-#include <linux/sprintf.h>
+ #include <linux/stddef.h>
+ #include <linux/string.h>
+ #include <linux/types.h>
diff --git a/batman-adv/patches/0004-Revert-batman-adv-Switch-to-linux-array_size.h.patch b/batman-adv/patches/0004-Revert-batman-adv-Switch-to-linux-array_size.h.patch
new file mode 100644 (file)
index 0000000..888b4ed
--- /dev/null
@@ -0,0 +1,69 @@
+From: Sven Eckelmann <sven@narfation.org>
+Date: Fri, 2 Feb 2024 22:49:48 +0100
+Subject: Revert "batman-adv: Switch to linux/array_size.h"
+
+The original patch requires Linux 6.7.0 or a mac80211 compat header with this
+name. But the mac80211 package is currently not providing this header and
+OpenWrt main is still using older Linux kernel versions for some targets.
+
+This reverts commit f33d7f724675544a36b24c77f8d4b95d41252ae2.
+
+--- a/compat-include/linux/array_size.h
++++ /dev/null
+@@ -1,20 +0,0 @@
+-/* SPDX-License-Identifier: GPL-2.0 */
+-/* Copyright (C) B.A.T.M.A.N. contributors:
+- *
+- * Marek Lindner, Simon Wunderlich
+- *
+- * This file contains macros for maintaining compatibility with older versions
+- * of the Linux kernel.
+- */
+-
+-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_ARRAY_SIZE_H_
+-#define _NET_BATMAN_ADV_COMPAT_LINUX_ARRAY_SIZE_H_
+-
+-#include <linux/version.h>
+-#if LINUX_VERSION_IS_GEQ(6, 7, 0)
+-#include_next <linux/array_size.h>
+-#else
+-#include <linux/kernel.h>
+-#endif
+-
+-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_ARRAY_SIZE_H_ */
+--- a/net/batman-adv/main.c
++++ b/net/batman-adv/main.c
+@@ -6,7 +6,6 @@
+ #include "main.h"
+-#include <linux/array_size.h>
+ #include <linux/atomic.h>
+ #include <linux/build_bug.h>
+ #include <linux/byteorder/generic.h>
+@@ -20,6 +19,7 @@
+ #include <linux/init.h>
+ #include <linux/ip.h>
+ #include <linux/ipv6.h>
++#include <linux/kernel.h>
+ #include <linux/kobject.h>
+ #include <linux/kref.h>
+ #include <linux/list.h>
+--- a/net/batman-adv/netlink.c
++++ b/net/batman-adv/netlink.c
+@@ -7,7 +7,6 @@
+ #include "netlink.h"
+ #include "main.h"
+-#include <linux/array_size.h>
+ #include <linux/atomic.h>
+ #include <linux/bitops.h>
+ #include <linux/bug.h>
+@@ -20,6 +19,7 @@
+ #include <linux/if_ether.h>
+ #include <linux/if_vlan.h>
+ #include <linux/init.h>
++#include <linux/kernel.h>
+ #include <linux/limits.h>
+ #include <linux/list.h>
+ #include <linux/minmax.h>
index 45111848167e703d543ad241d0947efd8fe86649..364e312e039e03469cde3f9e6e08c0ed5e2125f8 100644 (file)
 #include <linux/version.h>     /* LINUX_VERSION_CODE */
 #include <linux/types.h>
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)
+#if LINUX_VERSION_IS_LESS(6, 0, 0)
 
-#define dev_get_iflink(_net_dev) ((_net_dev)->iflink)
+#define __vstring(item, fmt, ap) __dynamic_array(char, item, 256)
+#define __assign_vstr(dst, fmt, va) \
+       WARN_ON_ONCE(vsnprintf(__get_dynamic_array(dst), 256, fmt, *va) >= 256)
 
-#endif /* < KERNEL_VERSION(4, 1, 0) */
+#endif /* LINUX_VERSION_IS_LESS(6, 0, 0) */
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0)
+#if LINUX_VERSION_IS_LESS(6, 2, 0)
 
-#include <linux/netdevice.h>
+#include <linux/random.h>
 
-#define netdev_master_upper_dev_link(dev, upper_dev, upper_priv, upper_info, extack) ({\
-       BUILD_BUG_ON(upper_priv != NULL); \
-       BUILD_BUG_ON(upper_info != NULL); \
-       BUILD_BUG_ON(extack != NULL); \
-       netdev_master_upper_dev_link(dev, upper_dev); \
-})
+#define genl_split_ops genl_ops
 
-#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
-
-#include <linux/netdevice.h>
-
-#define netdev_master_upper_dev_link(dev, upper_dev, upper_priv, upper_info, extack) ({\
-       BUILD_BUG_ON(extack != NULL); \
-       netdev_master_upper_dev_link(dev, upper_dev, upper_priv, upper_info); \
-})
-
-#endif /* < KERNEL_VERSION(4, 5, 0) */
-
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
-
-/* for batadv_v_elp_get_throughput which would have used
- * STATION_INFO_EXPECTED_THROUGHPUT in Linux 4.0.0
- */
-#define NL80211_STA_INFO_EXPECTED_THROUGHPUT    28
-
-/* wild hack for batadv_getlink_net only */
-#define get_link_net get_xstats_size || 1 ? fallback_net : (struct net*)netdev->rtnl_link_ops->get_xstats_size
-
-#endif /* < KERNEL_VERSION(4, 0, 0) */
-
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0)
-
-struct sk_buff *skb_checksum_trimmed(struct sk_buff *skb,
-                                    unsigned int transport_len,
-                                    __sum16(*skb_chkf)(struct sk_buff *skb));
-
-int ip_mc_check_igmp(struct sk_buff *skb, struct sk_buff **skb_trimmed);
-
-int ipv6_mc_check_mld(struct sk_buff *skb, struct sk_buff **skb_trimmed);
-
-#endif /* < KERNEL_VERSION(4, 2, 0) */
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
-
-#define IFF_NO_QUEUE   0; dev->tx_queue_len = 0
-
-static inline bool hlist_fake(struct hlist_node *h)
-{
-       return h->pprev == &h->next;
-}
-
-#endif /* < KERNEL_VERSION(4, 3, 0) */
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
-
-#include <linux/ethtool.h>
-
-#define ethtool_link_ksettings batadv_ethtool_link_ksettings
-
-struct batadv_ethtool_link_ksettings {
-       struct {
-               __u32   speed;
-               __u8    duplex;
-               __u8    autoneg;
-       } base;
-};
-
-#define __ethtool_get_link_ksettings(__dev, __link_settings) \
-       batadv_ethtool_get_link_ksettings(__dev, __link_settings)
-
-static inline int
-batadv_ethtool_get_link_ksettings(struct net_device *dev,
-                                 struct ethtool_link_ksettings *link_ksettings)
-{
-       struct ethtool_cmd cmd;
-       int ret;
-
-       memset(&cmd, 0, sizeof(cmd));
-       ret = __ethtool_get_settings(dev, &cmd);
-
-       if (ret != 0)
-               return ret;
-
-       link_ksettings->base.duplex = cmd.duplex;
-       link_ksettings->base.speed = ethtool_cmd_speed(&cmd);
-       link_ksettings->base.autoneg = cmd.autoneg;
-
-       return 0;
-}
-
-#endif /* < KERNEL_VERSION(4, 6, 0) */
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)
-
-#ifdef netif_trans_update
-#undef netif_trans_update
-#endif
-
-#define netif_trans_update batadv_netif_trans_update
-static inline void batadv_netif_trans_update(struct net_device *dev)
-{
-       dev->trans_start = jiffies;
-}
-
-#endif /* < KERNEL_VERSION(4, 7, 0) */
-
-
-#include_next <linux/netlink.h>
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)
-
-#include_next <net/netlink.h>
-
-static inline bool batadv_nla_need_padding_for_64bit(struct sk_buff *skb);
-
-static inline int batadv_nla_align_64bit(struct sk_buff *skb, int padattr)
+static inline u32 batadv_get_random_u32_below(u32 ep_ro)
 {
-       if (batadv_nla_need_padding_for_64bit(skb) &&
-           !nla_reserve(skb, padattr, 0))
-               return -EMSGSIZE;
-
-       return 0;
+       return prandom_u32_max(ep_ro);
 }
 
-static inline struct nlattr *batadv__nla_reserve_64bit(struct sk_buff *skb,
-                                                      int attrtype,
-                                                      int attrlen, int padattr)
-{
-       if (batadv_nla_need_padding_for_64bit(skb))
-               batadv_nla_align_64bit(skb, padattr);
-
-       return __nla_reserve(skb, attrtype, attrlen);
-}
+#define get_random_u32_below batadv_get_random_u32_below
 
-static inline void batadv__nla_put_64bit(struct sk_buff *skb, int attrtype,
-                                        int attrlen, const void *data,
-                                        int padattr)
-{
-       struct nlattr *nla;
+#endif /* LINUX_VERSION_IS_LESS(6, 2, 0) */
 
-       nla = batadv__nla_reserve_64bit(skb, attrtype, attrlen, padattr);
-       memcpy(nla_data(nla), data, attrlen);
-}
+#if LINUX_VERSION_IS_LESS(6, 4, 0) && \
+    !(LINUX_VERSION_IS_GEQ(5, 10, 205) && LINUX_VERSION_IS_LESS(5, 11, 0)) && \
+    !(LINUX_VERSION_IS_GEQ(5, 15, 144) && LINUX_VERSION_IS_LESS(5, 16, 0)) && \
+    !(LINUX_VERSION_IS_GEQ(6, 1, 69) && LINUX_VERSION_IS_LESS(6, 2, 0))
 
-static inline bool batadv_nla_need_padding_for_64bit(struct sk_buff *skb)
-{
-#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
-       /* The nlattr header is 4 bytes in size, that's why we test
-        * if the skb->data _is_ aligned.  A NOP attribute, plus
-        * nlattr header for next attribute, will make nla_data()
-        * 8-byte aligned.
-        */
-       if (IS_ALIGNED((unsigned long)skb_tail_pointer(skb), 8))
-               return true;
-#endif
-       return false;
-}
+#include <linux/if_vlan.h>
 
-static inline int batadv_nla_total_size_64bit(int payload)
-{
-       return NLA_ALIGN(nla_attr_size(payload))
-#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
-               + NLA_ALIGN(nla_attr_size(0))
-#endif
-               ;
-}
-
-static inline int batadv_nla_put_64bit(struct sk_buff *skb, int attrtype,
-                                      int attrlen, const void *data,
-                                      int padattr)
-{
-       size_t len;
-
-       if (batadv_nla_need_padding_for_64bit(skb))
-               len = batadv_nla_total_size_64bit(attrlen);
-       else
-               len = nla_total_size(attrlen);
-       if (unlikely(skb_tailroom(skb) < len))
-               return -EMSGSIZE;
-
-       batadv__nla_put_64bit(skb, attrtype, attrlen, data, padattr);
-       return 0;
-}
-
-#ifdef nla_put_u64_64bit
-#undef nla_put_u64_64bit
-#endif
-
-#define nla_put_u64_64bit(_skb, _attrtype, _value, _padattr) \
-       batadv_nla_put_u64_64bit(_skb, _attrtype, _value, _padattr)
-static inline int batadv_nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
-                                          u64 value, int padattr)
-{
-       return batadv_nla_put_64bit(skb, attrtype, sizeof(u64), &value,
-                                   padattr);
-}
-
-#endif /* < KERNEL_VERSION(4, 7, 0) */
-
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
-
-#include_next <linux/cache.h>
-
-/* hack for netlink.c which marked the family ops as ro */
-#ifdef __ro_after_init
-#undef __ro_after_init
-#endif
-#define __ro_after_init
-
-#endif /* < KERNEL_VERSION(4, 10, 0) */
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 9)
-
-#include <linux/netdevice.h>
-
-/* work around missing attribute needs_free_netdev and priv_destructor in
- * net_device
+/* Prefer this version in TX path, instead of
+ * skb_reset_mac_header() + vlan_eth_hdr()
  */
-#define ether_setup(dev) \
-       void batadv_softif_free2(struct net_device *dev) \
-       { \
-               batadv_softif_free(dev); \
-               free_netdev(dev); \
-       } \
-       void (*t1)(struct net_device *dev) __attribute__((unused)); \
-       bool t2 __attribute__((unused)); \
-       ether_setup(dev)
-#define needs_free_netdev destructor = batadv_softif_free2; t2
-#define priv_destructor destructor = batadv_softif_free2; t1
-
-#endif /* < KERNEL_VERSION(4, 11, 9) */
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 13, 0)
-
-static inline void *batadv_skb_put(struct sk_buff *skb, unsigned int len)
+static inline struct vlan_ethhdr *skb_vlan_eth_hdr(const struct sk_buff *skb)
 {
-       return (void *)skb_put(skb, len);
+       return (struct vlan_ethhdr *)skb->data;
 }
-#ifdef skb_put
-#undef skb_put
-#endif
-
-#define skb_put batadv_skb_put
-
-static inline void *batadv_skb_put_zero(struct sk_buff *skb, unsigned int len)
-{
-       void *tmp = skb_put(skb, len);
-
-       memset(tmp, 0, len);
-
-       return tmp;
-}
-#ifdef skb_put_zero
-#undef skb_put_zero
-#endif
-
-#define skb_put_zero batadv_skb_put_zero
-
-static inline void *batadv_skb_put_data(struct sk_buff *skb, const void *data,
-                                unsigned int len)
-{
-       void *tmp = skb_put(skb, len);
-
-       memcpy(tmp, data, len);
-
-       return tmp;
-}
-#ifdef skb_put_data
-#undef skb_put_data
-#endif
-
-#define skb_put_data batadv_skb_put_data
-
-#endif /* < KERNEL_VERSION(4, 13, 0) */
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
-
-#define batadv_softif_slave_add(__dev, __slave_dev, __extack) \
-       batadv_softif_slave_add(__dev, __slave_dev)
-
-#endif /* < KERNEL_VERSION(4, 15, 0) */
-
-#ifndef from_timer
-
-#define TIMER_DATA_TYPE                unsigned long
-#define TIMER_FUNC_TYPE                void (*)(TIMER_DATA_TYPE)
-
-static inline void timer_setup(struct timer_list *timer,
-                              void (*callback)(struct timer_list *),
-                              unsigned int flags)
-{
-       __setup_timer(timer, (TIMER_FUNC_TYPE)callback,
-                     (TIMER_DATA_TYPE)timer, flags);
-}
-
-#define from_timer(var, callback_timer, timer_fieldname) \
-       container_of(callback_timer, typeof(*var), timer_fieldname)
-
-#endif /* !from_timer */
-       
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0)
-
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 18, 0)
-
-#include <net/cfg80211.h>
-
-/* cfg80211 fix: https://patchwork.kernel.org/patch/10449857/ */
-static inline int batadv_cfg80211_get_station(struct net_device *dev,
-                                             const u8 *mac_addr,
-                                             struct station_info *sinfo)
-{
-       memset(sinfo, 0, sizeof(*sinfo));
-       return cfg80211_get_station(dev, mac_addr, sinfo);
-}
-
-#define cfg80211_get_station(dev, mac_addr, sinfo) \
-       batadv_cfg80211_get_station(dev, mac_addr, sinfo)
-
-#endif /* < KERNEL_VERSION(4, 18, 0) */
-
-
-#ifdef __CHECK_POLL
-typedef unsigned __bitwise __poll_t;
-#else
-typedef unsigned __poll_t;
-#endif
 
-#endif /* < KERNEL_VERSION(4, 16, 0) */
+#endif /* LINUX_VERSION_IS_LESS(6, 4, 0) */
 
 /* <DECLARE_EWMA> */
 
index 425d355943039b25f02ec3789e9bc3461c009fdb..f015d87d9933d3085515529c082ce9fb8b10c41c 100644 (file)
@@ -6,7 +6,6 @@
 #
 
 include $(TOPDIR)/rules.mk
-include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=batmand
 
@@ -14,7 +13,7 @@ PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://git.open-mesh.org/batmand.git
 PKG_REV:=b67a7087b51d7a5e90d27ac39116d1f57257c86e
 PKG_VERSION:=1440
-PKG_RELEASE:=0
+PKG_RELEASE:=1
 PKG_LICENSE:=GPL-2.0
 
 PKG_SOURCE_VERSION:=$(PKG_REV)
@@ -23,19 +22,13 @@ PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
 PKG_MIRROR_HASH:=ceb8e0e399f79b1b663594fcf9642e1efc40e696a7604daf709c77da9b6ec52f
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
 
-PKG_EXTRA_CFLAGS=-DDEBUG_MALLOC -DMEMORY_USAGE -DPROFILE_DATA -DREVISION_VERSION=\"\ rv$(PKG_REV)\" -D_GNU_SOURCE
-
-PKG_KMOD_BUILD_DIR:=$(PKG_BUILD_DIR)/linux/modules
+PKG_BUILD_PARALLEL:=1
 
 include $(INCLUDE_DIR)/package.mk
 
-define Package/batmand/Default
+define Package/batmand
   URL:=https://www.open-mesh.org/
   MAINTAINER:=Corinna "Elektra" Aichele <onelektra@gmx.net>
-endef
-
-define Package/batmand
-$(call Package/batmand/Default)
   SECTION:=net
   CATEGORY:=Network
   SUBMENU:=Routing and Redirection
@@ -47,61 +40,16 @@ define Package/batmand/description
 B.A.T.M.A.N. layer 3 routing daemon
 endef
 
-define KernelPackage/batgat
-$(call Package/batmand/Default)
-  SUBMENU:=Network Support
-  DEPENDS:=+batmand @BROKEN
-  TITLE:=B.A.T.M.A.N. gateway module
-  FILES:=$(PKG_KMOD_BUILD_DIR)/batgat.$(LINUX_KMOD_SUFFIX)
-  AUTOLOAD:=$(call AutoLoad,50,batgat)
-endef
-
-
-define KernelPackage/batgat/description
-Kernel gateway module for B.A.T.M.A.N. for better tunnel performance
-endef
-
-MAKE_BATMAND_ARGS += \
-       EXTRA_CFLAGS='$(TARGET_CFLAGS) $(PKG_EXTRA_CFLAGS)' \
-       CCFLAGS="$(TARGET_CFLAGS)" \
-       OFLAGS="$(TARGET_CFLAGS)" \
+MAKE_FLAGS += \
+       EXTRA_CFLAGS='-DDEBUG_MALLOC -DMEMORY_USAGE -DPROFILE_DATA -DREVISION_VERSION=\"\ rv$(PKG_REV)\" -D_GNU_SOURCE' \
        REVISION="$(PKG_REV)" \
        CC="$(TARGET_CC)" \
-       NODEBUG=1 \
        UNAME="Linux" \
-       INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
-       STRIP="/bin/true" \
-       batmand install
-
-MAKE_BATGAT_ARGS += \
-       CROSS_COMPILE="$(TARGET_CROSS)" \
-       ARCH="$(LINUX_KARCH)" \
-       PATH="$(TARGET_PATH)" \
-       SUBDIRS="$(PKG_KMOD_BUILD_DIR)" \
-       LINUX_VERSION="$(LINUX_VERSION)" \
-       REVISION="$(PKG_REV)" modules   
-
-
-define Build/Configure
-endef
-
-ifneq ($(DEVELOPER)$(CONFIG_PACKAGE_batmand),)
-       BUILD_BATMAND := $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_BATMAND_ARGS)
-endif
-       
-ifneq ($(DEVELOPER)$(CONFIG_PACKAGE_kmod-batgat),)
-       BUILD_BATGAT := $(MAKE) -C "$(LINUX_DIR)" $(MAKE_BATGAT_ARGS)
-endif
-               
-define Build/Compile
-       $(BUILD_BATMAND)
-       cp $(PKG_KMOD_BUILD_DIR)/Makefile.kbuild $(PKG_KMOD_BUILD_DIR)/Makefile
-       $(BUILD_BATGAT)
-endef
+       batmand
 
 define Package/batmand/install
        $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/batmand $(1)/usr/sbin/
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/batmand $(1)/usr/sbin/
        $(INSTALL_BIN) ./files/etc/init.d/batmand $(1)/etc/init.d
        $(INSTALL_DATA) ./files/etc/config/batmand $(1)/etc/config
 endef
@@ -111,4 +59,3 @@ define Package/batmand/conffiles
 endef
 
 $(eval $(call BuildPackage,batmand))
-$(eval $(call KernelPackage,batgat))
index 6d1f3beb49f2db67ecfa51a4863f83b647141d05..0cad38d3a03f05ff2363bbd620977fa5298bb74e 100644 (file)
@@ -1,12 +1,11 @@
 config batmand general
        option interface                ath0
-       option hna                      
-       option gateway_class            
+       option hna
+       option gateway_class
        option originator_interval
-       option preferred_gateway        
+       option preferred_gateway
        option routing_class
        option visualisation_srv
        option policy_routing_script
        option disable_client_nat
        option disable_aggregation
-       
index 403e9f39a0796ec8353f94e4544a582f59342c3b..8361e7255ca8c621023d306e38832fb6d9fb7b4f 100644 (file)
@@ -1,27 +1,44 @@
 #!/bin/sh /etc/rc.common
 START=90
+USE_PROCD=1
 
-start () {
-       interface=$(uci get batmand.general.interface)
+batmand_start() {
+       local config="$1"
+       local batman_args
+       local interface
+       local hnas
+       local gateway_class
+       local originator_interval
+       local preferred_gateway
+       local routing_class
+       local visualisation_srv
+       local local policy_routing_script
+       local disable_client_nat
+       local disable_aggregation
+
+       [ "$config" = "general" ] || return 1
+
+       config_get interface "$config" interface
        if [ "$interface" = "" ]; then
                echo $1 Error, you must specify at least a network interface
-               exit
+               return 1
        fi
-       hnas=$(uci get batmand.general.hna)
-       gateway_class=$(uci get batmand.general.gateway_class)
-       originator_interval=$(uci get batmand.general.originator_interval)
-       preferred_gateway=$(uci get batmand.general.preferred_gateway)
-       routing_class=$(uci get batmand.general.routing_class)
-       visualisation_srv=$(uci get batmand.general.visualisation_srv)
-       policy_routing_script=$(uci get batmand.general.policy_routing_script)
-       disable_client_nat=$(uci get batmand.general.disable_client_nat)
-       disable_aggregation=$(uci get batmand.general.disable_aggregation)
+
+       config_get hnas "$config" hna
+       config_get gateway_class "$config" gateway_class
+       config_get originator_interval "$config" originator_interval
+       config_get preferred_gateway "$config" preferred_gateway
+       config_get routing_class "$config" routing_class
+       config_get visualisation_srv "$config" visualisation_srv
+       config_get policy_routing_script "$config" policy_routing_script
+       config_get disable_client_nat "$config" disable_client_nat
+       config_get disable_aggregation "$config" disable_aggregation
+
        batman_args=""
 
-       for hna in $hnas
-          do
-             batman_args=${batman_args}'-a '$hna' '
-          done
+       for hna in $hnas; do
+               batman_args=${batman_args}'-a '$hna' '
+       done
 
        if [ $gateway_class ]; then
                batman_args=${batman_args}'-g '$gateway_class' '
@@ -38,29 +55,37 @@ start () {
        if [ $routing_class ]; then
                batman_args=${batman_args}'-r '$routing_class' '
        fi
-               
+
        if [ $visualisation_srv ]; then
                batman_args=${batman_args}'-s '$visualisation_srv' '
        fi
-       
+
        if [ $policy_routing_script ]; then
                batman_args=${batman_args}'--policy-routing-script '$policy_routing_script' '
        fi
-       
+
        if [ $disable_client_nat ]; then
                batman_args=${batman_args}'--disable-client-nat '
        fi
-       
+
        if [ $disable_aggregation ]; then
                batman_args=${batman_args}'--disable-aggregation '
        fi
 
-       batman_args=${batman_args}$interface
-       batmand $batman_args >/dev/null 2>&1
+       procd_open_instance "${config}"
+       procd_set_param command /usr/sbin/batmand
+       procd_append_param command --no-detach
+       procd_append_param command ${batman_args}
+       procd_append_param command ${interface}
+       procd_set_param netdev ${interface}
+       procd_close_instance
 }
 
-stop () {
-        killall batmand
+start_service() {
+       config_load "batmand"
+       config_foreach batmand_start batmand
 }
 
-        
+service_triggers() {
+       procd_add_reload_trigger "batmand"
+}
diff --git a/batmand/patches/0001-Allow-one-to-disable-forking-to-background-in-debug_.patch b/batmand/patches/0001-Allow-one-to-disable-forking-to-background-in-debug_.patch
new file mode 100644 (file)
index 0000000..7b01751
--- /dev/null
@@ -0,0 +1,66 @@
+From: Sven Eckelmann <sven@narfation.org>
+Date: Sun, 1 Dec 2013 14:39:00 +0100
+Subject: Allow one to disable forking to background in debug_mode 0
+
+---
+ posix/init.c | 19 ++++++++++++++-----
+ 1 file changed, 14 insertions(+), 5 deletions(-)
+
+--- a/posix/init.c
++++ b/posix/init.c
+@@ -44,6 +44,7 @@
+ #define IOCSETDEV 1
+ int8_t stop;
++int no_detach = 0;
+@@ -159,6 +160,7 @@ void apply_init_args( int argc, char *ar
+               {"purge-timeout",     required_argument,       0, 'q'},
+               {"disable-aggregation",     no_argument,       0, 'x'},
+               {"disable-client-nat",     no_argument,       0, 'z'},
++              {"no-detach",     no_argument,       0, 'D'},
+               {0, 0, 0, 0}
+       };
+@@ -169,7 +171,7 @@ void apply_init_args( int argc, char *ar
+       if ( strstr( SOURCE_VERSION, "-" ) != NULL )
+               printf( "WARNING: You are using the unstable batman branch. If you are interested in *using* batman get the latest stable release !\n" );
+-      while ( ( optchar = getopt_long( argc, argv, "a:A:bcd:hHio:g:p:r:s:vV", long_options, &option_index ) ) != -1 ) {
++      while ( ( optchar = getopt_long( argc, argv, "a:A:bcd:hHio:g:p:r:s:vVD", long_options, &option_index ) ) != -1 ) {
+               switch ( optchar ) {
+@@ -381,6 +383,11 @@ void apply_init_args( int argc, char *ar
+                               found_args++;
+                               break;
++                      case 'D':
++                              no_detach = 1;
++                              found_args++;
++                              break;
++
+                       case 'h':
+                       default:
+                               usage();
+@@ -539,12 +546,14 @@ void apply_init_args( int argc, char *ar
+               /* daemonize */
+               if (debug_level == 0) {
+-                      if (my_daemon() < 0) {
++                      if (!no_detach) {
++                              if (my_daemon() < 0) {
+-                              printf("Error - can't fork to background: %s\n", strerror(errno));
+-                              restore_defaults();
+-                              exit(EXIT_FAILURE);
++                                      printf("Error - can't fork to background: %s\n", strerror(errno));
++                                      restore_defaults();
++                                      exit(EXIT_FAILURE);
++                              }
+                       }
+                       openlog("batmand", LOG_PID, LOG_DAEMON);
diff --git a/batmand/patches/100-2.6.36.patch b/batmand/patches/100-2.6.36.patch
deleted file mode 100644 (file)
index 13318e0..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
----
- batman/linux/modules/gateway.c |   19 +++++++++++++++++++
- 1 file changed, 19 insertions(+)
-
---- batmand-r1439.orig/linux/modules/gateway.c
-+++ batmand-r1439/linux/modules/gateway.c
-@@ -29,6 +29,7 @@ static struct class *batman_class;
- static int batgat_open(struct inode *inode, struct file *filp);
- static int batgat_release(struct inode *inode, struct file *file);
- static int batgat_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg );
-+static long batgat_ioctl_unlocked(struct file *file, unsigned int cmd, unsigned long arg );
- static void udp_data_ready(struct sock *sk, int len);
-@@ -53,7 +54,11 @@ static int proc_clients_read(char *buf,
- static struct file_operations fops = {
-       .open = batgat_open,
-       .release = batgat_release,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
-+      .unlocked_ioctl = batgat_ioctl_unlocked,
-+#else
-       .ioctl = batgat_ioctl,
-+#endif
- };
-@@ -166,6 +171,20 @@ static int batgat_release(struct inode *
- }
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
-+#include <linux/smp_lock.h>
-+static long batgat_ioctl_unlocked(struct file *file, unsigned int cmd, unsigned long arg )
-+{
-+      int ret;
-+
-+      lock_kernel();
-+      ret = batgat_ioctl(file->f_path.dentry->d_inode, file, cmd, arg);
-+      unlock_kernel();
-+
-+      return ret;
-+}
-+#endif
-+
- static int batgat_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg )
- {
-       uint8_t tmp_ip[4];
diff --git a/bird1-openwrt/LUCI-DOCUMENTATION.md b/bird1-openwrt/LUCI-DOCUMENTATION.md
deleted file mode 100644 (file)
index 6b93262..0000000
+++ /dev/null
@@ -1,342 +0,0 @@
-<!--
----------------------------------------------------------------------
-(C) 2014 - 2017 Eloi Carbo <eloicaso@openmailbox.org>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
----------------------------------------------------------------------
--->
-
-# LUCI Bird{4|6} v0.3 Packages Documentation
-*  BIRD Daemon's official documentation: http://bird.network.cz/?get_doc
-*  Extra documentation in English & Catalan: https://github.com/eloicaso/bgp-bmx6-bird-docn
-*  If you want to add new options to bird*-openwrt packages add a pull request or issue in: https://github.com/eloicaso/bird-openwrt
-
-> *Clarification*: This documentation covers luci-app-bird{4|6} as both are completely aligned and only those IPv4/6-specific options will be covered separately.
->
-> Bird v1.6.3 has been used to test luci-app-bird{4|6}. Using newer versions of the Daemon might change the behaviour or messages documented here. Create an issue or pull request if you spot any mismatch in this document to address it.
-
-# Table of contents
-1. [Status Page](#status)
-2. [Log Page](#log)
-3. [Overview Page](#overview)
-4. [General Protocols Page](#general)
-5. [BGP Portocol](#bgp)
-6. [Filters and Functions](#fnf)
-
-
-## Status Page <a name="status"></a>
-The Status Page allows you to Start, Stop and restart the service as well as to check the result of these operations.
-
-#### Components
-- *Button* **Start**: Execute a Bird Daemon Service Start call. Operation's result is shown in the *Service Status* Text Box.
-- *Button* **Stop**: Execute a Bird Daemon Service Stop call. Operation's result is shown in the *Service Status* Text Box.
-- *Button* **Restart**: Execute a Bird Daemon Service Restart call. Operation's result is shown in the *Service Status* Text Box.
-- *Text Box* **Service Status**: Executes a Bird Daemon Service Status call. Operation's result is shown as plain text.
-
-#### Service Status common messages
-* *Running*: Service is running with no issues
-* *Already started*: You have clicked *Start* when the service was already running. No action taken.
-* *Stopped*: You have clicked *Stop* when the service was running. Service has been stopped.
-* *Already stopped*: You have clicked *Stop* when the service was already stopped. No action taken.
-* *Stopped ... Started*: You have pressed *Restart* when the service was running. The service has been restarted.
-* *Already stopped .. Started*: You have pressed *Restart* when the service was already stopped. The service has been started.
-* *Failed - ERROR MESSAGE*: There is a configuration or validation issue that prevents Bird to start. Check the *Error Message* and the Log Page to debug it and fix it.
-
-#### Error Examples
-1. Validation issues:
-  `bird4: Failed - bird: /tmp/bird4.conf, line 65: syntax error`
-
-If we check the file shown: `/tmp/bird4.conf` :
-```
-protocol bgp BGPExample {
-import Filter NonExistingFilter;
-}
-```
-We have entered an invalid (non-existent in this case) filter name. In order to fix this, write the correct Filter Name or remove its reference from the BGP Protocol Configuration Page and start the service again.
-
-2. Configuration issues:
-  ` bird4: Failed - bird: /tmp/bird4.conf, line 76: Only internal neighbor can be RR client`
-
-In this case, it is easy to spot that we have incorrectly selected the *Route Reflector Server* option incorrectly and we only need to untick it and start the service to solve it.
-
-Usuarlly, any configuration issue will be flagged appropiately through Bird service messages. However, in the event where you do not have enough information, please look for advice in either Bird's documentation or in the affected Protocol's documentation.
-
-## Log Page <a name="log"></a>
-The Log Page shows the last 30 lines of the configured Bird Daemon Log file. This information is automatically refreshed each second.
-
-#### Components
-- *Text Area* **Log File**: 30 lines text area that shows the Log file information
-- *Text* **Using Log File** and **File Size**: The first line of the Text Area is fixed and shows the file being used and its current size. **Please**, check this size information regularly to avoid letting the Log information overflow your Storage as it will make your service stop and prevent it to start until you fix it.
-- *Text* **File Contents**: The next 30 lines show information about the events and debug information happening live. Main information are state changes and *info, warning, fatal or trace*. If you hit any issue starting the service, you can investigate the issue from this page.
-
-
-## Overview Page <a name="overview"></a>
-The Overview Page includes the configuration of basic Bird Daemon settings such as UCI usage, Routing Tables definition and Global Options.
-
-### Bird File Settings (UCI Usage)
-This section enables/disables the use of this package's capabilities.
-
-#### Components
-- *Check Box* **Use UCI configuration**:
-  - If enabled, the package will use the UCI configuration generated by this web settings and translate it into a Bird Daemon configuration file.
-  - If disabled, the package will do nothing and you will have to manually edit a Bird Daemon configuration file.
-- *Text Box* **UCI File**: This file specifies the selected location for the translated Bird Daemon configuration file. Do not leave blank.
-
-### Tables Configuration
-This section allows you to set the Routing tables that will be used later in the different protocols. You can *Add* as many instances as required.
-
-#### Components
-- *Text Box* **Table Name**: Set an unique (meaningful) routing table name.
-> In some instances or protocols, you may want or be required to set a specific ID to a Table. In order to do this, please, follow this -right now- [manual procedure](https://github.com/eloicaso/bgp-bmx6-bird-docn/blob/master/EN/manual_procedures.md).
-
-
-### Global Options
-This section allows you to configure basic Bird Daemon settings.
-
-#### Components
-- *Text Box* **Router ID**: Set the Identificator to be used in this Bird Daemon instance. This option must be:
-> IPv4, this option will be set by default to the lowest IP Address configured. Otherwise, the identificator must be an IPv4 address.
-
-> IPv6, this option is **mandatory** and must be a HEX value (Hexadecimal). This package (bird6-uci), provides the HEX value *0xCAFEBABE* as a default value to avoid initial crashes.
-
-- *Text Box* **Log File**: Set the Name and Location of the Log file. By default, its location will be /tmp/bird{4|6}.log as the non-persistent partition.
-- *Mutiple Value* **Log**: Set which elements you want Bird Daemon to log in the configured file.
-> *Caution I*: if you select *All*, the other selected options will have no validity as, by definition, they are already included.
-> *Caution II*: Take into consideration that the more elements Bird has to log, the more space you will require to store this log file. If your storage is full, Bird will fail to start until you free some space to store its Log data.
-
-- *Multi Value* **Debug**: Set which Debug information elements you want Bird Daemon to log in the configured file.
-> *Caution I*: if you select *All*, the other selected options will have no validity as, by definition, they are already included.
-> *Caution II*: Take into consideration that the more elements Bird has to log, the more space you will require to store this log file (this is particularly critical in Debug as it can log MegaBytes of data quickly). If your storage is full, Bird will fail to start until you free some space to store its Log data.
-
-## General Protocols <a name="general"></a>
-The General Protocols Page includes the configuration of key OS Protocols or Network Basic Settings such as Kernel, Device or Static Routes.
-
-### Kernel Options
-This section allows you to set all the Kernel Protocols required to do Networking.
-> The first Kernel instance is the Primary one and must be left by default for OS usage. Do not set its "Table" or "Kernel Table" options.
-
-#### Components
-- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
-- *List Value* **Table**: Select the Routing Table to be used in the Kernel Protocol instance.
-> The Primary Kernel Protocol cannot be empty.
-
-- *Text Box* **Import**: Set if the protocol must import routes and which ones.
-  - **all**: Accept all the incoming routes.
-  - **none**: Reject all the incoming routes.
-  - **filter filterName**: Call an existing filter to define which incoming routes will be accepted or rejected.
-- *Text Box* **Export**: Set if the protocol must export routes and which ones.
-  - **all**: Accept all the outgoing routes.
-  - **none**: Reject all the outgoing routes.
-  - **filter filterName**: Call an existing filter to define which outgoing routes will be accepted or rejected.
-- *Text Box* **Scan time**: Set the time between Kernel Routing Table scans. This value must be the same for all the Kernel Protocols.
-- *Check Box* **Learn**: Set this option to allow the Kernel Protocol to learn Routes form other routing daemons or manually added by an admin.
-- *Check Box* **Persist**: Set this option to store the routes learnt in the table until it is removed. Unset this option if you want to clean the routes on the fly.
-- *Text Box* **Kernel Table**: Select the specific exitisting Routing Table for this Protocol instance.
-> The Kernel Table ID must be previously set by the administrator during the Routing Table configuration. Currently (v0.3), this process is done manually. Please, follow this [manual procedure](https://github.com/eloicaso/bgp-bmx6-bird-docn/blob/master/EN/manual_procedures.md).
-
-### Device Options
-This section allows you to set all the Device *Protocol*. The Device *Protocol* is just a mechanism to bound the interfaces and Kernel tables in order to get its information.
-
-#### Components
-- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
-- *Text Box* **Scan Time**: Set the time between Kernel Routing Table scans. This value must be the same for all the Kernel Protocols.
-
-### Static Options
-This section allows you to create the container for Routes definition. Static protocol instances allows you to manually create Routes that Bird will use and which Routing Table should hold this information. It also helps to manage routes by marking them (i.e. *Unreachable*, *Blocked*, ...).
-
-#### Components
-- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
-- *List Value* **Table**: Select the Routing Table to be used in the Static Protocol instance.
-
-### Routes
-This section allows to set which Routes will be set in a specific Static Protocol and how these should be handled.
-
-#### Components
-- *List Value* **Route Instance**: Set which Static Protocol instance will contain this route infromation.
-> Routes require an existing Static Protocol as parent.
-
-- *Text Box* **Route Prefix**: Set the Route instance to be defined.
-> Examples of routes are:. 10.0.0.0/8 (IPv4) or 2001:DB8:3000:0/16 (IPv6)
-
-- *List Value* **Type Of Route**: This value will set the conditional settings. Options are:
-  - **Router**: Classic routes going through specific IP Addresses. 
-    - *Text Box* **Via**: Set the target IP Address to be used for Routing
-    > I.e. 10.0.0.0/8 via 10.1.1.1
-
-  - **MultiPath**: Multiple paths Route.
-    - *List of Text Box* **Via**: Set the target Route to be used for Routing. This option allows several instances of **Via** elements.
-    > I.e. 10.0.0.0/8 via 10.1.1.1
-    >            via 10.1.1.100
-    >            via 10.1.1.200
-
-  - **Special**: Special treated Route.
-    - *Text Box* **Attribute**: Block special consideration of routes.
-    > **unreachable**: Return route cannot be reached.
-    > **prohibit**: Return route has been administratively blocked.
-    > **blackhole**: Silently drop the route.
-
-  - **Iface**: Classic routes going through specific interfaces.
-    - *List Value* **Interface**: Select the target interface to route.
-
-  - **Recursive**: Set a static recursive route. Its next hope will depen on the table's lookup for each target IP Address.
-
-### Direct Protocol
-This section allows to set pools of *directly* connected interfaces. Direct Protocol instances will make use of the *Device* Protocol in order to generate routes between the selected interfaces.
-
-#### Components
-- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
-- *Text Box* **Interfaces**: This is the key option allowing to *tie* the interfaces and create direct routes between different sides. Enter each interface's name you want to couple.
-  - If you leave this option empty, it will tie all the interfaces together.
-  - Each interface must be quoted: i.e. `"eth0"`
-  - Several interfaces must be entered comma-separated: i.e. `"eth0", "wlan0"`
-  - If you want to restrict this to specific interfaces, you have to enter them using its name or a pattern: i.e. All the ethernet interfaces `"eth*"`
-  - You are allowed to **exclude** specific interfaces by adding `-` before the interface name: i.e. Exclude all the Wireless interfaces `"-wlan*"`
-  > Example: All the wired interfaces (eth and em) but exclude all the wireless and point-to-point interfaces: `"eth*", "em*", "-wlan*", "-ptp_*"`
-
-> Current version 0.3 requires you to enter each interface you want to **include** or **exclude** manually. This will be enhanced in future versions.
-
-### Pipe Protocol
-This section allows to set instances of *linked* routing tables. Each instance will allow you to share the routes from a primary table to a secondary one.
-
-#### Components
-- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
-- *List Value* **Table**: Select the **Primary** Routing Table to be used.
-- *List Value* **Peer Table**: Select the **Secondary** Routing Table to be used.
-- *List Value* **Mode**: Set if you want to work in *transparent* or *opaque* mode.
-  - **Transparent**: Retransmits all the routes and its attributes. Therefore, you get two identical routing tables. This is the default behaviour.
-  - **Opaque**: This mode is not recommended for new configurations and it is not recommended. Tables will only share the optimal routes and overwrite route's attributes with new ones (Pipe).
-- *Text Box* **Import**: Set if the protocol must import routes and which ones.
-  - **all**: Accept all the incoming routes.
-  - **none**: Reject all the incoming routes.
-  - **filter filterName**: Call an existing filter to define which incoming routes will be accepted or rejected.
-- *Text Box* **Export**: Set if the protocol must export routes and which ones.
-  - **all**: Accept all the outgoing routes.
-  - **none**: Reject all the outgoing routes.
-  - **filter filterName**: Call an existing filter to define which outgoing routes will be accepted or rejected.
-
-
-## BGP Protocol<a name="bgp"></a>
-The BGP Protocol Page includes all the settings to configure BGP Templates and BGP instances.
-BGP Templates and Instances share most of the options as Templates are meant to diminish the requirements on Instances.
-> An extreme example case could be the Template holding all the options and the Instance only referencing to the Template as the only option..
-
-### BGP Templates
-This section allows you to set BGP Templates, which are commonly used BGP configuration*themes* to reduce the number of repeated settings while adding BGP Instances.
-
-### BGP Instances
-This section allows you to set BGP Instances. The Instances are the ones starting the BGP Protocol and can, or not, use a BGP Template to re-use the common properties.
-> **Caution**: Any duplicated option between an Instance and a Template will resolve by using the Instance option and dismissing the Template one. **Instance** > *Template*.
-
-#### BGP Instance Specific Option
-- *List Value* **Templates**: Set the BGP Template that will feed the instance. Any option in the Template will be inherited.
-
-#### Common Options
-- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
-- *Text Area* **Description**: Set a descriptive text to identify this protocol and what it does.
-- *Text Box* **Import**: Set if the protocol must import routes and which ones.
-  - **all**: Accept all the incoming routes.
-  - **none**: Reject all the incoming routes.
-  - **filter filterName**: Call an existing filter to define which incoming routes will be accepted or rejected.
-- *Text Box* **Export**: Set if the protocol must export routes and which ones.
-  - **all**: Accept all the outgoing routes.
-  - **none**: Reject all the outgoing routes.
-  - **filter filterName**: Call an existing filter to define which outgoing routes will be accepted or rejected.
-- *List Value* **Table**: Select the Routing Table to be used.
-- *List Value* **IGP Table**: Set the IGP Routing Table (Internal BGP). Bird uses the same Routing Table for both External BGP and Internal BGP by default.
-- *Text Area* **Source Address**: Set the local IP Address. By default the Router ID will be used.
-- *Text Area* **Local AS**: Set the local BGP Autonomous System ID.
-- *Text Area* **Local BGP Address**: Set the local BGP Autonomous System IP Address.
-- *Text Area* **Neighbor IP Address**: Set BGP neighbour's IP Address.
-- *Text Area* **Neighbor AS**: Set BGP neighbour's Autonomous System ID.
-- *Check Box* **Next Hop Self**: Overwrite Next Hop cost attributes with its own source address as next hop. Disabled by default as it is only used in some specific instances.
-- *Check Box* **Next Hop Keep**: Forward the same Next Hop information even in situations where the system would use its own source address instead. Disabled by default.
-- *Check Box* **Route Reflector Server**: Set if BGP instance must act as a Route Reflector Server and expect neighbours AS to act as clients
-- *Text Value* **Route Reflector Cluster ID**: Route Reflector service ID to avoid loops. This options is only allowed in the Server (not clients) and it is Router's ID by default.
-- *Text Box* **Routes Import Limit**: Set the maximum number of routes the protocol will import.
-- *List Value* **Routes Import Limit Action**: Set the action to apply if the *Routes Import Limit* is exceeded. Options are:
-  - **block**: Block any route exceeding the limit.
-  - **disable**: Stop the protocol.
-  - **warn**: Print Log warnings.
-  - **restart**: Restart the protocol.
-- *Text Box* **Routes Export Limit**: Set the maximum number of routes the protocol will export.
-- *List Value* **Routes Export Limit Action**: Set the action to apply if the *Routes Export Limit* is exceeded. Options are:
-  - **block**: Block any route exceeding the limit.
-  - **disable**: Stop BGP protocol.
-  - **warn**: Print Log warnings.
-  - **restart**: Restart BGP protocol.
-- *Text Box* **Routes Received Limit**: Set the maximum number of shared routes the Protocol must accept and remember (the **number** of imported routes is not affected by this option).
-- *List Value* **Routes Received Limit Action**: Set the action to apply if the *Routes Received Limit* is exceeded. Options are:
-  - **block**: Block any route exceeding the limit.
-  - **disable**: Stop BGP protocol.
-  - **warn**: Print Log warnings.
-  - **restart**: Restart BGP protocol.
-
-
-## Filters and Functions<a name="fnf"></a>
-The Filters and the Functions Page allows you to edit Bird Daemon Filter and Functions files without requiring you to go to command line.  Both Pages share the same code base and the only main change is where they are getting the files from. Therefore, and for documentation simplicity sake, both pages will be covered in this section.
-> From version 0.3 onwards:
-> The default and supported place to store filter files is under `/etc/bird{4|6}/filters`. 
-> The default and supported place to store function files is under `/etc/bird{4|6}/functions`. 
-
-> Current version 0.3 does not allow changing file names. You will have to change the default filenames through SSH. This will be enhanced in future versions.
-
-#### Components
-- *List Value* **Filter Files** / **Function Files**: Set the Filter or Function file to edit from the ones under `/etc/bird{4|6}/filters` / `/etc/bird{4|6}/functions`.
-> If you want to create a new Filter or Function file, use the **New File** element in the list.
-
-> The default behaviour is to allow administrators to create new files using this scheme:
-> */etc/bird{4|6}/filters/filter*-**TIMESTAMP**. *Timestamp* is: YYYYMMDD-HHMM. I.e. */etc/bird4/filters/filter-20170705-2030*
-> */etc/bird{4|6}/functions/function*-**TIMESTAMP**. *Timestamp* is: YYYYMMDD-HHMM. I.e. */etc/bird4/functions/function-20170705-2030*
-
-- *Button* **Load File**: Click this button to Load the file selected in the *{filter|function} Files* list. This button **must** be pressed in order to edit the target file.
-- *Read Only Text Box* **Editing File**: This Read-Only field is empty by default. It will get populated with the target file to edit. 
-> **Caution**: Only if this field shows a file path, the contents of the target file can be edited and saved. 
-
-- *Text Area* **File Contents**: This text area will show the contents of the file shown in the *Editting File*. Save the contents of this text area by pressing the Button **Submit**
-> Use **spaces** instead of **tabs** for indentation.
-
-> **Caveat**: If you save your filter or function using the *New File* option, until you refresh the page, the **saved** file will still appear as *New File*. However, the file will be created and correctly stored and you will be able to edit it with no problems.
-> After refreshing the page, your file will appear normally together with a new *New File* option.
-> This behaviour will be enhanced in future versions.
-
-#### Common Errors
-Most common errors produced by Filters and Functions are:
-
-- Syntax errors: `bird: /etc/bird4/filters/filter-20170507-0951, line 4: syntax error` 
-> This instances require you to check where your errors is following Bird's hints.
-
-- Non-existing filter: `bird: /tmp/bird4.conf, line 71: No such filter.`
-> Check your Filter name or define it in the **Filters Page**
-
-- Calls to functions not defined in the Functions files or not part of the Bird filter/function definition *language*: `, line 4: You can't call something which is not a function. Really.`
-> Check you Function definition, your call name or Bird's official documentation to get the right reference.
-
-#### Critical Errors
-There are some critical errors that could escape from first sight as Bird Daemon will start working *correctly*.
-
-If you set your Filter **without** *accept* or *reject* calls, your filter will fail to work and let all the routes pass by as accepted. This will be shown in the **Log Page**:
-
-Example: **Filter "doNothing"**
-```
-filter doNothing
-{
-    print "HelloWorld";
-}
-```
-This *wrong* filter has been used in our BGP instance and Bird Daemon runs correctly. However, if we check the **Log Page** we find:
-```
-2017-05-07 10:18:49 <ERR> Filter doNothing did not return accept nor reject. Make up your mind
-2017-05-07 10:18:49 <INFO> HelloWorld
-```
-> Do not leave any filter without *accept* or *reject* calls to avoid this wrong behaviour that will incurr in a waste of resources.
\ No newline at end of file
diff --git a/bird1-openwrt/README.md b/bird1-openwrt/README.md
deleted file mode 100644 (file)
index 6cba865..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-# bird-openwrt
-
-Package for OpenWRT to bring integration with UCI and LUCI to Bird4 and Bird6 daemon.
-
-This repository contains an UCI module adding support for an user-friendly configuration of the BIRD daemon in OpenWRT systems and a LuCI application to control this UCI configuration using the web-based OpenWRT configuration system.
-
-**Package Names**: luci-app-bird{4|6} and bird{4|6}-uci
-
-**Dependences**: +bird{4|6} +libuci +luci-base +uci +libuci-lua
-
-**Last Version**: 0.3
-
-**Terminal (UCI) Documentation**: [Link](https://github.com/eloicaso/bird-openwrt/blob/master/UCI-DOCUMENTATION.md)
-
-**Web (LUCI) Documentation**: [Link](https://github.com/eloicaso/bird-openwrt/blob/master/LUCI-DOCUMENTATION.md)
-
-
-## Known issues (v0.3):
-* There is an issue with pre-built images. It seems that the UCI-Default Scripts are not applied for some reason. If you face this situation, just copy both packages in your /tmp and and execute "opkg install PackageName.ipk --force-reinstall". It will overwrite your /etc/config/bird{4|6}, create a backup of this configuration.
-
-* LUCI Material Design Theme shows a "Loading page" in **Logs Page** preventing it to load. Moreover, the OpenWRT Theme crashes loading the **Log Page**.
-Please, go to `System -> Language and Style -> Design` and change it to any other avaiable Theme (*Bootstrap* or *Freifunk_Generic* are recommended).
-
-* There is a manual procedure to designate custom Routing Table IDs created through this package's UI. Please, visit [this page](https://github.com/eloicaso/bgp-bmx6-bird-docn/blob/master/EN/manual_procedures.md) for more details.
-
-## How to compile:
-Due to the existence of Routing's bird-openwrt packages, if you want to build your system using this repo's bird packages, you need to proceed as follows:
-
-
-* Add this github as a repository in feeds.conf. Alternatively, you could use a local git clone)
-```
-src-git birdwrt https://github.com/eloicaso/bird-openwrt.git
-
-```
-OR
-```
-src-link birdwrt /path/to/your/git/clone/bird-openwrt
-```
-
-* Disable OpenWRT-Routing repository to avoid getting the outdated package
-```
-# src-git routing https://github.com/openwrt-routing/packages.git
-```
-
-* Update and install all packages in feeds
-```
-./scripts/feeds update -a; ./scripts/feeds install -a
-```
-
-* Enable OpenWRT-Routing repository to fulfill bird{4/6} dependencies
-```
-src-git routing https://github.com/openwrt-routing/packages.git
-./scripts/feeds update routing; ./scripts/feeds install bird4 bird6
-```
-
-* Compile (Option 1) the whole OpenWRT image with the package included
-```
-make menuconfig -> Network -> Routing and Redirection -> Select bird*-uci
-                -> LuCI -> 3. Applications -> Select luci-app-bird*
-make V=99
-```
-
-* Compile (Option 2) the packet ( ! this method requires to compile its dependeces before using Option 1)
-```
-make package/feeds/birdwrt/bird{4/6}-openwrt/compile V=99
-```
-
-* Find your package in
-```
-[OpenWRT_folder]/bin/packages/{Architecture}/routing/bird{4/6}-uci_{Version}_{Architecture}.ipk
-[OpenWRT_folder]/bin/packages/{Architecture}/routing/luci-app-bird{4/6}_{Version}_{Architecture}.ipk
-```
-
-* Install your .ipk in your dev-environment (avoid CheckSum Missmatch issues)
-```
-scp bird{4/6}-uci_{Version}_{Architecture}.ipk user@IPAddres:/tmp
-
-On your Dev-Environment:
-opkg install bird{4/6}-uci_{Version}_{Architecture}.ipk --force-checksum
-```
diff --git a/bird1-openwrt/UCI-DOCUMENTATION.md b/bird1-openwrt/UCI-DOCUMENTATION.md
deleted file mode 100644 (file)
index 0661ed8..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-<!--
----------------------------------------------------------------------
-(C) 2014 - 2017 Eloi Carbo <eloicaso@openmailbox.org>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
----------------------------------------------------------------------
--->
-
-# Bird{4|6} UCI Packages Documentation
-*  BIRD Daemon's original documentation: http://bird.network.cz/?get_doc
-* Usage examples (Gitlab): https://gitlab.labs.nic.cz/labs/bird/wikis/home
-* Extra documentation in English & Catalan: https://github.com/eloicaso/bgp-bmx6-bird-docn
-* If you want to add new options to bird*-openwrt packages add a pull request or issue in: https://github.com/eloicaso/bird-openwrt
-
-### Options used in /etc/config/bird{4|6}
-> *Clarification*: Any reference to **{4|6}** in this document means that it applies to both Bird4 and Bird6 packages and configurations. Otherwise, the text will clarify which specific package is affected by it.
-
-#### CONFIGURATION SECTION 1: 'bird'
-Usage example :
-``` Bash
-config bird 'bird'
-    option use_UCI_config '1'
-    option UCI_config_file '/tmp/bird4.conf'
-```
-
-* **use_UCI_config**: *Boolean*
-This option allows you to use package's UCI configuration translation instead of using the original Bird config file (hand-edited). If true/1, birdX init.d script will use the translation placed in "UCI_config_file". Otherwise, it will use the default "/etc/birdX.conf" configuration.
-**\[HINT**\] This could be used to allow multiple configurations and swap them easily.
-*Default: 0*
-
-* **UCI_config_file**: *String* File_path
-This option sets where will be placed the translation of the UCI configuration file.
-*Default: /tmp/birdX.conf*
-
-
-#### CONFIGURATION SECTION 2: 'global NAME'
-Usage example:
-```Bash
-config global 'global'
-    option log_file '/tmp/bird4.log'
-    option log 'all'
-    option debug 'off'
-    option router_id '172.16.1.6'
-```
-
-* **log_file**: *String* File_path
-This option sets the path of the file used to save Bird Log and Debug's information.
-*Default: /tmp/bird{4|6}.log*
-
-* **log**: *String/Enumeration* (all/off, info, warning, error, fatal, debug, trace, remote, auth, bug)
-This option allows you to set which information you want to save in the Log file.
-**\[HINT\]** Use the enumeration like: { info, waning, error }. Do not enter any extra option if you select "all" (Bird will fail to start).
-*Default: all*
-
-* **debug**: *String/Enumeration* ( all/off, states, routes, filters, interfaces, events, packets)
-This option allows you to set which **extra** debug information will be saved in the "log_file" file.
-**\[HINT\]** Use the enumeration like: { info, waning, error }. Do not enter any extra option if you select "all" (Bird will fail to start).
-*Default: off*
-
-* **router_id**: IP Address
-This option sets which will be the Router ID.
-**\[HINT\]** In **Bird4** this field is the lowest IP address (not loopback) among the existing interfaces by default (Optional property).
-In **Bird6** there is no default value and it is mandatory.
-
-* **listen_bgp_addr**: IP Address
-This option sets the IP address that Bird BGP instances will listen by default.
-*Default: 0.0.0.0*
-
-* **listen_bgp_port**: *Integer* Port
-This option sets the port that Bird BGP instances will listen by default.
-*Default: IP 0.0.0.0 and Port 179*
-
-* **listen_bgp_dual**: *Boolean*
-**\[Bird6\]** This option configures Bird6 BGP instances to listen only IPv6 or IPv4/6 BGP routes.
-
-
-#### <a name="table"></a>CONFIGURATION SECTION 3: 'table'
-Usage example:
-``` Bash
-config table
-    option name 'aux'
-```
-
-* **name**: *String*
-This option allows you to set the name of the auxiliar kernel tables used for Bird. This option is mandatory for most of the protocols.
-
-
-#### CONFIGURATION SECTION 4: 'kernel NAME'
-Usage example:
-``` Bash
-config kernel kernel1
-    option table 'aux'
-    option import 'all'
-    option export 'all'
-    option kernel_table '100'
-    option scan_time '10'
-    option learn '1'
-    option persist '0'
-    option disabled '0'
-```
-
-* **table**: *String*
-Set an auxiliary table for the current kernel routing instance. This table **MUST** exist as a [table](#table) instance.
-**\[HINT\]** If there is an Kernel protocol instance that uses the "main" kernel table, not using table/kernel_table options, this should be included before the rest of Kernel instances (which will use auxiliary tables).
-
-* **import**: *String/Filter* function
-This option delimits which routes coming from other protocols will be accepted. 
-Options are:
-**All/none**: allows to import all the routes or none of them.
-**Filter name**: \[import 'bgp_filter_in'\] the protocol will use the filter with the given name (Specified filter **must** exists in any file under /etc/bird{4|6}/filters/ folder).
-
-* export: String/Filter function
-This option delimits which routes going out from the protocol. This option allows filters in different manners:
-**All/none**: allows to export all the routes or none of them.
-**Filter name**: \[export 'bgp_filter_out'\] the protocol will use the filter with the given name(Specified filter **must** exists in any file under /etc/bird{4|6}/filters/ folder).
-
-* **kernel_table**: *Integer*
-This option sets the identification number of the Kernel table that will be used instead of the main one.
-*Default: main table (254)*
-
-* **scan_time**: *Integer*
-This option sets the time between checks to target kernel table.
-
-* **learn**: *Boolean*
-Set if kernel table will add the routes from other routing protocols or the system administrator.
-
-* **persist**: *Boolean*
-Set if Bird Daemon will save the known routes when exiting or if it will clean the routing table.
-
-* **disable**: *Boolean*
-This option sets if the protocol will be used or dismissed.
-*Default: 0*
-
-
-#### CONFIGURATION SECTION 5: 'device NAME'
-Usage example:
-``` Bash
-config device device1
-    option scan_time '10'
-    option disabled '0'
-```
-
-* **scan_time***: *Integer*
-This option sets the time between checks to the selected kernel table.
-
-* **disable**: *Boolean*
-This option sets if the protocol will be used or dismissed.
-*Default: 0*
-
-
-#### CONFIGURATION SECTION 6: 'static NAME'
-Usage example:
-``` Bash
-config static static1
-    option table 'aux'
-    option disabled '0'
-```
-
-* **table**: *String*
-Set an auxiliary table for the current static instance. This table **MUST** exist as a [table](#table) instance.
-**\[HINT\]** If there is an static instance that uses the "main" kernel table (not using table/kernel_table options), this should be included before the rest of static instances (which will use auxiliary tables).
-
-* **disable**: *Boolean*
-This option sets if the protocol will be used or dismissed.
-*Default: 0*
-
-
-#### CONFIGURATION SECTION 7 & 8: 'bgp NAME' & 'bgp_template NAME'
-This section merges two different configuration sections: BGP *instances* and *templates*. The first one is the basic BGP configuration part and the second one is the template used to minimize the number of options written in the configuration file for each unique instance. Both configuration sections have the same options but, when Bird finds duplicities, the instance will overwrite the template options.
-
-Usage examples:
-``` Bash
-# instance
-config bgp bgp1
-    option template 'bgp_common'
-    option description 'Description of the BGP instance'
-    option neighbor_address '172.16.1.5'
-    option neighbor_as '65530'
-    option source_address '172.16.1.6'
-    option next_hop_self '0'
-    option next_hop_keep '0'
-    option rr_client '1'
-    option rr_cluster_id '172.16.1.6'
-```
-
-``` Bash
-# template
-config bgp_template bgp_common
-    option table 'aux'
-    option import 'all'
-    option export 'all'
-    option local_address '172.16.1.6'
-    option local_as '65001'
-    option import_limit '100'
-    option import_limit_action 'warn'
-    option export_limit '100'
-    option export_limit_action 'warn'
-    option receive_limit '100'
-    option receive_limit_action 'warn'
-    option disabled '0'
-```
-
-* **template**: *String*
-This option states the template used for current BGP instance. This template MUST exist.
-
-* **description**: *String*
-This option allows to add a description of the bgp instance and its function.
-
-* **local_addr**: IP address
-This option allows to set the IP source of our Autonomous System (AS).
-
-* **local_as**: *Integer*
-This option allows to set the identification number of our AS number. This option is mandatory for each BGP instance.
-
-* **neighbor_addr**: IP address 
-Each BGP instance has a neighbor connected to. This option allows to set its IP address.
-
-* **neighbor_as**: *Integer*
-Each BGP instance has a neighbor connected to. This option allows to set its AS ID.
-
-* **next_hop_self**: *Boolean*
-If this option is true, BGP protocol will avoid to calculate the next hop and always advertise own "Router id" IP.
-*Default: 0*
-
-* **next_hop_keep**: *Boolean*
-If this option is true, BGP will always use the received next_hop information to redirect the route.
-*Default: 0*
-
-* **rr_client**: *Boolean*
-IF this option is true, the router will be set as Route Reflector and will treat the rest of the routers as RR clients.
-*Default: 0*
-
-* **rr_cluster_id**: *Integer*
-This option sets the identification number of the RR cluster. All the nodes in a cluster needs this option and share the same number.
-*Default: Router id*
-
-* **import_limit**: *Integer*
-This option sets the limit of routes that a protocol can import until take the action indicated in the import_limit_action.
-import_limit also counts filtered routes (even dropped ones).
-*Default: 0 (no limit)*
-
-* **import_limit_action**: *String*
-This option allows to decide the action to take when reached the limit of imported routes.
-Actions are: warn, block, restart, disable
-
-* **export_limit**: *Integer*
-This option sets the limit of routes that a protocol can export until take the action indicated in the export_limit_action.
-*Default: 0 (no limit)*
-
-* **export_limit_action**: *String*
-This option allows to decide the action to take when reached the limit of exported routes.
-Actions are: warn, block, restart, disable
-
-* **receive_limit**: *Integer*
-This option sets the limit of routes that a protocol can receive until take the action indicated in the receive_limit_action. receive_limit only counts accepted routes from the protocol.
-*Default: 0 (no limit)*
-
-* **receive_limit_action**: *String*
-This option allows to decide the action to take when reached the limit of received routes.
-Actions are: warn, block, restart, disable
-
-* **disable**: *Boolean*
-This option sets if the protocol will be used or dismissed.
-*Default: 0*
-
-
-#### CONFIGURATION SECTION 9: 'route' 
-Usage example:
-``` Bash
-config route
-    option instance 'static1'
-    option type 'router'
-    option prefix '192.168.9.0/24'
-    option via '10.99.105.159'
-
-config route
-    option instance 'static1'
-    option type 'special'
-    option prefix '192.168.2.0/24'
-    option attribute 'unreachable'
-
-config route
-    option instance 'static1'
-    option type 'iface'
-    option prefix '192.168.3.0/24'
-    option iface 'mgmt0'
-
-config route
-    option instance 'static1'
-    option type 'recursive'
-    option prefix '192.168.4.0/24'
-    option ip '192.168.1.1'
-
-config route
-    option instance 'static1'
-    option type 'multipath'
-    option prefix '192.168.30.0/24'
-    list l_via '172.16.1.5'
-    list l_via '172.16.1.6'
-```
-
-* **instance**: *String*
-This option indicates the route that the static protocol instance will apply.
-
-* **type**: *String*
-This option states the type of route that will be applied. Also defines the options available for it.
-Types are: 'router', 'special', 'iface', 'recursive' or 'multipath'.
-
-* **prefix**: IP address/network
-This option allows to define the network that you want to define.
-**\[router only\]** 
-**via**: IP Address
-This option indicates the IP address of the neighbor router where the routes will pass through.
-**\[special only\]**
-**attribute**: *String*
-This option will mark the behaviour of the route.
-Attribures are: 'blackhole', 'unreachable' or 'prohibit'.
-**\[iface only\]**
-**iface**: *String*
-This option indicates the interface used to redirect the BGP routes. Careful, the interface MUST exist, or Bird will fail to start.
-**\[recursive only\]**
-**ip**: IP address
-This option states the IP address which the next hop will depend on.
-**\[multipath only\]**
-This is a list, not an option. Use it as in the example, or check the UCI configuration documentation.
-**l_via**: IP address
-This list of IPs specifies the list (following the sequence) of routers that the route will follow as next hops.
-
-
-#### CONFIGURATION SECTION 10 & 11: 'filter NAME' & 'function Name'
-Filters are written in separated files under **/etc/bird{4|6}/filters/** and **/etc/bird{4|6}/functions/**. Their syntax can be found [here.](http://bird.network.cz/?get_doc&f=bird-5.html)
-The content of each filter and file file will be included in the resulting bird{4|6}.conf file without checking its syntax, so you could find errors during start time.
-
-* Clarification for any existing **v0.2** user: an automated upgrade path has been added to switch your old "filter" or "function" sections. It is safe to upgrade, but doing regular backups of your key files is always a good practise to avoid frustration.
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/Makefile b/bird1-openwrt/bird1-ipv4-openwrt/Makefile
deleted file mode 100644 (file)
index 781d5d8..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-# Copyright (C) 2014-2017  Eloi Carbo <eloicaso@openmailbox.org>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-include $(TOPDIR)/rules.mk
-include $(INCLUDE_DIR)/kernel.mk
-
-BIRD := bird4
-BIRD_PKG := bird1-ipv4
-PKG_NAME := $(BIRD_PKG)-openwrt
-PKG_VERSION := 0.3
-PKG_RELEASE := 1
-PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
-PKG_LICENSE := GPL-3.0+
-uci := $(BIRD_PKG)-uci
-luci := luci-app-$(BIRD_PKG)
-
-include $(INCLUDE_DIR)/package.mk
-
-define Build/Prepare
-endef
-define Build/Compile
-endef
-
-define Package/$(uci)
-  TITLE:=The BIRD UCI module (v1.6) (IPv4)
-  SECTION:=net
-  CATEGORY:=Network
-  SUBMENU:=Routing and Redirection
-  MAINTAINER:=Eloi Carbo <eloicaso@openmailbox.org>
-  URL:=https://github.com/eloicaso/bird-openwrt/
-  DEPENDS:=+$(BIRD_PKG) +libuci +uci
-endef
-
-define Package/$(uci)/description
-$(BIRD_PKG) UCI integration module
-endef
-
-define Package/$(uci)/conffiles
-       /etc/config/$(BIRD)
-endef
-
-define Package/$(uci)/install
-       $(INSTALL_DIR) $(1)/etc/$(BIRD)/init.d
-       $(INSTALL_DIR) $(1)/etc/config
-       $(INSTALL_DIR) $(1)/etc/$(BIRD)/filters
-       $(INSTALL_DIR) $(1)/etc/$(BIRD)/functions
-       $(INSTALL_BIN) ./src/init.d/$(BIRD)* $(1)/etc/$(BIRD)/init.d/
-       $(CP) ./src/uci-defaults/* $(1)/etc/$(BIRD)/init.d/
-       $(INSTALL_CONF) ./src/config/$(BIRD) $(1)/etc/config/
-endef
-
-define Package/$(uci)/postinst
-#!/bin/sh
-    if [ -z "$${IPKG_INSTROOT}" ]; then
-        ( . /etc/$(BIRD)/init.d/bird-uci-install-init.d $(BIRD) ) && rm -f /etc/$(BIRD)/init.d/bird-uci-install-init.d
-        ( . /etc/$(BIRD)/init.d/99-relocate-filters $(BIRD) ) && rm -f /etc/$(BIRD)/init.d/99-relocate-filters
-        if [ -f /etc/sysupgrade.conf ] && ! grep $(BIRD) /etc/sysupgrade.conf; then
-            echo /etc/config/$(BIRD) >> /etc/sysupgrade.conf
-            echo /etc/$(BIRD)/filters/ >> /etc/sysupgrade.conf
-            echo /etc/$(BIRD)/functions/ >> /etc/sysupgrade.conf
-        fi
-    fi
-endef
-
-$(eval $(call BuildPackage,$(uci)))
-
-define Package/$(luci)
-  TITLE:=LuCI support for $(BIRD_PKG)
-  SECTION:=luci
-  CATEGORY:=LuCI
-  SUBMENU:=3. Applications
-  MAINTAINER:=Eloi Carbo <eloicaso@openmailbox.org>
-  URL:=https://github.com/eloicaso/bird-openwrt/
-  DEPENDS:=+$(BIRD_PKG)-uci +luci-base
-endef
-
-define Package/$(luci)/description
-$(BIRD) application for LuCI
-endef
-
-define Package/$(luci)/install
-       $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller/
-       $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/$(BIRD)/
-       $(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/$(BIRD)/
-       $(CP) ./src/model/* $(1)/usr/lib/lua/luci/model/cbi/$(BIRD)/
-       $(CP) ./src/controller/* $(1)/usr/lib/lua/luci/controller/
-       $(CP) ./src/view/* $(1)/usr/lib/lua/luci/view/$(BIRD)/
-endef
-
-$(eval $(call BuildPackage,$(luci)))
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/config/bird4 b/bird1-openwrt/bird1-ipv4-openwrt/src/config/bird4
deleted file mode 100644 (file)
index f822f99..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-config bird 'bird'
-    option use_UCI_config '1'
-        #Caution! Enabling this option, Bird will translate this
-        #UCI file and use it instead of /etc/bird4.conf
-    option UCI_config_file '/tmp/bird4.conf'
-        #If you enable useUCIconfig, UCIconfigFile will be Bird's
-        #configuration file location.
-
-config global 'global'
-    option log_file '/tmp/bird4.log'
-    option log 'all'
-    option debug 'off'
-
-config table
-    option name 'aux'
-
-config kernel kernel1
-    option table 'aux'
-    option import 'all'
-    option export 'all'
-    option kernel_table '100'
-    option scan_time '10'
-    option learn '1'
-    option persist '0'
-    option disabled '0'
-
-config device device1
-    option scan_time '10'
-    option disabled '0'
-
-config static static1
-    option table 'aux'
-    option disabled '0'
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/controller/bird4.lua b/bird1-openwrt/bird1-ipv4-openwrt/src/controller/bird4.lua
deleted file mode 100644 (file)
index d12803a..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
---[[ 
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
---]]
-
-module("luci.controller.bird4", package.seeall)
-
-function index()
-        entry({"admin", "network", "bird4",},
-            alias("admin", "network", "bird4", "status"),
-            _("Bird4"), 0)
-
-        entry({"admin", "network", "bird4", "status"},
-            cbi("bird4/status"),
-            _("Status"), 0).leaf = true
-
-        entry({"admin","network","bird4","log"},
-            template("bird4/log"),
-            _("Log"), 1).leaf = true
-
-        entry({"admin", "network", "bird4", "overview"},
-            cbi("bird4/overview"),
-            _("Overview"), 2).leaf = true
-
-        entry({"admin","network","bird4","proto_general"},
-            cbi("bird4/gen_proto"),
-            _("General protocols"), 3).leaf = true
-
-        entry({"admin","network","bird4","proto_bgp"},
-            cbi("bird4/bgp_proto"),
-            _("BGP Protocol"), 4).leaf = true
-
-        entry({"admin","network","bird4","filters"},
-            cbi("bird4/filters"),
-            _("Filters"), 5).leaf = true
-
-        entry({"admin","network","bird4","functions"},
-            cbi("bird4/functions"),
-            _("Functions"), 6).leaf = true
-end
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/init.d/bird4 b/bird1-openwrt/bird1-ipv4-openwrt/src/init.d/bird4
deleted file mode 100755 (executable)
index e5fe473..0000000
+++ /dev/null
@@ -1,233 +0,0 @@
-#!/bin/sh /etc/rc.common
-
-# Copyright (C) 2014-2017 - Eloi Carbo
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-# Extra Service Function to get the Status of the Service
-# This complements /etc/rc.common functions
-# Commands ending with *_quiet are meant to be ran in Luci. These
-# scripts' return minimal output.
-EXTRA_COMMANDS="status start_quiet stop_quiet restart_quiet status_quiet"
-EXTRA_HELP="        status  Returns service status"
-
-BIRD="bird4"
-BIRD_CONFIG="/etc/${BIRD}.conf"
-BIRD_LOG="/var/log/${BIRD}.log"
-BIRD_ERR="/tmp/${BIRD}.err"
-
-START=99
-STOP=10
-
-SERVICE_DAEMONIZE=1
-SERVICE_USE_PID=1
-SERVICE_PID_FILE="/var/run/${BIRD}.pid"
-
-BIRD_BIN="/usr/sbin/${BIRD}"
-# Special non-terminal-rich output for Luci calls
-LUCI="false"
-
-. /etc/${BIRD}/init.d/${BIRD}-lib.sh
-
-start() {
-    config_load ${BIRD}
-    local use_UCI_config
-    get use_UCI_config 'bird'
-
-    #Start the service
-    if [ "${LUCI}" == "false" ]; then
-        echo "Starting ${BIRD} Service [ ... ]"
-    fi
-    if [ -f ${BIRD_ERR} ]; then
-        echo -n "" > ${BIRD_ERR}
-    else
-        touch ${BIRD_ERR}
-    fi
-
-    if [ -z "${use_UCI_config}" -o "${use_UCI_config}" = "0" ]; then
-        # Disable Custom bird-openwrt settings.
-        # Use default behaviour and files
-        ${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &> ${BIRD_ERR} &
-    else
-        #Set Bird4 configuration location:
-        local UCI_config_file
-        local log_file
-        get UCI_config_file 'bird'
-        get log_file 'global'
-        BIRD_CONFIG="${UCI_config_file:-$BIRD_CONFIG}"
-        BIRD_LOG="${log_file:-$BIRD_LOG}"
-        #Backup previous configuration
-        [ -f ${BIRD_CONFIG} ] && cp ${BIRD_CONFIG} ${BIRD_CONFIG}.bak
-        #Setup the basic configuration
-        prepare_global 'global'
-
-        # Gather and set all Functions
-        gather_functions
-        # Gather and set all Filters
-        gather_filters
-
-        # Setup Main Protocols
-        config_foreach prepare_kernel 'kernel'
-        config_foreach prepare_static 'static'
-        config_foreach prepare_device 'device'
-        config_foreach prepare_direct 'direct'
-        config_foreach prepare_pipe 'pipe'
-
-        #Setup protocol's configuration: BGP
-        config_foreach prepare_bgp_template 'bgp_template'
-        config_foreach prepare_bgp 'bgp'
-
-        #Setup protocol's configuration: OSPF
-        config_foreach prepare_ospf_instance 'ospf'
-
-        #Start the service
-        ${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &>${BIRD_ERR} &
-    fi
-    while [ ! -s ${SERVICE_PID_FILE} ]; do
-        sleep 1
-        if [ -s ${BIRD_ERR} ]; then
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} Daemon Start Status: \033[0;31m[ FAILED ]\e[m"
-                cat ${BIRD_ERR}
-                cat ${BIRD_ERR} >> ${BIRD_LOG}
-            else
-                echo "${BIRD} - Failed: $(cat ${BIRD_ERR})"
-                cat ${BIRD_ERR} >> ${BIRD_LOG}
-            fi
-            break
-        fi
-    done
-
-    # PID & ERROR contents are read from their files to avoid an issue
-    # where if [ -s ${SERVICE_PID_FILE} ] and if [ -s ${BIRD_ERR} ]
-    # fails unless a previous command reads its contents making its
-    # behaviour unreliable.
-    SVC_PID="$(cat ${SERVICE_PID_FILE})"
-    BRDERR_TXT="$(cat ${BIRD_ERR})"
-    if [ -n "${SVC_PID}" ]; then
-        if [ -n "${BRDERR_TXT}" ]; then
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} Daemon already started. Status \033[0;32m[ RUNNING ]\e[m"
-            else
-                echo "${BIRD} already started"
-            fi
-        else
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} Daemon Start Status: \033[0;32m[ STARTED ]\e[m"
-            else
-                echo "${BIRD} - Started"
-            fi
-        fi
-        # PID File found (service started correctly)
-        return 0
-    fi
-
-    # PID File not found (error while starting service)
-    return 1
-}
-
-stop() {
-    if [ -s ${SERVICE_PID_FILE} ]; then
-        config_load ${BIRD}
-        local log_file
-        get log_file 'global'
-        BIRD_LOG="${log_file:-$BIRD_LOG}"
-        start-stop-daemon -p ${SERVICE_PID_FILE} -K 2>&1 >> ${BIRD_LOG}
-        if [ $? -eq 0 ]; then
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} Daemon Stop Status: \033[0;32m[ OK ]\e[m"
-            else
-                echo "${BIRD} - Stopped"
-            fi
-            echo -n "" > ${BIRD_ERR}
-        else
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} Daemon Stop Status: \033[0;31m[ FAILED ]\e[m"
-                echo "Check ${BIRD_LOG} file for more information."
-            else
-                echo "${BIRD} Failed to Stop. See Log file: ${BIRD_LOG}"
-            fi
-        fi
-    else
-        if [ "${LUCI}" == "false" ]; then
-            echo -e "${BIRD} Daemon Service already stopped. \033[0;31m[ FAILED ]\e[m"
-        else
-            echo "${BIRD} already stopped"
-        fi
-    fi
-    return 0
-}
-
-restart() {
-    stop
-    sleep 1
-    if [ "${LUCI}" == "true" ]; then
-        echo " ... "
-    fi
-    start
-}
-
-reload() {
-    service_reload ${BIRD_BIN}
-}
-
-status() {
-    if [ -s ${SERVICE_PID_FILE} ]; then
-        if [ "${LUCI}" == "false" ]; then
-            echo -e "${BIRD} start status: \033[0;32m[ RUNNING ]\e[m"
-        else
-            echo "${BIRD}: Running"
-        fi
-        return 0
-    else
-        if [ -s ${BIRD_ERR} ]; then
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m"
-                cat ${BIRD_ERR}
-            else
-                echo "${BIRD}: Failed - $(cat ${BIRD_ERR})"
-            fi
-            return 2
-        else
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m"
-            else
-                echo "${BIRD}: Stopped"
-            fi
-            return 1
-        fi
-    fi
-}
-
-
-# Luci-specific calls (stripped output).
-# The following scripts are not meant to be ran using Ash Terminal
-# Used in: LUCI/model/cbi/bird4/status.lua
-start_quiet() {
-    LUCI="true"
-    start
-}
-stop_quiet() {
-    LUCI="true"
-    stop
-}
-restart_quiet() {
-    LUCI="true"
-    restart
-}
-status_quiet() {
-    LUCI="true"
-    status
-}
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/init.d/bird4-lib.sh b/bird1-openwrt/bird1-ipv4-openwrt/src/init.d/bird4-lib.sh
deleted file mode 100644 (file)
index 7248a97..0000000
+++ /dev/null
@@ -1,587 +0,0 @@
-# Bird4-OpenWRT Library - Functions used in /etc/init.d/bird4 script.
-#
-#
-# Copyright (C) 2014-2017 - Eloi Carbo
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-
-# Function: writeToConfig $1
-# $1 string.
-# Allows to write in the $BIRD_CONFIG file, the string $1. This function does not check the $1 string.
-# Example: writeToConfig "value: $N"
-writeToConfig() {
-    echo "$1" >> ${BIRD_CONFIG}
-}
-
-
-# Function: write $1 $2
-# $1 string. $2 string.
-# This function checks if $2 is empty. If not, it writes the string $1 in the $BIRD_CONFIG file.
-# Use write function to check if $1, value found inside $2, is not empty and can be written in the configuration file.
-# Example: N=""; write "value: $N" $N;
-write() {
-    [ -n "$2" ] && writeToConfig "$1"
-}
-
-
-#Function: write_bool $1 $2
-# $1 string; $2 boolean
-# This function checks if $2 is true and write the $1 string into $BIRD_CONFIG file.
-# Example: local N=0; write_bool $N
-write_bool() {
-    [ "$2" == 1 ] && writeToConfig "    $1;"
-}
-
-
-# Function: get $1 $2
-# $1 string. $2 string
-# This function uses the external UCI function "config_get $result $section $option" to obtain a string value from UCI config file.
-# To use this function, use the same name of the UCI option for the variable.
-# Example: UCI (option id 'abcd'); local id; get id $section
-get() {
-    config_get $1 $2 $1
-}
-
-
-# Function: get_bool $1 $2
-# $1 boolean. $2 string
-# This function uses the external UCI function "config_get_bool $result $section $option" to obtain a boolean value from UCI config file.
-# To use this function, use the same name of the UCI option for the variable $1.
-# Example: UCI (option use_ipv6 '1'); local use_ipv6; get use_ipv6 $section
-get_bool() {
-    config_get_bool $1 $2 $1
-}
-
-
-# Function: multipath_list $1
-# $1 string
-# This function writes the $1 string in the multipath routes.
-multipath_list() {
-    write "          via $1" $1
-}
-
-
-# Function: range_list $1
-# $1 string
-# This function writes the $1 string in the OSPF networks.
-range_list(){
-    write "            $1;" $1
-}
-
-
-# Function: hidden_range_list $1
-# $1 string
-# This function writes the $1 string in the OSPF networks as hidden.
-hidden_range_list(){
-   write "            $1 hidden;" $1
-}
-
-
-# Function: prepare_tables $1
-# $1 string
-# This function gets each "table" section in the UCI configuration and sets each option in the bird4.conf file.
-# $1 is set as the ID of the current UCI table section
-prepare_tables() {
-    local section="$1"; local name
-
-    get name ${section}
-
-    write "table ${name};" ${name}
-}
-
-
-# Function: prepare_global $1
-# $1 string
-# This function gets each "global" section in the UCI configuration and sets each option in the bird4.conf file.
-# $1 is set as the ID of the current UCI global section. prepare_global is the first configuration set in the bird4.conf and removes the old file.
-prepare_global () {
-    local section="$1"
-    local log_file; local log; local debug; local router_id; local table
-
-    # Remove old configuration file
-    rm -f "${BIRD_CONFIG}"
-
-    get log_file ${section}
-    get log ${section}
-    get debug ${section}
-    get router_id ${section}
-    get table ${section}
-
-    # First line of the NEW configuration file
-    echo "#Bird4 configuration using UCI:" > ${BIRD_CONFIG}
-    writeToConfig " "
-    #TODO: Set Syslog as receiver if empty
-    #    LOGF="${log_file:-syslog]}"
-    #TODO: If $log/$debug are empty, set to off
-    if [ -n "${log_file}" -a -n "${log}" ]; then
-        firstEntry="${log:0:3}"
-        if [ "${firstEntry}" = "all" -o "${firstEntry}" = "off" ]; then
-            writeToConfig 'log "'${log_file}'" '${firstEntry}';'
-        else
-            logEntries=$(echo ${log} | tr " " ",")
-            writeToConfig "log \"${log_file}\" { ${logEntries} };"
-        fi
-    fi
-
-    if [ -n "${debug}" ]; then
-        firstEntry="${debug:0:3}"
-        if [ "${firstEntry}" = "all" -o "${firstEntry}" = "off" ]; then
-            writeToConfig "debug protocols ${firstEntry};"
-        else
-            debugEntries=$(echo ${debug} | tr " " ",")
-            writeToConfig "debug protocols { ${debugEntries} };"
-        fi
-    fi
-    writeToConfig " "
-    writeToConfig "#Router ID"
-    write "router id ${router_id};" ${router_id}
-    writeToConfig " "
-    writeToConfig "#Secondary tables"
-    config_foreach prepare_tables 'table'
-    writeToConfig " "
-}
-
-
-# Function: prepare_routes $1
-# $1 string
-# This function gets each "route" section in the UCI configuration and sets each option in the bird4.conf file.
-# $1 is set as the ID of the current UCI route section. Each type of route has its own treatment.
-prepare_routes() {
-    local instance; local prefix; local via; local type; local attribute; local iface
-    local section="$1"
-    local protoInstance="$2"
-
-    get instance ${section}
-    get type ${section}
-    get prefix ${section}
-
-    if [ "${instance}" = "${protoInstance}" ]; then
-        case "${type}" in
-            "router")
-                get via ${section}
-                [ -n "${prefix}" -a -n "${via}" ] && writeToConfig "    route ${prefix} via ${via};"
-                ;;
-            "special")
-                get attribute ${section}
-                [ -n "${prefix}" -a -n "${attribute}" ] && writeToConfig "    route ${prefix} ${attribute};"
-                ;;
-            "iface")
-                get iface ${section}
-                [ -n "${prefix}" -a -n "${iface}" ] && writeToConfig '    route '${prefix}' via "'${iface}'";'
-                ;;
-            "multipath")
-                write "    route ${prefix} multipath" ${prefix}
-                config_list_foreach ${section} l_via multipath_list
-                writeToConfig "        ;"
-                ;;
-        esac
-    fi
-}
-
-
-# Function: prepare_kernel $1
-# $1 string
-# This function gets each "kernel" protocol section in the UCI configuration and sets each option in the bird4.conf file.
-# $1 is set as the ID of the current UCI kernel section.
-prepare_kernel() {
-    local section="$1"
-    local disabled; local table; local kernel_table; local import; local export
-    local scan_time; local persist; local learn
-
-    get_bool disabled ${section}
-    get table ${section}
-    get import ${section}
-    get export ${section}
-    get scan_time ${section}
-    get kernel_table ${section}
-    get learn ${section}
-    get persist ${section}
-
-    write "#${section} configuration:" ${section}
-    writeToConfig "protocol kernel ${section} {" ${section}
-    write_bool disabled ${disabled}
-    write "    table ${table};" ${table}
-    write "    kernel table ${kernel_table};" ${kernel_table}
-    write_bool learn ${learn}
-    write_bool persist ${persist}
-    write "    scan time ${scan_time};" ${scan_time}
-    write "    import ${import};" ${import}
-    write "    export ${export};" ${export}
-    writeToConfig "}"
-    writeToConfig " "
-}
-
-
-# Function: prepare_static $1
-# $1 string
-# This function gets each "static" protocol section in the UCI configuration and sets each option in the bird4.conf file.
-# $1 is set as the ID of the current UCI static section.
-prepare_static() {
-    local section="$1"
-    local disabled; local table
-
-    get disabled ${section}
-    get table ${section}
-
-    if [ "${disabled}" -eq 0 ]; then
-        writeToConfig "#${section} configration:" ${section}
-        writeToConfig "protocol static {"
-        write "    table ${table};" ${table}
-        config_foreach prepare_routes 'route' ${section}
-        writeToConfig "}"
-        writeToConfig " "
-    fi
-}
-
-
-# Function: prepare_direct $1
-# $1 string
-# This function gets each "direct" protocol section in the UCI configuration and sets each option in the bird4.conf file.
-# $1 is set as the ID of the current UCI direct section.
-prepare_direct() {
-    local section="$1"
-    local disabled; local interface
-
-    get disabled ${section}
-    get interface ${section}
-
-    write "#${section} configuration:" ${section}
-    writeToConfig "protocol direct {"
-    write_bool disabled ${disabled}
-    write "    interface ${interface};" ${interface}
-    writeToConfig "}"
-    writeToConfig " "
-}
-
-
-# Function: prepare_pipe $1
-# $1 string
-# This function gets each "pipe" protocol section in the UCI configuration an
-# $1 is set as the ID of the current UCI direct section.
-prepare_pipe() {
-    local section="$1"
-    local disabled; local table; local peer_table; local mode; local import; local export
-
-    get disabled $section
-    get peer_table $section
-    get mode $section
-    get table $section
-    get import $section
-    get export $section
-
-    write "#$section configuration:" $section
-    writeToConfig "protocol pipe $section {" $section
-    write_bool disabled $disabled
-    write "    table $table;" $table
-    write "    peer table $peer_table;" $peer_table
-    write "    mode $mode;" $mode
-    write "    import $import;" $import
-    write "    export $export;" $export
-    writeToConfig "}"
-    writeToConfig " "
-}
-
-
-# Function: prepare_device $1
-# $1 string
-# This function gets each "device" protocol section in the UCI configuration and sets each option in the bird4.conf file.
-# $1 is set as the ID of the current UCI device section.
-prepare_device() {
-    local section="$1"
-    local disabled; local scan_time
-
-    get disabled ${section}
-    get scan_time ${section}
-
-    write "#${section} configuration:" ${section}
-    writeToConfig "protocol device {"
-    write_bool disabled ${disabled}
-    write "    scan time ${scan_time};" ${scan_time}
-    writeToConfig "}"
-    writeToConfig " "
-}
-
-
-# Function: prepare_bgp_template $1
-# $1 string
-# This function gets each "bgp_template" protocol section in the UCI configuration and sets each option in the bird4.conf file.
-# $1 is set as the ID of the current UCI bgp_template section.
-# Careful! Template options will be replaced by "instance" options if there is any match.
-prepare_bgp_template() {
-    local section="$1"
-    local disabled; local table; local import; local export
-    local local_as; local neighbor_address; local neighbor_as; local source_address
-    local next_hop_self; local next_hop_keep; local rr_client; local rr_cluster_id
-    local import_limit; local import_limit_action; local export_limit; local export_limit_action
-    local receive_limit; local receive_limit_action; local igp_table
-
-    get_bool disabled ${section}
-    get table ${section}
-    get import ${section}
-    get export ${section}
-    get source_address ${section}
-
-    get local_as ${section}
-    get neighbor_address ${section}
-    get neighbor_as ${section}
-
-    get_bool next_hop_self ${section}
-    get_bool next_hop_keep ${section}
-    get rr_client ${section}
-    get rr_cluster_id ${section}
-
-    get import_limit ${section}
-    get import_limit_action ${section}
-    get export_limit ${section}
-    get export_limit_action ${section}
-
-    get receive_limit ${section}
-    get receive_limit_action ${section}
-    get igp_table ${section}
-
-    writeToConfig "#${section} template:"
-    writeToConfig "template bgp ${section} {"
-    [ -n "${disabled}" ] && write_bool disabled ${disabled}
-    [ -n "${table}" ] && writeToConfig "    table ${table};"
-    [ -n "${igp_table}" ] && writeToConfig "    igp table ${igp_table};"
-    [ -n "${local_as}" ] && writeToConfig "    local as ${local_as};"
-    [ -n "${source_address}" ] && writeToConfig "    source address ${source_address};"
-    [ -n "${import}" ] && writeToConfig "    import ${import};"
-    [ -n "${export}" ] && writeToConfig "    export ${export};"
-    [ -n "${neighbor_address}" -a -n "${neighbor_as}" ] && writeToConfig "    neighbor ${neighbor_address} as ${neighbor_as};"
-    if [ -n "${import_limit}" -a "${import_limit}" > "0" ]; then
-        [ -z "${import_limit_action}" ] && ${import_limit_action} = "warn"
-        writeToConfig "    import limit ${import_limit} action ${import_limit_action};"
-    fi
-    if [ -n "${export_limit}" -a "${export_limit}" > "0" ]; then
-        [ -z "${export_limit_action}" ] && ${export_limit_action} = "warn"
-        writeToConfig "    export limit ${export_limit} action ${export_limit_action};"
-    fi
-    if [ -n "${receive_limit}" -a "${receive_limit}" > "0" ]; then
-        [ -z "${receive_limit_action}" ] && ${receive_limit_action} = "warn"
-        writeToConfig "    receive limit ${receive_limit} action ${receive_limit_action};"
-    fi
-    [ -n "${next_hop_self}" ] && write_bool "    next hop self;" ${next_hop_self}
-    [ -n "${next_hop_keep}" ] && write_bool "    next hop keep;" ${next_hop_keep}
-    [ -n "${rr_client}" ]     && write_bool "    rr client;" ${rr_client}
-    [ -n "${rr_cluster_id}" ] && writeToConfig "    rr cluster id ${rr_cluster_id};"
-    writeToConfig "}"
-    writeToConfig " "
-}
-
-
-# Function: prepare_bgp $1
-# $1 string
-# This function gets each "bgp" protocol section in the UCI configuration and sets each option in the bird4.conf file.
-# $1 is set as the ID of the current UCI bgp section.
-# Careful! The options set in bgp instances overlap bgp_template ones.
-prepare_bgp() {
-    local section="$1"
-    local disabled; local table; local template; local description; local igp_table; local passive
-    local import; local export; local source_address; local local_as; local neighbor_address
-    local neighbor_as; local rr_client; local rr_cluster_id; local import_limit
-    local import_limit_action; local export_limit; local export_limit_action
-    local receive_limit; local receive_limit_action; local igp_table
-
-    get disabled ${section}
-    get table ${section}
-    get igp_table ${section}
-    get template ${section}
-    get description ${section}
-    get passive ${section}
-
-    get import ${section}
-    get export ${section}
-    get source_address ${section}
-    get local_as ${section}
-    get neighbor_address ${section}
-
-    get neighbor_as ${section}
-    get import_limit ${section}
-    get import_limit_action ${section}
-    get export_limit ${section}
-    get export_limit_action ${section}
-
-    get receive_limit ${section}
-    get receive_limit_action ${section}
-    get_bool next_hop_self ${section}
-    get_bool next_hop_keep ${section}
-    get rr_client ${section}
-    get rr_cluster_id ${section}
-
-    writeToConfig "#${section} configuration:"
-    [ -n "${template}" ] && writeToConfig "protocol bgp ${section} from ${template} {" \
-                         || writeToConfig "protocol bgp ${section} {"
-    [ -n "${disabled}" ] && write_bool disabled ${disabled}
-    [ -n "${table}" ] && writeToConfig "    table ${table};"
-    [ -n "${igp_table}" ] && writeToConfig "    igp table ${igp_table};"
-    [ -n "${passive}" ] && writeToConfig "    passive;" ${passive}
-    [ -n "${local_as}" ] && writeToConfig "    local as ${local_as};"
-    [ -n "${source_address}" ] && writeToConfig "    source address ${source_address};"
-    [ -n "${import}" ] && writeToConfig "    import ${import};"
-    [ -n "${export}" ] && writeToConfig "    export ${export};"
-    [ -n "${neighbor_address}" -a -n "${neighbor_as}" ] && writeToConfig "    neighbor ${neighbor_address} as ${neighbor_as};"
-    if [ -n "${import_limit}" -a "${import_limit}" > "0" ]; then
-        [ -z "${import_limit_action}" ] && ${import_limit_action} = "warn"
-        writeToConfig "    import limit ${import_limit} action ${import_limit_action};"
-    fi
-    if [ -n "${export_limit}" -a "${export_limit}" > "0" ]; then
-        [ -z "${export_limit_action}" ] && ${export_limit_action} = "warn"
-        writeToConfig "    export limit ${export_limit} action ${export_limit_action};"
-    fi
-    if [ -n "${receive_limit}" -a "${receive_limit}" > "0" ]; then
-        [ -z "${receive_limit_action}" ] && ${receive_limit_action} = "warn"
-        writeToConfig "    receive limit ${receive_limit} action ${receive_limit_action};"
-    fi
-    [ -n "${next_hop_self}" ] && write_bool "    next hop self;" ${next_hop_self}
-    [ -n "${next_hop_keep}" ] && write_bool "    next hop keep;" ${next_hop_keep}
-    [ -n "${rr_client}" ] && write_bool "    rr client;" ${rr_client}
-    [ -n "${rr_cluster_id}" ] && writeToConfig "    rr cluster id ${rr_cluster_id};"
-    writeToConfig "}"
-    writeToConfig " "
-}
-
-
-#Function: prepare_ospf_network $1
-# $1 string $2 string
-# This function gets each "ospf_network" protocol section in the UCI configuration, checks if its Area ID is the same as the one
-# being configurated and finally sets the list of network ranges to be propagated, or not, by the OSPF protocol
-# $1 is set as the ID of the action area of the internal networks.
-# $2 is set as the ID of the current area being configurated.
-prepare_ospf_networks() {
-    local section="$1"
-    local current_area="$2"
-
-    if [ "${section}" = "${current_area}" ]; then
-        writeToConfig "        networks {"
-        config_list_foreach ${section} range range_list
-        config_list_foreach ${section} hidden_range hidden_range_list
-        writeToConfig "        };"
-    fi
-}
-
-
-# Function: prepare_ospf_password $1 $2
-prepare_ospf_passwords() {
-    local section="$1"
-    local current_interface="$2"
-    local interface; local passphrase
-
-    get interface $section
-    get passphrase $section
-
-    [ "current_interface" = "${interface}" ] && write '            password "$passphrase";' ${passphrase}
-}
-
-
-# Function: prepare_ospf_neighbors $1 $2
-#prepare_ospf_neighbors() {
-#}
-
-
-# Function: prepare_ospf_interface $1 $2
-prepare_ospf_interface() {
-    local section="$1"
-    local current_area="$2"
-    local area; local cost; local type; local hello; local priority; local retransmit; local authentication
-
-    get area ${section}
-    get cost ${section}
-    get type ${section}
-    get hello ${section}
-    get priority ${section}
-    get retransmit ${section}
-
-    if [ "${current_area}" = "${area}" ]; then
-        writeToConfig '        interface "$section" {'
-        write "            cost ${cost};" ${cost}
-        write "            hello ${hello};" ${hello}
-        write "            type ${type};" ${type}
-        write "            retransmit ${retransmit};" ${retransmit}
-        write "            authentication ${authentication};" ${authentication}
-        config_foreach prepare_ospf_passwords "ospf_password" ${section}
- #       config_foreach prepare_ospf_neighbors "ospf_neighbor" $section
-        writeToConfig "        };"
-    fi
-}
-
-
-# Function: prepare_ospf_area $1
-prepare_ospf_area() {
-    local section="$1"
-    local instance; local stub; local default_cost
-
-    get instance ${section}
-    get stub ${section}
-    get default_cost ${section}
-
-    writeToConfig "    area ${section} {"
-    if [ -n "${instance}" -a "${instance}" = "${section}" ]; then
-        [ -n "${stub}" -a "${stub}" = "1" ] && writeToConfig "        stub yes;"
-        [ -n "${default_cost}" ] && writeToConfig "        default cost ${default_cost};"
-        config_foreach prepare_ospf_networks "ospf_networks" ${section}
-        config_foreach prepare_ospf_interface "ospf_interface" ${section}
-        writeToConfig "    };"
-    fi
-}
-
-
-# Function: prepare_ospf_instance $1
-# $1 string
-# This function gets each "ospf_area" protocol section in the UCI configuration and sets each option in the bird4.conf file.
-# $1 is set as the ID of the current UCI ospf_area section.
-prepare_ospf_instance() {
-    local section="$1"
-    local cfg1583compat; local tick
-
-    get cfg1583compat ${section}
-    get tick ${section}
-
-    writeToConfig "protocol ospf ${section} {"
-    [ -n "${cfg1583compat}" ] && cfg1583State="yes" || cfg1583State="no"
-    writeToConfig "    rfc1583compat ${cfg1583State};"
-    [ -n "${tick}" ] && writeToConfig "    tick ${tick};"
-    config_foreach prepare_ospf_area 'ospf_area'
-    writeToConfig "}"
-}
-
-
-# Function: gather_filters
-# This function gets all the FILES under /filters folder and adds
-# them into the config as %include elements on top of the file
-# If there are no filters, the section will remain empty.
-gather_filters() {
-    writeToConfig "#Filters Section:"
-    for filter in $(find /etc/${BIRD}/filters -type f); do
-        writeToConfig "include \"${filter}\";"
-    done
-    writeToConfig "#End of Filters --"
-    writeToConfig " "
-}
-
-
-# Function: gather_functions
-# This function gets all the FILES under /functions folder and adds
-# them into the config as %include elements on top of the file
-# If there are no filters, the section will remain empty.
-gather_functions() {
-    writeToConfig "#Functions Section:"
-    for func in $(find /etc/${BIRD}/functions -type f); do
-        writeToConfig "include \"${func}\";"
-    done
-    writeToConfig "#End of Functions --"
-    writeToConfig " "
-}
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/model/bgp_proto.lua b/bird1-openwrt/bird1-ipv4-openwrt/src/model/bgp_proto.lua
deleted file mode 100644 (file)
index 4c2b951..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
---[[ 
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
---]]
-
-require("luci.sys")
-local http = require "luci.http"
-local uci = luci.model.uci.cursor()
-
--- Repeated Strings
-local common_string = "Valid options are:<br />" .. "1. all (All the routes)<br />" .. "2. none (No routes)<br />" .. "3. filter <b>Your_Filter_Name</b> (Call a specific filter from any of the available in the filters files)"
-local imp_string = "Set if the protocol must import routes.<br />" .. common_string
-local exp_string = "Set if the protocol must export routes.<br />" .. common_string
-
-m=Map("bird4", "Bird4 BGP protocol's configuration")
-
-tab_templates = {}
-uci:foreach('bird4', 'bgp_template', function (s)
-       local name = s[".name"]
-       if (name ~= nil) then
-               table.insert(tab_templates, name)
-       end
-end)
-
---
--- BGP TEMPLATES
---
-sect_templates = m:section(TypedSection, "bgp_template", "BGP Templates", "Configuration of the templates used in BGP instances.")
-sect_templates.addremove = true
-sect_templates.anonymous = false
-
-disabled = sect_templates:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
-disabled.optional=true
-
-table = sect_templates:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
-table.optional=true
-uci:foreach("bird4", "table",
-       function (s)
-               table:value(s.name)
-       end)
-table:value("")
-table.default = ""
-
-igp_table = sect_templates:option(ListValue, "igp_table", "IGP Table", "Select the IGP Routing Table to use. Hint: usually the same table as BGP.")
-igp_table.optional = true
-uci:foreach("bird4", "table",
-function(s)
-    igp_table:value(s.name)
-end)
-igp_table:value("")
-igp_table.default = ""
-
-import = sect_templates:option(Value, "import", "Import", imp_string)
-import.optional=true
-
-export = sect_templates:option(Value, "export", "Export", exp_string)
-export.optional=true
-
-source_addr = sect_templates:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
-source_addr.optional = true
-
-local_as = sect_templates:option(Value, "local_as", "Local AS", "")
-local_as.optional = false
-
-next_hop_self = sect_templates:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
-next_hop_self.default = nil
-next_hop_self.optional = true
-
-next_hop_keep = sect_templates:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
-next_hop_keep.default = nil
-next_hop_keep.optional = true
-
-rr_client = sect_templates:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
-rr_client.default = nil
-rr_client.optional = true
-
-rr_cluster_id = sect_templates:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
-rr_cluster_id.optional = true
-
-import_trigger = sect_templates:option(Flag, "import_trigger", "Import Limit", "Enable Routes Import limit settings")
-import_trigger.default = 0
-import_trigger.rmempty = false
-import_trigger.optional = false
-
-import_limit = sect_templates:option(Value, "import_limit", "Routes import limit", "Specify an import route limit.")
-import_limit:depends({import_trigger = "1"})
-import_limit.rmempty = true
-
-import_limit_action = sect_templates:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
-import_limit_action:depends({import_trigger = "1"})
-import_limit_action:value("warn")
-import_limit_action:value("block")
-import_limit_action:value("disable")
-import_limit_action:value("restart")
-import_limit_action.default = "warn"
-import_limit_action.rmempty = true
-
-export_trigger = sect_templates:option(Flag, "export_trigger", "Export Limit", "Enable Routes Export limit settings")
-export_trigger.default = 0
-export_trigger.rmempty = false
-export_trigger.optional = false
-
-export_limit = sect_templates:option(Value, "export_limit", "Routes export limit", "Specify an export route limit.")
-export_limit:depends({export_trigger = "1"})
-export_limit.rmempty = true
-
-export_limit_action = sect_templates:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
-export_limit_action:depends({export_trigger = "1"})
-export_limit_action.rmempty = true
-export_limit_action:value("warn")
-export_limit_action:value("block")
-export_limit_action:value("disable")
-export_limit_action:value("restart")
-export_limit_action.default = "warn"
-
-receive_trigger = sect_templates:option(Flag, "receive_trigger", "Received Limit", "Enable Routes Received Limit settings")
-receive_trigger.default = 0
-receive_trigger.rmempty = false
-receive_trigger.optional = false
-
-receive_limit = sect_templates:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit.")
-receive_limit:depends({receive_trigger = "1"})
-receive_limit.rmempty = true
-
-receive_limit_action = sect_templates:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
-receive_limit_action:depends({receive_trigger = "1"})
-receive_limit_action:value("warn")
-receive_limit_action:value("block")
-receive_limit_action:value("disable")
-receive_limit_action:value("restart")
-receive_limit_action.default = "warn"
-receive_limit_action.rmempty= true
-
---
--- BGP INSTANCES
---
-sect_instances = m:section(TypedSection, "bgp", "BGP Instances", "Configuration of the BGP protocol instances")
-sect_instances.addremove = true
-sect_instances.anonymous = false
-
-disabled = sect_instances:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
-disabled.optional = false
-disabled.rmempty = false
-disabled.default = nil
-
-templates = sect_instances:option(ListValue, "template", "Templates", "Available BGP templates")
-uci:foreach("bird4", "bgp_template",
-       function(s)
-               templates:value(s[".name"])
-       end)
-templates:value("")
-
-description = sect_instances:option(TextValue, "description", "Description", "Description of the current BGP instance")
-description.optional = true
-
-table = sect_instances:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
-table.optional=true
-uci:foreach("bird4", "table",
-    function (s)
-        table:value(s.name)
-    end)
-table:value("")
-table.default = ""
-
-igp_table = sect_instances:option(ListValue, "igp_table", "IGP Table", "Select the IGP Routing Table to use. Hint: usually the same table as BGP.")
-igp_table.optional = true
-uci:foreach("bird4", "table",
-function(s)
-    igp_table:value(s.name)
-end)
-igp_table:value("")
-igp_table.default = ""
-
-passive = sect_instances:option(Flag, "passive", "Passive", "Disable automatic initialization of outgoing connections.")
-passive.optional=true
-passive.rmempty = false
-passive.default = nil
-
-import = sect_instances:option(Value, "import", "Import", imp_string)
-import.optional=true
-
-export = sect_instances:option(Value, "export", "Export", exp_string)
-export.optional=true
-
-source_address = sect_instances:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
-source_address.optional = true
-
-local_as = sect_instances:option(Value, "local_as", "Local AS", "")
-local_as.optional=true
-
-neighbor_address = sect_instances:option(Value, "neighbor_address", "Neighbor IP Address", "")
-neighbor_address.optional = false
-
-neighbor_as = sect_instances:option(Value, "neighbor_as", "Neighbor AS", "")
-neighbor_as.optional = false
-
-next_hop_self = sect_instances:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
-next_hop_self.default = nil
-next_hop_self.optional = true
-
-next_hop_keep = sect_instances:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
-next_hop_keep.default = nil
-next_hop_keep.optional = true
-
-rr_client = sect_instances:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
-rr_client.default = nil
-rr_client.optional = true
-
-rr_cluster_id = sect_instances:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
-rr_cluster_id.optional = true
-
-import_trigger = sect_instances:option(Flag, "import_trigger", "Import Limit", "Enable Routes Import limit settings")
-import_trigger.default = 0
-import_trigger.rmempty = false
-import_trigger.optional = false
-
-import_limit = sect_instances:option(Value, "import_limit", "Routes import limit", "Specify an import route limit.")
-import_limit:depends({import_trigger = "1"})
-import_limit.rmempty = true
-
-import_limit_action = sect_instances:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
-import_limit_action:depends({import_trigger = "1"})
-import_limit_action:value("warn")
-import_limit_action:value("block")
-import_limit_action:value("disable")
-import_limit_action:value("restart")
-import_limit_action.default = "warn"
-import_limit_action.rmempty = true
-
-export_trigger = sect_instances:option(Flag, "export_trigger", "Export Limit", "Enable Routes Export limit settings")
-export_trigger.default = 0
-export_trigger.rmempty = false
-export_trigger.optional = false
-
-export_limit = sect_instances:option(Value, "export_limit", "Routes export limit", "Specify an export route limit.")
-export_limit:depends({export_trigger = "1"})
-export_limit.rmempty = true
-
-export_limit_action = sect_instances:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
-export_limit_action:depends({export_trigger = "1"})
-export_limit_action:value("warn")
-export_limit_action:value("block")
-export_limit_action:value("disable")
-export_limit_action:value("restart")
-export_limit_action.default = "warn"
-export_limit_action.rmempty= true
-
-receive_trigger = sect_instances:option(Flag, "receive_trigger", "Received Limit", "Enable Routes Received Limit settings")
-receive_trigger.default = 0
-receive_trigger.rmempty = false
-receive_trigger.optional = false
-
-receive_limit = sect_instances:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit.")
-receive_limit:depends({receive_trigger = "1"})
-receive_limit.rmempty = true
-
-receive_limit_action = sect_instances:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
-receive_limit_action:depends({receive_trigger = "1"})
-receive_limit_action:value("warn")
-receive_limit_action:value("block")
-receive_limit_action:value("disable")
-receive_limit_action:value("restart")
-receive_limit_action.default = "warn"
-receive_limit_action.rmempty= true
-
-
-function m.on_commit(self,map)
-        luci.sys.exec('/etc/init.d/bird4 restart')
-end
-return m
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/model/filters.lua b/bird1-openwrt/bird1-ipv4-openwrt/src/model/filters.lua
deleted file mode 100644 (file)
index 6f352b2..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
---[[
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-]]--
-
-local fs = require "nixio.fs"
-local filters_dir = "/etc/bird4/filters/"
-local lock_file = "/etc/bird4/filter_lock"
-
-m = SimpleForm("bird4", "Bird4 Filters", "<b>INFO:</b> New files are created using Timestamps.<br />In order to make it easier to handle, use SSH to connect to your terminal and rename those files.<br />If your file is not correctly shown in the list, please, refresh your browser.")
-
-s = m:section(SimpleSection)
-files = s:option(ListValue, "Files", "Filter Files:")
-local new_filter = filters_dir .. os.date("filter-%Y%m%d-%H%M")
-
--- New File Entry
-files:value(new_filter, "New File (".. new_filter .. ")")
-files.default = new_filter
-
-local i, file_list = 0, { }
-for filename in io.popen("find " .. filters_dir .. " -type f"):lines() do
-    i = i + 1
-    files:value(filename, filename)
-end
-
-ld = s:option(Button, "_load", "Load File")
-ld.inputstyle = "reload"
-
-st_file = s:option(DummyValue, "_stfile", "Editing file:")
-function st_file.cfgvalue(self, section)
-    if ld:formvalue(section) then
-        fs.writefile(lock_file, files:formvalue(section))
-        return files:formvalue(section)
-    else
-        fs.writefile(lock_file, "")
-        return ""
-    end
-end
-
-area = s:option(Value, "_filters")
-area.template = "bird4/tvalue"
-area.rows = 30
-function area.cfgvalue(self,section)
-    if ld:formvalue(section) then
-        local contents = fs.readfile(files:formvalue(section))
-        if contents then
-            return contents
-        else
-            return ""
-        end
-    else
-        return ""
-    end
-end
-
-function area.write(self, section)
-    local locked_file = fs.readfile(lock_file)
-    if locked_file and not ld:formvalue(section) then
-        local text = self:formvalue(section):gsub("\r\n?", "\n")
-        fs.writefile(locked_file, text)
-        fs.writefile(lock_file, "")
-    end
-end
-
-return m
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/model/functions.lua b/bird1-openwrt/bird1-ipv4-openwrt/src/model/functions.lua
deleted file mode 100644 (file)
index 86d8e9b..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
---[[
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-]]--
-
-local fs = require "nixio.fs"
-local functions_dir = "/etc/bird4/functions/"
-local lock_file = "/etc/bird4/function_lock"
-
-m = SimpleForm("bird4", "Bird4 Functions", "<b>INFO:</b> New files are created using Timestamps.<br />In order to make it easier to handle, use SSH to connect to your terminal and rename those files.<br />If your file is not correctly shown in the list, please, refresh your browser.")
-
-s = m:section(SimpleSection)
-files = s:option(ListValue, "Files", "Function Files:")
-local new_function = functions_dir .. os.date("function-%Y%m%d-%H%M")
-
--- New File Entry
-files:value(new_function, "New File (".. new_function .. ")")
-files.default = new_function
-
-local i, file_list = 0, { }
-for filename in io.popen("find " .. functions_dir .. " -type f"):lines() do
-    i = i + 1
-    files:value(filename, filename)
-end
-
-ld = s:option(Button, "_load", "Load File")
-ld.inputstyle = "reload"
-
-st_file = s:option(DummyValue, "_stfile", "Editing file:")
-function st_file.cfgvalue(self, section)
-    if ld:formvalue(section) then
-        fs.writefile(lock_file, files:formvalue(section))
-        return files:formvalue(section)
-    else
-        fs.writefile(lock_file, "")
-        return ""
-    end
-end
-
-area = s:option(Value, "_functions")
-area.template = "bird4/tvalue"
-area.rows = 30
-function area.cfgvalue(self,section)
-    if ld:formvalue(section) then
-        local contents = fs.readfile(files:formvalue(section))
-        if contents then
-            return contents
-        else
-            return ""
-        end
-    else
-        return ""
-    end
-end
-
-function area.write(self, section)
-    local locked_file = fs.readfile(lock_file)
-    if locked_file and not ld:formvalue(section) then
-        local text = self:formvalue(section):gsub("\r\n?", "\n")
-        fs.writefile(locked_file, text)
-        fs.writefile(lock_file, "")
-    end
-end
-
-return m
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/model/gen_proto.lua b/bird1-openwrt/bird1-ipv4-openwrt/src/model/gen_proto.lua
deleted file mode 100644 (file)
index 1544d18..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
---[[ 
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
---]]
-
-require("luci.sys")
-local http = require "luci.http"
-local uci = luci.model.uci.cursor()
-
--- Repeated Strings
-local common_string = "Valid options are:<br />" .. "1. all (All the routes)<br />" .. "2. none (No routes)<br />" .. "3. filter <b>Your_Filter_Name</b>      (Call a specific filter from any of the available in the filters files)"
-local imp_string = "Set if the protocol must import routes.<br />" .. common_string
-local exp_string = "Set if the protocol must export routes.<br />" .. common_string
-
-m=Map("bird4", "Bird4 general protocol's configuration.")
-
--- Optional parameters lists
-local protoptions = {
-       {["name"]="table", ["help"]="Auxiliar table for routing", ["depends"]={"static","kernel"}},
-       {["name"]="import", ["help"]=imp_string, ["depends"]={"kernel"}},
-       {["name"]="export", ["help"]=exp_string, ["depends"]={"kernel"}},
-       {["name"]="scan_time", ["help"]="Time between scans", ["depends"]={"kernel","device"}},
-       {["name"]="kernel_table", ["help"]="Set which table must be used as auxiliar kernel table", ["depends"]={"kernel"}},
-       {["name"]="learn", ["help"]="Learn routes", ["depends"]={"kernel"}},
-       {["name"]="persist", ["help"]="Store routes. After a restart, routes willstill be configured", ["depends"]={"kernel"}}
-}
-
-local routeroptions = {
-       {["name"]="prefix",["help"]="",["depends"]={"router","special","iface","multipath","recursive"}},
-       {["name"]="via",["help"]="",["depends"]={"router","multipath"}},
-       {["name"]="attribute",["help"]="",["depends"]={"special"}},
-       {["name"]="iface",["help"]="",["depends"]={"iface"}},
-       {["name"]="ip",["help"]="",["depends"]={"recursive"}}
-}
-
-
---
--- KERNEL PROTOCOL
---
-sect_kernel_protos = m:section(TypedSection, "kernel", "Kernel options", "Configuration of the kernel protocols. First Instance MUST be Primary table (no table or kernel_table fields).")
-sect_kernel_protos.addremove = true
-sect_kernel_protos.anonymous = false
-
--- Default kernel parameters
-disabled = sect_kernel_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
-disabled.default=0
-
--- Optional parameters
-for _,o in ipairs(protoptions) do
-       if o.name ~= nil then
-               for _, d in ipairs(o.depends) do
-                       if d == "kernel" then
-                               if o.name == "learn" or o.name == "persist" then
-                                       value = sect_kernel_protos:option(Flag, o.name, translate(o.name), translate(o.help))
-                               elseif o.name == "table" then 
-                                       value = sect_kernel_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
-                                       uci:foreach("bird4", "table",
-                                               function (s)
-                                                       value:value(s.name)
-                                               end)
-                                       value:value("")
-                                       value.default = ""
-                               else
-                                       value = sect_kernel_protos:option(Value, o.name, translate(o.name), translate(o.help))
-                               end
-                               value.optional = true
-                               value.rmempty = true
-                       end
-               end
-
-       end
-end
-
-
---
--- DEVICE PROTOCOL
---
-sect_device_protos = m:section(TypedSection, "device", "Device options", "Configuration of the device protocols.")
-sect_device_protos.addremove = true
-sect_device_protos.anonymous = false
-
--- Default kernel parameters
-
-disabled = sect_device_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
-disabled.default=0
-
--- Optional parameters
-for _,o in ipairs(protoptions) do
-       if o.name ~= nil then
-               for _, d in ipairs(o.depends) do
-                       if d == "device" then
-                               value = sect_device_protos:option(Value, o.name, translate(o.name), translate(o.help))
-                               value.optional = true
-                               value.rmempty = true
-                       end
-               end
-       end
-end
-
-
---
--- PIPE PROTOCOL
---
-sect_pipe_protos = m:section(TypedSection, "pipe", "Pipe options",     "Configuration of the Pipe protocols.")
-sect_pipe_protos.addremove = true
-sect_pipe_protos.anonymous = false
-
--- Default Pipe parameters
-disabled = sect_pipe_protos:option(Flag, "disabled", "Disabled", "If this  option is true, the protocol will not be configured. This protocol will connect the configured 'Table' to the 'Peer Table'.")
-disabled.default=0
-
-table = sect_pipe_protos:option(ListValue, "table", "Table", "Select the Primary Table to connect.")
-table.optional = false
-uci:foreach("bird4", "table",
-  function (s)
-    table:value(s.name)
-  end)
-table:value("")
-table.default = ""
-
-peer_table = sect_pipe_protos:option(ListValue, "peer_table", "Peer Table", "Select the Secondary Table to connect.")
-table.optional = false
-uci:foreach("bird4", "table",
-  function (s)
-    peer_table:value(s.name)
-  end)
-peer_table:value("")
-peer_table.default = ""
-
-mode = sect_pipe_protos:option(ListValue, "mode", "Mode", "Select <b>transparent</b> to retransmit all routes and their attributes<br />Select <b>opaque</b> to retransmit optimal routes (similar to what other protocols do)")
-mode.optional = false
-mode:value("transparent")
-mode:value("opaque")
-mode.default = "transparent"
-
-import = sect_pipe_protos:option(Value, "import", "Import",imp_string)
-import.optional=true
-
-export = sect_pipe_protos:option(Value, "export", "Export", exp_string)
-export.optional=true
-
-
---
--- DIRECT PROTOCOL
---
-sect_direct_protos = m:section(TypedSection, "direct", "Direct options", "Configuration of the Direct protocols.")
-sect_direct_protos.addremove = true
-sect_direct_protos.anonymous = false
-
--- Default Direct parameters
-disabled = sect_direct_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured. This protocol will connect the configured 'Table' to the 'Peer Table'.")
-disabled.optional = false
-disabled.default = 0
-
-interface = sect_direct_protos:option(Value, "interface", "Interfaces", "By default Direct will generate device routes for all the interfaces. To restrict this behaviour, select a number of patterns to match your desired interfaces:" .. "<br />" .. "1. All the strings <b>MUST</b> be quoted: \"pattern\"" .. "<br />" .. "2. Use * (star) to match patterns: \"eth*\" (<b>include</b> all eth... interfaces)" .. "<br />" .. "3. You can add \"-\" (minus) to exclude patterns: \"-em*\" (<b>exclude</b> all em... interfaces)." .. "<br />" .. "4. Separate several patterns using , (coma): \"-em*\", \"eth*\" (<b>exclude</b> em... and <b>include</b> all eth... interfaces).")
-interface.optional = false
-interface.default = "\"*\""
-
-
---
--- STATIC PROTOCOL
---
-sect_static_protos = m:section(TypedSection, "static", "Static options", "Configuration of the static protocols.")
-sect_static_protos.addremove = true
-sect_static_protos.anonymous = false
-
--- Default kernel parameters
-disabled = sect_static_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
-disabled.default=0
-
--- Optional parameters
-for _,o in ipairs(protoptions) do
-    if o.name ~= nil then
-        for _, d in ipairs(o.depends) do
-            if d == "static" then
-                if o.name == "table" then
-                    value = sect_static_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
-                    uci:foreach("bird4", "table",
-                        function (s)
-                            value:value(s.name)
-                        end)
-                    value:value("")
-                    value.default = ""
-                else
-                    value = sect_static_protos:option(Value, o.name, translate(o.name), translate(o.help))
-                end
-                    value.optional = true
-                    value.rmempty = true
-            end
-        end
-    end
-end
-
-
---
--- ROUTES FOR STATIC PROTOCOL
---
-sect_routes = m:section(TypedSection, "route", "Routes configuration", "Configuration of the routes used in static protocols.")
-sect_routes.addremove = true
-sect_routes.anonymous = true
-
-instance = sect_routes:option(ListValue, "instance", "Route instance", "")
-i = 0
-uci:foreach("bird4", "static",
-       function (s)
-               instance:value(s[".name"])
-       end)
-
-prefix = sect_routes:option(Value, "prefix", "Route prefix", "")
-
-type = sect_routes:option(ListValue, "type", "Type of route", "")
-type:value("router")
-type:value("special")
-type:value("iface")
-type:value("recursive")
-type:value("multipath")
-
-valueVia = sect_routes:option(Value, "via", "Via", "")
-valueVia.optional = false
-valueVia:depends("type", "router")
-valueVia.datatype = "ip4addr"
-
-listVia = sect_routes:option(DynamicList, "l_via", "Via", "")
-listVia:depends("type", "multipath")
-listVia.optional=false
-listVia.datatype = "ip4addr"
-
-attribute = sect_routes:option(ListValue, "attribute", "Attribute", "")
-attribute:depends("type", "special")
-attribute:value("unreachable")
-attribute:value("prohibit")
-attribute:value("blackhole")
-
-iface  = sect_routes:option(ListValue, "iface", "Interface", "")
-iface:depends("type", "iface")
-uci:foreach("network", "interface",
-       function(section)
-        if section[".name"] ~= "loopback" then
-            iface:value(section[".name"])
-        end
-       end)
-
-ip =  sect_routes:option(Value, "ip", "IP address", "")
-ip:depends("type", "ip")
-ip.datatype = [[ or"ip4addr", "ip6addr" ]]
-
-function m.on_commit(self,map)
-        luci.sys.exec('/etc/init.d/bird4 restart')
-end
-
-return m
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/model/overview.lua b/bird1-openwrt/bird1-ipv4-openwrt/src/model/overview.lua
deleted file mode 100644 (file)
index 7ebfb55..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
---[[ 
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-]]--
-
-require("luci.sys")
-local http = require "luci.http"
-local uci = require "luci.model.uci"
-local uciout = uci.cursor()
-
-m=Map("bird4", "Bird4 UCI configuration helper", "")
-
--- Named section: "bird"
-
-s_bird_uci = m:section(NamedSection, "bird", "bird", "Bird4 file settings", "")
-s_bird_uci.addremove = False
-
-uuc = s_bird_uci:option(Flag, "use_UCI_config", "Use UCI configuration", "Use UCI configuration instead of the /etc/bird4.conf file")
-
-ucf = s_bird_uci:option(Value, "UCI_config_file", "UCI File", "Specify the file to place the UCI-translated configuration")
-ucf.default = "/tmp/bird4.conf"
-
--- Named Section: "table"
-
-s_bird_table = m:section(TypedSection, "table", "Tables configuration", "Configuration of the tables used in the protocols")
-s_bird_table.addremove = true
-s_bird_table.anonymous = true
-
-name = s_bird_table:option(Value, "name", "Table name", "Descriptor ID of the table")
-
--- Named section: "global"
-
-s_bird_global = m:section(NamedSection, "global", "global", "Global options", "Basic Bird4 settings")
-s_bird_global.addremove = False
-
-id = s_bird_global:option(Value, "router_id", "Router ID", "Identification number of the router. By default, is the router's IP.")
-
-lf = s_bird_global:option(Value, "log_file", "Log File", "File used to store log related data.")
-
-l = s_bird_global:option(MultiValue, "log", "Log", "Set which elements do you want to log.")
-l:value("all", "All")
-l:value("info", "Info")
-l:value("warning","Warning")
-l:value("error","Error")
-l:value("fatal","Fatal")
-l:value("debug","Debug")
-l:value("trace","Trace")
-l:value("remote","Remote")
-l:value("auth","Auth")
-
-d = s_bird_global:option(MultiValue, "debug", "Debug", "Set which elements do you want to debug.")
-d:value("all", "All")
-d:value("states","States")
-d:value("routes","Routes")
-d:value("filters","Filters")
-d:value("interfaces","Interfaces")
-d:value("events","Events")
-d:value("packets","Packets")
-
-function m.on_commit(self,map)
-        luci.sys.exec('/etc/init.d/bird4 restart')
-end
-
-return m
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/model/status.lua b/bird1-openwrt/bird1-ipv4-openwrt/src/model/status.lua
deleted file mode 100644 (file)
index 187bba3..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
---[[
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-]]--
-
-local sys = require "luci.sys"
-
-m = SimpleForm("bird4", "Bird4 Daemon Status Page", "This page let you Start,   Stop, Restart and check Bird4 Service Status.")
-m.reset = false
-m.submit = false
-
-s = m:section(SimpleSection)
-
-start = s:option(Button, "_start", "Start Bird4 Daemon:")
-start.inputtitle = "   Start   "
-start.inputstyle = "apply"
-
-stop = s:option(Button, "_stop", "Stop Bird4 Daemon:")
-stop.inputtitle = "   Stop   "
-stop.inputstyle = "remove"
-
-restart = s:option(Button, "_restart", "Restart Bird4 Daemon:")
-restart.inputtitle = "Restart"
-restart.inputstyle = "reload"
-
-output = s:option(DummyValue, "_value", "Service Status")
-function output.cfgvalue(self, section)
-    local ret = ""
-    if start:formvalue(section) then
-        ret = sys.exec("/etc/init.d/bird4 start_quiet")
-    elseif stop:formvalue(section) then
-        ret = sys.exec("/etc/init.d/bird4 stop_quiet")
-    elseif restart:formvalue(section) then
-        ret = sys.exec("/etc/init.d/bird4 restart_quiet")
-    else
-        ret = sys.exec("/etc/init.d/bird4 status_quiet")
-    end
-    return ret
-end
-
-return m
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/uci-defaults/99-relocate-filters b/bird1-openwrt/bird1-ipv4-openwrt/src/uci-defaults/99-relocate-filters
deleted file mode 100644 (file)
index 97be5eb..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/sh
-
-# This UCI-Defaults script will MOVE any pre-existing filter
-# stored in a file and configured as an UCI item (deprecated)
-# The script will try to match any "filter" Section, get its
-# "file_path" property and move the file (if exists) to the
-# new (v0.3+) default location: /etc/bird{4|6}/filters
-
-[ $# -ne 1 ] && exit 1
-BIRD="$1"
-
-. /lib/functions.sh
-
-# This function will move an existing folder configured on
-# Bird as a "filter" to filters' folder.
-mv_filter() {
-    local section="$1"
-    local file_path
-    config_get file_path ${section} file_path
-
-    if [ -f ${file_path} ]; then
-        mv ${file_path} /etc/${BIRD}/filters/
-    fi
-    uci delete ${BIRD}.${section}
-}
-
-if [ -f /etc/config/${BIRD} ]; then
-    config_load ${BIRD}
-    config_foreach mv_filter 'filter'
-    uci commit ${BIRD}
-fi
-
-exit 0
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/uci-defaults/bird-uci-install-init.d b/bird1-openwrt/bird1-ipv4-openwrt/src/uci-defaults/bird-uci-install-init.d
deleted file mode 100644 (file)
index 28f64d2..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-
-[ $# -ne 1 ] && exit 1
-
-BIRD=$1
-
-EXC=`mount -t overlayfs | grep overlayfs -c`
-
-[ $EXC > 0 ] && rm -r /etc/init.d/${BIRD} || mv /etc/init.d/${BIRD} /etc/${BIRD}/init.d/${BIRD}.orig
-
-ln -s /etc/${BIRD}/init.d/${BIRD} /etc/init.d/${BIRD}
-
-exit 0
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/view/log.htm b/bird1-openwrt/bird1-ipv4-openwrt/src/view/log.htm
deleted file mode 100644 (file)
index 2a85e9f..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<%-
-    -- Only populate textarea through XHR.poll
-    -- "refresh" is present in the URL (.../log?refresh=1)
-    if luci.http.formvalue("refresh") then
-
-        -- Force HTTP Contents to be "text/plain"
-        luci.http.prepare_content("text/plain")
-
-        local sys = require("luci.sys")
-        local uci = require "luci.model.uci".cursor()
-
-        -- Get Log File from Bird's configuration or leave it empty.
-        local log_file = uci:get("bird4", "global", "log_file") or ""
-        local log_size = ""
-        if log_file then
-            log_size = sys.exec("du -h " .. log_file .. " | awk '{print      $1}'")
-            -- Gathering last 30 lines of the Log File.
-            lf = sys.exec("tail -n30 " .. log_file):gsub("\r\n?", "\n")
-        end
-
-        -- Write File used and its contents.
-        luci.http.write("Using Log File: " .. log_file .. " - File Size: " .. log_size .. "\n" .. lf)
-
-        -- Avoid printing the rest of the page (return only text log data)
-        return
-    end
--%>
-
-<%+header%>
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
-<script type="text/javascript">//<![CDATA[
-    // Refresh page each second. Use "refresh=1" as trigger.
-    XHR.poll(1, '<%=url('admin/network/bird4/log')%>', { refresh: 1 },       function(xhrInstance) {
-        var area = document.getElementById('log')
-        area.value = xhrInstance.responseText;
-    });
-//]]></script>
-
-
-<textarea readonly="readonly" style="width: 100%" wrap="on" rows="32"        id="log"><%=lf:pcdata()%></textarea>
-<%+footer%>
diff --git a/bird1-openwrt/bird1-ipv4-openwrt/src/view/tvalue.htm b/bird1-openwrt/bird1-ipv4-openwrt/src/view/tvalue.htm
deleted file mode 100644 (file)
index 7eba122..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<%+cbi/valueheader%>
-       <textarea class="cbi-input-textarea" <% if not self.size then %> style="width: 100%; font: normal 11pt 'Courier New'"<% else %> cols="<%=self.size%>"<% end %> data-update="change"<%= attr("name", cbid) .. attr("id", cbid) .. ifattr(self.rows, "rows") .. ifattr(self.wrap, "wrap")  .. ifattr(self.readonly, "readonly") %>>
-       <%-=pcdata(self:cfgvalue(section))-%>
-       </textarea>
-<%+cbi/valuefooter%>
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/Makefile b/bird1-openwrt/bird1-ipv6-openwrt/Makefile
deleted file mode 100644 (file)
index 939c1ee..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-# Copyright (C) 2014-2017  Eloi Carbo <eloicaso@openmailbox.org>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-include $(TOPDIR)/rules.mk
-include $(INCLUDE_DIR)/kernel.mk
-
-BIRD := bird6
-BIRD_PKG := bird1-ipv6
-PKG_NAME := $(BIRD_PKG)-openwrt
-PKG_VERSION := 0.3
-PKG_RELEASE := 1
-PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
-PKG_LICENSE := GPL-3.0+
-uci := $(BIRD_PKG)-uci
-luci := luci-app-$(BIRD_PKG)
-
-include $(INCLUDE_DIR)/package.mk
-
-define Build/Prepare
-endef
-define Build/Compile
-endef
-
-define Package/$(uci)
-  TITLE:=The BIRD UCI module (v1.6) (IPv6)
-  SECTION:=net
-  CATEGORY:=Network
-  SUBMENU:=Routing and Redirection
-  MAINTAINER:=Eloi Carbo <eloicaso@openmailbox.org>
-  URL:=https://github.com/eloicaso/bird-openwrt/
-  DEPENDS:=+$(BIRD_PKG) +libuci +uci
-endef
-
-define Package/$(uci)/description
-$(BIRD_PKG) UCI integration module
-endef
-
-define Package/$(uci)/conffiles
-       /etc/config/$(BIRD)
-endef
-
-define Package/$(uci)/install
-       $(INSTALL_DIR) $(1)/etc/$(BIRD)/init.d
-       $(INSTALL_DIR) $(1)/etc/config
-       $(INSTALL_DIR) $(1)/etc/$(BIRD)/filters
-       $(INSTALL_DIR) $(1)/etc/$(BIRD)/functions
-       $(INSTALL_BIN) ./src/init.d/$(BIRD)* $(1)/etc/$(BIRD)/init.d/
-       $(CP) ./src/uci-defaults/* $(1)/etc/$(BIRD)/init.d/
-       $(INSTALL_CONF) ./src/config/$(BIRD) $(1)/etc/config/
-endef
-
-define Package/$(uci)/postinst
-#!/bin/sh
-    if [ -z "$${IPKG_INSTROOT}" ]; then
-        ( . /etc/$(BIRD)/init.d/bird-uci-install-init.d $(BIRD) ) && rm -f /etc/$(BIRD)/init.d/bird-uci-install-init.d
-        ( . /etc/$(BIRD)/init.d/99-relocate-filters $(BIRD) ) && rm -f /etc/$(BIRD)/init.d/99-relocate-filters
-        if [ -f /etc/sysupgrade.conf ] && ! grep $(BIRD) /etc/sysupgrade.conf; then
-            echo /etc/config/$(BIRD) >> /etc/sysupgrade.conf
-            echo /etc/$(BIRD)/filters/ >> /etc/sysupgrade.conf
-            echo /etc/$(BIRD)/functions/ >> /etc/sysupgrade.conf
-        fi
-    fi
-endef
-
-$(eval $(call BuildPackage,$(uci)))
-
-define Package/$(luci)
-  TITLE:=LuCI support for $(BIRD_PKG)
-  SECTION:=luci
-  CATEGORY:=LuCI
-  SUBMENU:=3. Applications
-  MAINTAINER:=Eloi Carbo <eloicaso@openmailbox.org>
-  URL:=https://github.com/eloicaso/bird-openwrt/
-  DEPENDS:=+$(BIRD_PKG)-uci +luci-base
-endef
-
-define Package/$(luci)/description
-$(BIRD) application for LuCI
-endef
-
-define Package/$(luci)/install
-       $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller/
-       $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/$(BIRD)/
-       $(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/$(BIRD)/
-       $(CP) ./src/model/* $(1)/usr/lib/lua/luci/model/cbi/$(BIRD)/
-       $(CP) ./src/controller/* $(1)/usr/lib/lua/luci/controller/
-       $(CP) ./src/view/* $(1)/usr/lib/lua/luci/view/$(BIRD)/
-endef
-
-$(eval $(call BuildPackage,$(luci)))
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/config/bird6 b/bird1-openwrt/bird1-ipv6-openwrt/src/config/bird6
deleted file mode 100644 (file)
index 589d57d..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-config bird 'bird'
-    option use_UCI_config '1'
-        #Caution! Enabling this option, Bird will translate this
-        #UCI file and use it instead of /etc/bird6.conf
-    option UCI_config_file '/tmp/bird6.conf'
-        #If you enable useUCIconfig, UCIconfigFile will be Bird's
-        #configuration file location.
-
-config global 'global'
-    option log_file '/tmp/bird6.log'
-    option log 'all'
-    option debug 'off'
-    # This option is set up because is mandatory for Bird6.
-    # Change it to your IPv4 Address or a HEX value.
-    option router_id '0xCAFEBABE'
-
-config table
-    option name 'aux'
-
-config kernel kernel1
-    option table 'aux'
-    option import 'all'
-    option export 'all'
-    option kernel_table '100'
-    option scan_time '10'
-    option learn '1'
-    option persist '0'
-    option disabled '0'
-
-config device device1
-    option scan_time '10'
-    option disabled '0'
-
-config static static1
-    option table 'aux'
-    option disabled '0'
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/controller/bird6.lua b/bird1-openwrt/bird1-ipv6-openwrt/src/controller/bird6.lua
deleted file mode 100644 (file)
index e8ad175..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
---[[ 
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
---]]
-
-module("luci.controller.bird6", package.seeall)
-
-function index()
-        entry({"admin","network","bird6"},
-            alias("admin","network","bird6","status"),
-            _("Bird6"), 0)
-
-        entry({"admin", "network", "bird6", "status"},
-            cbi("bird6/status"),
-            _("Status"), 0).leaf = true
-
-        entry({"admin","network","bird6","log"},
-            template("bird6/log"),
-            _("Log"), 1).leaf = true
-
-        entry({"admin","network","bird6","overview"},
-            cbi("bird6/overview"),
-            _("Overview"), 2).leaf = true
-
-        entry({"admin","network","bird6","proto_general"},
-            cbi("bird6/gen_proto"),
-            _("General protocols"), 3).leaf = true
-
-        entry({"admin","network","bird6","proto_bgp"},
-            cbi("bird6/bgp_proto"),
-            _("BGP Protocol"), 4).leaf = true
-
-        entry({"admin","network","bird6","filters"},
-            cbi("bird6/filters"),
-            _("Filters"), 5).leaf = true
-
-        entry({"admin","network","bird6","functions"},
-            cbi("bird6/functions"),
-            _("Functions"), 6).leaf = true
-end
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/init.d/bird6 b/bird1-openwrt/bird1-ipv6-openwrt/src/init.d/bird6
deleted file mode 100755 (executable)
index 32e16a9..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-#!/bin/sh /etc/rc.common
-
-# Copyright (C) 2014-2017 - Eloi Carbo
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-# Extra Service Function to get the Status of the Service
-# This complements /etc/rc.common functions
-# Commands ending with *_quiet are meant to be ran in Luci. These
-# scripts' return minimal output.
-EXTRA_COMMANDS="status start_quiet stop_quiet restart_quiet status_quiet"
-EXTRA_HELP="        status  Returns service status"
-
-BIRD="bird6"
-BIRD_CONFIG="/etc/${BIRD}.conf"
-BIRD_LOG="/var/log/${BIRD}.log"
-BIRD_ERR="/tmp/${BIRD}.err"
-
-START=99
-STOP=10
-
-SERVICE_DAEMONIZE=1
-SERVICE_USE_PID=1
-SERVICE_PID_FILE="/var/run/${BIRD}.pid"
-
-BIRD_BIN="/usr/sbin/${BIRD}"
-# Special non-terminal-rich output for Luci calls
-LUCI="false"
-
-. /etc/${BIRD}/init.d/${BIRD}-lib.sh
-
-start() {
-    config_load ${BIRD}
-    local use_UCI_config
-    get use_UCI_config 'bird'
-
-    #Start the service
-    if [ "${LUCI}" == "false" ]; then
-        echo "Starting ${BIRD} Service [ ... ]"
-    fi
-    if [ -f ${BIRD_ERR} ]; then
-        echo "" > ${BIRD_ERR}
-    else
-        touch ${BIRD_ERR}
-    fi
-
-    if [ -z "${use_UCI_config}" -o "${use_UCI_config}" = "0" ]; then
-        # Disable Custom bird-openwrt settings.
-        # Use default behaviour and files
-        ${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &> ${BIRD_ERR} &
-    else
-        #Set Bird6 configuration location:
-        local UCI_config_file
-        local log_file
-        get UCI_config_file 'bird'
-        get log_file 'global'
-        BIRD_CONFIG="${UCI_config_file:-$BIRD_CONFIG}"
-        BIRD_LOG="${log_file:-$BIRD_LOG}"
-        #Backup previous configuration
-        [ -f ${BIRD_CONFIG} ] && cp ${BIRD_CONFIG} ${BIRD_CONFIG}.bak
-        #Setup the basic configuration
-        prepare_global 'global'
-
-        # Gather and set all Functions
-        gather_functions
-        # Gather and set all Filters
-        gather_filters
-
-        # Setup Main Protocols
-        config_foreach prepare_kernel 'kernel'
-        config_foreach prepare_static 'static'
-        config_foreach prepare_device 'device'
-        config_foreach prepare_direct 'direct'
-        config_foreach prepare_pipe 'pipe'
-
-        #Setup protocol's configuration: BGP
-        config_foreach prepare_bgp_template 'bgp_template'
-        config_foreach prepare_bgp 'bgp'
-
-        #Setup protocol's configuration: OSPF
-        #config_foreach prepare_ospf_instance 'ospf'
-
-        #Start the service
-        ${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &>${BIRD_ERR} &
-    fi
-    while [ ! -s ${SERVICE_PID_FILE} ]; do
-        sleep 1
-        if [ -s ${BIRD_ERR} ]; then
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} Daemon Start Status: \033[0;31m[ FAILED ]\e[m"
-                cat ${BIRD_ERR}
-                cat ${BIRD_ERR} >> ${BIRD_LOG}
-            else
-                echo "${BIRD} - Failed: $(cat ${BIRD_ERR})"
-                cat ${BIRD_ERR} >> ${BIRD_LOG}
-            fi
-            break
-        fi
-    done
-
-    if [ -s ${SERVICE_PID_FILE} ]; then
-        if [ -s ${BIRD_ERR} ]; then
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} Daemon already started. Status \033[0;32m[ RUNNING ]\e[m"
-            else
-                echo "${BIRD} already started"
-            fi
-        else
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} Daemon Start Status: \033[0;32m[ STARTED ]\e[m"
-            else
-                echo "${BIRD} - Started"
-            fi
-        fi
-        # PID File found (service started correctly)
-        return 0
-    fi
-
-    # PID File not found (error while starting service)
-    return 1
-}
-
-stop() {
-    if [ -s ${SERVICE_PID_FILE} ]; then
-        config_load ${BIRD}
-        local log_file
-        get log_file 'global'
-        BIRD_LOG="${log_file:-$BIRD_LOG}"
-        start-stop-daemon -p ${SERVICE_PID_FILE} -K 2>&1 >> ${BIRD_LOG}
-        if [ $? -eq 0 ]; then
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} Daemon Stop Status: \033[0;32m[ OK ]\e[m"
-            else
-                echo "${BIRD} - Stopped"
-            fi
-        else
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} Daemon Stop Status: \033[0;31m[ FAILED ]\e[m"
-                echo "Check ${BIRD_LOG} file for more information."
-            else
-                echo "${BIRD} Failed to Stop. See Log file: ${BIRD_LOG}"
-            fi
-        fi
-    else
-        if [ "${LUCI}" == "false" ]; then
-            echo -e "${BIRD} Daemon Service already stopped. \033[0;31m[ FAILED ]\e[m"
-        else
-            echo "${BIRD} already stopped"
-        fi
-    fi
-    return 0
-}
-
-restart() {
-    stop
-    sleep 1
-    if [ "${LUCI}" == "true" ]; then
-        echo " ... "
-    fi
-    start
-}
-
-reload() {
-    service_reload ${BIRD_BIN}
-}
-
-status() {
-    if [ -s ${SERVICE_PID_FILE} ]; then
-        if [ "${LUCI}" == "false" ]; then
-            echo -e "${BIRD} start status: \033[0;32m[ RUNNING ]\e[m"
-        else
-            echo "${BIRD}: Running"
-        fi
-        return 0
-    else
-        if [ -s ${BIRD_ERR} ]; then
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m"
-                cat ${BIRD_ERR}
-            else
-                echo "${BIRD}: Failed - $(cat ${BIRD_ERR})"
-            fi
-            return 2
-        else
-            if [ "${LUCI}" == "false" ]; then
-                echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m"
-            else
-                echo "${BIRD}: Stopped"
-            fi
-            return 1
-        fi
-    fi
-}
-
-# Luci-specific calls (stripped output).
-# The following scripts are not meant to be ran using Ash Terminal
-# Used in: LUCI/model/cbi/bird6/status.lua
-start_quiet() {
-    LUCI="true"
-    start
-}
-stop_quiet() {
-    LUCI="true"
-    stop
-}
-restart_quiet() {
-    LUCI="true"
-    restart
-}
-status_quiet() {
-    LUCI="true"
-    status
-}
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/init.d/bird6-lib.sh b/bird1-openwrt/bird1-ipv6-openwrt/src/init.d/bird6-lib.sh
deleted file mode 100644 (file)
index 7d29810..0000000
+++ /dev/null
@@ -1,473 +0,0 @@
-# Bird6-OpenWRT Library - Functions used in /etc/init.d/bird6 script.
-#
-#
-# Copyright (C) 2014-2017 - Eloi Carbo
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-
-# Function: writeToConfig $1
-# $1 string.
-# Allows to write in the $BIRD_CONFIG file, the string $1. This function does not check the $1 string.
-# Example: writeToConfig "value: $N"
-writeToConfig() {
-    echo "$1" >> ${BIRD_CONFIG}
-}
-
-
-# Function: write $1 $2
-# $1 string. $2 string.
-# This function checks if $2 is empty. If not, it writes the string $1 in the $BIRD_CONFIG file.
-# Use write function to check if $1, value found inside $2, is not empty and can be written in the configuration file.
-# Example: N=""; write "value: $N" $N;
-write() {
-    [ -n "$2" ] && writeToConfig "$1"
-}
-
-
-#Function: write_bool $1 $2
-# $1 string; $2 boolean
-# This function checks if $2 is true or false and write the $1 string into $BIRD_CONFIG file.
-# The function writes a # before the $2 string if its false.
-# Example: local N=0; write_bool $N
-write_bool() {
-    [ "$2" == 0 ] && writeToConfig "#   $1;" || writeToConfig "    $1;"
-}
-
-
-# Function: get $1 $2
-# $1 string. $2 string
-# This function uses the external UCI function "config_get $result $section $option" to obtain a string value from UCI config file.
-# To use this function, use the same name of the UCI option for the variable.
-# Example: UCI (option id 'abcd'); local id; get id $section
-get() {
-    config_get $1 $2 $1
-}
-
-
-# Function: get_bool $1 $2
-# $1 boolean. $2 string
-# This function uses the external UCI function "config_get_bool $result $section $option" to obtain a boolean value from UCI config file.
-# To use this function, use the same name of the UCI option for the variable $1.
-# Example: UCI (option use_ipv6 '1'); local use_ipv6; get use_ipv6 $section
-get_bool() {
-    config_get_bool $1 $2 $1
-}
-
-
-# Function: multipath_list $1
-# $1 string
-# This function writes the $1 string in the multipath routes.
-multipath_list() {
-    write "          via $1" $1
-}
-
-
-# Function: prepare_tables $1
-# $1 string
-# This function gets each "table" section in the UCI configuration and sets each option in the bird6.conf file.
-# $1 is set as the ID of the current UCI table section
-prepare_tables() {
-    local section="$1"; local name
-
-    get name ${section}
-
-    write "table ${name};" ${name}
-}
-
-
-# Function: prepare_global $1
-# $1 string
-# This function gets each "global" section in the UCI configuration and sets each option in the bird6.conf file.
-# $1 is set as the ID of the current UCI global section. prepare_global is the first configuration set in the bird6.conf and removes the old file.
-prepare_global () {
-    local section="$1"
-    local log_file; local log; local debug; local router_id; local table
-    local listen_bgp_addr; local listen_bgp_port; local listen_bgp_dual
-
-    # Remove old configuration file
-    rm -f "${BIRD_CONFIG}"
-
-    get log_file ${section}
-    get log ${section}
-    get debug ${section}
-    get router_id ${section}
-    get table ${section}
-    get listen_bgp_addr ${section}
-    get listen_bgp_port ${section}
-    get listen_bgp_dual ${section}
-
-    # First line of the NEW configuration file
-    echo "#Bird6 configuration using UCI:" > ${BIRD_CONFIG}
-    writeToConfig " "
-    #TODO: Set Syslog as receiver if empty
-    #    LOGF="${log_file:-syslog]}"
-    #TODO: If $log/$debug are empty, set to off
-    if [ -n "${log_file}" -a -n "${log}" ]; then
-        firstEntry="${log:0:3}"
-        if [ "${firstEntry}" = "all" -o "${firstEntry}" = "off" ]; then
-            writeToConfig 'log "'${log_file}'" '${firstEntry}';'
-        else
-            logEntries=$(echo ${log} | tr " " ",")
-            writeToConfig "log \"${log_file}\" { ${logEntries} };"
-        fi
-    fi
-
-    if [ -n "${debug}" ]; then
-        firstEntry="${debug:0:3}"
-        if [ "${firstEntry}" = "all" -o "${firstEntry}" = "off" ]; then
-            writeToConfig "debug protocols ${firstEntry};"
-        else
-            debugEntries=$(echo ${debug} | tr " " ",")
-            writeToConfig "debug protocols { ${debugEntries} };"
-        fi
-    fi
-    writeToConfig " "
-    writeToConfig "#Router ID"
-    write "router id ${router_id};" ${router_id}
-    writeToConfig " "
-    writeToConfig "#Secondary tables"
-    config_foreach prepare_tables 'table'
-    if [ -n "${listen_bgp_dual}" -o "${listen_bgp_dual}" = "0" ]; then
-        writeToConfig "listen bgp ${listen_bgp_addr} ${listen_bgp_port} v6only;"
-    else
-        writeToConfig "listen bgp ${listen_bgp_addr} ${listen_bgp_port} dual;"
-    fi
-    writeToConfig " "
-}
-
-
-# Function: prepare_routes $1
-# $1 string
-# This function gets each "route" section in the UCI configuration and sets each option in the bird6.conf file.
-# $1 is set as the ID of the current UCI route section. Each type of route has its own treatment.
-prepare_routes() {
-    local instance; local prefix; local via; local type
-    local section="$1"
-    local protoInstance="$2"
-
-    get instance ${section}
-    get type ${section}
-    get prefix ${section}
-    
-    if [ "${instance}" = "${protoInstance}" ]; then
-        case "${type}" in
-            "router")
-                get via ${section}
-                [ -n "${prefix}" -a -n "${via}" ] && writeToConfig "    route ${prefix} via ${via};"
-                ;;
-            "special")
-                get attribute ${section}
-                [ -n "${prefix}" -a -n "${attribute}" ] && writeToConfig "    route ${prefix} ${attribute};"
-                ;;
-            "iface")
-                get iface ${section}
-                [ -n "${prefix}" -a -n "${iface}" ] && writeToConfig '    route '${prefix}' via "'${iface}'";'
-                ;;
-            "multipath")
-                write "    route ${prefix} multipath" ${prefix}
-                config_list_foreach ${section} l_via multipath_list
-                writeToConfig "        ;"
-                ;;
-        esac
-    fi
-}
-
-
-# Function: prepare_kernel $1
-# $1 string
-# This function gets each "kernel" protocol section in the UCI configuration and sets each option in the bird6.conf file.
-# $1 is set as the ID of the current UCI kernel section.
-prepare_kernel() {
-    local section="$1"
-    local disabled; local table; local kernel_table; local import; local export
-    local scan_time; local persist; local learn
-
-    get_bool disabled ${section}
-    get table ${section}
-    get import ${section}
-    get export ${section}
-    get scan_time ${section}
-    get kernel_table ${section}
-    get learn ${section}
-    get persist ${section}
-
-    write "#${section} configuration:" ${section}
-    writeToConfig "protocol kernel ${section} {" ${section}
-    write_bool disabled ${disabled}
-    write "    table ${table};" ${table}
-    write "    kernel table ${kernel_table};" ${kernel_table}
-    write_bool learn ${learn}
-    write_bool persist ${persist}
-    write "    scan time ${scan_time};" ${scan_time}
-    write "    import ${import};" ${import}
-    write "    export ${export};" ${export}
-    writeToConfig "}"
-    writeToConfig " "
-}
-
-
-# Function: prepare_static $1
-# $1 string
-# This function gets each "static" protocol section in the UCI configuration and sets each option in the bird6.conf file.
-# $1 is set as the ID of the current UCI static section.
-prepare_static() {
-    local section="$1"
-    local disabled; local table
-
-    get disabled ${section}
-    get table ${section}
-
-    if [ "${disabled}" -eq 0 ]; then
-        writeToConfig "#${section} configration:" ${section}
-        writeToConfig "protocol static {"
-        write "    table ${table};" ${table}
-        config_foreach prepare_routes 'route' ${section}
-        writeToConfig "}"
-        writeToConfig " "
-    fi
-}
-
-
-# Function: prepare_direct $1
-# $1 string
-# This function gets each "direct" protocol section in the UCI configuration and sets each option in the bird6.conf file.
-# $1 is set as the ID of the current UCI direct section.
-prepare_direct() {
-    local section="$1"
-    local disabled; local interface
-
-    get disabled ${section}
-    get interface ${section}
-
-    write "#${section} configuration:" ${section}
-    writeToConfig "protocol direct {"
-    write_bool disabled ${disabled}
-    write "    interface ${interface};" ${interface}
-    writeToConfig "}"
-    writeToConfig " "
-}
-
-
-# Function: prepare_pipe $1
-# $1 string
-# This function gets each "pipe" protocol section in the UCI configuration and sets each option in the bird6.conf file.
-# $1 is set as the ID of the current UCI direct section.
-prepare_pipe() {
-    local section="$1"
-    local disabled; local table; local peer_table; local mode; local import; local export
-
-    get disabled ${section}
-    get peer_table ${section}
-    get mode ${section}
-    get table ${section}
-    get import ${section}
-    get export ${section}
-
-    write "#${section} configuration:" ${section}
-    writeToConfig "protocol pipe ${section} {" ${section}
-    write_bool disabled ${disabled}
-    write "    table ${table};" ${table}
-    write "    peer table ${peer_table};" ${peer_table}
-    write "    mode ${mode};" ${mode}
-    write "    import ${import};" ${import}
-    write "    export ${export};" ${export}
-    writeToConfig "}"
-    writeToConfig " "
-}
-
-
-# Function: prepare_device $1
-# $1 string
-# This function gets each "device" protocol section in the UCI configuration and sets each option in the bird6.conf file.
-# $1 is set as the ID of the current UCI device section.
-prepare_device() {
-    local section="$1"
-    local disabled; local scan_time
-
-    get disabled ${section}
-    get scan_time ${section}
-
-    write "#${section} configuration:" ${section}
-    writeToConfig "protocol device {"
-    write_bool disabled ${disabled}
-    write "    scan time ${scan_time};" ${scan_time}
-    writeToConfig "}"
-    writeToConfig " "
-}
-
-
-# Function: prepare_bgp_template $1
-# $1 string
-# This function gets each "bgp_template" protocol section in the UCI configuration and sets each option in the bird6.conf file.
-# $1 is set as the ID of the current UCI bgp_template section.
-# Careful! Template options will be replaced by "instance" options if there is any match.
-prepare_bgp_template() {
-    local section="$1"
-    local disabled; local table; local import; local export; local local_address
-    local local_as; local neighbor_address; local neighbor_as; local source_address
-    local next_hop_self; local next_hop_keep; local rr_client; local rr_cluster_id
-    local import_limit; local import_limit_action; local export_limit; local export_limit_action
-    local receive_limit; local receive_limit_action; local igp_table
-
-    get_bool disabled ${section}
-    get_bool next_hop_self ${section}
-    get_bool next_hop_keep ${section}
-    get table ${section}
-    get import ${section}
-    get export ${section}
-    get local_address ${section}
-    get local_as ${section}
-    get igp_table ${section}
-    get rr_client ${section}
-    get rr_cluster_id ${section}
-    get import_limit ${section}
-    get import_limit_action ${section}
-    get export_limit ${section}
-    get export_limit_action ${section}
-    get receive_limit ${section}
-    get receive_limit_action ${section}
-    get neighbor_address ${section}
-    get neighbor_as ${section}
-
-    writeToConfig "#${section} template:"
-    writeToConfig "template bgp ${section} {"
-    [ -n "${disabled}" ] && write_bool disabled ${disabled}
-    write "    table ${table};" ${table}
-    write "    local as ${local_as};" ${local_as}
-    write "    source address ${local_address};" ${local_address}
-    write "    import ${import};" ${import}
-    write "    export ${export};" ${export}
-    if [ -n "${next_hop_self}" ]; then
-        [ "${next_hop_self}" = "1" ] && writeToConfig "    next hop self;" || writeToConfig "#    next hop self;"
-    fi
-    if [ -n "${next_hop_keep}" ]; then
-        [ "${next_hop_keep}" = "1" ] && writeToConfig "    next hop keep;" || writeToConfig "#    next hop keep;"
-    fi
-    [ -n "${igp_table}" ] && writeToConfig "    igp table ${igp_table};"
-    [ "${rr_client}" = "1" ] && writeToConfig "    rr client;" || writeToConfig "#    rr client;"
-    write "    rr cluster id ${rr_cluster_id};" ${rr_cluster_id}
-    if [ -n "${import_limit}" -a "${import_limit}" > "0" ]; then
-        [ -z "${import_limit_action}" ] && ${import_limit_action} = "warn"
-        writeToConfig "    import limit ${import_limit} action ${import_limit_action};"
-    fi
-    if [ -n "${export_limit}" -a "${export_limit}" > "0" ]; then
-        [ -z "${export_limit_action}" ] && ${export_limit_action} = "warn"
-        writeToConfig "    export limit ${export_limit} action ${export_limit_action};"
-    fi
-    if [ -n "${receive_limit}" -a "${receive_limit}" > "0" ]; then
-        [ -z "${receive_limit_action}" ] && ${receive_limit_action} = "warn"
-        writeToConfig "    receive limit ${receive_limit} action ${receive_limit_action};"
-    fi
-    [ -n "${neighbor_address}" -a -n "${neighbor_as}" ] && writeToConfig "    neighbor ${neighbor_address} as ${neighbor_as};"
-    writeToConfig "}"
-    writeToConfig " "
-}
-
-
-# Function: prepare_bgp $1
-# $1 string
-# This function gets each "bgp" protocol section in the UCI configuration and sets each option in the bird6.conf file.
-# $1 is set as the ID of the current UCI bgp section.
-# Careful! The options set in bgp instances overlap bgp_template ones.
-prepare_bgp() {
-    local section="$1"
-    local disabled; local table; local template; local description; local import
-    local export; local local_address; local local_as; local neighbor_address
-    local neighbor_as; local rr_client; local rr_cluster_id; local import_limit
-    local import_limit_action; local export_limit; local export_limit_action
-    local receive_limit; local receive_limit_action; local igp_table
-
-    get disabled ${section}
-    get table ${section}
-    get template ${section}
-    get description ${section}
-    get import ${section}
-    get export ${section}
-    get local_address ${section}
-    get local_as ${section}
-    get igp_table ${section}
-    get rr_client ${section}
-    get rr_cluster_id ${section}
-    get import_limit ${section}
-    get import_limit_action ${section}
-    get export_limit ${section}
-    get export_limit_action ${section}
-    get receive_limit ${section}
-    get receive_limit_action ${section}
-    get neighbor_address ${section}
-    get neighbor_as ${section}
-
-    writeToConfig "#${section} configuration:"
-    [ -n "${template}" ] && writeToConfig "protocol bgp ${section} from ${template} {" || writeToConfig "protocol bgp ${section} {"
-    [ -n "${disabled}" ] && write_bool disabled ${disabled}
-    write "    table ${table};" ${table}
-    write "    local as ${local_as};" ${local_as}
-    write "    source address ${local_address};" ${local_address}
-    write "    import ${import};" ${import}
-    write "    export ${export};" ${export}
-    if [ -n "${next_hop_self}" ]; then
-        [ "${next_hop_self}" = "1" ] && writeToConfig "    next hop self;" || writeToConfig "#    next hop self;"
-    fi
-    if [ -n "${next_hop_keep}" ]; then
-        [ "${next_hop_keep}" = "1" ] && writeToConfig "    next hop keep;" || writeToConfig "#    next hop keep;"
-    fi
-    [ -n "${igp_table}" ] && writeToConfig "    igp table ${igp_table};"
-    [ "${rr_client}" = "1" ] && writeToConfig "    rr client;" || writeToConfig "#    rr client;"
-    write "    rr cluster id ${rr_cluster_id};" ${rr_cluster_id}
-    if [ -n "${import_limit}" -a "${import_limit}" > "0" ]; then
-        [ -z "${import_limit_action}" ] && ${import_limit_action} = "warn"
-        writeToConfig "    import limit ${import_limit} action ${import_limit_action};"
-    fi
-    if [ -n "${export_limit}" -a "${export_limit}" > "0" ]; then
-        [ -z "${export_limit_action}" ] && ${export_limit_action} = "warn"
-        writeToConfig "    export limit ${export_limit} action ${export_limit_action};"
-    fi
-    if [ -n "${receive_limit}" -a "${receive_limit}" > "0" ]; then
-        [ -z "${receive_limit_action}" ] && ${receive_limit_action} = "warn"
-        writeToConfig "    receive limit ${receive_limit} action ${receive_limit_action};"
-    fi
-    [ -n "${neighbor_address}" -a -n "${neighbor_as}" ] && writeToConfig "    neighbor ${neighbor_address} as ${neighbor_as};"
-    writeToConfig "}"
-    writeToConfig " "
-}
-
-
-# Function: gather_filters
-# This function gets all the FILES under /filters folder and adds
-# them into the config as %include elements on top of the file
-# If there are no filters, the section will remain empty.
-gather_filters() {
-    writeToConfig "#Filters Section:"
-    for filter in $(find /etc/${BIRD}/filters -type f); do
-        writeToConfig "include \"${filter}\";"
-    done
-    writeToConfig "#End of Filters --"
-    writeToConfig " "
-}
-
-
-# Function: gather_functions
-# This function gets all the FILES under /functions folder and adds
-# them into the config as %include elements on top of the file
-# If there are no filters, the section will remain empty.
-gather_functions() {
-    writeToConfig "#Functions Section:"
-    for func in $(find /etc/${BIRD}/functions -type f); do
-        writeToConfig "include \"${func}\";"
-    done
-    writeToConfig "#End of Functions --"
-    writeToConfig " "
-}
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/model/bgp_proto.lua b/bird1-openwrt/bird1-ipv6-openwrt/src/model/bgp_proto.lua
deleted file mode 100644 (file)
index de2c4a7..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
---[[ 
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
---]]
-
-require("luci.sys")
-local http = require "luci.http"
-local uci = luci.model.uci.cursor()
-
--- Repeated Strings
-local common_string = "Valid options are:<br />" .. "1. all (All the routes)<br />" .. "2. none (No routes)<br />" .. "3. filter <b>Your_Filter_Name</b> (Call a specific filter from any of the available in the filters files)"
-local imp_string = "Set if the protocol must import routes.<br />" .. common_string
-local exp_string = "Set if the protocol must export routes.<br />" .. common_string
-
-m=Map("bird6", "Bird6 BGP protocol's configuration")
-
-tab_templates = {}
-uci:foreach('bird6', 'bgp_template', function (s)
-       local name = s[".name"]
-       if (name ~= nil) then
-               table.insert(tab_templates, name)
-       end
-end)
-
---
--- BGP TEMPLATES
---
-sect_templates = m:section(TypedSection, "bgp_template", "BGP Templates", "Configuration of the templates used in BGP instances.")
-sect_templates.addremove = true
-sect_templates.anonymous = false
-
-disabled = sect_templates:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
-disabled.optional=true
-
-description = sect_templates:option(TextValue, "description", "Description", "Description of the current BGP instance")
-description.optional = true
-
-table = sect_templates:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
-table.optional=true
-uci:foreach("bird6", "table",
-       function (s)
-               table:value(s.name)
-       end)
-table:value("")
-table.default = ""
-
-igp_table = sect_templates:option(ListValue, "igp_table", "IGP Table", "Select the IGP Routing Table to use. Hint: usually the same table as BGP.")
-igp_table.optional = true
-uci:foreach("bird6", "table",
-function(s)
-    igp_table:value(s.name)
-end)
-igp_table:value("")
-igp_table.default = ""
-
-import = sect_templates:option(Value, "import", "Import", imp_string)
-import.optional=true
-
-export = sect_templates:option(Value, "export", "Export", exp_string)
-export.optional=true
-
-source_addr = sect_templates:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
-source_addr.optional = true
-
-local_address = sect_templates:option(Value, "local_address", "Local BGP address", "")
-local_address.optional = false
-
-local_as = sect_templates:option(Value, "local_as", "Local AS", "")
-local_as.optional = false
-
-next_hop_self = sect_templates:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
-next_hop_self.default = nil
-next_hop_self.optional = true
-
-next_hop_keep = sect_templates:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
-next_hop_keep.default = nil
-next_hop_keep.optional = true
-
-rr_client = sect_templates:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
-rr_client.default = nil
-rr_client.optional = true
-
-rr_cluster_id = sect_templates:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
-rr_cluster_id.optional = true
-
-import_trigger = sect_templates:option(Flag, "import_trigger", "Import Limit", "Enable Routes Import limit settings")
-import_trigger.default = 0
-import_trigger.rmempty = false
-import_trigger.optional = false
-
-import_limit = sect_templates:option(Value, "import_limit", "Routes import limit", "Specify an import route limit.")
-import_limit:depends({import_trigger = "1"})
-import_limit.rmempty = true
-
-import_limit_action = sect_templates:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
-import_limit_action:depends({import_trigger = "1"})
-import_limit_action:value("warn")
-import_limit_action:value("block")
-import_limit_action:value("disable")
-import_limit_action:value("restart")
-import_limit_action.default = "warn"
-import_limit_action.rmempty = true
-
-export_trigger = sect_templates:option(Flag, "export_trigger", "Export Limit", "Enable Routes Export limit settings")
-export_trigger.default = 0
-export_trigger.rmempty = false
-export_trigger.optional = false
-
-export_limit = sect_templates:option(Value, "export_limit", "Routes export limit", "Specify an export route limit.")
-export_limit:depends({export_trigger = "1"})
-export_limit.rmempty = true
-
-export_limit_action = sect_templates:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
-export_limit_action:depends({export_trigger = "1"})
-export_limit_action.rmempty = true
-export_limit_action:value("warn")
-export_limit_action:value("block")
-export_limit_action:value("disable")
-export_limit_action:value("restart")
-export_limit_action.default = "warn"
-
-receive_trigger = sect_templates:option(Flag, "receive_trigger", "Received Limit", "Enable Routes Received Limit settings")
-receive_trigger.default = 0
-receive_trigger.rmempty = false
-receive_trigger.optional = false
-
-receive_limit = sect_templates:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit.")
-receive_limit:depends({receive_trigger = "1"})
-receive_limit.rmempty = true
-
-receive_limit_action = sect_templates:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
-receive_limit_action:depends({receive_trigger = "1"})
-receive_limit_action:value("warn")
-receive_limit_action:value("block")
-receive_limit_action:value("disable")
-receive_limit_action:value("restart")
-receive_limit_action.default = "warn"
-receive_limit_action.rmempty= true
-
---
--- BGP INSTANCES
---
-sect_instances = m:section(TypedSection, "bgp", "BGP Instances", "Configuration of the BGP protocol instances")
-sect_instances.addremove = true
-sect_instances.anonymous = false
-
-templates = sect_instances:option(ListValue, "template", "Templates", "Available BGP templates")
-uci:foreach("bird6", "bgp_template",
-       function(s)
-               templates:value(s[".name"])
-       end)
-templates:value("")
-
-disabled = sect_instances:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
-disabled.optional = false
-disabled.rmempty = false
-disabled.default = nil
-
-description = sect_instances:option(TextValue, "description", "Description", "Description of the current BGP instance")
-description.optional = true
-
-table = sect_instances:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
-table.optional=true
-uci:foreach("bird6", "table",
-    function (s)
-        table:value(s.name)
-    end)
-table:value("")
-table.default = ""
-
-igp_table = sect_instances:option(ListValue, "igp_table", "IGP Table", "Select the IGP Routing Table to use. Hint: usually the same table as BGP.")
-igp_table.optional = true
-uci:foreach("bird6", "table",
-function(s)
-    igp_table:value(s.name)
-end)
-igp_table:value("")
-igp_table.default = ""
-
-import = sect_instances:option(Value, "import", "Import", imp_string)
-import.optional=true
-
-export = sect_instances:option(Value, "export", "Export", exp_string)
-export.optional=true
-
-source_address = sect_instances:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
-source_address.optional = true
-
-local_address = sect_instances:option(Value, "local_address", "Local BGP address", "")
-local_address.optional=true
-
-local_as = sect_instances:option(Value, "local_as", "Local AS", "")
-local_as.optional=true
-
-neighbor_address = sect_instances:option(Value, "neighbor_address", "Neighbor IP Address", "")
-neighbor_address.optional = false
-
-neighbor_as = sect_instances:option(Value, "neighbor_as", "Neighbor AS", "")
-neighbor_as.optional = false
-
-next_hop_self = sect_instances:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
-next_hop_self.default = nil
-next_hop_self.optional = true
-
-next_hop_keep = sect_instances:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
-next_hop_keep.default = nil
-next_hop_keep.optional = true
-
-rr_client = sect_instances:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
-rr_client.default = nil
-rr_client.optional = true
-
-rr_cluster_id = sect_instances:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
-rr_cluster_id.optional = true
-
-import_trigger = sect_instances:option(Flag, "import_trigger", "Import Limit", "Enable Routes Import limit settings")
-import_trigger.default = 0
-import_trigger.rmempty = false
-import_trigger.optional = false
-
-import_limit = sect_instances:option(Value, "import_limit", "Routes import limit", "Specify an import route limit.")
-import_limit:depends({import_trigger = "1"})
-import_limit.rmempty = true
-
-import_limit_action = sect_instances:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
-import_limit_action:depends({import_trigger = "1"})
-import_limit_action:value("warn")
-import_limit_action:value("block")
-import_limit_action:value("disable")
-import_limit_action:value("restart")
-import_limit_action.default = "warn"
-import_limit_action.rmempty = true
-
-export_trigger = sect_instances:option(Flag, "export_trigger", "Export Limit", "Enable Routes Export limit settings")
-export_trigger.default = 0
-export_trigger.rmempty = false
-export_trigger.optional = false
-
-export_limit = sect_instances:option(Value, "export_limit", "Routes export limit", "Specify an export route limit.")
-export_limit:depends({export_trigger = "1"})
-export_limit.rmempty = true
-
-export_limit_action = sect_instances:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
-export_limit_action:depends({export_trigger = "1"})
-export_limit_action.rmempty = true
-export_limit_action:value("warn")
-export_limit_action:value("block")
-export_limit_action:value("disable")
-export_limit_action:value("restart")
-export_limit_action.default = "warn"
-
-receive_trigger = sect_instances:option(Flag, "receive_trigger", "Received Limit", "Enable Routes Received Limit settings")
-receive_trigger.default = 0
-receive_trigger.rmempty = false
-receive_trigger.optional = false
-
-receive_limit = sect_instances:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit.")
-receive_limit:depends({receive_trigger = "1"})
-receive_limit.rmempty = true
-
-receive_limit_action = sect_instances:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
-receive_limit_action:depends({receive_trigger = "1"})
-receive_limit_action:value("warn")
-receive_limit_action:value("block")
-receive_limit_action:value("disable")
-receive_limit_action:value("restart")
-receive_limit_action.default = "warn"
-receive_limit_action.rmempty= true
-
-function m.on_commit(self,map)
-        luci.sys.exec('/etc/init.d/bird6 restart')
-end
-
-return m
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/model/filters.lua b/bird1-openwrt/bird1-ipv6-openwrt/src/model/filters.lua
deleted file mode 100644 (file)
index fa18759..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
---[[
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-]]--
-
-local fs = require "nixio.fs"
-local filters_dir = "/etc/bird6/filters/"
-local lock_file = "/etc/bird6/filter_lock"
-
-m = SimpleForm("bird6", "Bird6 Filters", "<b>INFO:</b> New files are created using Timestamps.<br />In order to make it easier to handle, use SSH to connect to your terminal and rename those files.<br />If your file is not correctly shown in the list, please, refresh your browser.")
-
-s = m:section(SimpleSection)
-files = s:option(ListValue, "Files", "Filter Files:")
-local new_filter = filters_dir .. os.date("filter-%Y%m%d-%H%M")
-
--- New File Entry
-files:value(new_filter, "New File (".. new_filter .. ")")
-files.default = new_filter
-
-local i, file_list = 0, { }
-for filename in io.popen("find " .. filters_dir .. " -type f"):lines() do
-    i = i + 1
-    files:value(filename, filename)
-end
-
-ld = s:option(Button, "_load", "Load File")
-ld.inputstyle = "reload"
-
-st_file = s:option(DummyValue, "_stfile", "Editing file:")
-function st_file.cfgvalue(self, section)
-    if ld:formvalue(section) then
-        fs.writefile(lock_file, files:formvalue(section))
-        return files:formvalue(section)
-    else
-        fs.writefile(lock_file, "")
-        return ""
-    end
-end
-
-area = s:option(Value, "_filters")
-area.template = "bird6/tvalue"
-area.rows = 30
-function area.cfgvalue(self,section)
-    if ld:formvalue(section) then
-        local contents = fs.readfile(files:formvalue(section))
-        if contents then
-            return contents
-        else
-            return ""
-        end
-    else
-        return ""
-    end
-end
-
-function area.write(self, section)
-    local locked_file = fs.readfile(lock_file)
-    if locked_file and not ld:formvalue(section) then
-        local text = self:formvalue(section):gsub("\r\n?", "\n")
-        fs.writefile(locked_file, text)
-        fs.writefile(lock_file, "")
-    end
-end
-
-return m
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/model/functions.lua b/bird1-openwrt/bird1-ipv6-openwrt/src/model/functions.lua
deleted file mode 100644 (file)
index 466056b..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
---[[
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-]]--
-
-local fs = require "nixio.fs"
-local functions_dir = "/etc/bird6/functions/"
-local lock_file = "/etc/bird6/function_lock"
-
-m = SimpleForm("bird6", "Bird6 Functions", "<b>INFO:</b> New files are created using Timestamps.<br />In order to make it easier to handle, use SSH to connect to your terminal and rename those files.<br />If your file is not correctly shown in the list, please, refresh your browser.")
-
-s = m:section(SimpleSection)
-files = s:option(ListValue, "Files", "Function Files:")
-local new_function = functions_dir .. os.date("function-%Y%m%d-%H%M")
-
--- New File Entry
-files:value(new_function, "New File (".. new_function .. ")")
-files.default = new_function
-
-local i, file_list = 0, { }
-for filename in io.popen("find " .. functions_dir .. " -type f"):lines() do
-    i = i + 1
-    files:value(filename, filename)
-end
-
-ld = s:option(Button, "_load", "Load File")
-ld.inputstyle = "reload"
-
-st_file = s:option(DummyValue, "_stfile", "Editing file:")
-function st_file.cfgvalue(self, section)
-    if ld:formvalue(section) then
-        fs.writefile(lock_file, files:formvalue(section))
-        return files:formvalue(section)
-    else
-        fs.writefile(lock_file, "")
-        return ""
-    end
-end
-
-area = s:option(Value, "_functions")
-area.template = "bird6/tvalue"
-area.rows = 30
-function area.cfgvalue(self,section)
-    if ld:formvalue(section) then
-        local contents = fs.readfile(files:formvalue(section))
-        if contents then
-            return contents
-        else
-            return ""
-        end
-    else
-        return ""
-    end
-end
-
-function area.write(self, section)
-    local locked_file = fs.readfile(lock_file)
-    if locked_file and not ld:formvalue(section) then
-        local text = self:formvalue(section):gsub("\r\n?", "\n")
-        fs.writefile(locked_file, text)
-        fs.writefile(lock_file, "")
-    end
-end
-
-return m
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/model/gen_proto.lua b/bird1-openwrt/bird1-ipv6-openwrt/src/model/gen_proto.lua
deleted file mode 100644 (file)
index d823907..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
---[[ 
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
---]]
-
-require("luci.sys")
-local http = require "luci.http"
-local uci = luci.model.uci.cursor()
-
--- Repeated Strings
-local common_string = "Valid options are:<br />" .. "1. all (All the routes)<br />" .. "2. none (No routes)<br />" .. "3. filter <b>Your_Filter_Name</b>      (Call a specific filter from any of the available in the filters files)"
-local imp_string = "Set if the protocol must import routes.<br />" .. common_string
-local exp_string = "Set if the protocol must export routes.<br />" .. common_string
-
-m=Map("bird6", "Bird6 general protocol's configuration.")
-
--- Optional parameters lists
-local protoptions = {
-       {["name"]="table", ["help"]="Auxiliar table for routing", ["depends"]={"static","kernel"}},
-       {["name"]="import", ["help"]=imp_string, ["depends"]={"kernel"}},
-       {["name"]="export", ["help"]=exp_string, ["depends"]={"kernel"}},
-       {["name"]="scan_time", ["help"]="Time between scans", ["depends"]={"kernel","device"}},
-       {["name"]="kernel_table", ["help"]="Set which table must be used as auxiliar kernel table", ["depends"]={"kernel"}},
-       {["name"]="learn", ["help"]="Learn routes", ["depends"]={"kernel"}},
-       {["name"]="persist", ["help"]="Store routes. After a restart, routes willstill be configured", ["depends"]={"kernel"}}
-}
-
-local routeroptions = {
-       {["name"]="prefix",["help"]="",["depends"]={"router","special","iface","multipath","recursive"}},
-       {["name"]="via",["help"]="",["depends"]={"router","multipath"}},
-       {["name"]="attribute",["help"]="",["depends"]={"special"}},
-       {["name"]="iface",["help"]="",["depends"]={"iface"}},
-       {["name"]="ip",["help"]="",["depends"]={"recursive"}}
-}
-
---
--- KERNEL PROTOCOL
---
-
-sect_kernel_protos = m:section(TypedSection, "kernel", "Kernel options", "Configuration of the kernel protocols. First Instance MUST be Primary table (no table or kernel_table fields).")
-sect_kernel_protos.addremove = true
-sect_kernel_protos.anonymous = false
-
--- Default kernel parameters
-
-disabled = sect_kernel_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
-disabled.default=0
-
--- Optional parameters
-for _,o in ipairs(protoptions) do
-       if o.name ~= nil then
-               for _, d in ipairs(o.depends) do
-                       if d == "kernel" then
-                               if o.name == "learn" or o.name == "persist" then
-                                       value = sect_kernel_protos:option(Flag, o.name, translate(o.name), translate(o.help))
-                               elseif o.name == "table" then 
-                                       value = sect_kernel_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
-                                       uci:foreach("bird6", "table",
-                                               function (s)
-                                                       value:value(s.name)
-                                               end)
-                                       value:value("")
-                    value.default = ""
-                               else
-                                       value = sect_kernel_protos:option(Value, o.name, translate(o.name), translate(o.help))
-                               end
-                               value.optional = true
-                               value.rmempty = true
-                       end
-               end
-
-       end
-end
-
---
--- DEVICE PROTOCOL
---
-
-sect_device_protos = m:section(TypedSection, "device", "Device options", "Configuration of the device protocols.")
-sect_device_protos.addremove = true
-sect_device_protos.anonymous = false
-
--- Default kernel parameters
-
-disabled = sect_device_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
-disabled.default=0
-
--- Optional parameters
-for _,o in ipairs(protoptions) do
-       if o.name ~= nil then
-               for _, d in ipairs(o.depends) do
-                       if d == "device" then
-                               value = sect_device_protos:option(Value, o.name, translate(o.name), translate(o.help))
-                               value.optional = true
-                               value.rmempty = true
-                       end
-               end
-       end
-end
-                                                                                                                                                                                                                               
---
--- STATIC PROTOCOL
---
-
-sect_static_protos = m:section(TypedSection, "static", "Static options", "Configuration of the static protocols.")
-sect_static_protos.addremove = true
-sect_static_protos.anonymous = false
-
--- Default kernel parameters
-
-disabled = sect_static_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
-disabled.default=0
-
--- Optional parameters
-for _,o in ipairs(protoptions) do
-       if o.name ~= nil then
-               for _, d in ipairs(o.depends) do
-                       if d == "static" then
-                               if o.name == "table" then
-                                       value = sect_static_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
-                                       uci:foreach("bird6", "table",
-                                               function (s)
-                                                       value:value(s.name)
-                                               end)
-                                       value:value("")
-                    value.default = ""
-                               else
-                                       value = sect_static_protos:option(Value, o.name, translate(o.name), translate(o.help))
-                               end
-                                       value.optional = true
-                                       value.rmempty = true
-                       end
-               end
-       end
-end
-
-
---
--- PIPE PROTOCOL
---
-sect_pipe_protos = m:section(TypedSection, "pipe", "Pipe options",     "Configuration of the Pipe protocols.")
-sect_pipe_protos.addremove = true
-sect_pipe_protos.anonymous = false
-
--- Default Pipe parameters
-disabled = sect_pipe_protos:option(Flag, "disabled", "Disabled", "If this  option is true, the protocol will not be configured. This protocol will connect the configured 'Table' to the 'Peer Table'.")
-disabled.default=0
-
-table = sect_pipe_protos:option(ListValue, "table", "Table", "Select the Primary Table to connect.")
-table.optional = false
-uci:foreach("bird6", "table",
-  function (s)
-    table:value(s.name)
-  end)
-table:value("")
-table.default = ""
-
-peer_table = sect_pipe_protos:option(ListValue, "peer_table", "Peer Table", "Select the Secondary Table to connect.")
-table.optional = false
-uci:foreach("bird6", "table",
-  function (s)
-    peer_table:value(s.name)
-  end)
-peer_table:value("")
-peer_table.default = ""
-
-mode = sect_pipe_protos:option(ListValue, "mode", "Mode", "Select <b>transparent</b> to retransmit all routes and their attributes<br />Select <b>opaque</b> to retransmit optimal routes (similar to what other protocols do)")
-mode.optional = false
-mode:value("transparent")
-mode:value("opaque")
-mode.default = "transparent"
-
-import = sect_pipe_protos:option(Value, "import", "Import",imp_string)
-import.optional=true
-
-export = sect_pipe_protos:option(Value, "export", "Export", exp_string)
-export.optional=true
-
-
---
--- DIRECT PROTOCOL
---
-sect_direct_protos = m:section(TypedSection, "direct", "Direct options", "Configuration of the Direct protocols.")
-sect_direct_protos.addremove = true
-sect_direct_protos.anonymous = false
-
--- Default Direct parameters
-disabled = sect_direct_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured. This protocol will connect the configured 'Table' to the 'Peer Table'.")
-disabled.optional = false
-disabled.default = 0
-
-interface = sect_direct_protos:option(Value, "interface", "Interfaces", "By default Direct will generate device routes for all the interfaces. To restrict this behaviour, select a number of patterns to match your desired interfaces:" .. "<br />" .. "1. All the strings <b>MUST</b> be quoted: \"pattern\"" .. "<br />" .. "2. Use * (star) to match patterns: \"eth*\" (<b>include</b> all eth... interfaces)" .. "<br />" .. "3. You can add \"-\" (minus) to exclude patterns: \"-em*\" (<b>exclude</b> all em... interfaces)." .. "<br />" .. "4. Separate several patterns using , (coma): \"-em*\", \"eth*\" (<b>exclude</b> em... and <b>include</b> all eth... interfaces).")
-interface.optional = false
-interface.default = "\"*\""
-
-
---
--- ROUTES FOR STATIC PROTOCOL
---
-sect_routes = m:section(TypedSection, "route", "Routes configuration", "Configuration of the routes used in static protocols.")
-sect_routes.addremove = true
-sect_routes.anonymous = true
-
-instance = sect_routes:option(ListValue, "instance", "Route instance", "")
-i = 0
-
-uci:foreach("bird6", "static",
-       function (s)
-               instance:value(s[".name"])
-       end)
-
-prefix = sect_routes:option(Value, "prefix", "Route prefix", "")
-prefix.datatype = "ip6prefix"
-
-type = sect_routes:option(ListValue, "type", "Type of route", "")
-type:value("router")
-type:value("special")
-type:value("iface")
-type:value("recursive")
-type:value("multipath")
-
-valueVia = sect_routes:option(Value, "via", "Via", "")
-valueVia.optional = false
-valueVia:depends("type", "router")
-valueVia.datatype = "ip6addr"
-
-listVia = sect_routes:option(DynamicList, "l_via", "Via", "")
-listVia:depends("type", "multipath")
-listVia.optional=false
-listVia.datatype = "ip6addr"
-
-attribute = sect_routes:option(Value, "attribute", "Attribute", "Types are: unreachable, prohibit and blackhole")
-attribute:depends("type", "special")
-
-iface  = sect_routes:option(ListValue, "iface", "Interface", "")
-iface:depends("type", "iface")
-
-uci:foreach("network", "interface",
-       function(section)
-        if section[".name"] ~= "loopback" then
-            iface:value(section[".name"])
-        end
-       end)
-
-ip =  sect_routes:option(Value, "ip", "IP address", "")
-ip:depends("type", "ip")
-ip.datatype = [[ or"ip4addr", "ip6addr" ]]
-
-function m.on_commit(self,map)
-        luci.sys.exec('/etc/init.d/bird6 restart')
-end
-
-return m
-
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/model/overview.lua b/bird1-openwrt/bird1-ipv6-openwrt/src/model/overview.lua
deleted file mode 100644 (file)
index 2b58a9d..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
---[[ 
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-]]--
-
-require("luci.sys")
-local http = require "luci.http"
-local uci = require "luci.model.uci"
-local uciout = uci.cursor()
-
-m=Map("bird6", "Bird6 UCI configuration helper", "")
-
--- Named section: "bird"
-
-s_bird_uci = m:section(NamedSection, "bird", "bird", "Bird6 file settings", "")
-s_bird_uci.addremove = False
-
-uuc = s_bird_uci:option(Flag, "use_UCI_config", "Use UCI configuration", "Use UCI configuration instead of the /etc/bird6.conf file")
-
-ucf = s_bird_uci:option(Value, "UCI_config_file", "UCI File", "Specify the file to place the UCI-translated configuration")
-ucf.default = "/tmp/bird6.conf"
-
--- Named Section: "table"
-
-s_bird_table = m:section(TypedSection, "table", "Tables configuration", "Configuration of the tables used in the protocols")
-s_bird_table.addremove = true
-s_bird_table.anonymous = true
-
-name = s_bird_table:option(Value, "name", "Table name", "Descriptor ID of the table")
-
--- Named section: "global"
-
-s_bird_global = m:section(NamedSection, "global", "global", "Global options", "Basic Bird6 settings")
-s_bird_global.addremove = False
-
-id = s_bird_global:option(Value, "router_id", "Router ID", "Identification number of the router. By default, is the router's IP.")
-
-lf = s_bird_global:option(Value, "log_file", "Log File", "File used to store log related data.")
-
-l = s_bird_global:option(MultiValue, "log", "Log", "Set which elements do you want to log.")
-l:value("all", "All")
-l:value("info", "Info")
-l:value("warning","Warning")
-l:value("error","Error")
-l:value("fatal","Fatal")
-l:value("debug","Debug")
-l:value("trace","Trace")
-l:value("remote","Remote")
-l:value("auth","Auth")
-
-d = s_bird_global:option(MultiValue, "debug", "Debug", "Set which elements do you want to debug.")
-d:value("all", "All")
-d:value("states","States")
-d:value("routes","Routes")
-d:value("filters","Filters")
-d:value("interfaces","Interfaces")
-d:value("events","Events")
-d:value("packets","Packets")
-
-listen_addr = s_bird_global:option(Value, "listen_bgp_addr", "BGP Address", "Set the Addres that BGP will listen to.")
-listen_addr.optional = true
-
-listen_port = s_bird_global:option(Value, "listen_bgp_port", "BGP Port", "Set the port that BGP will listen to.")
-listen_port.optional = true
-
-listen_dual = s_bird_global:option(Flag, "listen_bgp_dual", "BGP Dual/ipv6", "Set if BGP connections will listen ipv6 only 'ipv6only' or both ipv4/6 'dual' routes")
-listen_dual.optional = true
-
-function m.on_commit(self,map)
-        luci.sys.exec('/etc/init.d/bird6 restart')
-end
-
-return m
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/model/status.lua b/bird1-openwrt/bird1-ipv6-openwrt/src/model/status.lua
deleted file mode 100644 (file)
index 074d905..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
---[[
-Copyright (C) 2014-2017 - Eloi Carbo
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-]]--
-
-local sys = require "luci.sys"
-
-m = SimpleForm("bird6", "Bird6 Daemon Status Page", "This page let you Start,   Stop, Restart and check Bird6 Service Status.")
-m.reset = false
-m.submit = false
-
-s = m:section(SimpleSection)
-
-start = s:option(Button, "_start", "Start Bird4 Daemon:")
-start.inputtitle = "   Start   "
-start.inputstyle = "apply"
-
-stop = s:option(Button, "_stop", "Stop Bird4 Daemon:")
-stop.inputtitle = "   Stop   "
-stop.inputstyle = "remove"
-
-restart = s:option(Button, "_restart", "Restart Bird4 Daemon:")
-restart.inputtitle = "Restart"
-restart.inputstyle = "reload"
-
-output = s:option(DummyValue, "_value", "Service Status")
-function output.cfgvalue(self, section)
-    local ret = ""
-    if start:formvalue(section) then
-        ret = sys.exec("/etc/init.d/bird6 start_quiet")
-    elseif stop:formvalue(section) then
-        ret = sys.exec("/etc/init.d/bird6 stop_quiet")
-    elseif restart:formvalue(section) then
-        ret = sys.exec("/etc/init.d/bird6 restart_quiet")
-    else
-        ret = sys.exec("/etc/init.d/bird6 status_quiet")
-    end
-    return ret
-end
-
-return m
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/uci-defaults/99-relocate-filters b/bird1-openwrt/bird1-ipv6-openwrt/src/uci-defaults/99-relocate-filters
deleted file mode 100644 (file)
index 97be5eb..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/sh
-
-# This UCI-Defaults script will MOVE any pre-existing filter
-# stored in a file and configured as an UCI item (deprecated)
-# The script will try to match any "filter" Section, get its
-# "file_path" property and move the file (if exists) to the
-# new (v0.3+) default location: /etc/bird{4|6}/filters
-
-[ $# -ne 1 ] && exit 1
-BIRD="$1"
-
-. /lib/functions.sh
-
-# This function will move an existing folder configured on
-# Bird as a "filter" to filters' folder.
-mv_filter() {
-    local section="$1"
-    local file_path
-    config_get file_path ${section} file_path
-
-    if [ -f ${file_path} ]; then
-        mv ${file_path} /etc/${BIRD}/filters/
-    fi
-    uci delete ${BIRD}.${section}
-}
-
-if [ -f /etc/config/${BIRD} ]; then
-    config_load ${BIRD}
-    config_foreach mv_filter 'filter'
-    uci commit ${BIRD}
-fi
-
-exit 0
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/uci-defaults/bird-uci-install-init.d b/bird1-openwrt/bird1-ipv6-openwrt/src/uci-defaults/bird-uci-install-init.d
deleted file mode 100644 (file)
index 28f64d2..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-
-[ $# -ne 1 ] && exit 1
-
-BIRD=$1
-
-EXC=`mount -t overlayfs | grep overlayfs -c`
-
-[ $EXC > 0 ] && rm -r /etc/init.d/${BIRD} || mv /etc/init.d/${BIRD} /etc/${BIRD}/init.d/${BIRD}.orig
-
-ln -s /etc/${BIRD}/init.d/${BIRD} /etc/init.d/${BIRD}
-
-exit 0
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/view/log.htm b/bird1-openwrt/bird1-ipv6-openwrt/src/view/log.htm
deleted file mode 100644 (file)
index 5514f9c..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<%-
-    -- Only populate textarea through XHR.poll
-    -- "refresh" is present in the URL (.../log?refresh=1)
-    if luci.http.formvalue("refresh") then
-
-        -- Force HTTP Contents to be "text/plain"
-        luci.http.prepare_content("text/plain")
-
-        local sys = require("luci.sys")
-        local uci = require "luci.model.uci".cursor()
-
-        -- Get Log File from Bird's configuration or leave it empty.
-        local log_file = uci:get("bird6", "global", "log_file") or ""
-        local log_size = ""
-        if log_file then
-            log_size = sys.exec("du -h " .. log_file .. " | awk '{print      $1}'")
-            -- Gathering last 30 lines of the Log File.
-            lf = sys.exec("tail -n30 " .. log_file):gsub("\r\n?", "\n")
-        end
-
-        -- Write File used and its contents.
-        luci.http.write("Using Log File: " .. log_file .. " - File Size: " .. log_size .. "\n" .. lf)
-
-        -- Avoid printing the rest of the page (return only text log data)
-        return
-    end
--%>
-
-<%+header%>
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
-<script type="text/javascript">//<![CDATA[
-    // Refresh page each second. Use "refresh=1" as trigger.
-    XHR.poll(1, '<%=url('admin/network/bird6/log')%>', { refresh: 1 },       function(xhrInstance) {
-        var area = document.getElementById('log')
-        area.value = xhrInstance.responseText;
-    });
-//]]></script>
-
-
-<textarea readonly="readonly" style="width: 100%" wrap="on" rows="32"        id="log"><%=lf:pcdata()%></textarea>
-<%+footer%>
diff --git a/bird1-openwrt/bird1-ipv6-openwrt/src/view/tvalue.htm b/bird1-openwrt/bird1-ipv6-openwrt/src/view/tvalue.htm
deleted file mode 100644 (file)
index 7eba122..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<%+cbi/valueheader%>
-       <textarea class="cbi-input-textarea" <% if not self.size then %> style="width: 100%; font: normal 11pt 'Courier New'"<% else %> cols="<%=self.size%>"<% end %> data-update="change"<%= attr("name", cbid) .. attr("id", cbid) .. ifattr(self.rows, "rows") .. ifattr(self.wrap, "wrap")  .. ifattr(self.readonly, "readonly") %>>
-       <%-=pcdata(self:cfgvalue(section))-%>
-       </textarea>
-<%+cbi/valuefooter%>
diff --git a/bird1/Makefile b/bird1/Makefile
deleted file mode 100644 (file)
index e5e32a8..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-# 
-# Copyright (C) 2009-2016 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=bird1
-PKG_VERSION:=1.6.4
-PKG_RELEASE:=1
-
-PKG_SOURCE:=bird-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=ftp://bird.network.cz/pub/bird
-PKG_MD5SUM:=c26b8caae988dba81a9dbbee93502463d4326d1b749d728d62aa5529c605afc0
-PKG_BUILD_DEPENDS:=ncurses readline
-PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
-PKG_BUILD_DIR:=$(BUILD_DIR)/bird-$(PKG_VERSION)
-
-PKG_LICENSE:=GPL-2.0
-
-include $(INCLUDE_DIR)/package.mk
-
-define Package/bird1/Default
-  TITLE:=The BIRD Internet Routing Daemon (v1.6)
-  URL:=http://bird.network.cz/
-  DEPENDS:=+libpthread
-endef
-
-define Package/bird1c/Default
-  TITLE:=The BIRD command-line client (v1.6)
-  URL:=http://bird.network.cz/
-  DEPENDS:= +libreadline +libncurses
-endef
-
-define Package/bird1cl/Default
-  TITLE:=The BIRD lightweight command-line client (v1.6)
-  URL:=http://bird.network.cz/
-endef
-
-define Package/bird1/Default/description1
-BIRD is an internet routing daemon which manages TCP/IP routing tables
-with support of modern routing protocols, easy to use configuration
-interface and powerful route filtering language. It is lightweight and
-efficient and therefore appropriate for small embedded routers.
-
-This packages the legacy v1.6 branch of Bird, which splits IPv4 and IPv6
-support into separate binaries. See also the bird2 package for the newer
-branch which integrates support for both IP protocols in a single binary.
-
-endef
-
-define Package/bird1/Default/description2
-In BGP, BIRD supports communities, multiprotocol extensions, MD5
-authentication, 32bit AS numbers and could act as a route server or a
-route reflector. BIRD also supports multiple RIBs, multiple kernel
-routing tables and redistribution between the protocols with a powerful
-configuration syntax.
-
-endef
-
-define Package/bird1/Default/description3
-This is a BIRD command-line client. It is used to send commands to BIRD,
-commands can perform simple actions such as enabling/disabling of
-protocols, telling BIRD to show various information, telling it to show
-a routing table filtered by a filter, or asking BIRD to reconfigure.
-
-Unless you can't afford dependency on ncurses and readline, you
-should install BIRD command-line client together with BIRD.
-
-endef
-
-define Package/bird1/Default/description4
-This is a BIRD lightweight command-line client. It is used to send commands to BIRD,
-commands can perform simple actions such as enabling/disabling of
-protocols, telling BIRD to show various information, telling it to show
-a routing table filtered by a filter, or asking BIRD to reconfigure.
-
-endef
-
-define Package/bird1-ipv4
-$(call Package/bird1/Default)
-  SECTION:=net
-  CATEGORY:=Network
-  SUBMENU:=Routing and Redirection
-  TITLE+= (IPv4)
-  CONFLICTS+=bird4
-endef
-
-define Package/bird1c-ipv4
-$(call Package/bird1c/Default)
-  SECTION:=net
-  CATEGORY:=Network
-  SUBMENU:=Routing and Redirection
-  TITLE+= (IPv4)
-  DEPENDS+= +bird1-ipv4
-  CONFLICTS+=birdc4
-endef
-
-define Package/bird1cl-ipv4
-$(call Package/bird1cl/Default)
-  SECTION:=net
-  CATEGORY:=Network
-  SUBMENU:=Routing and Redirection
-  TITLE+= (IPv4)
-  DEPENDS+= +bird1-ipv4
-  CONFLICTS+=birdcl4
-endef
-
-define Package/bird1-ipv6
-$(call Package/bird1/Default)
-  SECTION:=net
-  CATEGORY:=Network
-  SUBMENU:=Routing and Redirection
-  TITLE+= (IPv6)
-  CONFLICTS+=bird6
-endef
-
-define Package/bird1c-ipv6
-$(call Package/bird1c/Default)
-  SECTION:=net
-  CATEGORY:=Network
-  SUBMENU:=Routing and Redirection
-  TITLE+= (IPv6)
-  DEPENDS+= +bird1-ipv6
-  CONFLICTS+=birdc6
-endef
-
-define Package/bird1cl-ipv6
-$(call Package/bird1cl/Default)
-  SECTION:=net
-  CATEGORY:=Network
-  SUBMENU:=Routing and Redirection
-  TITLE+= (IPv6)
-  DEPENDS+= +bird1-ipv6
-  CONFLICTS+=birdcl6
-endef
-
-define Package/bird1-ipv4/description
-$(call Package/bird1/Default/description1)
-This is IPv4 version of BIRD, it supports OSPFv2, RIPv2 and BGP
-protocols.
-
-$(call Package/bird1/Default/description2)
-endef
-
-define Package/bird1c-ipv4/description
-$(call Package/bird1/Default/description1)
-$(call Package/bird1/Default/description3)
-endef
-
-define Package/bird1cl-ipv4/description
-$(call Package/bird1/Default/description1)
-$(call Package/bird1/Default/description4)
-endef
-
-define Package/bird1-ipv6/description
-$(call Package/bird1/Default/description1)
-This is IPv6 version of BIRD, it supports OSPFv3, RIPng and BGP
-protocols.
-
-$(call Package/bird1/Default/description2)
-endef
-
-define Package/bird1c-ipv6/description
-$(call Package/bird1/Default/description1)
-$(call Package/bird1/Default/description3)
-endef
-
-define Package/bird1cl-ipv6/description
-$(call Package/bird1/Default/description1)
-$(call Package/bird1/Default/description4)
-endef
-
-CONFIGURE_ARGS += --with-linux-headers="$(LINUX_DIR)"
-
-TARGET_CFLAGS+=-std=gnu89
-
-define Build/Template
-
-$(STAMP_BUILT)-$(2): $(STAMP_PREPARED)
-       $(call Build/Configure/Default,$(3))
-       $(call Build/Compile/Default,)
-       ( cd $(PKG_BUILD_DIR); mv -f bird bird$(2); mv -f birdc birdc$(2); mv -f birdcl birdcl$(2) )
-       -$(MAKE) -C $(PKG_BUILD_DIR) clean
-       touch $$@
-
-$(STAMP_BUILT): $(STAMP_BUILT)-$(2)
-
-define Package/bird1-ipv$(2)/install
-       $(INSTALL_DIR)  $$(1)/usr/sbin
-       $(INSTALL_BIN)  $$(PKG_BUILD_DIR)/bird$(2) $$(1)/usr/sbin/
-       $(INSTALL_DIR)  $$(1)/etc
-       $(INSTALL_DATA) ./files/bird$(2).conf $$(1)/etc/
-       $(INSTALL_DIR)  $$(1)/etc/init.d
-       $(INSTALL_BIN)  ./files/bird$(2).init $$(1)/etc/init.d/bird$(2)
-
-endef
-
-define Package/bird1-ipv$(2)/conffiles
-/etc/bird$(2).conf
-endef
-
-define Package/bird1c-ipv$(2)/install
-       $(INSTALL_DIR) $$(1)/usr/sbin
-       $(INSTALL_BIN) $$(PKG_BUILD_DIR)/birdc$(2) $$(1)/usr/sbin/
-endef
-
-define Package/bird1cl-ipv$(2)/install
-       $(INSTALL_DIR) $$(1)/usr/sbin
-       $(INSTALL_BIN) $$(PKG_BUILD_DIR)/birdcl$(2) $$(1)/usr/sbin/
-endef
-
-endef
-
-
-$(eval $(call Build/Template,bird1-ipv4,4, --disable-ipv6))
-$(eval $(call Build/Template,bird1-ipv6,6, --enable-ipv6))
-
-$(eval $(call BuildPackage,bird1-ipv4))
-$(eval $(call BuildPackage,bird1c-ipv4))
-$(eval $(call BuildPackage,bird1cl-ipv4))
-$(eval $(call BuildPackage,bird1-ipv6))
-$(eval $(call BuildPackage,bird1c-ipv6))
-$(eval $(call BuildPackage,bird1cl-ipv6))
diff --git a/bird1/files/bird4.conf b/bird1/files/bird4.conf
deleted file mode 100644 (file)
index 8616a0a..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-
-# THIS CONFIG FILE IS NOT A COMPLETE DOCUMENTATION
-# PLEASE LOOK IN THE BIRD DOCUMENTATION FOR MORE INFO
-
-# However, most of options used here are just for example
-# and will be removed in real-life configs.
-
-log syslog all;
-
-# Override router ID
-#router id 192.168.0.1;
-
-# Turn on global debugging of all protocols
-#debug protocols all;
-
-
-# Define a route filter...
-# filter test_filter {
-#      if net ~ 10.0.0.0/16 then accept;
-#      else reject;
-# }
-
-# The direct protocol automatically generates device routes to all network
-# interfaces. Can exist in as many instances as you wish if you want to
-# populate multiple routing tables with device routes. Because device routes
-# are handled by Linux kernel, this protocol is  usually not needed.
-# protocol direct {
-#      interface "*";  # Restrict network interfaces it works with
-# }
-
-# This pseudo-protocol performs synchronization between BIRD's routing
-# tables and the kernel. You can run multiple instances of the kernel
-# protocol and synchronize different kernel tables with different BIRD tables.
-protocol kernel {
-#      learn;                  # Learn all alien routes from the kernel
-#      persist;                # Don't remove routes on bird shutdown
-       scan time 20;           # Scan kernel routing table every 20 seconds
-#      import none;            # Default is import all
-#      export all;             # Default is export none
-}
-
-# This pseudo-protocol watches all interface up/down events.
-protocol device {
-       scan time 10;           # Scan interfaces every 10 seconds
-}
-
-# Static routes (again, there can be multiple instances, so that you
-# can disable/enable various groups of static routes on the fly).
-protocol static {
-#      export all;             # Default is export none
-#      route 0.0.0.0/0 via 62.168.0.13;
-#      route 10.0.0.0/8 reject;
-#      route 192.168.0.0/16 reject;
-}
-
-
-#protocol rip {
-#      disabled;
-#      import all;
-#      export all;
-#      export filter test_filter;
-
-#      port 1520;
-#      period 7;
-#      infinity 16;
-#      garbage time 60;
-#      interface "*" { mode broadcast; };
-#      honor neighbor;
-#      honor always;
-#      honor never;
-#      authentication none;
-#}
-
-
-#protocol ospf {
-#      disabled;
-#      import all;
-#      export all;
-#      export where source = RTS_STATIC;
-
-#      area 0 {
-#              interface "eth*" {
-#                      cost 10;
-#                      hello 3;
-#                      retransmit 2;
-#                      wait 5;
-#                      dead 20;
-#                      type broadcast;
-#                      authentication simple;
-#                      password "pass";
-#              };
-#      };
-#}
-
-
-#protocol bgp {
-#      disabled;
-#      import all;
-#      export all;
-#      export where source = RTS_STATIC;
-
-#      local as 65000;
-#      neighbor 192.168.1.1 as 65001;
-#      multihop 20 via 192.168.2.1;
-
-#      hold time 240;
-#      startup hold time 240;
-#      connect retry time 120;
-#      keepalive time 80;      # defaults to hold time / 3
-#      start delay time 5;     # How long do we wait before initial connect
-#      error wait time 60, 300;# Minimum and maximum time we wait after an error (when consecutive
-#                              # errors occur, we increase the delay exponentially ...
-#      error forget time 300;  # ... until this timeout expires)
-#      disable after error;    # Disable the protocol automatically when an error occurs
-#      next hop self;          # Disable next hop processing and always advertise our local address as nexthop
-#      source address 62.168.0.14;     # What local address we use for the TCP connection
-#      password "secret"       # Password used for MD5 authentication
-#      rr client;              # I am a route reflector and the neighor is my client
-#      rr cluster id 1.0.0.1   # Use this value for cluster id instead of my router id 
-#      };
-#}
diff --git a/bird1/files/bird4.init b/bird1/files/bird4.init
deleted file mode 100644 (file)
index a1a1be2..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2010-2014 OpenWrt.org
-
-BIRD="bird4"
-
-START=99
-STOP=10
-
-SERVICE_DAEMONIZE=1
-SERVICE_USE_PID=1
-SERVICE_PID_FILE="/var/run/$BIRD.pid"
-
-BIRD_BIN="/usr/sbin/$BIRD"
-BIRD_CONF="/etc/$BIRD.conf"
-
-start() {
-       service_start $BIRD_BIN -d -c $BIRD_CONF -P $SERVICE_PID_FILE
-}
-
-stop() {
-       service_stop $BIRD_BIN
-}
-
-reload() {
-       service_reload $BIRD_BIN
-}
diff --git a/bird1/files/bird6.conf b/bird1/files/bird6.conf
deleted file mode 100644 (file)
index 8616a0a..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-
-# THIS CONFIG FILE IS NOT A COMPLETE DOCUMENTATION
-# PLEASE LOOK IN THE BIRD DOCUMENTATION FOR MORE INFO
-
-# However, most of options used here are just for example
-# and will be removed in real-life configs.
-
-log syslog all;
-
-# Override router ID
-#router id 192.168.0.1;
-
-# Turn on global debugging of all protocols
-#debug protocols all;
-
-
-# Define a route filter...
-# filter test_filter {
-#      if net ~ 10.0.0.0/16 then accept;
-#      else reject;
-# }
-
-# The direct protocol automatically generates device routes to all network
-# interfaces. Can exist in as many instances as you wish if you want to
-# populate multiple routing tables with device routes. Because device routes
-# are handled by Linux kernel, this protocol is  usually not needed.
-# protocol direct {
-#      interface "*";  # Restrict network interfaces it works with
-# }
-
-# This pseudo-protocol performs synchronization between BIRD's routing
-# tables and the kernel. You can run multiple instances of the kernel
-# protocol and synchronize different kernel tables with different BIRD tables.
-protocol kernel {
-#      learn;                  # Learn all alien routes from the kernel
-#      persist;                # Don't remove routes on bird shutdown
-       scan time 20;           # Scan kernel routing table every 20 seconds
-#      import none;            # Default is import all
-#      export all;             # Default is export none
-}
-
-# This pseudo-protocol watches all interface up/down events.
-protocol device {
-       scan time 10;           # Scan interfaces every 10 seconds
-}
-
-# Static routes (again, there can be multiple instances, so that you
-# can disable/enable various groups of static routes on the fly).
-protocol static {
-#      export all;             # Default is export none
-#      route 0.0.0.0/0 via 62.168.0.13;
-#      route 10.0.0.0/8 reject;
-#      route 192.168.0.0/16 reject;
-}
-
-
-#protocol rip {
-#      disabled;
-#      import all;
-#      export all;
-#      export filter test_filter;
-
-#      port 1520;
-#      period 7;
-#      infinity 16;
-#      garbage time 60;
-#      interface "*" { mode broadcast; };
-#      honor neighbor;
-#      honor always;
-#      honor never;
-#      authentication none;
-#}
-
-
-#protocol ospf {
-#      disabled;
-#      import all;
-#      export all;
-#      export where source = RTS_STATIC;
-
-#      area 0 {
-#              interface "eth*" {
-#                      cost 10;
-#                      hello 3;
-#                      retransmit 2;
-#                      wait 5;
-#                      dead 20;
-#                      type broadcast;
-#                      authentication simple;
-#                      password "pass";
-#              };
-#      };
-#}
-
-
-#protocol bgp {
-#      disabled;
-#      import all;
-#      export all;
-#      export where source = RTS_STATIC;
-
-#      local as 65000;
-#      neighbor 192.168.1.1 as 65001;
-#      multihop 20 via 192.168.2.1;
-
-#      hold time 240;
-#      startup hold time 240;
-#      connect retry time 120;
-#      keepalive time 80;      # defaults to hold time / 3
-#      start delay time 5;     # How long do we wait before initial connect
-#      error wait time 60, 300;# Minimum and maximum time we wait after an error (when consecutive
-#                              # errors occur, we increase the delay exponentially ...
-#      error forget time 300;  # ... until this timeout expires)
-#      disable after error;    # Disable the protocol automatically when an error occurs
-#      next hop self;          # Disable next hop processing and always advertise our local address as nexthop
-#      source address 62.168.0.14;     # What local address we use for the TCP connection
-#      password "secret"       # Password used for MD5 authentication
-#      rr client;              # I am a route reflector and the neighor is my client
-#      rr cluster id 1.0.0.1   # Use this value for cluster id instead of my router id 
-#      };
-#}
diff --git a/bird1/files/bird6.init b/bird1/files/bird6.init
deleted file mode 100644 (file)
index 6156fb2..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2010-2014 OpenWrt.org
-
-BIRD="bird6"
-
-START=99
-STOP=10
-
-SERVICE_DAEMONIZE=1
-SERVICE_USE_PID=1
-SERVICE_PID_FILE="/var/run/$BIRD.pid"
-
-BIRD_BIN="/usr/sbin/$BIRD"
-BIRD_CONF="/etc/$BIRD.conf"
-
-start() {
-       service_start $BIRD_BIN -d -c $BIRD_CONF -P $SERVICE_PID_FILE
-}
-
-stop() {
-       service_stop $BIRD_BIN
-}
-
-reload() {
-       service_reload $BIRD_BIN
-}
index 26b5e4aeca3fb8cc5e8a4a54f0833f02fcc29715..d692c326f2407bb8d8b1cc4a36ef8f1ee506d375 100644 (file)
@@ -7,17 +7,18 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=bird2
-PKG_VERSION:=2.0.2
+PKG_VERSION:=2.14
 PKG_RELEASE:=1
 
 PKG_SOURCE:=bird-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=ftp://bird.network.cz/pub/bird
-PKG_HASH:=035f91d6f568f8ed438a0814235ac4c5c79147cd2acf201322c307732883480f
-PKG_BUILD_DEPENDS:=ncurses readline
+PKG_HASH:=b0b9f6f8566541b9be4af1f0cac675c5a3785601a55667a7ec3d7de29735a786
+
 PKG_MAINTAINER:=Toke Høiland-Jørgensen <toke@toke.dk>
-PKG_BUILD_DIR:=$(BUILD_DIR)/bird-$(PKG_VERSION)
+PKG_LICENSE:=GPL-2.0-or-later
 
-PKG_LICENSE:=GPL-2.0
+PKG_BUILD_DEPENDS:=ncurses readline
+PKG_BUILD_DIR:=$(BUILD_DIR)/bird-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
 
@@ -96,7 +97,7 @@ protocols, telling BIRD to show various information, telling it to show
 a routing table filtered by a filter, or asking BIRD to reconfigure.
 endef
 
-CONFIGURE_ARGS += --with-linux-headers="$(LINUX_DIR)"  --disable-libssh
+CONFIGURE_ARGS += --disable-libssh
 
 define Package/bird2/conffiles
 /etc/bird.conf
index 18db4af77984c68afc8e5be6f44d95dde672b731..3ac7be1838392219e34916906bd1dd547150fc44 100644 (file)
@@ -3,6 +3,7 @@
 
 USE_PROCD=1
 START=70
+STOP=10
 
 BIRD_BIN="/usr/sbin/bird"
 BIRD_CONF="/etc/bird.conf"
@@ -11,10 +12,14 @@ BIRD_PID_FILE="/var/run/bird.pid"
 start_service() {
     mkdir -p /var/run
     procd_open_instance
-    procd_set_param command $BIRD_BIN -c $BIRD_CONF -P $BIRD_PID_FILE
+    procd_set_param command $BIRD_BIN -f -c $BIRD_CONF -P $BIRD_PID_FILE
     procd_set_param file "$BIRD_CONF"
     procd_set_param stdout 1
     procd_set_param stderr 1
     procd_set_param respawn
     procd_close_instance
 }
+
+reload_service() {
+    procd_send_signal bird
+}
diff --git a/bird2/patches/000-ospf-bus-error.patch b/bird2/patches/000-ospf-bus-error.patch
new file mode 100644 (file)
index 0000000..085965e
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/proto/ospf/topology.h
++++ b/proto/ospf/topology.h
+@@ -41,7 +41,7 @@ struct top_hash_entry
+   u8 mode;                    /* LSA generated during RT calculation (LSA_RTCALC or LSA_STALE)*/
+   u8 nhs_reuse;                       /* Whether nhs nodes can be reused during merging.
+                                  See a note in rt.c:add_cand() */
+-};
++} PACKED;
+ /* Prevents ospf_hash_find() to ignore the entry, for p->lsrqh and p->lsrth */
diff --git a/bird2/patches/0001-BGP-Fix-extended-next-hop-handling.patch b/bird2/patches/0001-BGP-Fix-extended-next-hop-handling.patch
deleted file mode 100644 (file)
index 7f73f66..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From f3a8cf050e6181e158dcde2fe885d7bf220eedc3 Mon Sep 17 00:00:00 2001
-From: "Ondrej Zajicek (work)" <santiago@crfreenet.org>
-Date: Thu, 12 Apr 2018 16:55:56 +0200
-Subject: [PATCH] BGP: Fix extended next hop handling
-
-For IPv4 with extended next hop, we use MP-BGP format and therefore no
-independent NEXT_HOP attribute.
-
-Thanks to Arvin Gan for the bugreport.
----
- proto/bgp/attrs.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c
-index 0f41f818..9003feb2 100644
---- a/proto/bgp/attrs.c
-+++ b/proto/bgp/attrs.c
-@@ -295,7 +295,7 @@ bgp_encode_next_hop(struct bgp_write_state *s, eattr *a, byte *buf, uint size)
-    * store it and encode it later by AFI-specific hooks.
-    */
--  if (s->channel->afi == BGP_AF_IPV4)
-+  if ((s->channel->afi == BGP_AF_IPV4) && !s->channel->ext_next_hop)
-   {
-     ASSERT(a->u.ptr->length == sizeof(ip_addr));
--- 
-2.17.0
-
diff --git a/bird2/patches/0002-Filter-Added-missing-instruction-comparators.patch b/bird2/patches/0002-Filter-Added-missing-instruction-comparators.patch
deleted file mode 100644 (file)
index 3daefb4..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-From 823ad12191e66e243dd088a81c66e4a518563e40 Mon Sep 17 00:00:00 2001
-From: Jan Maria Matejka <mq@ucw.cz>
-Date: Fri, 27 Apr 2018 14:38:41 +0200
-Subject: [PATCH] Filter: Added missing instruction comparators.
-
-These instructions caused SIGABORTs on reconfiguration.
----
- filter/filter.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/filter/filter.c b/filter/filter.c
-index bb3146e7..881ba420 100644
---- a/filter/filter.c
-+++ b/filter/filter.c
-@@ -1712,7 +1712,10 @@ i_same(struct f_inst *f1, struct f_inst *f2)
-   case FI_EA_SET: ONEARG; A2_SAME; break;
-   case FI_RETURN: ONEARG; break;
-+  case FI_ROA_MAXLEN: ONEARG; break;
-+  case FI_ROA_ASN: ONEARG; break;
-   case FI_IP: ONEARG; break;
-+  case FI_IS_V4: ONEARG; break;
-   case FI_ROUTE_DISTINGUISHER: ONEARG; break;
-   case FI_CALL: /* Call rewriting trickery to avoid exponential behaviour */
-              ONEARG;
-@@ -1735,6 +1738,8 @@ i_same(struct f_inst *f1, struct f_inst *f2)
-              ((struct f_inst_roa_check *) f2)->rtc->name))
-       return 0;
-     break;
-+  case FI_FORMAT: ONEARG; break;
-+  case FI_ASSERT: ONEARG; break;
-   default:
-     bug( "Unknown instruction %d in same (%c)", f1->fi_code, f1->fi_code & 0xff);
-   }
--- 
-2.17.0
-
diff --git a/bird2/patches/0003-babel-Fix-type-of-route-entry-router-ID.patch b/bird2/patches/0003-babel-Fix-type-of-route-entry-router-ID.patch
deleted file mode 100644 (file)
index f4ce573..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-From 40e7bd0e39849a03bd3f6f44d6719a5f8b1dd291 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= <toke@toke.dk>
-Date: Mon, 30 Apr 2018 16:29:20 +0200
-Subject: [PATCH] babel: Fix type of route entry router ID
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-The router ID being assigned to routes was a uint, which discards the upper
-32 bits. This also has the nice side effect of echoing the wrong router ID
-back to other routers.
-
-Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
----
- proto/babel/babel.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/proto/babel/babel.c b/proto/babel/babel.c
-index 4fd88042..a8eb5ea8 100644
---- a/proto/babel/babel.c
-+++ b/proto/babel/babel.c
-@@ -2140,7 +2140,7 @@ babel_rt_notify(struct proto *P, struct channel *c UNUSED, struct network *net,
-     uint internal = (new->attrs->src->proto == P);
-     uint rt_seqno = internal ? new->u.babel.seqno : p->update_seqno;
-     uint rt_metric = ea_get_int(attrs, EA_BABEL_METRIC, 0);
--    uint rt_router_id = internal ? new->u.babel.router_id : p->router_id;
-+    u64 rt_router_id = internal ? new->u.babel.router_id : p->router_id;
-     if (rt_metric > BABEL_INFINITY)
-     {
--- 
-2.17.0
-
diff --git a/bird2/patches/0004-Babel-Add-option-to-randomize-router-ID.patch b/bird2/patches/0004-Babel-Add-option-to-randomize-router-ID.patch
deleted file mode 100644 (file)
index 161b73e..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-From 70fab17837dbb4c5848681e4c6b9b90891891130 Mon Sep 17 00:00:00 2001
-From: "Ondrej Zajicek (work)" <santiago@crfreenet.org>
-Date: Thu, 3 May 2018 16:55:11 +0200
-Subject: [PATCH 1/2] Babel: Add option to randomize router ID
-
-When a Babel node restarts, it loses its sequence number, which can cause
-its routes to be rejected by peers until the state is cleared out by other
-nodes in the network (which can take on the order of minutes).
-
-There are two ways to fix this: Having stable storage to keep the sequence
-number across restarts, or picking a different router ID each time.
-
-This implements the latter, by introducing a new option that will cause
-BIRD to randomize a high 32 bits of router ID every time it starts up.
-This avoids the problem at the cost of not having stable router IDs in
-the network.
-
-Thanks to Toke Hoiland-Jorgensen for the patch.
----
- doc/bird.sgml        | 10 ++++++++++
- proto/babel/babel.c  | 11 +++++++++++
- proto/babel/babel.h  |  1 +
- proto/babel/config.Y |  3 ++-
- 4 files changed, 24 insertions(+), 1 deletion(-)
-
-diff --git a/doc/bird.sgml b/doc/bird.sgml
-index 1191fa03..ae308d4c 100644
---- a/doc/bird.sgml
-+++ b/doc/bird.sgml
-@@ -1691,6 +1691,7 @@ supports the following per-interface configuration options:
- protocol babel [<name>] {
-       ipv4 { <channel config> };
-       ipv6 [sadr] { <channel config> };
-+        randomize router id <switch>;
-       interface <interface pattern> {
-               type <wired|wireless>;
-               rxcost <number>;
-@@ -1713,6 +1714,15 @@ protocol babel [<name>] {
-       <tag><label id="babel-channel">ipv4 | ipv6 [sadr] <m/channel config/</tag>
-       The supported channels are IPv4, IPv6, and IPv6 SADR.
-+      <tag><label id="babel-random-router-id">randomize router id <m/switch/</tag>
-+      If enabled, Bird will randomize the top 32 bits of its router ID whenever
-+      the protocol instance starts up. If a Babel node restarts, it loses its
-+      sequence number, which can cause its routes to be rejected by peers until
-+      the state is cleared out by other nodes in the network (which can take on
-+      the order of minutes). Enabling this option causes Bird to pick a random
-+      router ID every time it starts up, which avoids this problem at the cost
-+      of not having stable router IDs in the network. Default: no.
-+
-       <tag><label id="babel-type">type wired|wireless </tag>
-       This option specifies the interface type: Wired or wireless. On wired
-       interfaces a neighbor is considered unreachable after a small number of
-diff --git a/proto/babel/babel.c b/proto/babel/babel.c
-index 797a83d4..ce05191c 100644
---- a/proto/babel/babel.c
-+++ b/proto/babel/babel.c
-@@ -2226,6 +2226,14 @@ babel_init(struct proto_config *CF)
-   return P;
- }
-+static inline void
-+babel_randomize_router_id(struct babel_proto *p)
-+{
-+  p->router_id &= (u64) 0xffffffff;
-+  p->router_id |= ((u64) random()) << 32;
-+  TRACE(D_EVENTS, "Randomized router ID to %lR", p->router_id);
-+}
-+
- static int
- babel_start(struct proto *P)
- {
-@@ -2244,6 +2252,9 @@ babel_start(struct proto *P)
-   p->update_seqno = 1;
-   p->router_id = proto_get_router_id(&cf->c);
-+  if (cf->randomize_router_id)
-+    babel_randomize_router_id(p);
-+
-   p->route_slab = sl_new(P->pool, sizeof(struct babel_route));
-   p->source_slab = sl_new(P->pool, sizeof(struct babel_source));
-   p->msg_slab = sl_new(P->pool, sizeof(struct babel_msg_node));
-diff --git a/proto/babel/babel.h b/proto/babel/babel.h
-index b194ce30..e5c9cd5b 100644
---- a/proto/babel/babel.h
-+++ b/proto/babel/babel.h
-@@ -112,6 +112,7 @@ struct babel_config {
-   struct proto_config c;
-   list iface_list;                    /* List of iface configs (struct babel_iface_config) */
-   uint hold_time;                     /* Time to hold stale entries and unreachable routes */
-+  u8 randomize_router_id;
-   struct channel_config *ip4_channel;
-   struct channel_config *ip6_channel;
-diff --git a/proto/babel/config.Y b/proto/babel/config.Y
-index 7adfb4bb..205b4e4f 100644
---- a/proto/babel/config.Y
-+++ b/proto/babel/config.Y
-@@ -25,7 +25,7 @@ CF_DECLS
- CF_KEYWORDS(BABEL, INTERFACE, METRIC, RXCOST, HELLO, UPDATE, INTERVAL, PORT,
-       TYPE, WIRED, WIRELESS, RX, TX, BUFFER, PRIORITY, LENGTH, CHECK, LINK,
-       NEXT, HOP, IPV4, IPV6, BABEL_METRIC, SHOW, INTERFACES, NEIGHBORS,
--      ENTRIES)
-+      ENTRIES, RANDOMIZE, ROUTER, ID)
- CF_GRAMMAR
-@@ -42,6 +42,7 @@ babel_proto_item:
-    proto_item
-  | proto_channel
-  | INTERFACE babel_iface
-+ | RANDOMIZE ROUTER ID bool { BABEL_CFG->randomize_router_id = $4; }
-  ;
- babel_proto_opts:
--- 
-2.17.0
-
diff --git a/bird2/patches/0005-Better-initialization-of-random-generator.patch b/bird2/patches/0005-Better-initialization-of-random-generator.patch
deleted file mode 100644 (file)
index 21c6dc3..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-From eaf63d314d50cba5b2cfa8f18de64a91d3131b94 Mon Sep 17 00:00:00 2001
-From: "Ondrej Zajicek (work)" <santiago@crfreenet.org>
-Date: Thu, 3 May 2018 17:07:39 +0200
-Subject: [PATCH 2/2] Better initialization of random generator
-
-Use full time precision to initialize random generator. The old
-code was prone to initialize it to the same values in specific
-circumstances (boot without RTC, multiple VMs starting at once).
----
- sysdep/unix/io.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
-index 012deaf0..11a0d6f1 100644
---- a/sysdep/unix/io.c
-+++ b/sysdep/unix/io.c
-@@ -2144,7 +2144,9 @@ io_init(void)
-   // XXX init_times();
-   // XXX update_times();
-   boot_time = current_time();
--  srandom((uint) (current_real_time() TO_S));
-+
-+  u64 now = (u64) current_real_time();
-+  srandom((uint) (now ^ (now >> 32)));
- }
- static int short_loops = 0;
--- 
-2.17.0
-
diff --git a/bird2/patches/0006-babel-Set-onlink-flag-for-IPv4-routes-with-unreachab.patch b/bird2/patches/0006-babel-Set-onlink-flag-for-IPv4-routes-with-unreachab.patch
deleted file mode 100644 (file)
index 528051d..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-From 0ca3156f64a46c52c6d6fc913958f83970d3e57f Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= <toke@toke.dk>
-Date: Mon, 30 Apr 2018 11:13:02 +0200
-Subject: [PATCH] babel: Set onlink flag for IPv4 routes with unreachable next
- hop
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-If the next hop of a route is not a reachable address, the route should be
-installed as onlink. This enables a configuration common in mesh networks
-where the mesh interface is assigned a /32 and babel handles the routing by
-installing onlink routes.
-
-Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
----
- proto/babel/babel.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/proto/babel/babel.c b/proto/babel/babel.c
-index ce05191c..afd2eb19 100644
---- a/proto/babel/babel.c
-+++ b/proto/babel/babel.c
-@@ -640,6 +640,13 @@ babel_announce_rte(struct babel_proto *p, struct babel_entry *e)
-       .nh.iface = r->neigh->ifa->iface,
-     };
-+    /* If we cannot find a reachable neighbour, set the entry to be onlink. This
-+     * makes it possible to, e.g., assign /32 addresses on a mesh interface and
-+     * have routing work.
-+     */
-+    if (!neigh_find2(&p->p, &r->next_hop, r->neigh->ifa->iface, 0))
-+          a0.nh.flags = RNF_ONLINK;
-+
-     rta *a = rta_lookup(&a0);
-     rte *rte = rte_get_temp(a);
-     rte->u.babel.seqno = r->seqno;
--- 
-2.17.0
-
diff --git a/bird2/patches/0007-Fix-build-version.patch b/bird2/patches/0007-Fix-build-version.patch
deleted file mode 100644 (file)
index 84096ad..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-diff --git a/Makefile.in b/Makefile.in
-index c8168bb..eb6cc5c 100644
---- a/Makefile.in
-+++ b/Makefile.in
-@@ -21,11 +21,6 @@ INSTALL=@INSTALL@
- INSTALL_PROGRAM=@INSTALL_PROGRAM@
- INSTALL_DATA=@INSTALL_DATA@
--git-label:=$(strip $(shell git describe --always --dirty=-x 2>/dev/null))
--ifneq ($(git-label),)
--        CFLAGS += -DGIT_LABEL="$(git-label)"
--endif
--
- client=$(addprefix $(exedir)/,@CLIENT@)
- daemon=$(exedir)/bird
- protocols=@protocols@
-@@ -42,6 +37,11 @@ srcdir := @srcdir@
- objdir := @objdir@
- exedir := @exedir@
-+git-label:=$(strip $(shell cd $(srcdir) && [ "$$(git rev-parse --show-toplevel)" = "$$(readlink -f .)" ] && git describe --always --dirty=-x 2>/dev/null))
-+ifneq ($(git-label),)
-+        CFLAGS += -DGIT_LABEL="$(git-label)"
-+endif
-+
- ifeq ($(objdir),.)
-   objdir := $(realpath .)
- endif
diff --git a/bird2/patches/0008-Filter-Add-support-for-src-filter-op-to-access-SADR-.patch b/bird2/patches/0008-Filter-Add-support-for-src-filter-op-to-access-SADR-.patch
deleted file mode 100644 (file)
index dc2ed34..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-From b24b781117179f301116837f0a39468343e4805b Mon Sep 17 00:00:00 2001
-From: "Ondrej Zajicek (work)" <santiago@crfreenet.org>
-Date: Wed, 16 May 2018 11:19:29 +0200
-Subject: [PATCH] Filter: Add support for src filter op to access SADR source
- prefix
-
-The patch allows to use 'net.src' to access SADR source prefix
-from filters.
-
-Thanks to Toke Hoiland-Jorgensen for the original patch for srclen.
----
- filter/config.Y |  3 ++-
- filter/filter.c | 15 +++++++++++++++
- filter/filter.h |  1 +
- lib/net.h       |  2 ++
- 4 files changed, 20 insertions(+), 1 deletion(-)
-
-diff --git a/filter/config.Y b/filter/config.Y
-index f8170a83..e01e02ef 100644
---- a/filter/config.Y
-+++ b/filter/config.Y
-@@ -411,7 +411,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
-       TRUE, FALSE, RT, RO, UNKNOWN, GENERIC,
-       FROM, GW, NET, MASK, PROTO, SOURCE, SCOPE, DEST, IFNAME, IFINDEX,
-       PREFERENCE,
--      ROA_CHECK, ASN,
-+      ROA_CHECK, ASN, SRC,
-       IS_V4, IS_V6,
-       LEN, MAXLEN,
-       DEFINED,
-@@ -898,6 +898,7 @@ term:
-  | term '.' LEN { $$ = f_new_inst(FI_LENGTH); $$->a1.p = $1; }
-  | term '.' MAXLEN { $$ = f_new_inst(FI_ROA_MAXLEN); $$->a1.p = $1; }
-  | term '.' ASN { $$ = f_new_inst(FI_ROA_ASN); $$->a1.p = $1; }
-+ | term '.' SRC { $$ = f_new_inst(FI_SADR_SRC); $$->a1.p = $1; }
-  | term '.' MASK '(' term ')' { $$ = f_new_inst(FI_IP_MASK); $$->a1.p = $1; $$->a2.p = $5; }
-  | term '.' FIRST { $$ = f_new_inst(FI_AS_PATH_FIRST); $$->a1.p = $1; }
-  | term '.' LAST  { $$ = f_new_inst(FI_AS_PATH_LAST); $$->a1.p = $1; }
-diff --git a/filter/filter.c b/filter/filter.c
-index 881ba420..3d7b5c9f 100644
---- a/filter/filter.c
-+++ b/filter/filter.c
-@@ -1241,6 +1241,20 @@ interpret(struct f_inst *what)
-     default: runtime( "Prefix, path, clist or eclist expected" );
-     }
-     break;
-+  case FI_SADR_SRC:   /* Get SADR src prefix */
-+    ONEARG;
-+    if (v1.type != T_NET || !net_is_sadr(v1.val.net))
-+      runtime( "SADR expected" );
-+
-+    {
-+      net_addr_ip6_sadr *net = (void *) v1.val.net;
-+      net_addr *src = lp_alloc(f_pool, sizeof(net_addr_ip6));
-+      net_fill_ip6(src, net->src_prefix, net->src_pxlen);
-+
-+      res.type = T_NET;
-+      res.val.net = src;
-+    }
-+    break;
-   case FI_ROA_MAXLEN:         /* Get ROA max prefix length */
-     ONEARG;
-     if (v1.type != T_NET || !net_is_roa(v1.val.net))
-@@ -1714,6 +1728,7 @@ i_same(struct f_inst *f1, struct f_inst *f2)
-   case FI_RETURN: ONEARG; break;
-   case FI_ROA_MAXLEN: ONEARG; break;
-   case FI_ROA_ASN: ONEARG; break;
-+  case FI_SADR_SRC: ONEARG; break;
-   case FI_IP: ONEARG; break;
-   case FI_IS_V4: ONEARG; break;
-   case FI_ROUTE_DISTINGUISHER: ONEARG; break;
-diff --git a/filter/filter.h b/filter/filter.h
-index d347924a..982276f0 100644
---- a/filter/filter.h
-+++ b/filter/filter.h
-@@ -55,6 +55,7 @@
-   F(FI_LENGTH,                          0, 'L') \
-   F(FI_ROA_MAXLEN,            'R', 'M') \
-   F(FI_ROA_ASN,                       'R', 'A') \
-+  F(FI_SADR_SRC,              'n', 's') \
-   F(FI_IP,                    'c', 'p') \
-   F(FI_ROUTE_DISTINGUISHER,   'R', 'D') \
-   F(FI_AS_PATH_FIRST,         'a', 'f') \
-diff --git a/lib/net.h b/lib/net.h
-index ad4000fd..0cd5f735 100644
---- a/lib/net.h
-+++ b/lib/net.h
-@@ -268,6 +268,8 @@ static inline int net_is_roa(const net_addr *a)
- static inline int net_is_flow(const net_addr *a)
- { return (a->type == NET_FLOW4) || (a->type == NET_FLOW6); }
-+static inline int net_is_sadr(const net_addr *a)
-+{ return (a->type == NET_IP6_SADR); }
- static inline ip4_addr net4_prefix(const net_addr *a)
- { return ((net_addr_ip4 *) a)->prefix; }
--- 
-2.17.0
-
diff --git a/bmx6/Makefile b/bmx6/Makefile
deleted file mode 100644 (file)
index 92610e1..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-#    Copyright (C) 2011 Fundacio Privada per a la Xarxa Oberta, Lliure i Neutral guifi.net
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License along
-#    with this program; if not, write to the Free Software Foundation, Inc.,
-#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-#    The full GNU General Public License is included in this distribution in
-#    the file called "COPYING".
-#
-# Contibutors:
-#      Axel Neumann, Simó Albert i Beltran, Pau Escrich
-#
-
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=bmx6
-
-PKG_SOURCE_PROTO:=git
-
-PKG_SOURCE_URL:=https://github.com/bmx-routing/bmx6.git
-
-PKG_REV:=0312168aaa384379ccbefd4b2d936fc698664d5b
-PKG_MIRROR_HASH:=98acdbda8a8cadadf8141c7b8a17b6417112f70f3211b86abad23a8c7a28be10
-PKG_VERSION:=r2018020902
-PKG_RELEASE:=5
-PKG_LICENSE:=GPL-2.0
-
-PKG_SOURCE_VERSION:=$(PKG_REV)
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
-PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
-
-include $(INCLUDE_DIR)/package.mk
-
-TARGET_CFLAGS += $(FPIC)
-
-MAKE_ARGS += \
-       EXTRA_CFLAGS="$(TARGET_CFLAGS) -I. -I$(STAGING_DIR)/usr/include -DNO_DEBUG_ALL -DNO_DEBUG_DUMP" \
-       EXTRA_LDFLAGS="-L$(STAGING_DIR)/usr/lib " \
-       GIT_REV="$(PKG_REV)" \
-       CC="$(TARGET_CC)" \
-       INSTALL_DIR="$(PKG_INSTALL_DIR)" \
-       STRIP="/bin/false" \
-       build_all
-
-define Package/bmx6/Default
-  SECTION:=net
-  CATEGORY:=Network
-  SUBMENU:=Routing and Redirection
-  TITLE:=BMX6 layer 3 routing daemon
-  URL:=http://bmx6.net/
-  MAINTAINER:=Axel Neumann <neumann@cgws.de>
-  DEPENDS:=+kmod-ip6-tunnel +kmod-iptunnel6 +kmod-tun
-endef
-
-define Package/bmx6/description
-BMX6 layer 3 routing daemon supporting IPv4, IPv6, and IPv4 over IPv6
-endef
-
-define Package/bmx6
-  $(call Package/bmx6/Default)
-  MENU:=1
-endef
-
-define Package/bmx6-uci-config
-  $(call Package/bmx6/Default)
-  DEPENDS:=bmx6 +libuci
-  TITLE:=configuration plugin based on uci (recommended!)
-endef
-
-define Package/bmx6-json
-  $(call Package/bmx6/Default)
-  DEPENDS:=bmx6 +libjson-c
-  TITLE:=json plugin based on json-c
-endef
-
-define Package/bmx6-sms
-  $(call Package/bmx6/Default)
-  DEPENDS:=bmx6
-  TITLE:=sms plugin
-endef
-
-#define Package/bmx6-quagga
-#  $(call Package/bmx6/Default)
-#  DEPENDS:=bmx6 +qmp-quagga @BROKEN
-#  TITLE:=bmx6 quagga plugin to redistribute/export routes (needs manet/bmx6 patched quagga 0.99.21)
-#endef
-
-define Package/bmx6-table
-  $(call Package/bmx6/Default)
-  DEPENDS:=bmx6
-  TITLE:=bmx6 table plugin to automatic announce routing-table routes via ip6ip tunnels
-endef
-
-define Build/Configure
-       mkdir -p $(PKG_INSTALL_DIR)
-endef
-
-define Build/Compile
-       $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_ARGS)
-endef
-
-define Package/bmx6/install
-       $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/bmx6 $(1)/usr/sbin/bmx6
-endef
-
-define Package/bmx6-uci-config/conffiles
-/etc/config/bmx6
-endef
-
-define Package/bmx6-uci-config/install
-       $(INSTALL_DIR) $(1)/usr/lib $(1)/etc/config $(1)/etc/init.d
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_uci_config/bmx6_config.so $(1)/usr/lib/bmx6_config.so
-       $(INSTALL_BIN) ./files/etc/init.d/bmx6 $(1)/etc/init.d/bmx6
-       $(INSTALL_DATA) ./files/etc/config/bmx6 $(1)/etc/config/bmx6
-endef
-
-define Package/bmx6-json/install
-       $(INSTALL_DIR) $(1)/usr/lib
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_json/bmx6_json.so $(1)/usr/lib/bmx6_json.so
-endef
-
-define Package/bmx6-sms/install
-       $(INSTALL_DIR) $(1)/usr/lib
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_sms/bmx6_sms.so $(1)/usr/lib/bmx6_sms.so
-endef
-
-define Package/bmx6-table/install
-       $(INSTALL_DIR) $(1)/usr/lib
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_table/bmx6_table.so $(1)/usr/lib/bmx6_table.so
-endef
-
-#define Package/bmx6-quagga/install
-#      $(INSTALL_DIR) $(1)/usr/lib
-#      $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_quagga/bmx6_quagga.so $(1)/usr/lib/bmx6_quagga.so
-#endef
-
-$(eval $(call BuildPackage,bmx6))
-$(eval $(call BuildPackage,bmx6-uci-config))
-$(eval $(call BuildPackage,bmx6-json))
-$(eval $(call BuildPackage,bmx6-sms))
-#$(eval $(call BuildPackage,bmx6-quagga))
-$(eval $(call BuildPackage,bmx6-table))
diff --git a/bmx6/files/etc/config/bmx6 b/bmx6/files/etc/config/bmx6
deleted file mode 100644 (file)
index 884fd12..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-
-# for more information:
-# http://bmx6.net/projects/bmx6/wiki
-# options execute: bmx6 --help
-
-config 'bmx6' 'general'
-#       option 'runtimeDir' '/var/run/bmx6'
-#       option 'tun4Address' '10.202.0.116/32'
-#       option 'tun4Address' '10.254.10.0/32'
-#       option 'tun6Address' '2012:0:0:1000::1/64'
-
-#config 'ipVersion' 'ipVersion'
-#       option 'ipVersion' '6'   # default is 4
-#       option 'throwRules' '0'
-
-
-#config 'plugin'
-#        option 'plugin' 'bmx6_config.so'
-
-
-
-#config 'plugin'
-#        option 'plugin' 'bmx6_json.so'
-
-
-
-#config 'plugin'
-#        option 'plugin' 'bmx6_sms.so'
-
-
-config 'dev' 'mesh_1'
-        option 'dev' 'eth0.12'
-
-config 'dev' 'mesh_2'
-        option 'dev' 'ath0.12'
-
-
-
-#config 'hna' 'my_global_prefix'
-#       option 'hna' '2012:0:0:74:0:0:0:0/64'
-
-
-#config 'tunOut'
-#        option 'tunOut' 'ip6'
-#        option 'network' '2012::/16'
-#        option 'exportDistance' '0'
-
-#config 'tunOut'
-#        option 'tunOut' 'ip4'
-#        option 'network' '10.254.0.0/16'
-#        option 'exportDistance' '0'  # requires quagga plugin !
-#        option 'minPrefixLen' '27'
-
-
-
-#config 'plugin'
-#        option 'plugin' 'bmx6_quagga.so'
-
-
-
-#config 'redistribute'
-#        option 'redistribute' 'ospf6'
-#        option 'network' '10.0.0.0/8'
-#        option 'minPrefixLen' '10'
-#        option 'bandwidth' '10000000'
-#        option 'ospf6' '1'
-#        option 'aggregatePrefixLen' '16'
-
-#config 'redistribute'
-#        option 'redistribute' 'bgp'
-#        option 'network' '0.0.0.0/0'
-#        option 'minPrefixLen' '0'
-#        option 'maxPrefixLen' '24'
-#        option 'bandwidth' '10000000'
-#        option 'bgp' '1'
-#        option 'aggregatePrefixLen' '8'
-
-
-
-
-
-
diff --git a/bmx6/files/etc/init.d/bmx6 b/bmx6/files/etc/init.d/bmx6
deleted file mode 100755 (executable)
index 9d48eb4..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/sh /etc/rc.common
-#    Copyright (C) 2017 Gui Iribarren <gui@altermundi.net>
-#    Copyright (C) 2011 Fundacio Privada per a la Xarxa Oberta, Lliure i Neutral guifi.net
-#
-#    This is free software, licensed under the GNU General Public License v3.
-
-START=91
-STOP=91
-USE_PROCD=1
-
-NAME=bmx6
-BIN=/usr/sbin/bmx6
-CONF=/etc/config/bmx6
-PID=/var/run/bmx6/pid
-DEBUG=0
-
-start_service() {
-    procd_open_instance "$NAME"
-    procd_set_param command "$BIN" -f "$CONF" -d "$DEBUG"
-
-    ### Respawn automatically when process dies, after waiting respawn_timeout seconds
-    ### If respawn_retry consecutives respawns die before respawn_threshold seconds (i.e. they crash)
-    ### it will stop trying and leave it dead.
-    procd_set_param respawn ${respawn_threshold:-60} ${respawn_timeout:-3} ${respawn_retry:-5}
-
-    procd_set_param limits core="20000"  # Equivalent to 'ulimit -c 20000'
-    procd_close_instance
-}
-
-reload_service() {
-    "$BIN" -c configReload
-}
-
-service_triggers()
-{
-    procd_add_reload_trigger "bmx6" # Call reload_service() when /etc/config/bmx6 changed and reload_config is run
-}
index 80e1bd09a4dd066879bddb17d122350263a6989b..7813856dc08af08cee1f94a26e4027dd5fd30ab2 100644 (file)
@@ -1,70 +1,51 @@
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License along
-#    with this program; if not, write to the Free Software Foundation, Inc.,
-#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-#    The full GNU General Public License is included in this distribution in
-#    the file called "COPYING".
-#
-# Contibutors:
-#      Axel Neumann, Simó Albert i Beltran, Pau Escrich
-#
-
-
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=bmx7
+PKG_VERSION:=7.1.1
+PKG_RELEASE:=5
 
-PKG_SOURCE_PROTO:=git
-
-PKG_SOURCE_URL:=https://github.com/bmx-routing/bmx7.git
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://codeload.github.com/bmx-routing/bmx7/tar.gz/v$(PKG_VERSION)?
+PKG_HASH:=5f88df1c95e5cb842a6016bb1604e3e7f6097c63c5c9916edc3c84e96d4f5f65
 
-PKG_REV:=9883383dc26df16da67b9ef7ba99efe62f79c4e7
-PKG_MIRROR_HASH:=012178aba42016d3e0961715f99bf1e322c2c6c22b1cc6635375468360cb4d68
-PKG_VERSION:=r2018042501
-PKG_RELEASE:=3
-PKG_LICENSE:=GPL-2.0
+PKG_MAINTAINER:=Axel Neumann <neumann@cgws.de>
+PKG_LICENSE:=GPL-2.0-or-later
+PKG_LICENSE_FILES:=LICENSE
 
-PKG_SOURCE_VERSION:=$(PKG_REV)
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
-PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
+PKG_BUILD_PARALLEL:=1
 
 include $(INCLUDE_DIR)/package.mk
 
 TARGET_CFLAGS += $(FPIC)
 
-MAKE_ARGS += EXTRA_CFLAGS="$(TARGET_CFLAGS) -I. -I$(STAGING_DIR)/usr/include -DCRYPTLIB=MBEDTLS_2_4_0 -DCORE_LIMIT=20000 -DTRAFFIC_DUMP -DNO_TRACE_FUNCTION_CALLS -DBMX7_LIB_IWINFO"
-
-MAKE_ARGS += \
-        EXTRA_LDFLAGS="$(TARGET_LDFLAGS) -L$(STAGING_DIR)/usr/lib -liwinfo" \
-        GIT_REV="$(PKG_REV)" \
-        CC="$(TARGET_CC)" \
-        INSTALL_DIR="$(PKG_INSTALL_DIR)" \
-        build_all
+MAKE_ARGS += EXTRA_CFLAGS="$(TARGET_CFLAGS) \
+                               -I. \
+                               -I$(STAGING_DIR)/usr/include \
+                               -DCRYPTLIB=MBEDTLS_2_8_0 \
+                               -DCORE_LIMIT=20000 \
+                               -DTRAFFIC_DUMP \
+                               -DNO_TRACE_FUNCTION_CALLS \
+                               -DBMX7_LIB_IWINFO" \
+                               EXTRA_LDFLAGS="$(TARGET_LDFLAGS) \
+                               -L$(STAGING_DIR)/usr/lib -liwinfo" \
+                               GIT_REV="$(PKG_REV)" \
+                               CC="$(TARGET_CC)" \
+                               INSTALL_DIR="$(PKG_INSTALL_DIR)" \
+                               build_all
+
+MAKE_PATH:=src
 
 define Package/bmx7/Default
   SECTION:=net
   CATEGORY:=Network
   SUBMENU:=Routing and Redirection
   TITLE:=BMX7 layer 3 routing daemon
-  URL:=http://github.com/bmx-routing/bmx7
-  MAINTAINER:=Axel Neumann <neumann@cgws.de>
+  URL:=https://github.com/bmx-routing/bmx7
   DEPENDS:=+zlib +libmbedtls +libiwinfo
 endef
 
 define Package/bmx7/description
-BMX7 routing daemon supporting securely-entrusted IPv6 (and IPv4in6) routing
+  BMX7 routing daemon supporting securely-entrusted IPv6 (and IPv4in6) routing
 endef
 
 define Package/bmx7
@@ -81,7 +62,7 @@ endef
 define Package/bmx7-iwinfo
   $(call Package/bmx7/Default)
   DEPENDS:=bmx7 +libiwinfo
-  TITLE:=link characteristics plugin based on libiwinfo (recommended!)
+  TITLE:=link characteristics plugin via libiwinfo (recommended!)
 endef
 
 define Package/bmx7-topology
@@ -114,30 +95,15 @@ define Package/bmx7-table
   TITLE:=plugin to announce routes from tables via tunnels
 endef
 
-define Build/Configure
-       mkdir -p $(PKG_INSTALL_DIR)
-endef
-
-define Build/Compile
-       $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_ARGS)
-endef
-
 define Package/bmx7/install
        $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/bmx7 $(1)/usr/sbin/bmx7
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/bmx7 $(1)/usr/sbin/bmx7
 endef
 
-define Package/bmx7/postinst
-#!/bin/sh
-# # check if we are on real system
-if [ -z "$${IPKG_INSTROOT}" ]; then
-       if [ -f /etc/sysupgrade.conf ] && ! grep bmx7 /etc/sysupgrade.conf; then
-               echo /etc/bmx7 >> /etc/sysupgrade.conf
-        fi
-fi
+define Build/Compile
+       $(MAKE) -C $(PKG_BUILD_DIR)/$(MAKE_PATH) $(MAKE_ARGS)
 endef
 
-
 define Package/bmx7-uci-config/conffiles
 /etc/config/bmx7
 /etc/bmx7
@@ -145,42 +111,48 @@ endef
 
 define Package/bmx7-uci-config/install
        $(INSTALL_DIR) $(1)/usr/lib $(1)/etc/config $(1)/etc/init.d
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_uci_config/bmx7_config.so $(1)/usr/lib/bmx7_config.so
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_uci_config/bmx7_config.so \
+               $(1)/usr/lib/bmx7_config.so
        $(INSTALL_BIN) ./files/etc/init.d/bmx7 $(1)/etc/init.d/bmx7
        $(INSTALL_DATA) ./files/etc/config/bmx7 $(1)/etc/config/bmx7
 endef
 
 define Package/bmx7-iwinfo/install
        $(INSTALL_DIR) $(1)/usr/lib
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_iwinfo/bmx7_iwinfo.so $(1)/usr/lib/bmx7_iwinfo.so
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_iwinfo/bmx7_iwinfo.so \
+               $(1)/usr/lib/bmx7_iwinfo.so
 endef
 
 define Package/bmx7-topology/install
        $(INSTALL_DIR) $(1)/usr/lib
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_topology/bmx7_topology.so $(1)/usr/lib/bmx7_topology.so
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_topology/bmx7_topology.so \
+               $(1)/usr/lib/bmx7_topology.so
 endef
 
 define Package/bmx7-json/install
        $(INSTALL_DIR) $(1)/usr/lib
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_json/bmx7_json.so $(1)/usr/lib/bmx7_json.so
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_json/bmx7_json.so \
+               $(1)/usr/lib/bmx7_json.so
 endef
 
 define Package/bmx7-sms/install
        $(INSTALL_DIR) $(1)/usr/lib
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_sms/bmx7_sms.so $(1)/usr/lib/bmx7_sms.so
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_sms/bmx7_sms.so \
+               $(1)/usr/lib/bmx7_sms.so
 endef
 
 define Package/bmx7-tun/install
        $(INSTALL_DIR) $(1)/usr/lib
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_tun/bmx7_tun.so $(1)/usr/lib/bmx7_tun.so
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_tun/bmx7_tun.so \
+               $(1)/usr/lib/bmx7_tun.so
 endef
 
 define Package/bmx7-table/install
        $(INSTALL_DIR) $(1)/usr/lib
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_table/bmx7_table.so $(1)/usr/lib/bmx7_table.so
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_table/bmx7_table.so \
+               $(1)/usr/lib/bmx7_table.so
 endef
 
-
 $(eval $(call BuildPackage,bmx7))
 $(eval $(call BuildPackage,bmx7-uci-config))
 $(eval $(call BuildPackage,bmx7-iwinfo))
index b92f52578ee15ad5126775933a96166046308cc1..648c9131a3b169027103ef7f45e455219d2ea60f 100644 (file)
@@ -1,11 +1,10 @@
-
 # for more information:
-# http://bmx6.net/projects/bmx6/wiki
+# https://github.com/bmx-routing/bmx7/
 # options execute: bmx7 --help
 
 config 'bmx7' 'general'
-#       option 'runtimeDir' '/var/run/bmx7'
-#      option 'trustedNodesDir' '/etc/bmx7/trustedNodes'
+#        option 'runtimeDir' '/var/run/bmx7'
+#        option 'trustedNodesDir' '/etc/bmx7/trustedNodes'
 
 #config 'plugin'
 #        option 'plugin' 'bmx7_config.so'
@@ -19,22 +18,18 @@ config 'bmx7' 'general'
 #config 'plugin'
 #        option 'plugin' 'bmx7_iwinfo.so'
 
-
 config 'dev' 'mesh_1'
         option 'dev' 'br-lan'
 
 config 'dev' 'mesh_2'
         option 'dev' 'wlan0'
 
-
-
 #config 'plugin'
 #        option 'plugin' 'bmx7_tun.so'
 
 #config 'plugin'
 #        option 'plugin' 'bmx7_table.so'
 
-
 #config 'tunDev' default
 #        option 'tunDev' 'default'
 #        option 'tun6Address' '2012:0:0:6666::1/64'
@@ -50,8 +45,3 @@ config 'dev' 'mesh_2'
 #        option 'tunOut' 'ip4'
 #        option 'network' '10.0.0.0/9'
 #        option 'minPrefixLen' '27'
-
-
-
-
-
index 74f896603cc30c9b8c6feeaff96e4b360e0e673f..2fb3a5508a5f1ca09477f74879c19cf4264cbc88 100755 (executable)
@@ -6,7 +6,7 @@ BIN=/usr/sbin/bmx7
 CONF=/etc/config/bmx7
 
 start_service() {
-       cd /root/
+       cd /root/ || return
        while pgrep -f mac80211.sh ; do sleep 1; done
 
        procd_open_instance "bmx7"
diff --git a/bmx7/patches/010-gcc10.patch b/bmx7/patches/010-gcc10.patch
new file mode 100644 (file)
index 0000000..d2b9fcb
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/src/bmx.h
++++ b/src/bmx.h
+@@ -290,7 +290,7 @@ enum ADGSN {
+ #define SUCCESS 0
+ #define FAILURE -1
+-const void* FAILURE_PTR;
++extern const void* FAILURE_PTR;
+ #define MAX_SELECT_TIMEOUT_MS 1100 /* MUST be smaller than (1000/2) to fit into max tv_usec */
diff --git a/bmx7/patches/020-siocgstamp.patch b/bmx7/patches/020-siocgstamp.patch
new file mode 100644 (file)
index 0000000..977aa49
--- /dev/null
@@ -0,0 +1,38 @@
+--- a/src/schedule.c
++++ b/src/schedule.c
+@@ -375,7 +375,9 @@ loop4Event:
+                                       continue;
+                               }
++#ifdef SIOCGSTAMP
+                               ioctl(pb.i.iif->rx_mcast_sock, SIOCGSTAMP, &(pb.i.tv_stamp));
++#endif
+                               rx_packet(&pb);
+@@ -401,7 +403,9 @@ loop4Event:
+                                       continue;
+                               }
++#ifdef SIOCGSTAMP
+                               ioctl(pb.i.iif->rx_fullbrc_sock, SIOCGSTAMP, &(pb.i.tv_stamp));
++#endif
+                               rx_packet(&pb);
+@@ -451,10 +455,15 @@ loop4Event:
+                                       }
+                               }
+ #endif
++#ifdef SIOCGSTAMP
+                               if (tv_stamp == NULL)
+                                       ioctl(pb.i.iif->unicast_sock, SIOCGSTAMP, &(pb.i.tv_stamp));
+                               else
+                                       timercpy(&(pb.i.tv_stamp), tv_stamp);
++#else
++                              if (tv_stamp)
++                                      timercpy(&(pb.i.tv_stamp), tv_stamp);
++#endif
+                               rx_packet(&pb);
diff --git a/bmx7/patches/100-rename-list_add_tail-and-struct-list_head.patch b/bmx7/patches/100-rename-list_add_tail-and-struct-list_head.patch
deleted file mode 100644 (file)
index ffb4584..0000000
+++ /dev/null
@@ -1,461 +0,0 @@
-From 53f5a6ef74acff4c7294f4346a3d88fa04ad49c9 Mon Sep 17 00:00:00 2001
-From: Daniel Golle <daniel@makrotopia.org>
-Date: Tue, 14 Aug 2018 12:19:49 +0200
-Subject: [PATCH] rename list_add_tail and struct list_head
-
-Rename some list stuff to avoid namespace collision with libubox
----
- control.c          | 18 +++++++++---------
- control.h          | 12 ++++++------
- lib/bmx7_tun/tun.c |  2 +-
- list.c             | 26 +++++++++++++-------------
- list.h             | 36 ++++++++++++++++++------------------
- msg.h              |  2 +-
- plugin.c           |  8 ++++----
- plugin.h           |  2 +-
- schedule.c         |  2 +-
- tun.h              |  2 +-
- 10 files changed, 55 insertions(+), 55 deletions(-)
-
-diff --git a/control.c b/control.c
-index ee9df30..9ab778d 100644
---- a/control.c
-+++ b/control.c
-@@ -73,7 +73,7 @@ uint32_t My_pid = 0;
- LIST_SIMPEL(ctrl_list, struct ctrl_node, list, list);
--struct list_head dbgl_clients[DBGL_MAX + 1];
-+struct bmx_list_head dbgl_clients[DBGL_MAX + 1];
- static struct dbg_histogram dbgl_history[2][DBG_HIST_SIZE];
- static uint8_t debug_system_active = NO;
-@@ -136,7 +136,7 @@ void add_dbgl_node(struct ctrl_node *cn, int dbgl)
-       dn->cn = cn;
-       cn->dbgl = dbgl;
--      list_add_tail(&dbgl_clients[dbgl], &dn->list);
-+      bmx_list_add_tail(&dbgl_clients[dbgl], &dn->list);
-       if (dbgl == DBGL_SYS || dbgl == DBGL_CHANGES) {
-               dbgf_all(DBGT_INFO, "resetting muted dbg history");
-@@ -255,7 +255,7 @@ struct ctrl_node *create_ctrl_node(int fd, void (*cn_fd_handler) (struct ctrl_no
- {
-       struct ctrl_node *cn = debugMallocReset(sizeof(struct ctrl_node), -300010);
--      list_add_tail(&ctrl_list, &cn->list);
-+      bmx_list_add_tail(&ctrl_list, &cn->list);
-       cn->fd = fd;
-       cn->cn_fd_handler = cn_fd_handler;
-@@ -571,7 +571,7 @@ void debug_output(uint32_t check_len, struct ctrl_node *cn, int8_t dbgl, int8_t
-               if (level == DBGL_SYS && mute_dbgl_sys == DBG_HIST_MUTED)
-                       continue;
--              list_for_each(list_pos, /*(struct list_head *)*/&(dbgl_clients[level]))
-+              list_for_each(list_pos, /*(struct bmx_list_head *)*/&(dbgl_clients[level]))
-               {
-                       struct dbgl_node *dn = list_entry(list_pos, struct dbgl_node, list);
-@@ -990,7 +990,7 @@ void register_option(struct opt_type *opt, const char * category_name)
-               opt->d.parent_opt = tmp_opt;
--              list_add_tail(&tmp_opt->d.childs_type_list, &opt->d.list);
-+              bmx_list_add_tail(&tmp_opt->d.childs_type_list, &opt->d.list);
-       } else {
-@@ -1017,7 +1017,7 @@ void register_option(struct opt_type *opt, const char * category_name)
-               }
-               if (!tmp_opt)
--                      list_add_tail(&opt_list, &opt->d.list);
-+                      bmx_list_add_tail(&opt_list, &opt->d.list);
-       }
-@@ -1094,7 +1094,7 @@ struct opt_type *get_option(struct opt_type *parent_opt, uint8_t short_opt, char
-       struct list_node *list_pos;
-       int32_t len = 0;
--      struct list_head *list;
-+      struct bmx_list_head *list;
-       struct opt_type *opt = NULL;
-       char *equalp = NULL;
-       char s[MAX_ARG_SIZE] = "";
-@@ -1305,7 +1305,7 @@ struct opt_child *add_opt_child(struct opt_type *opt, struct opt_parent *p)
-       c->opt = opt;
-       c->parent_instance = p;
--      list_add_tail(&p->childs_instance_list, &c->list);
-+      bmx_list_add_tail(&p->childs_instance_list, &c->list);
-       return c;
- }
-@@ -1347,7 +1347,7 @@ struct opt_parent *add_opt_parent(struct opt_type *opt)
-       LIST_INIT_HEAD(p->childs_instance_list, struct opt_child, list, list);
--      list_add_tail(&opt->d.parents_instance_list, &p->list);
-+      bmx_list_add_tail(&opt->d.parents_instance_list, &p->list);
-       return p;
- }
-diff --git a/control.h b/control.h
-index df0176f..4ef0854 100644
---- a/control.h
-+++ b/control.h
-@@ -49,7 +49,7 @@ typedef uint32_t TIME_SEC_T;
- extern int unix_sock;
--extern struct list_head ctrl_list;
-+extern struct bmx_list_head ctrl_list;
- extern int32_t Client_mode;
-@@ -115,7 +115,7 @@ struct ctrl_node {
-       int8_t dbgl;
- };
--extern struct list_head dbgl_clients[DBGL_MAX + 1];
-+extern struct bmx_list_head dbgl_clients[DBGL_MAX + 1];
- struct dbgl_node {
-       struct list_node list;
-@@ -227,7 +227,7 @@ struct ctrl_node *create_ctrl_node(int fd, void (*cn_fd_handler) (struct ctrl_no
- #define MAX_UNIX_MSG_SIZE 2000
--extern struct list_head opt_list;
-+extern struct bmx_list_head opt_list;
- /* opt_t types:
-@@ -292,7 +292,7 @@ struct opt_child {
- struct opt_parent {
-       struct list_node list;
--      struct list_head childs_instance_list;
-+      struct bmx_list_head childs_instance_list;
-       char *val; //key
-@@ -311,9 +311,9 @@ struct opt_data {
-       struct opt_type *parent_opt; //REMOVE THIS and use casting instead !
--      struct list_head childs_type_list; //if this opt is a section type, then further sub-opts types can be listed here
-+      struct bmx_list_head childs_type_list; //if this opt is a section type, then further sub-opts types can be listed here
--      struct list_head parents_instance_list; //
-+      struct bmx_list_head parents_instance_list; //
- };
- struct opt_type {
-diff --git a/lib/bmx7_tun/tun.c b/lib/bmx7_tun/tun.c
-index 2aa740c..265c47a 100644
---- a/lib/bmx7_tun/tun.c
-+++ b/lib/bmx7_tun/tun.c
-@@ -126,7 +126,7 @@ void set_tunXin6_net_adv_list_handl(uint8_t del, void **adv_list_ptr)
-       n = debugMallocReset(sizeof( struct tunXin6_net_adv_list_node), -300517);
-       n->adv_list = adv_list;
--      list_add_tail((&tunXin6_net_adv_list_list), &n->list);
-+      bmx_list_add_tail((&tunXin6_net_adv_list_list), &n->list);
- }
- STATIC_FUNC
-diff --git a/list.c b/list.c
-index 5e0665d..b698874 100644
---- a/list.c
-+++ b/list.c
-@@ -39,7 +39,7 @@
-  * @head: list head of maintained nodes
-  * @node: a node maintained in the list or NULL
-  */
--void * list_iterate(struct list_head *head, void *node)
-+void * list_iterate(struct bmx_list_head *head, void *node)
- {
-       struct list_node *ln = (node ?
-               ((struct list_node*) (((char*) node) + head->list_node_offset)) :
-@@ -53,7 +53,7 @@ void * list_iterate(struct list_head *head, void *node)
-       return(((char*) ln->next) - head->list_node_offset);
- }
--void *list_find_next(struct list_head *head, void* key, void *node)
-+void *list_find_next(struct bmx_list_head *head, void* key, void *node)
- {
-       while ((node = list_iterate(head, node))) {
-@@ -68,7 +68,7 @@ void *list_find_next(struct list_head *head, void* key, void *node)
-  * @head: list head to add it after
-  * @new: new entry to be added
-  */
--void list_add_head(struct list_head *head, struct list_node *new)
-+void list_add_head(struct bmx_list_head *head, struct list_node *new)
- {
-       new->next = head->next;
-@@ -82,12 +82,12 @@ void list_add_head(struct list_head *head, struct list_node *new)
- }
- /**
-- * list_add_tail - add a new entry
-+ * bmx_list_add_tail - add a new entry
-  * @head: list head to add it before
-  * @new: new entry to be added
-  */
--void list_add_tail(struct list_head *head, struct list_node *new)
-+void bmx_list_add_tail(struct bmx_list_head *head, struct list_node *new)
- {
-       new->next = (struct list_node *) head;
-       head->last->next = new;
-@@ -96,7 +96,7 @@ void list_add_tail(struct list_head *head, struct list_node *new)
-       head->items++;
- }
--void list_add_after(struct list_head *head, struct list_node *ln, struct list_node *new)
-+void list_add_after(struct bmx_list_head *head, struct list_node *ln, struct list_node *new)
- {
-       new->next = ln->next;
-       ln->next = new;
-@@ -112,7 +112,7 @@ void list_add_after(struct list_head *head, struct list_node *ln, struct list_no
-  * @entry: the element to delete from the list.
-  * Note: list_empty on entry does not return true after this, the entry is in an undefined state.
-  */
--void list_del_next(struct list_head *head, struct list_node *ln)
-+void list_del_next(struct bmx_list_head *head, struct list_node *ln)
- {
-       assertion(-502641, (ln->next != (struct list_node*) head));
-@@ -126,7 +126,7 @@ void list_del_next(struct list_head *head, struct list_node *ln)
-       head->items--;
- }
--void *list_del_head(struct list_head *head)
-+void *list_del_head(struct bmx_list_head *head)
- {
-       if (LIST_EMPTY(head))
-               return NULL;
-@@ -147,7 +147,7 @@ void *list_del_head(struct list_head *head)
-  */
- /* UNTESTED
--void * plist_iterate(struct list_head *head, struct plist_node **pln)
-+void * plist_iterate(struct bmx_list_head *head, struct plist_node **pln)
- {
-       if (head->last == (struct list_node*)
-@@ -169,17 +169,17 @@ static struct plist_node *plist_node_create(void *item)
-       return plh;
- }
--void plist_add_head(struct list_head *head, void *item)
-+void plist_add_head(struct bmx_list_head *head, void *item)
- {
-       list_add_head(head, &((plist_node_create(item))->list));
- }
--void plist_add_tail(struct list_head *head, void *item)
-+void plist_add_tail(struct bmx_list_head *head, void *item)
- {
--      list_add_tail(head, &((plist_node_create(item))->list));
-+      bmx_list_add_tail(head, &((plist_node_create(item))->list));
- }
--void * plist_del_head(struct list_head *head)
-+void * plist_del_head(struct bmx_list_head *head)
- {
-       struct plist_node *pln = list_del_head(head);
-diff --git a/list.h b/list.h
-index d40306c..770dc9f 100644
---- a/list.h
-+++ b/list.h
-@@ -28,7 +28,7 @@
- #ifndef _LIST_H
--#define _LIST_H
-+#define _LIST_H_
- #include <stdint.h>
-@@ -36,7 +36,7 @@ struct list_node {
-       struct list_node *next;
- };
--struct list_head {
-+struct bmx_list_head {
-       struct list_node *next;
-       struct list_node *last;
-       uint16_t items;
-@@ -52,7 +52,7 @@ struct plist_node {
--#define LIST_SIMPEL(ptr, element_type, list_field, key_field ) struct list_head ptr = { \
-+#define LIST_SIMPEL(ptr, element_type, list_field, key_field ) struct bmx_list_head ptr = { \
-           .next = (struct list_node *)&ptr, \
-           .last = (struct list_node *)&ptr,    \
-           .items = 0, \
-@@ -75,14 +75,14 @@ struct plist_node {
- #define list_get_first(head) ((void*)((LIST_EMPTY(head)) ? NULL : (((char*) (head)->next) - (head)->list_node_offset) ))
- #define list_get_last(head) ((void*)((LIST_EMPTY(head)) ? NULL : (((char*) (head)->last) - (head)->list_node_offset) ))
--void *list_iterate(struct list_head *head, void *node);
--void *list_find_next(struct list_head *head, void* key, void *node);
-+void *list_iterate(struct bmx_list_head *head, void *node);
-+void *list_find_next(struct bmx_list_head *head, void* key, void *node);
--void list_add_head(struct list_head *head, struct list_node * new);
--void list_add_tail(struct list_head *head, struct list_node * new);
--void list_add_after(struct list_head *head, struct list_node *pos, struct list_node * new);
--void list_del_next(struct list_head *head, struct list_node *pos);
--void *list_del_head(struct list_head *head);
-+void list_add_head(struct bmx_list_head *head, struct list_node * new);
-+void bmx_list_add_tail(struct bmx_list_head *head, struct list_node * new);
-+void list_add_after(struct bmx_list_head *head, struct list_node *pos, struct list_node * new);
-+void list_del_next(struct bmx_list_head *head, struct list_node *pos);
-+void *list_del_head(struct bmx_list_head *head);
- #define plist_get_first(head) (LIST_EMPTY(head) ? NULL : \
-@@ -91,17 +91,17 @@ void *list_del_head(struct list_head *head);
- #define plist_get_last(head) (LIST_EMPTY(head) ? NULL : \
-                               ((struct plist_node*)(((char*) (head)->prev) - (head)->list_node_offset))-item )
--void * plist_iterate(struct list_head *head, struct plist_node **pln);
-+void * plist_iterate(struct bmx_list_head *head, struct plist_node **pln);
--void plist_add_head(struct list_head *head, void *item);
--void plist_add_tail(struct list_head *head, void *item);
--void *plist_del_head(struct list_head *head);
-+void plist_add_head(struct bmx_list_head *head, void *item);
-+void plist_add_tail(struct bmx_list_head *head, void *item);
-+void *plist_del_head(struct bmx_list_head *head);
- /**
-  * list_entry - get the struct for this entry
-- * @ptr:      the &struct list_head pointer.
-+ * @ptr:      the &struct bmx_list_head pointer.
-  * @type:     the type of the struct this is embedded in.
-  * @member:   the name of the list_struct within the struct.
-  */
-@@ -109,7 +109,7 @@ void *plist_del_head(struct list_head *head);
- /**
-  * list_for_each      -       iterate over a list
-- * @pos:      the &struct list_head to use as a loop counter.
-+ * @pos:      the &struct bmx_list_head to use as a loop counter.
-  * @head:     the head for your list.
-  */
- #define list_for_each(pos, head) \
-@@ -123,8 +123,8 @@ void *plist_del_head(struct list_head *head);
- /**
-  * list_for_each_safe -       iterate over a list safe against removal of list entry
-- * @pos:      the &struct list_head to use as a loop counter.
-- * @n:                another &struct list_head to use as temporary storage
-+ * @pos:      the &struct bmx_list_head to use as a loop counter.
-+ * @n:                another &struct bmx_list_head to use as temporary storage
-  * @head:     the head for your list.
-  */
- #define list_for_each_safe(pos, n, head) \
-diff --git a/msg.h b/msg.h
-index d36f6e2..b881cef 100644
---- a/msg.h
-+++ b/msg.h
-@@ -357,7 +357,7 @@ struct tx_frame_iterator {
-       // MUST be initialized:
-       // remains unchanged:
-       const char *caller;
--      struct list_head *tx_task_list;
-+      struct bmx_list_head *tx_task_list;
-       struct tx_task_node *ttn;
-       //      struct desc_contents *descContents;
-       struct frame_db *db;
-diff --git a/plugin.c b/plugin.c
-index 5016956..102cdba 100644
---- a/plugin.c
-+++ b/plugin.c
-@@ -74,7 +74,7 @@ void _set_thread_hook(int32_t cb_type, void (*cb_handler) (void), int8_t del, st
-               cleanup_all(-500143);
-       }
--      list_for_each_safe(list_pos, tmp_pos, (struct list_head*) cb_list)
-+      list_for_each_safe(list_pos, tmp_pos, (struct bmx_list_head*) cb_list)
-       {
-               cbn = list_entry(list_pos, struct cb_node, list);
-@@ -82,7 +82,7 @@ void _set_thread_hook(int32_t cb_type, void (*cb_handler) (void), int8_t del, st
-                       if (del) {
--                              list_del_next(((struct list_head*) cb_list), prev_pos);
-+                              list_del_next(((struct bmx_list_head*) cb_list), prev_pos);
-                               debugFree(cbn, -300069);
-                               return;
-@@ -103,7 +103,7 @@ void _set_thread_hook(int32_t cb_type, void (*cb_handler) (void), int8_t del, st
-       cbn->cb_type = cb_type;
-       cbn->cb_handler = cb_handler;
--      list_add_tail(((struct list_head*) cb_list), &cbn->list);
-+      bmx_list_add_tail(((struct bmx_list_head*) cb_list), &cbn->list);
- }
-@@ -261,7 +261,7 @@ int activate_plugin(struct plugin *p, void *dlhandle, const char *dl_name)
-       pn->plugin = p;
-       pn->dlhandle = dlhandle;
--      list_add_tail(&plugin_list, &pn->list);
-+      bmx_list_add_tail(&plugin_list, &pn->list);
-       dbgf_all(DBGT_INFO, "%s SUCCESS", pn->plugin->plugin_name);
-diff --git a/plugin.h b/plugin.h
-index 5028d4e..b5c9727 100644
---- a/plugin.h
-+++ b/plugin.h
-@@ -74,7 +74,7 @@ struct cb_fd_node {
-       void (*cb_fd_handler) (int32_t fd);
- };
--extern struct list_head cb_fd_list;
-+extern struct bmx_list_head cb_fd_list;
- // cb_fd_handler is called when fd received data
- // called function may remove itself
- void set_fd_hook(int32_t fd, void (*cb_fd_handler) (int32_t fd), int8_t del);
-diff --git a/schedule.c b/schedule.c
-index 8e3f7a6..8868b01 100644
---- a/schedule.c
-+++ b/schedule.c
-@@ -205,7 +205,7 @@ void task_register(TIME_T timeout, void (* task) (void *), void *data, int32_t t
-       }
-       if ((tmp_tn == NULL) || (U32_LE(tmp_tn->expire, tn->expire)))
--              list_add_tail(&task_list, &tn->list);
-+              bmx_list_add_tail(&task_list, &tn->list);
- }
-diff --git a/tun.h b/tun.h
-index 06b8c6f..102ee87 100644
---- a/tun.h
-+++ b/tun.h
-@@ -309,7 +309,7 @@ struct tunXin6_net_adv_list_node {
- };
--extern struct list_head tunXin6_net_adv_list_list;
-+extern struct bmx_list_head tunXin6_net_adv_list_list;
- struct tun_bit_key_nodes {
-       struct tun_search_node *tsn;
index cd5ca905574e1780848b6ff0680efb70bd6fae2d..cd3ccfeb4b13cc0a502ab4dc09be73893d8297d5 100644 (file)
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=cjdns
-PKG_VERSION:=20.2
-PKG_RELEASE:=1
+PKG_VERSION:=21.1
+PKG_RELEASE:=6
 
-PKG_SOURCE_URL:=https://github.com/cjdelisle/cjdns.git
-PKG_SOURCE_PROTO:=git
-PKG_SOURCE_VERSION:=77259a49e5bc7ca7bc6dca5bd423e02be563bdc5
-PKG_LICENSE:=GPL-3.0
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.bz2
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION)
-PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_SOURCE_VERSION)
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://codeload.github.com/cjdelisle/cjdns/tar.gz/$(PKG_NAME)-v$(PKG_VERSION)?
+PKG_HASH:=a6158ce7847159aa44e86f74ccc7b6ded6910a230ed8f3830db53cda5838f0b0
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_NAME)-v$(PKG_VERSION)
 
-include $(INCLUDE_DIR)/package.mk
+PKG_MAINTAINER:=William Fleurant <meshnet@protonmail.com>
+PKG_LICENSE:=GPL-3.0-or-later
+PKG_LICENSE_FILES:=LICENSE
 
+include $(INCLUDE_DIR)/package.mk
 
 define Package/cjdns
        SECTION:=net
@@ -37,8 +37,7 @@ define Package/cjdns
        SUBMENU:=Routing and Redirection
        TITLE:=Encrypted near-zero-conf mesh routing protocol
        URL:=https://github.com/cjdelisle/cjdns
-       MAINTAINER:=Lars Gierth <larsg@systemli.org>
-       DEPENDS:=@IPV6 +kmod-tun +libnl-tiny +libpthread +librt \
+       DEPENDS:=@!arc @IPV6 +kmod-tun +libnl-tiny +libpthread +librt \
                +libuci-lua +lua-bencode +dkjson +luasocket +lua-sha2
 endef
 
@@ -55,12 +54,11 @@ define Package/cjdns-tests
        SUBMENU:=Routing and Redirection
        TITLE:=cjdns test cases
        URL:=https://github.com/cjdelisle/cjdns
-       MAINTAINER:=Lars Gierth <larsg@systemli.org>
-       DEPENDS:=+libpthread +librt
+       DEPENDS:=+libpthread +librt @!arc
 endef
 
 define Package/cjdns-test/description
-       cjdns test cases
+       Builds cjdns test cases binary test_testcjdroute_c
 endef
 
 define Build/Configure
@@ -80,10 +78,10 @@ define Build/Compile
        $(INSTALL_DIR) $(PKG_BUILD_DIR)/tmp
        (cd $(PKG_BUILD_DIR) && \
        CROSS="true" \
-       CC="$(TARGET_CC)" \
+       CC="$(TARGET_CC_NOCACHE)" \
        AR="$(TARGET_AR)" \
        RANLIB="$(TARGET_RANLIB)" \
-       CFLAGS="$(TARGET_CFLAGS) -U_FORTIFY_SOURCE" \
+       CFLAGS="$(TARGET_CFLAGS) -U_FORTIFY_SOURCE -Wno-error=array-bounds -Wno-error=stringop-overflow -Wno-error=stringop-overread" \
        LDFLAGS="$(TARGET_LDFLAGS)" \
        SYSTEM="linux" \
        TARGET_ARCH="$(CONFIG_ARCH)" \
@@ -101,7 +99,8 @@ define Package/cjdns/install
                $(1)/etc/config \
                $(1)/etc/init.d \
                $(1)/etc/uci-defaults \
-               $(1)/usr/lib/lua/cjdns
+               $(1)/usr/lib/lua/cjdns \
+               $(1)/usr/share/ucitrack
 
        $(INSTALL_BIN) \
                ./files/cjdrouteconf \
@@ -123,6 +122,10 @@ define Package/cjdns/install
                ./files/cjdns.defaults \
                $(1)/etc/uci-defaults/cjdns
 
+       $(INSTALL_DATA) \
+               ./files/luci-app-cjdns.json \
+               $(1)/usr/share/ucitrack
+
        $(CP) \
                ./lua/cjdns/* \
                $(1)/usr/lib/lua/cjdns
@@ -132,7 +135,6 @@ define Package/cjdns/postinst
 #!/bin/sh
 if [ -z $${IPKG_INSTROOT} ] ; then
        ( . /etc/uci-defaults/cjdns ) && rm -f /etc/uci-defaults/cjdns
-       # TODO: we should have an 'Enable' button instead
        /etc/init.d/cjdns enabled || /etc/init.d/cjdns enable
        exit 0
 fi
index f2baf6d6c5b51f6ef5dc0cbd3dc95c052a865d9b..04e9ceb4f4c903cd12b9685bd3b9364c78b87440 100644 (file)
@@ -4,14 +4,6 @@
 uci get cjdns.cjdns.ipv6 >/dev/null 2>&1
 if [ $? -ne 0 ]; then
 
-  # register commit handler
-  uci -q batch <<-EOF >/dev/null
-    delete ucitrack.@cjdns[-1]
-    add ucitrack cjdns
-    set ucitrack.@cjdns[-1].init=cjdns
-    commit ucitrack
-EOF
-
   # generate configuration
   touch /etc/config/cjdns
   cjdroute --genconf | cjdroute --cleanconf | cjdrouteconf set
@@ -23,17 +15,10 @@ EOF
   fi
 
   # enable auto-peering on ethernet interface lan, if existing
-  uci get network.lan | grep interface >/dev/null 2>&1
-  if [ $? -eq 0 ]; then
-    uci get network.lan.type | grep bridge >/dev/null 2>&1
-    if [ $? -eq 0 ]; then
-      # most routers will set up an ethernet bridge for the lan
-      ifname="br-lan"
-    else
-      # docker containers don't have permission to create bridges by default,
-      # so we bind to the underlying interface instead (likely eth0)
-      ifname=`uci get network.lan.ifname`
-    fi
+  ifname=$(uci -q get network.lan.device || \
+           ([ "$(uci -q get network.lan.type)" == "bridge" ] && echo br-lan) || \
+           uci -q get network.lan.ifname)
+  if [ -n "$ifname" ]; then
     uci -q batch <<-EOF >/dev/null
       add cjdns eth_interface
       set cjdns.@eth_interface[-1].beacon=2
@@ -46,7 +31,7 @@ EOF
   # create the network interface
   uci -q batch <<-EOF >/dev/null
     set network.cjdns=interface
-    set network.cjdns.ifname=tuncjdns
+    set network.cjdns.device=tuncjdns
     set network.cjdns.proto=none
 EOF
 
diff --git a/cjdns/files/luci-app-cjdns.json b/cjdns/files/luci-app-cjdns.json
new file mode 100644 (file)
index 0000000..386b0fa
--- /dev/null
@@ -0,0 +1,4 @@
+{
+       "config": "cjdns",
+       "init": "cjdns"
+}
index f4716b772bf89e219980d7e707d37b35f306a4b2..d6b6633e9968a69c30bd68075f93b5f649782c55 100644 (file)
@@ -53,6 +53,10 @@ function UCI.get()
     obj.router.interface.tunDevice = config.tun_device
   end
 
+  cursor:foreach("cjdns", "supernodes", function(supernodes)
+    table.insert(obj.router.supernodes, supernodes.public_key)
+  end)
+
   for i,section in pairs(obj.security) do
     if type(section.seccomp) == "number" then
       obj.security[i].seccomp = tonumber(config.seccomp)
diff --git a/cjdns/patches/001-five-mins-builder-zonk.patch b/cjdns/patches/001-five-mins-builder-zonk.patch
new file mode 100644 (file)
index 0000000..c53c62f
--- /dev/null
@@ -0,0 +1,13 @@
+--- a/node_build/builder.js
++++ b/node_build/builder.js
+@@ -277,8 +277,8 @@ const execJs = function (js, ctx, file,
+     js = '"use strict";' + qs.join("'");
+     const to = setTimeout(function () {
+-        throw new Error("Inline JS did not return after 120 seconds [" + js + "]");
+-    }, 120000);
++        throw new Error("Inline JS did not return after 5 minutes [" + js + "]");
++    }, 300000);
+     nThen(function (waitFor) {
diff --git a/cjdns/patches/020-prefer-python2.patch b/cjdns/patches/020-prefer-python2.patch
new file mode 100644 (file)
index 0000000..5bb8624
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/node_build/FindPython.js
++++ b/node_build/FindPython.js
+@@ -23,7 +23,7 @@ var Fs = require('fs');
+ // de-prioritize because the testing script accepts ANY python3 version
+ // (as of this writing, we don't know what python3 versions actually work)
+ // whereas we know that python2.7 is the only working python2 version.
+-var PYTHONS = ["python3.7", "python3", "python2.7", "python2", "python"];
++var PYTHONS = ["python2", "python2.7", "python3.7", "python3.8", "python3.9", "python3"]
+ var SCRIPT = [
+     'import sys',
diff --git a/cjdns/patches/030-fix-invalid-pointer.patch b/cjdns/patches/030-fix-invalid-pointer.patch
new file mode 100644 (file)
index 0000000..ae988a9
--- /dev/null
@@ -0,0 +1,23 @@
+--- a/net/SwitchPinger_admin.c
++++ b/net/SwitchPinger_admin.c
+@@ -78,8 +78,10 @@ static void adminPing(Dict* args, void*
+     uint32_t timeout = (timeoutPtr) ? *timeoutPtr : DEFAULT_TIMEOUT;
+     uint64_t path;
+     String* err = NULL;
++    String* pathNotParsable = String_CONST("path was not parsable.");
++    String* noOpenSlots = String_CONST("no open slots to store ping, try later.");
+     if (pathStr->len != 19 || AddrTools_parsePath(&path, (uint8_t*) pathStr->bytes)) {
+-        err = String_CONST("path was not parsable.");
++        err = pathNotParsable;
+     } else {
+         struct SwitchPinger_Ping* ping = SwitchPinger_newPing(path,
+                                                               data,
+@@ -89,7 +91,7 @@ static void adminPing(Dict* args, void*
+                                                               context->switchPinger);
+         if (keyPing && *keyPing) { ping->type = SwitchPinger_Type_KEYPING; }
+         if (!ping) {
+-            err = String_CONST("no open slots to store ping, try later.");
++            err = noOpenSlots;
+         } else {
+             ping->onResponseContext = Allocator_clone(ping->pingAlloc, (&(struct Ping) {
+                 .context = context,
diff --git a/cjdns/patches/040-gyp-python_310.patch b/cjdns/patches/040-gyp-python_310.patch
new file mode 100644 (file)
index 0000000..abff213
--- /dev/null
@@ -0,0 +1,15 @@
+--- a/node_build/dependencies/libuv/build/gyp/pylib/gyp/common.py
++++ b/node_build/dependencies/libuv/build/gyp/pylib/gyp/common.py
+@@ -4,7 +4,11 @@
+ from __future__ import with_statement
+-import collections
++try:
++  # Python 3.10
++  from six.moves import collections_abc as collections
++except ImportError:
++  import collections
+ import errno
+ import filecmp
+ import os.path
index 6390f1375acba07c000787dadb7fb4843225b18d..9adcc68481b0f601d1da2d8b700a65835f489da0 100644 (file)
@@ -7,17 +7,19 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=hnetd
-PKG_SOURCE_VERSION:=606d7e904603ad8792ac1a7ba825618df97b5a4e
-PKG_VERSION:=2016-06-28-$(PKG_SOURCE_VERSION)
+PKG_SOURCE_DATE:=2018-12-21
+PKG_SOURCE_VERSION:=c43766610ed30194b048bc070a3c433aec731c40
 PKG_RELEASE:=1
 
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_URL:=https://github.com/sbyx/hnetd.git
+PKG_SOURCE_URL:=https://github.com/sbyx/hnetd
+PKG_MIRROR_HASH:=3b3bfff16b99dfd23b74932ac6a74af18cb9f8fd029980f1bd3788ddfb0414bb
+
 PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
-PKG_LICENSE:=GPL-2.0
+PKG_LICENSE:=GPL-2.0-only
+PKG_LICENSE_FILES:=LICENSE
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_PARALLEL:=1
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/cmake.mk
diff --git a/hnetd/patches/010-openssl-deprecated.patch b/hnetd/patches/010-openssl-deprecated.patch
new file mode 100644 (file)
index 0000000..1bcfbf7
--- /dev/null
@@ -0,0 +1,43 @@
+--- a/src/dtls.c
++++ b/src/dtls.c
+@@ -698,8 +698,10 @@ dtls dtls_create(uint16_t port)
+   if (!_ssl_initialized)
+     {
+       _ssl_initialized = true;
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
+       SSL_load_error_strings();
+       SSL_library_init();
++#endif
+     }
+   if (!d)
+     goto fail;
+@@ -711,9 +713,9 @@ dtls dtls_create(uint16_t port)
+     goto fail;
+ #ifdef USE_ONE_CONTEXT
+-  SSL_CTX *ctx = SSL_CTX_new(DTLSv1_method());
++  SSL_CTX *ctx = SSL_CTX_new(DTLS_method());
+ #else
+-  SSL_CTX *ctx = SSL_CTX_new(DTLSv1_server_method());
++  SSL_CTX *ctx = SSL_CTX_new(DTLS_server_method());
+ #endif /* USE_ONE_CONTEXT */
+   if (!ctx)
+     {
+@@ -1002,6 +1004,7 @@ _client_psk(SSL *ssl,
+ bool dtls_set_psk(dtls d, const char *psk, size_t psk_len)
+ {
++#ifndef OPENSSL_NO_PSK
+   free(d->psk);
+   d->psk = malloc(psk_len);
+   if (!d->psk)
+@@ -1011,6 +1014,9 @@ bool dtls_set_psk(dtls d, const char *ps
+   SSL_CTX_set_psk_client_callback(d->ssl_client_ctx, _client_psk);
+   SSL_CTX_set_psk_server_callback(d->ssl_server_ctx, _server_psk);
+   return true;
++#else
++  return false;
++#endif
+ }
+ bool dtls_cert_to_pem_buf(dtls_cert cert, char *buf, int buf_len)
diff --git a/hnetd/patches/020-unused.patch b/hnetd/patches/020-unused.patch
new file mode 100644 (file)
index 0000000..28b35a4
--- /dev/null
@@ -0,0 +1,10 @@
+--- a/src/hnetd.h
++++ b/src/hnetd.h
+@@ -39,6 +39,7 @@
+ #endif /* __APPLE__ */
++#undef __unused
+ #include <stddef.h>
+ #include <stdint.h>
+ #include <time.h>
diff --git a/luci-app-bmx6/COPYING b/luci-app-bmx6/COPYING
deleted file mode 100644 (file)
index d511905..0000000
+++ /dev/null
@@ -1,339 +0,0 @@
-                   GNU GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                   GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                           NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                    END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/luci-app-bmx6/Makefile b/luci-app-bmx6/Makefile
deleted file mode 100644 (file)
index bb37c20..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-#    Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License along
-#    with this program; if not, write to the Free Software Foundation, Inc.,
-#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-#    The full GNU General Public License is included in this distribution in
-#    the file called "COPYING".
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=luci-app-bmx6
-PKG_RELEASE:=5
-
-PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
-PKG_LICENSE:=GPL-2.0+
-
-include $(INCLUDE_DIR)/package.mk
-
-define Package/luci-app-bmx6
-  SECTION:=luci
-  CATEGORY:=LuCI
-  SUBMENU:=3. Applications
-  TITLE:= bmx6 configuration, status and visualization module
-  DEPENDS:=+luci-lib-json +luci-base +luci-lib-httpclient +bmx6 +luci-lib-jquery-1-4 +luci-lib-dracula
-  MAINTAINER:= Pau Escrich <p4u@dabax.net>
-endef
-
-define Package/luci-lib-jquery-1-4
-  SECTION:=luci
-  CATEGORY:=LuCI
-  TITLE:=LuCI - Lua Configuration Interface
-  MAINTAINER:=Gui Iribarren <gui@altermundi.net>
-  SUBMENU:=6. Libraries
-  TITLE:=jQuery 1.4 javascript library
-endef
-
-define Package/luci-lib-dracula
-  SECTION:=luci
-  CATEGORY:=LuCI
-  TITLE:=LuCI - Lua Configuration Interface
-  MAINTAINER:=Pau Escrich <p4u@dabax.net>
-  SUBMENU:=6. Libraries
-  TITLE:=dracula graph javascript library
-endef
-
-define Package/luci-app-bmx6/description
-       bmx6 web application (status and configuration) for LuCi web interface
-endef
-
-define Package/luci-lib-jquery-1-4/description
-       minified javascript jQuery 1.4 library
-endef
-
-define Package/luci-lib-dracula-graph/description
-       minified dracula javascript graph library
-endef
-
-define Package/luci-app-bmx6/conffiles
-       /etc/config/luci-bmx6
-endef
-
-define Build/Prepare
-endef
-
-define Build/Configure
-endef
-
-define Build/Compile
-endef
-
-define Package/luci-app-bmx6/install
-       $(CP) ./bmx6/* $(1)/
-       chmod 755 $(1)/www/cgi-bin/bmx6-info
-endef
-
-define Package/luci-lib-jquery-1-4/install
-       $(INSTALL_DIR) $(1)/www/luci-static/resources/jquery/
-       $(CP) ./jquery/* $(1)/www/luci-static/resources/jquery/
-endef
-
-define Package/luci-lib-dracula/install
-       $(INSTALL_DIR) $(1)/www/luci-static/resources/dracula
-       $(CP) ./dracula/* $(1)/www/luci-static/resources/dracula/
-endef
-
-$(eval $(call BuildPackage,luci-app-bmx6))
-$(eval $(call BuildPackage,luci-lib-jquery-1-4))
-$(eval $(call BuildPackage,luci-lib-dracula))
diff --git a/luci-app-bmx6/bmx6/etc/config/luci-bmx6 b/luci-app-bmx6/bmx6/etc/config/luci-bmx6
deleted file mode 100644 (file)
index df1e715..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-config 'bmx6' 'luci'
-       option ignore '0'
-       option place 'admin network BMX6'
-       #option place 'qmp Mesh'
-       option position '3'
-       #option json 'http://127.0.0.1/cgi-bin/bmx6-info?'
-       option json 'exec:/www/cgi-bin/bmx6-info -s'
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/controller/bmx6.lua b/luci-app-bmx6/bmx6/usr/lib/lua/luci/controller/bmx6.lua
deleted file mode 100644 (file)
index 5842fc9..0000000
+++ /dev/null
@@ -1,277 +0,0 @@
---[[
-    Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-    Contributors Jo-Philipp Wich <xm@subsignal.org>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-    The full GNU General Public License is included in this distribution in
-    the file called "COPYING".
---]]
-
-local bmx6json = require("luci.model.bmx6json")
-
-module("luci.controller.bmx6", package.seeall)
-
-function index()
-       local place = {}
-       local ucim = require "luci.model.uci"
-       local uci = ucim.cursor()
-
-       -- checking if ignore is on
-       if uci:get("luci-bmx6","luci","ignore") == "1" then
-               return nil
-       end
-
-       -- getting value from uci database
-       local uci_place = uci:get("luci-bmx6","luci","place")
-
-       -- default values
-       if uci_place == nil then
-               place = {"bmx6"}
-       else
-               local util = require "luci.util"
-               place = util.split(uci_place," ")
-       end
-
-       -- getting position of menu
-       local uci_position = uci:get("luci-bmx6","luci","position")
-
-       ---------------------------
-       -- Starting with the pages
-       ---------------------------
-
-       --- status (default)
-       entry(place,call("action_nodes_j"),place[#place],tonumber(uci_position))            
-
-       table.insert(place,"Status")
-       entry(place,call("action_status_j"),"Status",0)
-       table.remove(place)
-
-       --- nodes
-       table.insert(place,"Nodes")
-       entry(place,call("action_nodes_j"),"Nodes",1)
-       table.remove(place)
-
-       --- links
-       table.insert(place,"Links")
-       entry(place,call("action_links"),"Links",2).leaf = true
-       table.remove(place)
-
-       -- Tunnels
-       table.insert(place,"Tunnels")
-       entry(place,call("action_tunnels_j"), "Tunnels", 3).leaf = true
-       table.remove(place)
-
-       --- Chat
-       table.insert(place,"Chat")
-       entry(place,call("action_chat"),"Chat",5)
-       table.remove(place)
-
-       --- Graph
-       table.insert(place,"Graph")
-       entry(place, template("bmx6/graph"), "Graph",4)
-       table.remove(place)
-
-       --- Topology (hidden)
-       table.insert(place,"topology")
-       entry(place, call("action_topology"), nil)
-       table.remove(place)
-
-       --- configuration (CBI)
-       table.insert(place,"Configuration")
-       entry(place, cbi("bmx6/main"), "Configuration",6).dependent=false
-
-       table.insert(place,"General")
-       entry(place, cbi("bmx6/main"), "General",1)
-       table.remove(place)
-
-       table.insert(place,"Advanced")
-       entry(place, cbi("bmx6/advanced"), "Advanced",5)
-       table.remove(place)
-
-       table.insert(place,"Interfaces")
-       entry(place, cbi("bmx6/interfaces"), "Interfaces",2)
-       table.remove(place)
-
-       table.insert(place,"Tunnels")
-        entry(place, cbi("bmx6/tunnels"), "Tunnels",3)
-        table.remove(place)
-
-       table.insert(place,"Plugins")
-       entry(place, cbi("bmx6/plugins"), "Plugins",6)
-       table.remove(place)
-
-       table.insert(place,"HNAv6")
-       entry(place, cbi("bmx6/hna"), "HNAv6",4)
-       table.remove(place)
-
-       table.remove(place)
-
-end
-
-function action_status_j()
-       luci.template.render("bmx6/status_j", {})
-end
-
-
-function action_nodes_j()
-       local http = require "luci.http"
-       local link_non_js = "/cgi-bin/luci" .. http.getenv("PATH_INFO") .. '/nodes_nojs'
-
-       luci.template.render("bmx6/nodes_j", {link_non_js=link_non_js})
-end
-
-function action_gateways_j()
-       luci.template.render("bmx6/gateways_j", {})
-end
-
-function action_tunnels_j()
-        luci.template.render("bmx6/tunnels_j", {})
-end
-
-function action_links(host)
-       local links = bmx6json.get("links", host)
-       local devlinks = {}
-       local _,l
-
-       if links ~= nil then
-               links = links.links
-               for _,l in ipairs(links) do
-                       devlinks[l.viaDev] = {}
-               end
-               for _,l in ipairs(links) do
-                       l.name = luci.util.split(l.name,'.')[1]
-                       table.insert(devlinks[l.viaDev],l)
-               end
-       end
-
-       luci.template.render("bmx6/links", {links=devlinks})
-end
-
-function action_topology()
-       local originators = bmx6json.get("originators/all")
-       local o,i,l,i2
-       local first = true
-       local topology = '[ '
-       local cache = '/tmp/bmx6-topology.json'
-       local offset = 60
-
-       local cachefd = io.open(cache,r)
-       local update = false
-
-       if cachefd ~= nil then
-               local lastupdate = tonumber(cachefd:read("*line")) or 0
-               if os.time() >= lastupdate + offset then
-                       update = true
-               else
-                       topology = cachefd:read("*all")
-               end
-               cachefd:close()
-       end
-
-       if cachefd == nil or update then
-               for i,o in ipairs(originators) do
-                       local links = bmx6json.get("links",o.primaryIp)
-                       if links then
-                               if first then
-                                       first = false
-                               else
-                                               topology = topology .. ', '
-                               end
-           
-                                       topology = topology .. '{ "name": "%s", "links": [' %o.name
-           
-                               local first2 = true
-           
-                               for i2,l in ipairs(links.links) do
-                                       if first2 then
-                                               first2 = false
-                                       else
-                                               topology = topology .. ', '
-                                               end
-                                               name = l.name or l.llocalIp or "unknown"
-                                               topology = topology .. '{ "name": "%s", "rxRate": %s, "txRate": %s }'
-                                                       %{ name, l.rxRate, l.txRate }
-           
-                               end
-           
-                               topology = topology .. ']}'
-                       end
-           
-               end
-               
-               topology = topology .. ' ]'
-
-               -- Upgrading the content of the cache file
-               cachefd = io.open(cache,'w+')
-               cachefd:write(os.time()..'\n')
-               cachefd:write(topology)
-               cachefd:close()
-       end
-
-       luci.http.prepare_content("application/json")
-       luci.http.write(topology)
-end
-
-
-function action_chat()
-       local sms_dir = "/var/run/bmx6/sms"
-       local rcvd_dir = sms_dir .. "/rcvdSms"
-       local send_file = sms_dir .. "/sendSms/chat"
-       local sms_list = bmx6json.get("rcvdSms")
-       local sender = ""
-       local sms_file = ""
-       local chat = {}
-       local to_send = nil
-       local sent = ""
-       local fd = nil
-
-       if luci.sys.call("test -d " .. sms_dir) ~= 0 then
-               luci.template.render("bmx6/error", {txt="sms plugin disabled or some problem with directory " .. sms_dir})
-               return nil
-       end
-
-       sms_list = luci.util.split(luci.util.exec("ls "..rcvd_dir.."/*:chat"))
-
-       for _,sms_path in ipairs(sms_list) do
-         if #sms_path > #rcvd_dir then
-               sms_file = luci.util.split(sms_path,'/')
-               sms_file = sms_file[#sms_file]
-               sender = luci.util.split(sms_file,':')[1]
-
-               -- Trying to clean the name
-               if string.find(sender,".") ~= nil then
-                       sender = luci.util.split(sender,".")[1]
-               end
-
-               fd = io.open(sms_path,"r")
-               chat[sender] = fd:read()
-               fd:close()
-         end
-       end
-
-       to_send = luci.http.formvalue("toSend")
-       if to_send ~= nil and #to_send > 1  then
-               fd = io.open(send_file,"w")
-               fd:write(to_send)
-               fd:close()
-               sent = to_send
-       else
-               sent = luci.util.exec("cat "..send_file)
-       end
-
-       luci.template.render("bmx6/chat", {chat=chat,sent=sent})
-end
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/bmx6json.lua b/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/bmx6json.lua
deleted file mode 100644 (file)
index a4a8e43..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
---[[
-    Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-    Contributors Jo-Philipp Wich <xm@subsignal.org>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-    The full GNU General Public License is included in this distribution in
-    the file called "COPYING".
---]]
-
-local ltn12 = require("luci.ltn12")
-local json = require("luci.json")
-local util = require("luci.util")
-local uci = require("luci.model.uci")
-local sys = require("luci.sys")
-local template = require("luci.template")
-local http = require("luci.http")
-local string = require("string")
-local table = require("table")
-local nixio = require("nixio")
-local nixiofs = require("nixio.fs")
-local ipairs = ipairs
-
-module "luci.model.bmx6json"
-
--- Returns a LUA object from bmx6 JSON daemon
-
-function get(field, host)
-       local url
-       if host ~= nil then
-               if host:match(":") then
-                       url = 'http://[%s]/cgi-bin/bmx6-info?' % host
-               else
-                       url = 'http://%s/cgi-bin/bmx6-info?' % host
-               end
-       else
-               url = uci.cursor():get("luci-bmx6","luci","json")
-       end
-
-       if url == nil then
-                print_error("bmx6 json url not configured, cannot fetch bmx6 daemon data",true)
-                return nil
-        end
-
-        local json_url = util.split(url,":")
-        local raw = ""
-
-       if json_url[1] == "http"  then
-               raw,err = wget(url..field,1000)
-       else
-
-               if json_url[1] == "exec" then
-                       raw = sys.exec(json_url[2]..' '..field)
-               else
-                       print_error("bmx6 json url not recognized, cannot fetch bmx6 daemon data. Use http: or exec:",true)
-                       return nil
-               end
-
-       end
-
-       local data = nil
-
-       if raw and raw:len() > 10 then
-               local decoder = json.Decoder()
-               ltn12.pump.all(ltn12.source.string(raw), decoder:sink())
-               data = decoder:get()
---     else
---             print_error("Cannot get data from bmx6 daemon",true)
---             return nil
-       end
-
-       return data
-end
-
-function print_error(txt,popup)
-       util.perror(txt)
-       sys.call("logger -t bmx6json " .. txt)
-
-       if popup then
-               http.write('<script type="text/javascript">alert("Some error detected, please check it: '..txt..'");</script>')
-       else
-               http.write("<h1>Dammit! some error detected</h1>")
-               http.write("bmx6-luci: " .. txt)
-               http.write('<p><FORM><INPUT TYPE="BUTTON" VALUE="Go Back" ONCLICK="history.go(-1)"></FORM></p>')
-       end
-
-end
-
-function text2html(txt)
-       txt = string.gsub(txt,"<","{")
-       txt = string.gsub(txt,">","}")
-       txt = util.striptags(txt)
-       return txt
-end
-
-
-function wget(url, timeout)
-       local rfd, wfd = nixio.pipe()
-       local pid = nixio.fork()
-       if pid == 0 then
-               rfd:close()
-               nixio.dup(wfd, nixio.stdout)
-               -- candidates for wget, try first ones with SSL support
-               local candidates = {{"/usr/bin/wget-ssl",1},{"/usr/bin/wget",0},{"/bin/wget",0}}
-               local _, bin
-               for _, bin in ipairs(candidates) do
-                       if nixiofs.access(bin[1], "x") then
-                               if bin[2] == 0 then
-                                       nixio.exec(bin[1], "-q", "-O", "-", url)
-                               else
-                                       nixio.exec(bin[1], "--no-check-certificate", "-q", "-O", "-", url)
-                               end
-                       end
-               end
-               return
-       else
-               wfd:close()
-               rfd:setblocking(false)
-
-               local buffer = { }
-               local err1, err2
-
-               while true do
-                       local ready = nixio.poll({{ fd = rfd, events = nixio.poll_flags("in") }}, timeout)
-                       if not ready then
-                               nixio.kill(pid, nixio.const.SIGKILL)
-                               err1 = "timeout"
-                               break
-                       end
-
-                       local rv = rfd:read(4096)
-                       if rv then
-                               -- eof
-                               if #rv == 0 then
-                                       break
-                               end
-
-                               buffer[#buffer+1] = rv
-                       else
-                               -- error
-                               if nixio.errno() ~= nixio.const.EAGAIN and
-                                  nixio.errno() ~= nixio.const.EWOULDBLOCK then
-                                       err1 = "error"
-                                       err2 = nixio.errno()
-                               end
-                       end
-               end
-
-               nixio.waitpid(pid, "nohang")
-               if not err1 then
-                       return table.concat(buffer)
-               else
-                       return nil, err1, err2
-               end
-       end
-end
-
-function getOptions(name)
-       -- Getting json and Checking if bmx6-json is avaiable
-       local options = get("options")
-       if options == nil or options.OPTIONS == nil then
-               m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
-               return nil
-       else
-               options = options.OPTIONS
-       end
-
-       -- Filtering by the option name
-       local i,_
-       local namedopt = nil
-       if name ~= nil then
-               for _,i in ipairs(options) do
-                       if i.name == name and i.CHILD_OPTIONS ~= nil then
-                               namedopt = i.CHILD_OPTIONS
-                               break
-                       end
-               end
-       end
-
-       return namedopt
-end
-
--- Rturns a help string formated to be used in HTML scope
-function getHtmlHelp(opt)
-       if opt == nil then return nil end
-       
-       local help = ""
-       if opt.help ~= nil then
-               help = text2html(opt.help)
-       end
-       if opt.syntax ~= nil then
-               help = help .. "<br/><b>Syntax: </b>" .. text2html(opt.syntax)
-       end             
-
-       return help
-end
-
-function testandreload()
-       local test = sys.call('bmx6 -c --test > /tmp/bmx6-luci.err.tmp')
-       if test ~= 0 then
-               return sys.exec("cat /tmp/bmx6-luci.err.tmp")
-       end
-
-       local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
-               if err ~= 0 then
-               return sys.exec("cat /tmp/bmx6-luci.err.tmp")
-       end
-
-       return nil
-end
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/advanced.lua b/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/advanced.lua
deleted file mode 100644 (file)
index c254899..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
---[[
-    Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-    The full GNU General Public License is included in this distribution in
-    the file called "COPYING".
---]]
-
-m = Map("bmx6", "bmx6")
-
-local bmx6json = require("luci.model.bmx6json")
-local util = require("luci.util")
-local http = require("luci.http")
-local sys = require("luci.sys")
-
-local options = bmx6json.get("options")
-if options == nil or options.OPTIONS == nil then
-       m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
-       options = {}
-else
-       options = options.OPTIONS
-end
-
-local general = m:section(NamedSection,"general","bmx6")
-general.addremove = true
-
-local name = ""
-local help = ""
-local value = nil
-local _,o
-
-for _,o in ipairs(options) do
-       if o.name ~= nil and o.CHILD_OPTIONS == nil and o.configurable == 1 then
-               help = ""
-               name = o.name
-
-               if o.help ~= nil then
-                       help = bmx6json.text2html(o.help)
-               end
-
-               if o.syntax ~= nil then
-                       help = help .. "<br/><strong>Syntax: </strong>" .. bmx6json.text2html(o.syntax)
-               end
-
-               if o.def ~= nil then
-                       help = help .. "<strong> Default: </strong>" .. o.def
-               end
-
-               value = general:option(Value,name,name,help)
-
-       end
-end
-
-function m.on_commit(self,map)
-       local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
-       if err ~= 0 then
-               m.message = sys.exec("cat /tmp/bmx6-luci.err.tmp")
-       end
-end
-
-return m
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/hna.lua b/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/hna.lua
deleted file mode 100644 (file)
index db98ae6..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
---[[
-    Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-    The full GNU General Public License is included in this distribution in
-    the file called "COPYING".
---]]
-
-local sys = require("luci.sys")
-
-m = Map("bmx6", "bmx6")
-
-local hna = m:section(TypedSection,"unicastHna","IPv6 HNA")
-hna.addremove = true
-hna.anonymous = true
-local hna_option = hna:option(Value,"unicastHna", "IPv6 Host Network Announcement. Syntax <NETADDR>/<PREFIX>")
-
---function hna_option:validate(value)
---     local err = sys.call('bmx6 -c --test -a ' .. value)
---     if err ~= 0 then
---             return nil
---     end
---     return value
---end
-
-function m.on_commit(self,map)
-        local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
-       if err ~= 0 then
-               m.message = sys.exec("cat /tmp/bmx6-luci.err.tmp")
-        end
-end
-
-return m
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/interfaces.lua b/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/interfaces.lua
deleted file mode 100644 (file)
index fb1261b..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
---[[
-    Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-    The full GNU General Public License is included in this distribution in
-    the file called "COPYING".
---]]
-
-local sys = require("luci.sys")
-local bmx6json = require("luci.model.bmx6json")
-local m = Map("bmx6", "bmx6")
-
-local eth_int = sys.net.devices()
-local interfaces = m:section(TypedSection,"dev","Devices","")
-interfaces.addremove = true
-interfaces.anonymous = true
-
-local intlv = interfaces:option(ListValue,"dev","Device")
-
-for _,i in ipairs(eth_int) do
-       intlv:value(i,i)
-end
-
--- Getting json and looking for device section
-local json = bmx6json.get("options")
-
-if json == nil or json.OPTIONS == nil then
-       m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
-       json = {}
-else
-       json = json.OPTIONS
-end
-
-local dev = {}
-for _,j in ipairs(json) do
-       if j.name == "dev" and j.CHILD_OPTIONS ~= nil then
-               dev = j.CHILD_OPTIONS
-               break
-       end
-end
-
-local help = ""
-local name = ""
-
-for _,o in ipairs(dev) do
-       if o.name ~= nil then
-               help = ""
-               name = o.name
-               if o.help ~= nil then
-                       help = bmx6json.text2html(o.help)
-               end
-
-               if o.syntax ~= nil then
-                       help = help .. "<br/><strong>Syntax: </strong>" .. bmx6json.text2html(o.syntax)
-               end
-
-               value = interfaces:option(Value,name,name,help)
-               value.optional = true
-       end
-end
-
-
-return m
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/main.lua b/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/main.lua
deleted file mode 100644 (file)
index 8ff3520..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
---[[
-    Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-    The full GNU General Public License is included in this distribution in
-    the file called "COPYING".
---]]
-
-local sys = require("luci.sys")
-local bmx6json = require("luci.model.bmx6json")
-
-m = Map("bmx6", "bmx6")
-
--- Getting json and Checking if bmx6-json is avaiable
-local options = bmx6json.get("options")
-if options == nil or options.OPTIONS == nil then
-       m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
-       return m
-else
-       options = options.OPTIONS
-end
-
--- Getting a list of interfaces
-local eth_int = luci.sys.net.devices()
-
-local tunDev = m:section(TypedSection,"tunDev",translate("Tunnel device"),translate("Define incoming ipip tunnel interface name"))
-tunDev.addremove = true
-tunDev.anonymous = true
-tunDev:option(Value,"tunDev",translate("Name"),translate("Name for the tunnel network device"))
-tunDev:option(Value,"tun4Address", translate("IPv4 address/length"),translate("Specify default IPv4 tunnel address and announced range (ex. 10.1.2.3/24)"))
-tunDev:option(Value,"tun6Address", translate("IPv6 address/length"),translate("Specify default IPv6 tunnel address and announced range (ex. 2012:0:0:123:0:0:0:1/64)"))
-
--- IP section
-local ipV = m:section(NamedSection,"ipVersion","ipVersion",translate("Miscellaneous IP options"))
-ipV.addremove = false
-local lipv = ipV:option(ListValue,"ipVersion",translate("IP version"))
-lipv:value("6","6")
-lipv.default = "6"
-
--- rest of ip options are optional, getting them from json
-local ipoptions = {}
-for _,o in ipairs(options) do
-       if o.name == "ipVersion" and o.CHILD_OPTIONS ~= nil then
-               ipoptions = o.CHILD_OPTIONS
-               break
-       end
-end
-
-local help = ""
-local name = ""
-local value = nil
-
-for _,o in ipairs(ipoptions) do
-       if o.name ~= nil then
-               help = ""
-               name = o.name
-               if o.help ~= nil then
-                       help = bmx6json.text2html(o.help)
-               end
-
-               if o.syntax ~= nil then
-                       help = help .. "<br/><strong>Syntax: </strong>" .. bmx6json.text2html(o.syntax)
-               end
-
-               if o.def ~= nil then
-                       help = help .. "<br/><strong> Default: </strong>" .. bmx6json.text2html(o.def)
-               end
-
-               value = ipV:option(Value,name,name,help)
-               value.optional = true
-       end
-end
-
--- Interfaces section
-local interfaces = m:section(TypedSection,"dev",translate("Devices"),translate("Network devices to mesh with"))
-interfaces.addremove = true
-interfaces.anonymous = true
-local intlv = interfaces:option(ListValue,"dev",translate("Device"))
-
-for _,i in ipairs(eth_int) do
-       intlv:value(i,i)
-end
-
-function m.on_commit(self,map)
-    local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
-    if err ~= 0 then
-        m.message = sys.exec("cat /tmp/bmx6-luci.err.tmp")
-    end
-end
-
-return m
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/plugins.lua b/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/plugins.lua
deleted file mode 100644 (file)
index 518864e..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
---[[
-    Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-    The full GNU General Public License is included in this distribution in
-    the file called "COPYING".
---]]
-local sys = require("luci.sys")
-
-m = Map("bmx6", "bmx6")
-plugins_dir = {"/usr/lib/","/var/lib","/lib"}
-
-plugin = m:section(TypedSection,"plugin","Plugin")
-plugin.addremove = true
-plugin.anonymous = true
-plv = plugin:option(ListValue,"plugin", "Plugin")
-
-for _,d in ipairs(plugins_dir) do
-       pl = luci.sys.exec("cd "..d..";ls bmx6_*")
-       if #pl > 6 then
-               for _,v in ipairs(luci.util.split(pl,"\n")) do
-                       plv:value(v,v)
-               end
-       end
-end
-
-
-function m.on_commit(self,map)
-       local err = sys.call('/etc/init.d/bmx6 restart')
-       if err ~= 0 then
-               m.message = sys.exec("Cannot restart bmx6")
-       end
-end
-
-
-return m
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/tunnels.lua b/luci-app-bmx6/bmx6/usr/lib/lua/luci/model/cbi/bmx6/tunnels.lua
deleted file mode 100644 (file)
index 92b14fc..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
---[[
-    Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-    The full GNU General Public License is included in this distribution in
-    the file called "COPYING".
---]]
-
-local sys = require("luci.sys")
-local bmx6json = require("luci.model.bmx6json")
-
-m = Map("bmx6", "bmx6")
-
--- tunOut
-local tunnelsOut = m:section(TypedSection,"tunOut",translate("Networks to fetch"),translate("Gateways announcements to fetch"))
-tunnelsOut.addremove = true
-tunnelsOut.anonymous = true
-tunnelsOut:option(Value,"tunOut","Name")
-tunnelsOut:option(Value,"network", translate("Network to fetch"))
-
-local tunoptions = bmx6json.getOptions("tunOut")
-local _,o
-for _,o in ipairs(tunoptions) do
-        if o.name ~= nil  and o.name ~= "network" then
-               help = bmx6json.getHtmlHelp(o)
-               value = tunnelsOut:option(Value,o.name,o.name,help)
-               value.optional = true
-       end
-end
-
-
--- tunOut
-local tunnelsIn = m:section(TypedSection,"tunIn",translate("Networks to offer"),translate("Gateways to announce in the network"))
-tunnelsIn.addremove = true
-tunnelsIn.anonymous = true
-tunnelsIn:option(Value,"tunIn","Name")
-tunnelsIn:option(Value,"network", translate("Network to offer"))
-
-local tunInoptions = bmx6json.getOptions("tunIn")
-local _,o
-for _,o in ipairs(tunInoptions) do
-        if o.name ~= nil  and o.name ~= "network" then
-               help = bmx6json.getHtmlHelp(o)
-               value = tunnelsIn:option(Value,o.name,o.name,help)
-               value.optional = true
-       end
-end
-
-function m.on_commit(self,map)
-       --Not working. If test returns error the changes are still commited
-       local msg = bmx6json.testandreload()
-       if msg ~= nil then
-               m.message = msg
-       end
-end
-
-return m
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/admin_status/index/neighbours_simple.htm b/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/admin_status/index/neighbours_simple.htm
deleted file mode 100644 (file)
index 97d6e0e..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-<script type="text/javascript">//<![CDATA[
-
-       XHR.poll(5, '/cgi-bin/bmx6-info', { '$neighbours': '' },
-               function(x, st)
-               {
-                       var originators = st.neighbours[0].originators;
-                       var descriptions = st.neighbours[1].descriptions;
-
-                       var tb = document.getElementById('descriptions_table');
-
-                       if ( originators.length != descriptions.length )
-                       {
-                               var tr = tb.insertRow(-1);
-                               tr.className = 'cbi-section-table-row';
-                               var td = tr.insertCell(-1);
-                               td.colSpan = 7;
-                               td.innerHTML = '<em><br /><%:Some problem with JSON: lenght of originators and descriptions different. %></em>';
-                               return 1;
-                       }
-
-                       if ( originators && descriptions && tb)
-                       {
-                               /* clear all rows */
-                               while( tb.rows.length > 1 )
-                                       tb.deleteRow(1);
-
-                               for( var i = 0; i < descriptions.length; i++ )
-                               {
-                                       var tr = tb.insertRow(-1);
-                                       tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-                                       tr.insertCell(-1).innerHTML = descriptions[i].DESC_ADV.globalId.replace(/\.[^\.]+$/,"");
-
-                                       var extensions = descriptions[i].DESC_ADV.extensions;
-
-                                       //Looking for the extensions
-                                       var hna6 = [];
-                                       for( var e = 0; e < extensions.length; e++)
-                                       {
-                                               if( extensions[e].HNA6_EXTENSION )
-                                               {
-                                                       hna6 = extensions[e].HNA6_EXTENSION;
-                                                       break;
-                                               }
-                                       }
-
-                                       //Adding first HNA with prefix=128 as main address
-                                       var ipstxt = '';
-                                       var address;
-                                       var prefix;
-
-                                       for( var e = 0; e < hna6.length; e++ )
-                                       {
-                                               address = hna6[e].address;
-                                               prefix = hna6[e].prefixlen;
-                                               if ( prefix == '128' )
-                                                       {
-                                                               ipstxt += address;
-                                                               break;
-                                                       }
-                                       }
-
-                                       tr.insertCell(-1).innerHTML = ipstxt;
-
-                                       tr.insertCell(-1).innerHTML = originators[i].viaDev;
-                                       tr.insertCell(-1).innerHTML = originators[i].metric;
-                                       tr.insertCell(-1).innerHTML = originators[i].lastDesc;
-                                       tr.insertCell(-1).innerHTML = originators[i].lastRef;
-                                       tr.insertCell(-1).innerHTML = originators[i].blocked;
-
-                               }
-
-                               if( tb.rows.length == 1 )
-                               {
-                                       var tr = tb.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row';
-
-                                       var td = tr.insertCell(-1);
-                                               td.colSpan = 7;
-                                               td.innerHTML = '<em><br /><%:There are no nodes available.%></em>';
-                               }
-                       }
-               }
-       );
-//]]></script>
-
-<div class="cbi-map">
-
-<fieldset class="cbi-section">
-       <legend><%:Mesh nodes%></legend>
-       <table class="cbi-section-table" id="descriptions_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Hostname%></th>
-                       <th class="cbi-section-table-cell"><%:Primary IP%></th>
-                       <th class="cbi-section-table-cell"><%:Via Device%></th>
-                       <th class="cbi-section-table-cell"><%:Metric%></th>
-                       <th class="cbi-section-table-cell"><%:Last Desc%></th>
-                       <th class="cbi-section-table-cell"><%:Last Ref%></th>
-                       <th class="cbi-section-table-cell"><%:Blocked%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="7"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
-
-</div>
-
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/chat.htm b/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/chat.htm
deleted file mode 100644 (file)
index 8e25b11..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<%+header%>
-<meta http-equiv="refresh" content="60" />
-<h2><a id="content" name="content"><%:Chat%></a></h2>
-<p>This is sms a chat where all bmx6 nodes can participate. The data is replayed using routing packets, so there is a limit of 2040 bytes. Use it only to send short messages.</p>
-<p>Each participant can only send one sms at same time.</p>
-<br />
-
-<strong>Received SMS</strong>
-<br />
-<pre style="background-color:#dadbe6;">
-<% for orig,sms in pairs(chat) do %>
-         <u><%=orig%></u>:<%=sms%>
-<% end %>
-</pre>
-
-<form action=".">
-        <input type="submit" value="refresh" />
-</form>
-
-<br />
-
-<form action="." method="post">
-       <input type="text" name="toSend" />
-       <input type="submit" value="send sms" />
-</form>
-
-<br />
-<table>
-       <tr>
-       <td><strong>Your last sms: </strong></td>
-       <td><pre><%=sent%></pre></td>
-       </tr>
-</table>
-<%+footer%>
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/error.htm b/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/error.htm
deleted file mode 100644 (file)
index 78de7b9..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<%+header%>
-<h2><a id="content" name="content"><%:ERROR%></a></h2>
-<strong>Some error has occurred</strong>
-<br />
-<pre>
-       <%=txt%>
-</pre>
-<br />
-<%+footer%>
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/gateways_j.htm b/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/gateways_j.htm
deleted file mode 100644 (file)
index 12bfcd4..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-<%+header%>
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
-
-<script type="text/javascript">//<![CDATA[
-
-       var displayExtraInfo = function ( id ) {
-
-               document.getElementById('extra-info').innerHTML = document.getElementById(id).innerHTML;
-       }
-       XHR.poll(5, '/cgi-bin/bmx6-info', { 'descriptions/all': '' },
-               function(x, st)
-               {
-                 var tb = document.getElementById('descriptions_table');
-                 var rowcount = 0;
-                 var tunicon = "<%=resource%>/icons/tunnel.png";
-                 /* clear all rows */
-                 while( tb.rows.length > 1 ) tb.deleteRow(1);
-
-                 for ( var k in st  )
-                       {
-                       var description = st[k].DESC_ADV;
-                       var tun4in6;
-
-                       for ( var k in description.extensions )
-                               {
-                               var value = description.extensions[k];
-
-                                       if ( value.TUN4IN6_NET_EXTENSION )
-                                               {
-                                               tun4in6 = value.TUN4IN6_NET_EXTENSION;
-                                               break;
-                                               }
-                               }
-
-                       if ( tun4in6 )
-                       {
-                               var nodename = description.globalId.replace(/\..+$/,'');
-
-                               for( var i = 0; i < tun4in6.length; i++ )
-                               {
-                                       var tr = tb.insertRow(-1);
-                                       var network =  tun4in6[i].network;
-                                       var network_len = tun4in6[i].networklen;
-                                       var network_bw = tun4in6[i].bandwidth;
-
-                                       if ( network_len >= 32 ) continue;
-
-                                       tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((rowcount++ % 2) + 1);
-                                       tr.insertCell(-1).innerHTML = String.format('<a href="/cgi-bin/bmx6control?function=gwselect&amp;node=%s"><img src="%s" /></a>',nodename,tunicon);
-                                       tr.insertCell(-1).innerHTML = nodename;
-                                       tr.insertCell(-1).innerHTML = network + '/' + network_len;
-                                       tr.insertCell(-1).innerHTML = network_bw;
-
-
-                               }
-
-                               if( tb.rows.length == 1 )
-                               {
-                                       var tr = tb.insertRow(-1);
-                                               tr.className = 'cbi-section-table-row';
-
-                                       var td = tr.insertCell(-1);
-                                               td.colSpan = 4;
-                                               td.innerHTML = '<em><br /><%:There are no gateways announced in the network.%></em>';
-                               }
-                               }
-                       }
-               }
-       );
-//]]></script>
-
-<style>
-
-       div.hideme{
-               display: none;
-       }
-
-       div.info{
-               background: #FFF;
-               border: solid 1px;
-               height: 80px;
-               display: block;
-               overflow: auto;
-       }
-
-       div.inforow{
-               text-align:left;
-               display:inline-block;
-               width:20%;
-               margin:5px;
-               vertical-align:top;
-
-       }
-
-#extra-info ul { list-style: none outside none; margin-left: 0em; }
-
-</style>
-<div class="cbi-map">
-
-<h2>Originators</h2>
-<div class="cbi-map-descr"></div>
-<fieldset class="cbi-section">
-       <legend><%:Mesh gateways%></legend>
-       <table class="cbi-section-table" id="descriptions_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"></th>
-                       <th class="cbi-section-table-cell"><%:Node%></th>
-                       <th class="cbi-section-table-cell"><%:Network%></th>
-                       <th class="cbi-section-table-cell"><%:Bandwidth%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="4"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
-
-</div>
-
-<%+footer%>
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/graph.htm b/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/graph.htm
deleted file mode 100644 (file)
index 0655302..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<%#
-Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-Contributors Jo-Philip
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-The full GNU General Public License is included in this distribution in
-the file called "COPYING".
--%>
-
-<%
-       luci.http.prepare_content("text/html")
-
-       local location = { unpack(luci.dispatcher.context.path) }
-       location[#location] = "topology"
-%>
-
-<%+header%>
-
-<button id="redraw" onclick="redraw();">&nbsp redraw &nbsp</button>
-
-<div id="wait" style="text-align: center">
-<br /><br />
-<img src="<%=resource%>/icons/loading.gif" />
-<%:Collecting data...%>
-
-</div>
-
-<div id="canvas" style="min-width:1024px; min-height:1024px"></div>
-
-<script type="text/javascript" src="<%=resource%>/jquery/jquery-1.4.js"></script>
-<script type="text/javascript" src="<%=resource%>/dracula/raphael-min.js"></script>
-<script type="text/javascript" src="<%=resource%>/dracula/dracula_graffle.js"></script>
-<script type="text/javascript" src="<%=resource%>/dracula/dracula_graph.js"></script>
-<script type="text/javascript" src="<%=resource%>/bmx6/js/bmx6-graph.js"></script>
-
-<%+footer%>
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/links.htm b/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/links.htm
deleted file mode 100644 (file)
index 77b9ed1..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<%+header%>
-<meta http-equiv="refresh" content="10" />
-<h2><a id="content" name="content"><%:Links%></a></h2>
-<br />
-<div id="links" style="position:relative;padding-left:2px">
-
-<% for j,d in pairs(links) do %>
-
-       <table>
-       <tr>
-               <td><img src="/luci-static/resources/bmx6/wifi.png"/></td>
-               <td><strong><%=j%></strong></td>
-       </tr>
-       </table>
-
-       <div style="display:table">
-
-<% for i,l in ipairs(d) do  %>
-       <div id="link" style="background-color:#dadbe9;left:50px;width:300px;margin:10px;float:left;position:relative">
-       <table>
-       <tr><th colspan="2">
-               <span style="color:grey;font-weight:700;text-align:left;">
-               <%=l.name%>
-               <br />
-               </span>
-       </th></tr>
-       <tr>
-               <td><img src="/luci-static/resources/bmx6/link.png"/></td>
-               <td>
-               <ul>
-                       <li>Local IP: <a href="[<%=l.llocalIp%>]"><%=l.llocalIp%></a></li>
-                       <li>Device: <%=l.viaDev%></li>
-                       <li>Rate (rx/tx):
-                               <% if l.rxRate+l.txRate < 120 then %>
-                                       <span style="color:red;">
-                               <% else %>
-                                       <span style="color:green;">
-                               <% end %>
-                                       <%=l.rxRate%>/<%=l.txRate%>
-                               </span>
-                       </li>
-                       <li>Routes: <%=l.routes%></li>
-               </ul>
-               </td>
-       </tr>
-       </table>
-       </div>
-<% end %>
-</div>
-<% end %>
-</div>
-
-<br />
-<br />
-<%+footer%>
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/nodes_j.htm b/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/nodes_j.htm
deleted file mode 100644 (file)
index 8ebd5ee..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-<%#
-   Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-   Contributors Lluis Esquerda <eskerda@gmail.com>
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, write to the Free Software Foundation, Inc.,
-   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-   The full GNU General Public License is included in this distribution in
-   the file called "COPYING".
--%>
-
-<%+header%>
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
-<script type="text/javascript" src="<%=resource%>/bmx6/js/polling.js"></script>
-
-
-<style>
-
-       div.hideme{
-               display: none;
-       }
-
-       div.info{
-               background: #FFF;
-               border: solid 0px;
-               height: 90px;
-               display: block;
-               overflow: auto;
-       }
-
-       div.inforow{
-               text-align:left;
-               display:inline-block;
-               width:20%;
-               margin:5px;
-               vertical-align:top;
-
-       }
-
-#extra-info ul { list-style: none outside none; margin-left: 0em; }
-
-</style>
-<div class="cbi-map">
-
-<h2>Node originators</h2>
-<div class="cbi-map-descr"></div>
-<div id="extra-info" class="info">
-       <br />
-       <center>
-       Click icon <img src="<%=resource%>/bmx6/world.png" /> to see individual node information
-       </center>
-</div>
-<fieldset class="cbi-section">
-       <legend><%:Mesh nodes%></legend>
-       <table class="cbi-section-table" id="descriptions_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"></th>
-                       <th class="cbi-section-table-cell"><%:Hostname%></th>
-                       <th class="cbi-section-table-cell"><%:Primary IP%></th>
-                       <th class="cbi-section-table-cell"><%:Via Device%></th>
-                       <th class="cbi-section-table-cell"><%:Metric%></th>
-                       <th class="cbi-section-table-cell"><%:Last Desc%></th>
-                       <th class="cbi-section-table-cell"><%:Last Ref%></th>
-                       <th class="cbi-section-table-cell"><%:Blocked%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="8"><br /><center><em><%:Collecting data...%></em></center></td>
-               </tr>
-       </table>
-</fieldset>
-
-</div>
-
-<script type="text/javascript">//<![CDATA[
-               var displayExtraInfo = function ( id ) {
-                 document.getElementById('extra-info').innerHTML = document.getElementById(id).innerHTML;
-               }
-       
-               new TablePooler(5,"/cgi-bin/bmx6-info", {'$neighbours':''}, "descriptions_table", function(st){
-                 var infoicon = "<%=resource%>/bmx6/world_small.png";
-                 var nodeicon = "<%=resource%>/bmx6/world.png";
-                 var originators = st.neighbours[0].originators;
-                 var descriptions = st.neighbours[1].descriptions;
-                 var res = Array();
-                 var error = "";
-
-                 if ( originators.length != descriptions.length )
-                 {
-                       error = '<em><br /><%:Some problem with JSON: lenght of originators and descriptions differs. %> \
-                       <%: Please perform a cache flush from a console it this persists: bmx6 -c --flushAll %></em>';
-                       res.push([[error,7]]);
-                       return res;
-                 }  
-
-                 for ( var i = 0; i < descriptions.length; i++ ){
-                       var nodename =  descriptions[i].DESC_ADV.globalId.replace(/\.[^\.]+$/,"");              
-                       var extensions = descriptions[i].DESC_ADV.extensions;
-                       //var extrainfo = '<a onclick="displayExtraInfo(\'ip-' + i + '\')"><img src="' + infoicon + '" / ></a>';
-                       var extrainfo_link = '<a onclick="displayExtraInfo(\'ip-' + i + '\')">' +  '<img src="' + infoicon + '" />' + '</a>';
-                       // Looking for the extensions
-                       var hna6 = [];
-                       var tun4in6 = [];
-                       var tun6in6 = [];
-
-                       for( var e = 0; e < extensions.length; e++)
-                               {
-                               if( extensions[e].HNA6_EXTENSION )
-                               hna6 = extensions[e].HNA6_EXTENSION;
-                               if ( extensions[e].TUN4IN6_NET_EXTENSION )
-                               tun4in6 = extensions[e].TUN4IN6_NET_EXTENSION;
-                               tun6in6 = extensions[e].TUN6IN6_NET_EXTENSION;
-                               }
-
-                       // Gateways
-                       var gateways = '<ul>';
-                       if ( typeof(tun4in6) !== "undefined" && tun4in6 !== null )
-                       for ( var t = 0; t < tun4in6.length; t++)
-                               {
-                               if ( tun4in6[t].networklen == "32" )
-                                       gateways += '<li><a href="http://' + tun4in6[t].network + '">' + tun4in6[t].network + '</a></li>';
-                               else
-                                       gateways += "<li>"+tun4in6[t].network+'/'+tun4in6[t].networklen + ' | ' + tun4in6[t].bandwidth+'</li>';
-                               }
-
-                       if ( typeof(tun6in6) !== "undefined" && tun6in6 !== null )
-                       for ( var t = 0; t < tun6in6.length; t++)
-                               {
-                               if ( tun6in6[t].networklen == "128" )
-                                       gateways += '<li><a href="http://' + tun6in6[t].network + '">' + tun6in6[t].network + '</a></li>';
-                               else
-                                       gateways += "<li>"+tun6in6[t].network+'/'+tun6in6[t].networklen + ' | ' + tun6in6[t].bandwidth+'</li>';
-                               }
-
-                       gateways += '</ul>';
-
-                       //Adding HNAs with prefix=128 as main address
-                       var ipstxt = '';
-                       var address;
-                       var first = 1;
-                       var ipstxt_hidden = '<ul>';
-                       var hna6list = '<ul>';
-                       var extrainfo = "";
-
-                       for( var e = 0; e < hna6.length; e++ )
-                       {
-                               address = hna6[e].address;
-                               prefix = hna6[e].prefixlen;
-                               if ( prefix == '128' )
-                                       {
-                                       if (first)
-                                               {
-                                               ipstxt += address;
-                                               ipstxt_hidden += '<li><a href="http://['+address+']" >'+address+"</a></li>";
-                                               first = 0;
-                                               }
-                                       else    {
-                                               ipstxt_hidden += '<li><a href="http://['+address+']" >'+address+"</a></li>";
-                                               }
-                                       }
-                               else    {
-                                       hna6list += '<li>'+address+'/'+prefix+'</li>';
-                                       }
-                       }
-                       hna6list += '</ul>';
-                       ipstxt_hidden += '</ul>';
-
-                       extrainfo = '<div id="ip-'+ i +'" class="hideme">'
-                       + "<div class='inforow'>" 
-                       + "<h4>" + nodename  + '</h4>\n' + '<img src="' + nodeicon + '" />'+ "</div>"
-                       
-                       + "<div class='inforow'>"
-                       + "<h5>Available IPs</h5>\n"
-                       + ipstxt_hidden + "</div>\n"
-                       
-                       + "<div class='inforow'>"
-                       + "<h5>Gateways announced</h5>\n"
-                       + gateways + "</div>\n"
-                       
-                       + "<div class='inforow'>"
-                       + "<h5>Networks announced</h5>\n"
-                       + hna6list +  "</div>\n"
-                       + "\n</div>";
-                       
-                       res.push([extrainfo_link,nodename, ipstxt, originators[i].viaDev, originators[i].metric,
-                       originators[i].lastDesc, originators[i].lastRef, originators[i].blocked, extrainfo]);
-
-                 }
-                 return res;
-               });
-//]]></script>
-
-<%+footer%>
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/status_j.htm b/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/status_j.htm
deleted file mode 100644 (file)
index bf21106..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-<%+header%>
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
-<script type="text/javascript" src="<%=resource%>/bmx6/js/polling.js"></script>
-
-
-<style>
-
-       div.hideme{
-               display: none;
-       }
-
-       div.info{
-               background: #FFF;
-               border: solid 1px;
-               height: 80px;
-               display: block;
-               overflow: auto;
-       }
-
-       div.inforow{
-               text-align:left;
-               display:inline-block;
-               width:20%;
-               margin:5px;
-               vertical-align:top;
-
-       }
-
-#extra-info ul { list-style: none outside none; margin-left: 0em; }
-
-</style>
-<div class="cbi-map">
-<center>
-<img src="<%=resource%>/bmx6/bmx6logo.png" />
-<br />
-<br />
-a mesh routing protocol for Linux devices.<br />
-Visit <a href="http://bmx6.net">bmx6.net</a> for more info.
-<br />
-<br />
-</center>
-
-<h2>status</h2>
-<div class="cbi-map-descr"></div>
-<fieldset class="cbi-section">
-       <legend><%:status%></legend>
-       <table class="cbi-section-table" id="status_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Version%></th>
-                       <th class="cbi-section-table-cell"><%:Primary IP%></th>
-                       <th class="cbi-section-table-cell"><%:Tun6Address%></th>
-                       <th class="cbi-section-table-cell"><%:Tun4Address%></th>
-                       <th class="cbi-section-table-cell"><%:Uptime%></th>
-                       <th class="cbi-section-table-cell"><%:Cpu load%></th>
-                       <th class="cbi-section-table-cell"><%:Nodes seen%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="7"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
-
-</div>
-
-<script type="text/javascript">//<![CDATA[
-               new TablePooler(5,"/cgi-bin/bmx6-info", {'$info':''}, "status_table", function(st){
-               var res = Array();
-               var sta = st.info[0].status;
-               var ifaces = st.info[1].interfaces;
-
-               res.push([sta.version+'/'+sta.compat,sta.primaryIp,sta.tun6Address,
-                       sta.tun4Address,sta.uptime,sta.cpu,sta.nodes]);
-               res.push(['<br/>','','','','','','',''])
-               res.push(['','','','','','','',''])
-               res.push(['<b>Interface Name</b>','<b>State</b>','<b>Type</b>','<b>Rate</b>','<b>Local IP</b>','<b>Global IP</b>','<b>is Primary</b>'])
-
-               for ( var i = 0; i < ifaces.length; i++)
-                       {
-                       res.push([ifaces[i].devName,ifaces[i].state,ifaces[i].type,ifaces[i].rateMin+"/"+ifaces[i].rateMax,
-                              ifaces[i].llocalIp,ifaces[i].globalIp,ifaces[i].primary],'');
-                       }
-
-               return res;
-               });
-//]]></script>
-
-<%+footer%>
-
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/tunnels_j.htm b/luci-app-bmx6/bmx6/usr/lib/lua/luci/view/bmx6/tunnels_j.htm
deleted file mode 100644 (file)
index 92b22a9..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-<%#
-   Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-   Contributors Lluis Esquerda <eskerda@gmail.com>
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, write to the Free Software Foundation, Inc.,
-   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-   The full GNU General Public License is included in this distribution in
-   the file called "COPYING".
--%>
-
-
-<%+header%>
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
-<script type="text/javascript" src="<%=resource%>/bmx6/js/polling.js"></script>
-
-
-<style>
-
-       div.hideme{
-               display: none;
-       }
-
-       div.info{
-               background: #FFF;
-               border: solid 1px;
-               height: 80px;
-               display: block;
-               overflow: auto;
-       }
-
-       div.inforow{
-               text-align:left;
-               display:inline-block;
-               width:20%;
-               margin:5px;
-               vertical-align:top;
-
-       }
-
-#extra-info ul { list-style: none outside none; margin-left: 0em; }
-
-</style>
-<div class="cbi-map">
-
-<h2>Gateways tunnel announcements</h2>
-<div class="cbi-map-descr"></div>
-<fieldset class="cbi-section">
-       <legend><%:Mesh gateways%></legend>
-       <table class="cbi-section-table" id="descriptions_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"></th>
-                       <th class="cbi-section-table-cell"><%:Tunnel%></th>
-                       <th class="cbi-section-table-cell"><%:Node%></th>
-                       <th class="cbi-section-table-cell"><%:Network%></th>
-                       <th class="cbi-section-table-cell"><%:Bandwidth%></th>
-                       <th class="cbi-section-table-cell"><%:SearchNet%></th>
-                       <th class="cbi-section-table-cell"><%:Path Metric%></th>
-                       <th class="cbi-section-table-cell"><%:Tun metric%></th>
-                       <th class="cbi-section-table-cell"><%:Rating%></th>
-                       <th class="cbi-section-table-cell"><%:Src%></th>
-                       <th class="cbi-section-table-cell"><%:Search id%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="10"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
-
-</div>
-
-<script type="text/javascript">//<![CDATA[
-               new TablePooler(5,"/cgi-bin/bmx6-info", {'$tunnels':''}, "descriptions_table", function(st){
-                  var tunicon = "<%=resource%>/icons/tunnel.png";
-                  var tunicon_dis = "<%=resource%>/icons/tunnel_disabled.png";
-                  var applyicon = "<%=resource%>/cbi/apply.gif";
-                 var res = Array();
-                  for ( var k in st.tunnels ){
-                        var tunnel = st.tunnels[k];
-                        var nodename = tunnel.remoteName.replace(/\..+$/,'');
-                       var advnet = tunnel.advNet;
-                       var status = '<img src="'+tunicon_dis+'"/>';
-                       
-                       if ( tunnel.tunName != "---" ) status = '<img src="'+tunicon+'"/>';
-                       if ( advnet == "0.0.0.0/0" ) advnet = "<b>Internet</b>";
-
-                       res.push([status, tunnel.name, nodename, advnet, tunnel.advBw, tunnel.net,
-                               tunnel.pathMtc, tunnel.tunMtc, tunnel.rating, tunnel.srcIngress, tunnel.id]);
-                 }
-                 return res;
-               });
-//]]></script>
-
-<%+footer%>
-
diff --git a/luci-app-bmx6/bmx6/www/cgi-bin/bmx6-info b/luci-app-bmx6/bmx6/www/cgi-bin/bmx6-info
deleted file mode 100755 (executable)
index 9c615e4..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-#!/bin/sh
-# This script gives information about bmx6
-# Can be executed from a linux shell: ./bmx6-info -s links
-# Or from web interfae (with cgi enabled): http://host/cgi-bin/bmx6-info?links
-# Special methods are tagged with '$', like $myself or $neighbours: http://host/cgi-bin/bmx6-info?$myself
-# When '$' is not used, raw bmx6 information from the filesystem is returned (/var/runb/bmx6/json/)
-
-BMX6_DIR="$(uci get bmx6.general.runtimeDir 2>/dev/null)" || BMX6_DIR="/var/run/bmx6/json"
-
-#Checking if shell mode or cgi-bin mode
-if [ "$1" == "-s" ]; then
-  QUERY="$2"
-else
-  QUERY="${QUERY_STRING%%=*}"
-  QUERY="${QUERY%%\?*}"
-  QUERY="${QUERY%%\&*}"
-  echo "Content-type: application/json"
-  echo ""
-fi
-
-# workaround to support old format starting with '$'
-QUERY="$(echo "$QUERY" | sed s/'\$'//)"
-
-check_path() {
-  [ -d "$1" ] && path=$(cd $1; pwd)
-  [ -f "$1" ] && path=$(cd $1/..; pwd)
-  [ $(echo "$path" | grep -c "^$BMX6_DIR") -ne 1 ] && exit 1
-}
-
-print_query() {
-  # If the query is a directory
-  [ -d "$BMX6_DIR/$1" ] &&
-  {
-    # If /all has not been specified
-    [ -z "$QALL" ] &&
-    {
-      total=$(ls $BMX6_DIR/$1 | wc -w)
-      i=1
-      echo -n "{ \"$1\": [ "
-      for f in $(ls $BMX6_DIR/$1); do
-        echo -n "{ \"name\": \"$f\" }"
-        [ $i -lt $total ]  && echo -n ','
-        i=$(( $i + 1 ))
-      done
-      echo -n " ] }"
-      
-      # If /all has been specified, printing all the files together
-      } || {
-      comma=""
-      echo -n "[ "
-      for entry in "$BMX6_DIR/$1/"*; do
-        [ -f "$entry" ] &&
-        {
-          ${comma:+echo -n "$comma"}
-          tr -d '\n' < "$entry"
-          comma=","
-        }
-      done
-      echo -n " ]"
-    }
-  }
-  # If the query is a file, just printing the file
-  [ -f "$BMX6_DIR/$1" ] && cat "$BMX6_DIR/$1";
-}
-
-if [ "${QUERY##*/}" == "all" ]; then
-  QUERY="${QUERY%/all}"
-  QALL=1
-fi
-
-if [ "$QUERY" == 'myself' ]; then
-  hostname="$(cat /proc/sys/kernel/hostname)"
-  ip6="$(bmx6 -c show=status | grep ^BMX | awk '{print $5}')"
-  ip4="$(bmx6 -c show=status | grep ^BMX | awk '{print $6}')"
-  cidr6=$(lua -l luci.ip -e "ip=luci.ip.new(\"$ip6\"); print(ip:network():string()..'/'..ip:prefix())")
-  cidr4=$(lua -l luci.ip -e "ip=luci.ip.new(\"$ip4\"); print(ip:network():string()..'/'..ip:prefix())")
-  echo -n "{\"myself\":{\"hostname\":\"$hostname\",\"ip6\":\"$ip6\",\"ip4\":\"$ip4\",\"net6\":\"$cidr6\",\"net4\":\"$cidr4\"}}"
-  exit 0
-fi
-    
-if [ "$QUERY" == 'info' ]; then
-  echo -n '{ "info": [ '
-  print_query status
-  echo -n ","
-  print_query interfaces
-  echo -n "] }"
-  exit 0
-fi
-
-if [ "$QUERY" == 'neighbours' ]; then
-  QALL=1
-  echo -n '{ "neighbours": [ '
-  echo -n '{ "originators": '
-  print_query originators
-  echo -n '}, '
-  echo -n '{ "descriptions": '
-  print_query descriptions
-  echo -n "} ] }"
-  exit 0
-fi
-
-if [ "$QUERY" == 'tunnels' ]; then
-  bmx6 -c --jshow tunnels /r=0
-  exit 0
-fi
-
-if [ "$QUERY" == "" ]; then
-  echo -n '{ "queries": ['
-  echo -n '{ "name": "myself", "info": "basic network information of self node" },'
-  echo -n '{ "name": "info", "info": "full network and device information of self node" },'
-  echo -n '{ "name": "tunnels", "info": "accnouncements (tunnels) published by the mesh network" },'
-  echo -n '{ "name": "neighbours", "info": "list of all my neighbours and their information" },'
-  echo -n '{ "name": "/", "info": "raw bmx6 json API" }]}'
-  exit 0
-fi
-
-check_path "$BMX6_DIR/$QUERY"
-print_query $QUERY
-
-#ls -1F "$BMX6_DIR"
-exit 0
diff --git a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/bmx6logo.png b/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/bmx6logo.png
deleted file mode 100644 (file)
index 12f7526..0000000
Binary files a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/bmx6logo.png and /dev/null differ
diff --git a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/js/bmx6-graph.js b/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/js/bmx6-graph.js
deleted file mode 100644 (file)
index 80233ff..0000000
+++ /dev/null
@@ -1,234 +0,0 @@
-var graph, canvas, layouter, renderer, divwait, nodes, announcements, nodesIndex, palette, localInfo;
-document.addEventListener( "DOMContentLoaded", init, false);
-
-/**
- * Returns an index of nodes by name
- */
-function createNodeIndex(nodes) {
-  var inode, index = {};
-
-  for (inode in nodes)
-    index[nodes[inode].name] = nodes[inode];
-
-  return index;
-}
-
-/**
- * Updates to have announcements in nodes list
- */
-function processNodeAnnouncements(nodes, announcements) {
-  var iannouncement, remoteNode, announcement;
-  nodesIndex = createNodeIndex(nodes);
-
-  for(iannouncement in announcements) {
-    announcement = announcements[iannouncement];
-    if (announcement.remoteName == '---' ) continue;
-    if (!( announcement.remoteName in nodesIndex )) {
-      newNode = {
-        name: announcement.remoteName,
-        links: []
-      };
-      nodes.push(newNode);
-      nodesIndex[newNode.name] = newNode;
-    };
-
-    remoteNode = nodesIndex[announcement.remoteName];
-    if (!( 'announcements' in remoteNode )) remoteNode.announcements = [];
-    remoteNode.announcements.push(announcement);
-  };
-}
-
-function init() {
-  palette = generatePalette(200);
-
-  graph = new Graph();
-  canvas = document.getElementById('canvas');
-  layouter = new Graph.Layout.Spring(graph);
-  renderer = new Graph.Renderer.Raphael(canvas.id, graph, canvas.offsetWidth, canvas.offsetHeight);
-
-  divwait = document.getElementById("wait");
-
-  XHR.get('/cgi-bin/luci/status/bmx6/topology', null, function(nodesRequest, nodesData) {
-    nodes = nodesData;
-
-    XHR.get('/cgi-bin/bmx6-info?$myself&', null, function(myselfRequest, myselfData) {
-      if (myselfData)
-        localAnnouncements = [
-          {remoteName: myselfData.myself.hostname, advNet: myselfData.myself.net4},
-          {remoteName: myselfData.myself.hostname, advNet: myselfData.myself.net6}
-        ];
-
-      XHR.get('/cgi-bin/bmx6-info?$tunnels=&', null, function(tunnelsRequest, tunnelsData) {
-        var iAnnouncement;
-
-        announcements = tunnelsData.tunnels;
-        for(iAnnouncement in localAnnouncements) {
-          announcements.push(localAnnouncements[iAnnouncement])
-        };
-
-        processNodeAnnouncements(nodes, announcements);
-
-        divwait.parentNode.removeChild(divwait);
-        draw(nodes);
-      });
-    });
-  });
-}
-
-function hashCode(str) {
-  var hash = 0;
-  if (str.length == 0) return hash;
-  for (i = 0; i < str.length; i++) {
-    char = str.charCodeAt(i);
-    hash = ((hash<<5)-hash)+char;
-    hash = hash & hash; // Convert to 32bit integer
-  }
-  return hash;
-}
-
-function generatePalette(size) {
-  var i, arr = [];
-  Raphael.getColor(); // just to remove the grey one
-  for(i = 0; i < size; i++) {
-    arr.push(Raphael.getColor())
-  }
-
-  return arr;
-}
-
-function getFillFromHash(hash) {
-  return palette[Math.abs(hash % palette.length)];
-}
-
-function hashAnnouncementsNames(announcementsNames) {
-  return hashCode(announcementsNames.sort().join('-'));
-}
-
-function getNodeAnnouncements(networkNode) {
-  return networkNode.announcements;
-}
-
-function nodeRenderer(raphael, node) {
-  var nodeFill, renderedNode, options;
-  options = {
-    'fill': 'announcements' in node.networkNode ? getFillFromHash(
-      hashAnnouncementsNames(
-        getNodeAnnouncements(node.networkNode).map(function(ann) {return ann.advNet;})
-      )
-    ) : '#bfbfbf',
-    'stroke-width': 1,
-
-  };
-
-  renderedNode = raphael.set();
-
-  renderedNode.push(raphael.ellipse(node.point[0], node.point[1], 30, 20).attr({"fill": options['fill'], "stroke-width": options['stroke-width']}));
-  renderedNode.push(raphael.text(node.point[0], node.point[1] + 30, node.networkNode.name).attr({}));
-
-  renderedNode.items.forEach(function(el) {
-    var announcements, tooltip = raphael.set();
-    tooltip.push(raphael.rect(-60, -60, 120, 60).attr({"fill": "#fec", "stroke-width": 1, r : "9px"}));
-
-    announcements = getNodeAnnouncements(node.networkNode);
-    if (announcements) {
-
-      announcements = announcements.map(function(ann) {return ann.advNet});
-      tooltip.push(raphael.text(0, -40, 'announcements\n' + announcements.join('\n')).attr({}));
-    };
-
-    el.tooltip(tooltip);
-  });
-
-  return renderedNode;
-}
-
-function genericNodeRenderer(raphael, node) {
-  var renderedNode;
-
-  renderedNode = raphael.set();
-
-  renderedNode.push(raphael.ellipse(node.point[0], node.point[1], 30, 20).attr({"fill": '#bfbfbf', "stroke-width": 1}));
-  renderedNode.push(raphael.text(node.point[0], node.point[1] + 30, node.networkNode.name).attr({}));
-
-  return renderedNode;
-}
-
-function redraw() {
-  layouter.layout();
-  renderer.draw();
-}
-
-function interpolateColor(minColor,maxColor,maxDepth,depth){
-
-  function d2h(d) {return d.toString(16);}
-  function h2d(h) {return parseInt(h,16);}
-
-  if(depth == 0){
-    return minColor;
-  }
-  if(depth == maxDepth){
-    return maxColor;
-  }
-
-  var color = "#";
-
-  for(var i=1; i <= 6; i+=2){
-    var minVal = new Number(h2d(minColor.substr(i,2)));
-    var maxVal = new Number(h2d(maxColor.substr(i,2)));
-    var nVal = minVal + (maxVal-minVal) * (depth/maxDepth);
-    var val = d2h(Math.floor(nVal));
-    while(val.length < 2){
-      val = "0"+val;
-    }
-    color += val;
-  }
-  return color;
-}
-function draw(nodes) {
-  var node, neighbourNode, seenKey, rxRate, txRate, seen, i, j, currentName, linkQuality;
-
-  seen = { };
-
-  for (i = 0; i < (nodes.length); i++) {
-    node = nodes[i];
-    graph.addNode(node.name, {
-      networkNode: node,
-      render: nodeRenderer
-    });
-  };
-
-  for (i = 0; i < (nodes.length); i++) {
-    node = nodes[i];
-
-    if (! node.name) continue;
-
-    currentName = node.name;
-
-    for (j = 0; j < (node.links.length); j++) {
-      neighbourNode = node.links[j];
-
-      graph.addNode(neighbourNode.name, {render: genericNodeRenderer, networkNode: neighbourNode});
-
-      seenKey = (node.name < neighbourNode.name) ? node.name + '|' + neighbourNode.name : neighbourNode.name + '|' + node.name;
-
-      rxRate = neighbourNode.rxRate;
-      txRate = neighbourNode.txRate;
-
-      if (!seen[seenKey] && rxRate > 0 && txRate > 0) {
-        linkQuality = ( rxRate + txRate ) / 2;
-
-        graph.addEdge(node.name, neighbourNode.name, {
-          'label': rxRate + '/' + txRate,
-          'directed': false,
-          'stroke': interpolateColor('FF0000','00FF00', 5, 5 * ( linkQuality - 1 )/100),
-          'fill': interpolateColor('FF0000','00FF00', 5, 5 * ( linkQuality - 1 )/100),
-          'label-style': { 'font-size': 8 }
-        });
-
-        seen[seenKey] = true;
-      }
-    }
-  }
-
-  redraw();
-}
diff --git a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/js/polling.js b/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/js/polling.js
deleted file mode 100644 (file)
index 8f81443..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-    Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-    Contributors Lluis Esquerda <eskerda@gmail.com>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-    The full GNU General Public License is included in this distribution in
-    the file called "COPYING".
-*/
-
-               
-/*
-       Table pooler is a function to easy call XHR poller. 
-
-               new TablePooler(5,"/cgi-bin/bmx6-info", {'status':''}, "status_table", function(st){
-                       var table = Array()
-                       table.push(st.first,st.second)
-                       return table
-               }
-       Parameters are: 
-               polling_time: time between pollings
-               json_url: the json url to fetch the data
-               json_call: the json call
-               output_table_id: the table where javascript will put the data
-               callback_function: the function that will be executed each polling_time
-       
-       The callback_function must return an array of arrays (matrix).
-       In the code st is the data obtained from the json call
-*/
-
-       function TablePooler (time, jsonurl, getparams, table_id, callback) {
-               this.table = document.getElementById(table_id);
-               this.callback = callback;
-               this.jsonurl = jsonurl;
-               this.getparams = getparams;
-               this.time = time;
-
-               this.clear = function(){
-                       /* clear all rows */
-                       while( this.table.rows.length > 1 ) this.table.deleteRow(1);
-               }
-               this.start = function(){
-                       XHR.poll(this.time, this.jsonurl, this.getparams, function(x, st){
-                               var data = this.callback(st);
-                               var content, tr, td;
-                               this.clear();
-                               for (var i = 0; i < data.length; i++){
-                                       tr = this.table.insertRow(-1);
-                                       tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-                                               
-                                       for (var j = 0; j < data[i].length; j++){
-                                               td = tr.insertCell(-1);
-                                               if (data[i][j].length == 2) {
-                                                       td.colSpan = data[i][j][1];
-                                                       content = data[i][j][0];
-                                               }
-                                               else content = data[i][j];
-                                               td.innerHTML = content;
-                                       }
-                               }
-                       }.bind(this));
-               }
-
-
-               this.start();
-       }
-
-
-
diff --git a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/link.png b/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/link.png
deleted file mode 100644 (file)
index 58977ff..0000000
Binary files a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/link.png and /dev/null differ
diff --git a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/style.css b/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/style.css
deleted file mode 100644 (file)
index d8191a7..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-    table {
-       width:90%;
-       border-top:1px solid #e5eaf8;
-       border-right:1px solid #e5eaf8;
-       margin:1em auto;
-       border-collapse:collapse;
-     }
-
-    td {
-       color:#678197;
-       border-bottom:1px solid #e6eff8;
-       border-left:1px solid #e6eff8;
-       padding:.3em 1em;
-       text-align:center;
-     }
-    th {
-       background:#f4f9fe;
-       text-align:center;
-       font:bold 1.2em/2em Century Gothic,Trebuchet MS,Arial,Helvetica,sans-serif;
-       color:#66a3d3;
-     }
-
diff --git a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/wifi.png b/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/wifi.png
deleted file mode 100644 (file)
index 4195b08..0000000
Binary files a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/wifi.png and /dev/null differ
diff --git a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/world.png b/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/world.png
deleted file mode 100644 (file)
index 29b53c9..0000000
Binary files a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/world.png and /dev/null differ
diff --git a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/world_small.png b/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/world_small.png
deleted file mode 100644 (file)
index f5f3105..0000000
Binary files a/luci-app-bmx6/bmx6/www/luci-static/resources/bmx6/world_small.png and /dev/null differ
diff --git a/luci-app-bmx6/dracula/dracula_graffle.js b/luci-app-bmx6/dracula/dracula_graffle.js
deleted file mode 100644 (file)
index 9832727..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Raphael.fn.connection=function(a,b,c){var d=this,e={draw:function(){for(var f=a.getBBox(),g=b.getBBox(),h=0,i=0,j=[{x:f.x+f.width/2,y:f.y-h},{x:f.x+f.width/2,y:f.y+f.height+h},{x:f.x-h,y:f.y+f.height/2},{x:f.x+f.width+h,y:f.y+f.height/2},{x:g.x+g.width/2,y:g.y-i},{x:g.x+g.width/2,y:g.y+g.height+i},{x:g.x-i,y:g.y+g.height/2},{x:g.x+g.width+i,y:g.y+g.height/2}],k={},l=[],m=0;m<4;m++)for(var n=4;n<8;n++){var o=Math.abs(j[m].x-j[n].x),p=Math.abs(j[m].y-j[n].y);(m==n-4||(3!=m&&6!=n||j[m].x<j[n].x)&&(2!=m&&7!=n||j[m].x>j[n].x)&&(0!=m&&5!=n||j[m].y>j[n].y)&&(1!=m&&4!=n||j[m].y<j[n].y))&&(l.push(o+p),k[l[l.length-1].toFixed(3)]=[m,n])}var q=0==l.length?[0,4]:k[Math.min.apply(Math,l).toFixed(3)],r=j[q[0]].x,s=j[q[0]].y,t=j[q[1]].x,u=j[q[1]].y,o=Math.max(Math.abs(r-t)/2,10),p=Math.max(Math.abs(s-u)/2,10),v=[r,r,r-o,r+o][q[0]].toFixed(3),w=[s-p,s+p,s,s][q[0]].toFixed(3),x=[0,0,0,0,t,t,t-o,t+o][q[1]].toFixed(3),y=[0,0,0,0,s+p,s-p,u,u][q[1]].toFixed(3),z=["M",r.toFixed(3),s.toFixed(3),"C",v,w,x,y,t.toFixed(3),u.toFixed(3)].join(",");if(c&&c.directed){var A=Math.sqrt((u-y)*(u-y)+(t-x)*(t-x)),B=function(a,b){return-a*(b||5)/A},C=[{x:(B(t-x)+B(u-y)+t).toFixed(3),y:(B(u-y)+B(t-x)+u).toFixed(3)},{x:(B(t-x)-B(u-y)+t).toFixed(3),y:(B(u-y)-B(t-x)+u).toFixed(3)}];z=z+",M"+C[0].x+","+C[0].y+",L"+t+","+u+",L"+C[1].x+","+C[1].y}var D="attr";e.fg&&e.fg[D]({path:z})||(e.fg=d.path(z).attr({stroke:c&&c.stroke||"#000",fill:"none"}).toBack()),e.bg&&e.bg[D]({path:z})||c&&c.fill&&(e.bg=c.fill.split&&d.path(z).attr({stroke:c.fill.split("|")[0],fill:"none","stroke-width":c.fill.split("|")[1]||3}).toBack()),c&&c.label&&(e.label&&e.label.attr({x:(r+t)/2,y:(s+u)/2})||(e.label=d.text((r+t)/2,(s+u)/2,c.label).attr({fill:"#000","font-size":c["font-size"]||"12px"}))),c&&c.label&&c["label-style"]&&e.label&&e.label.attr(c["label-style"]),c&&c.callback&&c.callback(e)}};return e.draw(),e};
diff --git a/luci-app-bmx6/dracula/dracula_graph.js b/luci-app-bmx6/dracula/dracula_graph.js
deleted file mode 100644 (file)
index f25e5b3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-function log(a){console.log&&console.log(a)}var AbstractEdge=function(){};AbstractEdge.prototype={hide:function(){this.connection.fg.hide(),this.connection.bg&&this.bg.connection.hide()}};var EdgeFactory=function(){this.template=new AbstractEdge,this.template.style=new Object,this.template.style.directed=!1,this.template.weight=1};EdgeFactory.prototype={build:function(a,b){var c=jQuery.extend(!0,{},this.template);return c.source=a,c.target=b,c}};var Graph=function(){this.nodes={},this.edges=[],this.snapshots=[],this.edgeFactory=new EdgeFactory};Graph.prototype={addNode:function(a,b){return void 0==this.nodes[a]&&(this.nodes[a]=new Graph.Node(a,b)),this.nodes[a]},addEdge:function(a,b,c){var d=this.addNode(a),e=this.addNode(b),f=this.edgeFactory.build(d,e);jQuery.extend(f.style,c),d.edges.push(f),this.edges.push(f),e.edges.push(f)},snapShot:function(a){},removeNode:function(a){delete this.nodes[a];for(var b=0;b<this.edges.length;b++)this.edges[b].source.id!=a&&this.edges[b].target.id!=a||(this.edges.splice(b,1),b--)}},Graph.Node=function(a,b){return b=b||{},b.id=a,b.edges=[],b.hide=function(){this.hidden=!0,this.shape&&this.shape.hide();for(i in this.edges)(this.edges[i].source.id==a||this.edges[i].target==a)&&this.edges[i].hide&&this.edges[i].hide()},b.show=function(){this.hidden=!1,this.shape&&this.shape.show();for(i in this.edges)(this.edges[i].source.id==a||this.edges[i].target==a)&&this.edges[i].show&&this.edges[i].show()},b},Graph.Node.prototype={},Graph.Renderer={},Graph.Renderer.Raphael=function(a,b,c,d){this.width=c||400,this.height=d||400;var e=this;this.r=Raphael(a,this.width,this.height),this.radius=40,this.graph=b,this.mouse_in=!1,this.graph.render||(this.graph.render=function(){}),this.isDrag=!1,this.dragger=function(a){this.dx=a.clientX,this.dy=a.clientY,e.isDrag=this,this.set&&this.set.animate({"fill-opacity":.1},200)&&this.set.toFront(),a.preventDefault&&a.preventDefault()};var f=document.getElementById(a);f.onmousemove=function(a){if(a=a||window.event,e.isDrag){var b=e.isDrag.set.getBBox(),c=a.clientX-e.isDrag.dx+(b.x+b.width/2),d=a.clientY-e.isDrag.dy+(b.y+b.height/2),f=a.clientX-(c<20?c-20:c>e.width-20?c-e.width+20:0),g=a.clientY-(d<20?d-20:d>e.height-20?d-e.height+20:0);e.isDrag.set.translate(f-Math.round(e.isDrag.dx),g-Math.round(e.isDrag.dy));for(var h in e.graph.edges)e.graph.edges[h].connection&&e.graph.edges[h].connection.draw();e.isDrag.dx=f,e.isDrag.dy=g}},f.onmouseup=function(){e.isDrag&&e.isDrag.set.animate({"fill-opacity":.6},500),e.isDrag=!1},this.draw()},Graph.Renderer.Raphael.prototype={translate:function(a){return[(a[0]-this.graph.layoutMinX)*this.factorX+this.radius,(a[1]-this.graph.layoutMinY)*this.factorY+this.radius]},rotate:function(a,b,c){var d=b*Math.cos(c),e=b*Math.sin(c);return[a[0]+d,a[1]+e]},draw:function(){this.factorX=(this.width-2*this.radius)/(this.graph.layoutMaxX-this.graph.layoutMinX),this.factorY=(this.height-2*this.radius)/(this.graph.layoutMaxY-this.graph.layoutMinY);for(a in this.graph.nodes)this.drawNode(this.graph.nodes[a]);for(var a=0;a<this.graph.edges.length;a++)this.drawEdge(this.graph.edges[a])},drawNode:function(a){var b=this.translate([a.layoutPosX,a.layoutPosY]);if(a.point=b,a.shape){var c=a.shape.getBBox(),d={x:c.x+c.width/2,y:c.y+c.height/2};return a.shape.translate(Math.round(b[0]-d.x),Math.round(b[1]-d.y)),this.r.safari(),a}var e;a.render||(a.render=function(a,b){var c=Raphael.getColor(),d=a.ellipse(0,0,30,20).attr({fill:c,stroke:c,"stroke-width":2});return d.node.id=b.label||b.id,e=a.set().push(d).push(a.text(0,30,b.label||b.id))}),a.shapes,e=a.render(this.r,a).hide(),e.attr({"fill-opacity":.6}),e.items.forEach(function(a){a.set=e,a.node.style.cursor="move"}),e.mousedown(this.dragger);var f=e.getBBox();e.translate(Math.round(b[0]-(f.x+f.width/2)),Math.round(b[1]-(f.y+f.height/2))),a.hidden||e.show(),a.shape=e},drawEdge:function(a){if(!a.backedge){if(a.source.hidden||a.target.hidden)return void(a.connection&&a.connection.fg.hide()|a.connection.bg&&a.connection.bg.hide());if(!a.connection)return a.style&&a.style.callback&&a.style.callback(a),void(a.connection=this.r.connection(a.source.shape,a.target.shape,a.style));a.connection.fg.show(),a.connection.bg&&a.connection.bg.show(),a.connection.draw()}}},Graph.Layout={},Graph.Layout.Spring=function(a){this.graph=a,this.iterations=500,this.maxRepulsiveForceDistance=6,this.k=2,this.c=.01,this.maxVertexMovement=.5,this.layout()},Graph.Layout.Spring.prototype={layout:function(){this.layoutPrepare();for(var a=0;a<this.iterations;a++)this.layoutIteration();this.layoutCalcBounds()},layoutPrepare:function(){for(i in this.graph.nodes){var a=this.graph.nodes[i];a.layoutPosX=0,a.layoutPosY=0,a.layoutForceX=0,a.layoutForceY=0}},layoutCalcBounds:function(){var a=1/0,b=-(1/0),c=1/0,d=-(1/0);for(i in this.graph.nodes){var e=this.graph.nodes[i].layoutPosX,f=this.graph.nodes[i].layoutPosY;e>b&&(b=e),e<a&&(a=e),f>d&&(d=f),f<c&&(c=f)}this.graph.layoutMinX=a,this.graph.layoutMaxX=b,this.graph.layoutMinY=c,this.graph.layoutMaxY=d},layoutIteration:function(){var a=new Array;for(var b in this.graph.nodes){var c=this.graph.nodes[b];for(var d in a){var e=this.graph.nodes[a[d]];this.layoutRepulsive(c,e)}a.push(b)}for(var f=0;f<this.graph.edges.length;f++){var g=this.graph.edges[f];this.layoutAttractive(g)}for(f in this.graph.nodes){var h=this.graph.nodes[f],i=this.c*h.layoutForceX,j=this.c*h.layoutForceY,k=this.maxVertexMovement;i>k&&(i=k),i<-k&&(i=-k),j>k&&(j=k),j<-k&&(j=-k),h.layoutPosX+=i,h.layoutPosY+=j,h.layoutForceX=0,h.layoutForceY=0}},layoutRepulsive:function(a,b){if("undefined"!=typeof a&&"undefined"!=typeof b){var c=b.layoutPosX-a.layoutPosX,d=b.layoutPosY-a.layoutPosY,e=c*c+d*d;if(e<.01){c=.1*Math.random()+.1,d=.1*Math.random()+.1;var e=c*c+d*d}var f=Math.sqrt(e);if(f<this.maxRepulsiveForceDistance){var g=this.k*this.k/f;b.layoutForceX+=g*c/f,b.layoutForceY+=g*d/f,a.layoutForceX-=g*c/f,a.layoutForceY-=g*d/f}}},layoutAttractive:function(a){var b=a.source,c=a.target,d=c.layoutPosX-b.layoutPosX,e=c.layoutPosY-b.layoutPosY,f=d*d+e*e;if(f<.01){d=.1*Math.random()+.1,e=.1*Math.random()+.1;var f=d*d+e*e}var g=Math.sqrt(f);g>this.maxRepulsiveForceDistance&&(g=this.maxRepulsiveForceDistance,f=g*g);var h=(f-this.k*this.k)/this.k;void 0==a.attraction&&(a.attraction=1),h*=.5*Math.log(a.attraction)+1,c.layoutForceX-=h*d/g,c.layoutForceY-=h*e/g,b.layoutForceX+=h*d/g,b.layoutForceY+=h*e/g}},Graph.Layout.Ordered=function(a,b){this.graph=a,this.order=b,this.layout()},Graph.Layout.Ordered.prototype={layout:function(){this.layoutPrepare(),this.layoutCalcBounds()},layoutPrepare:function(a){for(i in this.graph.nodes){var b=this.graph.nodes[i];b.layoutPosX=0,b.layoutPosY=0}var c=0;for(i in this.order){var b=this.order[i];b.layoutPosX=c,b.layoutPosY=Math.random(),c++}},layoutCalcBounds:function(){var a=1/0,b=-(1/0),c=1/0,d=-(1/0);for(i in this.graph.nodes){var e=this.graph.nodes[i].layoutPosX,f=this.graph.nodes[i].layoutPosY;e>b&&(b=e),e<a&&(a=e),f>d&&(d=f),f<c&&(c=f)}this.graph.layoutMinX=a,this.graph.layoutMaxX=b,this.graph.layoutMinY=c,this.graph.layoutMaxY=d}},Raphael.el.tooltip=function(a){return this.tp=a,this.tp.o={x:0,y:0},this.tp.hide(),this.hover(function(a){this.mousemove(function(a){this.tp.translate(a.clientX-this.tp.o.x,a.clientY-this.tp.o.y),this.tp.o={x:a.clientX,y:a.clientY}}),this.tp.show().toFront()},function(a){this.tp.hide(),this.unmousemove()}),this},Array.prototype.forEach||(Array.prototype.forEach=function(a){var b=this.length;if("function"!=typeof a)throw new TypeError;for(var c=arguments[1],d=0;d<b;d++)d in this&&a.call(c,this[d],d,this)});
diff --git a/luci-app-bmx6/dracula/raphael-min.js b/luci-app-bmx6/dracula/raphael-min.js
deleted file mode 100644 (file)
index 8718b5b..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * Raphael 1.3.1 - JavaScript Vector Library
- *
- * Copyright (c) 2008 - 2009 Dmitry Baranovskiy (http://raphaeljs.com)
- * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
- */
-Raphael=(function(){var a=/[, ]+/,aO=/^(circle|rect|path|ellipse|text|image)$/,L=document,au=window,l={was:"Raphael" in au,is:au.Raphael},an=function(){if(an.is(arguments[0],"array")){var d=arguments[0],e=w[aW](an,d.splice(0,3+an.is(d[0],al))),S=e.set();for(var R=0,a0=d[m];R<a0;R++){var E=d[R]||{};aO.test(E.type)&&S[f](e[E.type]().attr(E));}return S;}return w[aW](an,arguments);},aT=function(){},aL="appendChild",aW="apply",aS="concat",at="",am=" ",z="split",F="click dblclick mousedown mousemove mouseout mouseover mouseup"[z](am),Q="hasOwnProperty",az="join",m="length",aY="prototype",aZ=String[aY].toLowerCase,ab=Math,g=ab.max,aI=ab.min,al="number",aA="toString",aw=Object[aY][aA],aQ={},aM=ab.pow,f="push",aU=/^(?=[\da-f]$)/,c=/^url\(['"]?([^\)]+)['"]?\)$/i,x=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgb\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|rgb\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\)|hs[bl]\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|hs[bl]\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\))\s*$/i,O=ab.round,v="setAttribute",W=parseFloat,G=parseInt,aN=String[aY].toUpperCase,j={"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rotation:0,rx:0,ry:0,scale:"1 1",src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",translation:"0 0",width:0,x:0,y:0},Z={along:"along","clip-rect":"csv",cx:al,cy:al,fill:"colour","fill-opacity":al,"font-size":al,height:al,opacity:al,path:"path",r:al,rotation:"csv",rx:al,ry:al,scale:"csv",stroke:"colour","stroke-opacity":al,"stroke-width":al,translation:"csv",width:al,x:al,y:al},aP="replace";an.version="1.3.1";an.type=(au.SVGAngle||L.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML");if(an.type=="VML"){var ag=document.createElement("div");ag.innerHTML="<!--[if vml]><br><br><![endif]-->";if(ag.childNodes[m]!=2){return null;}}an.svg=!(an.vml=an.type=="VML");aT[aY]=an[aY];an._id=0;an._oid=0;an.fn={};an.is=function(e,d){d=aZ.call(d);return((d=="object"||d=="undefined")&&typeof e==d)||(e==null&&d=="null")||aZ.call(aw.call(e).slice(8,-1))==d;};an.setWindow=function(d){au=d;L=au.document;};var aD=function(e){if(an.vml){var d=/^\s+|\s+$/g;aD=aj(function(R){var S;R=(R+at)[aP](d,at);try{var a0=new ActiveXObject("htmlfile");a0.write("<body>");a0.close();S=a0.body;}catch(a2){S=createPopup().document.body;}var i=S.createTextRange();try{S.style.color=R;var a1=i.queryCommandValue("ForeColor");a1=((a1&255)<<16)|(a1&65280)|((a1&16711680)>>>16);return"#"+("000000"+a1[aA](16)).slice(-6);}catch(a2){return"none";}});}else{var E=L.createElement("i");E.title="Rapha\xebl Colour Picker";E.style.display="none";L.body[aL](E);aD=aj(function(i){E.style.color=i;return L.defaultView.getComputedStyle(E,at).getPropertyValue("color");});}return aD(e);};an.hsb2rgb=aj(function(a3,a1,a7){if(an.is(a3,"object")&&"h" in a3&&"s" in a3&&"b" in a3){a7=a3.b;a1=a3.s;a3=a3.h;}var R,S,a8;if(a7==0){return{r:0,g:0,b:0,hex:"#000"};}if(a3>1||a1>1||a7>1){a3/=255;a1/=255;a7/=255;}var a0=~~(a3*6),a4=(a3*6)-a0,E=a7*(1-a1),e=a7*(1-(a1*a4)),a9=a7*(1-(a1*(1-a4)));R=[a7,e,E,E,a9,a7,a7][a0];S=[a9,a7,a7,e,E,E,a9][a0];a8=[E,E,a9,a7,a7,e,E][a0];R*=255;S*=255;a8*=255;var a5={r:R,g:S,b:a8},d=(~~R)[aA](16),a2=(~~S)[aA](16),a6=(~~a8)[aA](16);d=d[aP](aU,"0");a2=a2[aP](aU,"0");a6=a6[aP](aU,"0");a5.hex="#"+d+a2+a6;return a5;},an);an.rgb2hsb=aj(function(d,e,a1){if(an.is(d,"object")&&"r" in d&&"g" in d&&"b" in d){a1=d.b;e=d.g;d=d.r;}if(an.is(d,"string")){var a3=an.getRGB(d);d=a3.r;e=a3.g;a1=a3.b;}if(d>1||e>1||a1>1){d/=255;e/=255;a1/=255;}var a0=g(d,e,a1),i=aI(d,e,a1),R,E,S=a0;if(i==a0){return{h:0,s:0,b:a0};}else{var a2=(a0-i);E=a2/a0;if(d==a0){R=(e-a1)/a2;}else{if(e==a0){R=2+((a1-d)/a2);}else{R=4+((d-e)/a2);}}R/=6;R<0&&R++;R>1&&R--;}return{h:R,s:E,b:S};},an);var aE=/,?([achlmqrstvxz]),?/gi;an._path2string=function(){return this.join(",")[aP](aE,"$1");};function aj(E,e,d){function i(){var R=Array[aY].slice.call(arguments,0),a0=R[az]("\u25ba"),S=i.cache=i.cache||{},a1=i.count=i.count||[];if(S[Q](a0)){return d?d(S[a0]):S[a0];}a1[m]>=1000&&delete S[a1.shift()];a1[f](a0);S[a0]=E[aW](e,R);return d?d(S[a0]):S[a0];}return i;}an.getRGB=aj(function(d){if(!d||!!((d=d+at).indexOf("-")+1)){return{r:-1,g:-1,b:-1,hex:"none",error:1};}if(d=="none"){return{r:-1,g:-1,b:-1,hex:"none"};}!(({hs:1,rg:1})[Q](d.substring(0,2))||d.charAt()=="#")&&(d=aD(d));var S,i,E,a2,a3,a0=d.match(x);if(a0){if(a0[2]){a2=G(a0[2].substring(5),16);E=G(a0[2].substring(3,5),16);i=G(a0[2].substring(1,3),16);}if(a0[3]){a2=G((a3=a0[3].charAt(3))+a3,16);E=G((a3=a0[3].charAt(2))+a3,16);i=G((a3=a0[3].charAt(1))+a3,16);}if(a0[4]){a0=a0[4][z](/\s*,\s*/);i=W(a0[0]);E=W(a0[1]);a2=W(a0[2]);}if(a0[5]){a0=a0[5][z](/\s*,\s*/);i=W(a0[0])*2.55;E=W(a0[1])*2.55;a2=W(a0[2])*2.55;}if(a0[6]){a0=a0[6][z](/\s*,\s*/);i=W(a0[0]);E=W(a0[1]);a2=W(a0[2]);return an.hsb2rgb(i,E,a2);}if(a0[7]){a0=a0[7][z](/\s*,\s*/);i=W(a0[0])*2.55;E=W(a0[1])*2.55;a2=W(a0[2])*2.55;return an.hsb2rgb(i,E,a2);}a0={r:i,g:E,b:a2};var e=(~~i)[aA](16),R=(~~E)[aA](16),a1=(~~a2)[aA](16);e=e[aP](aU,"0");R=R[aP](aU,"0");a1=a1[aP](aU,"0");a0.hex="#"+e+R+a1;return a0;}return{r:-1,g:-1,b:-1,hex:"none",error:1};},an);an.getColor=function(e){var i=this.getColor.start=this.getColor.start||{h:0,s:1,b:e||0.75},d=this.hsb2rgb(i.h,i.s,i.b);i.h+=0.075;if(i.h>1){i.h=0;i.s-=0.2;i.s<=0&&(this.getColor.start={h:0,s:1,b:i.b});}return d.hex;};an.getColor.reset=function(){delete this.start;};an.parsePathString=aj(function(d){if(!d){return null;}var i={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},e=[];if(an.is(d,"array")&&an.is(d[0],"array")){e=av(d);}if(!e[m]){(d+at)[aP](/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,function(R,E,a1){var a0=[],S=aZ.call(E);a1[aP](/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,function(a3,a2){a2&&a0[f](+a2);});while(a0[m]>=i[S]){e[f]([E][aS](a0.splice(0,i[S])));if(!i[S]){break;}}});}e[aA]=an._path2string;return e;});an.findDotsAtSegment=function(e,d,be,bc,a0,R,a2,a1,a8){var a6=1-a8,a5=aM(a6,3)*e+aM(a6,2)*3*a8*be+a6*3*a8*a8*a0+aM(a8,3)*a2,a3=aM(a6,3)*d+aM(a6,2)*3*a8*bc+a6*3*a8*a8*R+aM(a8,3)*a1,ba=e+2*a8*(be-e)+a8*a8*(a0-2*be+e),a9=d+2*a8*(bc-d)+a8*a8*(R-2*bc+d),bd=be+2*a8*(a0-be)+a8*a8*(a2-2*a0+be),bb=bc+2*a8*(R-bc)+a8*a8*(a1-2*R+bc),a7=(1-a8)*e+a8*be,a4=(1-a8)*d+a8*bc,E=(1-a8)*a0+a8*a2,i=(1-a8)*R+a8*a1,S=(90-ab.atan((ba-bd)/(a9-bb))*180/ab.PI);(ba>bd||a9<bb)&&(S+=180);return{x:a5,y:a3,m:{x:ba,y:a9},n:{x:bd,y:bb},start:{x:a7,y:a4},end:{x:E,y:i},alpha:S};};var U=aj(function(a5){if(!a5){return{x:0,y:0,width:0,height:0};}a5=H(a5);var a2=0,a1=0,R=[],e=[],E;for(var S=0,a4=a5[m];S<a4;S++){E=a5[S];if(E[0]=="M"){a2=E[1];a1=E[2];R[f](a2);e[f](a1);}else{var a0=aC(a2,a1,E[1],E[2],E[3],E[4],E[5],E[6]);R=R[aS](a0.min.x,a0.max.x);e=e[aS](a0.min.y,a0.max.y);a2=E[5];a1=E[6];}}var d=aI[aW](0,R),a3=aI[aW](0,e);return{x:d,y:a3,width:g[aW](0,R)-d,height:g[aW](0,e)-a3};}),av=function(a0){var E=[];if(!an.is(a0,"array")||!an.is(a0&&a0[0],"array")){a0=an.parsePathString(a0);}for(var e=0,R=a0[m];e<R;e++){E[e]=[];for(var d=0,S=a0[e][m];d<S;d++){E[e][d]=a0[e][d];}}E[aA]=an._path2string;return E;},ad=aj(function(R){if(!an.is(R,"array")||!an.is(R&&R[0],"array")){R=an.parsePathString(R);}var a4=[],a6=0,a5=0,a9=0,a8=0,E=0;if(R[0][0]=="M"){a6=R[0][1];a5=R[0][2];a9=a6;a8=a5;E++;a4[f](["M",a6,a5]);}for(var a1=E,ba=R[m];a1<ba;a1++){var d=a4[a1]=[],a7=R[a1];if(a7[0]!=aZ.call(a7[0])){d[0]=aZ.call(a7[0]);switch(d[0]){case"a":d[1]=a7[1];d[2]=a7[2];d[3]=a7[3];d[4]=a7[4];d[5]=a7[5];d[6]=+(a7[6]-a6).toFixed(3);d[7]=+(a7[7]-a5).toFixed(3);break;case"v":d[1]=+(a7[1]-a5).toFixed(3);break;case"m":a9=a7[1];a8=a7[2];default:for(var a0=1,a2=a7[m];a0<a2;a0++){d[a0]=+(a7[a0]-((a0%2)?a6:a5)).toFixed(3);}}}else{d=a4[a1]=[];if(a7[0]=="m"){a9=a7[1]+a6;a8=a7[2]+a5;}for(var S=0,e=a7[m];S<e;S++){a4[a1][S]=a7[S];}}var a3=a4[a1][m];switch(a4[a1][0]){case"z":a6=a9;a5=a8;break;case"h":a6+=+a4[a1][a3-1];break;case"v":a5+=+a4[a1][a3-1];break;default:a6+=+a4[a1][a3-2];a5+=+a4[a1][a3-1];}}a4[aA]=an._path2string;return a4;},0,av),r=aj(function(R){if(!an.is(R,"array")||!an.is(R&&R[0],"array")){R=an.parsePathString(R);}var a3=[],a5=0,a4=0,a8=0,a7=0,E=0;if(R[0][0]=="M"){a5=+R[0][1];a4=+R[0][2];a8=a5;a7=a4;E++;a3[0]=["M",a5,a4];}for(var a1=E,a9=R[m];a1<a9;a1++){var d=a3[a1]=[],a6=R[a1];if(a6[0]!=aN.call(a6[0])){d[0]=aN.call(a6[0]);switch(d[0]){case"A":d[1]=a6[1];d[2]=a6[2];d[3]=a6[3];d[4]=a6[4];d[5]=a6[5];d[6]=+(a6[6]+a5);d[7]=+(a6[7]+a4);break;case"V":d[1]=+a6[1]+a4;break;case"H":d[1]=+a6[1]+a5;break;case"M":a8=+a6[1]+a5;a7=+a6[2]+a4;default:for(var a0=1,a2=a6[m];a0<a2;a0++){d[a0]=+a6[a0]+((a0%2)?a5:a4);}}}else{for(var S=0,e=a6[m];S<e;S++){a3[a1][S]=a6[S];}}switch(d[0]){case"Z":a5=a8;a4=a7;break;case"H":a5=d[1];break;case"V":a4=d[1];break;default:a5=a3[a1][a3[a1][m]-2];a4=a3[a1][a3[a1][m]-1];}}a3[aA]=an._path2string;return a3;},null,av),aX=function(e,E,d,i){return[e,E,d,i,d,i];},aK=function(e,E,a0,R,d,i){var S=1/3,a1=2/3;return[S*e+a1*a0,S*E+a1*R,S*d+a1*a0,S*i+a1*R,d,i];},K=function(a9,bE,bi,bg,ba,a4,S,a8,bD,bb){var R=ab.PI,bf=R*120/180,d=R/180*(+ba||0),bm=[],bj,bA=aj(function(bF,bI,i){var bH=bF*ab.cos(i)-bI*ab.sin(i),bG=bF*ab.sin(i)+bI*ab.cos(i);return{x:bH,y:bG};});if(!bb){bj=bA(a9,bE,-d);a9=bj.x;bE=bj.y;bj=bA(a8,bD,-d);a8=bj.x;bD=bj.y;var e=ab.cos(R/180*ba),a6=ab.sin(R/180*ba),bo=(a9-a8)/2,bn=(bE-bD)/2;bi=g(bi,ab.abs(bo));bg=g(bg,ab.abs(bn));var by=(bo*bo)/(bi*bi)+(bn*bn)/(bg*bg);if(by>1){bi=ab.sqrt(by)*bi;bg=ab.sqrt(by)*bg;}var E=bi*bi,br=bg*bg,bt=(a4==S?-1:1)*ab.sqrt(ab.abs((E*br-E*bn*bn-br*bo*bo)/(E*bn*bn+br*bo*bo))),bd=bt*bi*bn/bg+(a9+a8)/2,bc=bt*-bg*bo/bi+(bE+bD)/2,a3=ab.asin(((bE-bc)/bg).toFixed(7)),a2=ab.asin(((bD-bc)/bg).toFixed(7));a3=a9<bd?R-a3:a3;a2=a8<bd?R-a2:a2;a3<0&&(a3=R*2+a3);a2<0&&(a2=R*2+a2);if(S&&a3>a2){a3=a3-R*2;}if(!S&&a2>a3){a2=a2-R*2;}}else{a3=bb[0];a2=bb[1];bd=bb[2];bc=bb[3];}var a7=a2-a3;if(ab.abs(a7)>bf){var be=a2,bh=a8,a5=bD;a2=a3+bf*(S&&a2>a3?1:-1);a8=bd+bi*ab.cos(a2);bD=bc+bg*ab.sin(a2);bm=K(a8,bD,bi,bg,ba,0,S,bh,a5,[a2,be,bd,bc]);}a7=a2-a3;var a1=ab.cos(a3),bC=ab.sin(a3),a0=ab.cos(a2),bB=ab.sin(a2),bp=ab.tan(a7/4),bs=4/3*bi*bp,bq=4/3*bg*bp,bz=[a9,bE],bx=[a9+bs*bC,bE-bq*a1],bw=[a8+bs*bB,bD-bq*a0],bu=[a8,bD];bx[0]=2*bz[0]-bx[0];bx[1]=2*bz[1]-bx[1];if(bb){return[bx,bw,bu][aS](bm);}else{bm=[bx,bw,bu][aS](bm)[az]()[z](",");var bk=[];for(var bv=0,bl=bm[m];bv<bl;bv++){bk[bv]=bv%2?bA(bm[bv-1],bm[bv],d).y:bA(bm[bv],bm[bv+1],d).x;}return bk;}},M=function(e,d,E,i,a2,a1,a0,S,a3){var R=1-a3;return{x:aM(R,3)*e+aM(R,2)*3*a3*E+R*3*a3*a3*a2+aM(a3,3)*a0,y:aM(R,3)*d+aM(R,2)*3*a3*i+R*3*a3*a3*a1+aM(a3,3)*S};},aC=aj(function(i,d,R,E,a9,a8,a5,a2){var a7=(a9-2*R+i)-(a5-2*a9+R),a4=2*(R-i)-2*(a9-R),a1=i-R,a0=(-a4+ab.sqrt(a4*a4-4*a7*a1))/2/a7,S=(-a4-ab.sqrt(a4*a4-4*a7*a1))/2/a7,a3=[d,a2],a6=[i,a5],e;ab.abs(a0)>1000000000000&&(a0=0.5);ab.abs(S)>1000000000000&&(S=0.5);if(a0>0&&a0<1){e=M(i,d,R,E,a9,a8,a5,a2,a0);a6[f](e.x);a3[f](e.y);}if(S>0&&S<1){e=M(i,d,R,E,a9,a8,a5,a2,S);a6[f](e.x);a3[f](e.y);}a7=(a8-2*E+d)-(a2-2*a8+E);a4=2*(E-d)-2*(a8-E);a1=d-E;a0=(-a4+ab.sqrt(a4*a4-4*a7*a1))/2/a7;S=(-a4-ab.sqrt(a4*a4-4*a7*a1))/2/a7;ab.abs(a0)>1000000000000&&(a0=0.5);ab.abs(S)>1000000000000&&(S=0.5);if(a0>0&&a0<1){e=M(i,d,R,E,a9,a8,a5,a2,a0);a6[f](e.x);a3[f](e.y);}if(S>0&&S<1){e=M(i,d,R,E,a9,a8,a5,a2,S);a6[f](e.x);a3[f](e.y);}return{min:{x:aI[aW](0,a6),y:aI[aW](0,a3)},max:{x:g[aW](0,a6),y:g[aW](0,a3)}};}),H=aj(function(a9,a4){var R=r(a9),a5=a4&&r(a4),a6={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},d={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},a0=function(ba,bb){var i,bc;if(!ba){return["C",bb.x,bb.y,bb.x,bb.y,bb.x,bb.y];}!(ba[0] in {T:1,Q:1})&&(bb.qx=bb.qy=null);switch(ba[0]){case"M":bb.X=ba[1];bb.Y=ba[2];break;case"A":ba=["C"][aS](K[aW](0,[bb.x,bb.y][aS](ba.slice(1))));break;case"S":i=bb.x+(bb.x-(bb.bx||bb.x));bc=bb.y+(bb.y-(bb.by||bb.y));ba=["C",i,bc][aS](ba.slice(1));break;case"T":bb.qx=bb.x+(bb.x-(bb.qx||bb.x));bb.qy=bb.y+(bb.y-(bb.qy||bb.y));ba=["C"][aS](aK(bb.x,bb.y,bb.qx,bb.qy,ba[1],ba[2]));break;case"Q":bb.qx=ba[1];bb.qy=ba[2];ba=["C"][aS](aK(bb.x,bb.y,ba[1],ba[2],ba[3],ba[4]));break;case"L":ba=["C"][aS](aX(bb.x,bb.y,ba[1],ba[2]));break;case"H":ba=["C"][aS](aX(bb.x,bb.y,ba[1],bb.y));break;case"V":ba=["C"][aS](aX(bb.x,bb.y,bb.x,ba[1]));break;case"Z":ba=["C"][aS](aX(bb.x,bb.y,bb.X,bb.Y));break;}return ba;},e=function(ba,bb){if(ba[bb][m]>7){ba[bb].shift();var bc=ba[bb];while(bc[m]){ba.splice(bb++,0,["C"][aS](bc.splice(0,6)));}ba.splice(bb,1);a7=g(R[m],a5&&a5[m]||0);}},E=function(be,bd,bb,ba,bc){if(be&&bd&&be[bc][0]=="M"&&bd[bc][0]!="M"){bd.splice(bc,0,["M",ba.x,ba.y]);bb.bx=0;bb.by=0;bb.x=be[bc][1];bb.y=be[bc][2];a7=g(R[m],a5&&a5[m]||0);}};for(var a2=0,a7=g(R[m],a5&&a5[m]||0);a2<a7;a2++){R[a2]=a0(R[a2],a6);e(R,a2);a5&&(a5[a2]=a0(a5[a2],d));a5&&e(a5,a2);E(R,a5,a6,d,a2);E(a5,R,d,a6,a2);var a1=R[a2],a8=a5&&a5[a2],S=a1[m],a3=a5&&a8[m];a6.x=a1[S-2];a6.y=a1[S-1];a6.bx=W(a1[S-4])||a6.x;a6.by=W(a1[S-3])||a6.y;d.bx=a5&&(W(a8[a3-4])||d.x);d.by=a5&&(W(a8[a3-3])||d.y);d.x=a5&&a8[a3-2];d.y=a5&&a8[a3-1];}return a5?[R,a5]:R;},null,av),p=aj(function(a4){var a3=[];for(var a0=0,a5=a4[m];a0<a5;a0++){var e={},a2=a4[a0].match(/^([^:]*):?([\d\.]*)/);e.color=an.getRGB(a2[1]);if(e.color.error){return null;}e.color=e.color.hex;a2[2]&&(e.offset=a2[2]+"%");a3[f](e);}for(var a0=1,a5=a3[m]-1;a0<a5;a0++){if(!a3[a0].offset){var E=W(a3[a0-1].offset||0),R=0;for(var S=a0+1;S<a5;S++){if(a3[S].offset){R=a3[S].offset;break;}}if(!R){R=100;S=a5;}R=W(R);var a1=(R-E)/(S-a0+1);for(;a0<S;a0++){E+=a1;a3[a0].offset=E+"%";}}}return a3;}),ao=function(){var i,e,R,E,d;if(an.is(arguments[0],"string")||an.is(arguments[0],"object")){if(an.is(arguments[0],"string")){i=L.getElementById(arguments[0]);}else{i=arguments[0];}if(i.tagName){if(arguments[1]==null){return{container:i,width:i.style.pixelWidth||i.offsetWidth,height:i.style.pixelHeight||i.offsetHeight};}else{return{container:i,width:arguments[1],height:arguments[2]};}}}else{if(an.is(arguments[0],al)&&arguments[m]>3){return{container:1,x:arguments[0],y:arguments[1],width:arguments[2],height:arguments[3]};}}},aG=function(d,i){var e=this;for(var E in i){if(i[Q](E)&&!(E in d)){switch(typeof i[E]){case"function":(function(R){d[E]=d===e?R:function(){return R[aW](e,arguments);};})(i[E]);break;case"object":d[E]=d[E]||{};aG.call(this,d[E],i[E]);break;default:d[E]=i[E];break;}}}},ak=function(d,e){d==e.top&&(e.top=d.prev);d==e.bottom&&(e.bottom=d.next);d.next&&(d.next.prev=d.prev);d.prev&&(d.prev.next=d.next);},Y=function(d,e){if(e.top===d){return;}ak(d,e);d.next=null;d.prev=e.top;e.top.next=d;e.top=d;},k=function(d,e){if(e.bottom===d){return;}ak(d,e);d.next=e.bottom;d.prev=null;e.bottom.prev=d;e.bottom=d;},A=function(e,d,i){ak(e,i);d==i.top&&(i.top=e);d.next&&(d.next.prev=e);e.next=d.next;e.prev=d;d.next=e;},aq=function(e,d,i){ak(e,i);d==i.bottom&&(i.bottom=e);d.prev&&(d.prev.next=e);e.prev=d.prev;d.prev=e;e.next=d;},s=function(d){return function(){throw new Error("Rapha\xebl: you are calling to method \u201c"+d+"\u201d of removed object");};},ar=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/;if(an.svg){aT[aY].svgns="http://www.w3.org/2000/svg";aT[aY].xlink="http://www.w3.org/1999/xlink";var O=function(d){return +d+(~~d===d)*0.5;},V=function(S){for(var e=0,E=S[m];e<E;e++){if(aZ.call(S[e][0])!="a"){for(var d=1,R=S[e][m];d<R;d++){S[e][d]=O(S[e][d]);}}else{S[e][6]=O(S[e][6]);S[e][7]=O(S[e][7]);}}return S;},aJ=function(i,d){if(d){for(var e in d){if(d[Q](e)){i[v](e,d[e]);}}}else{return L.createElementNS(aT[aY].svgns,i);}};an[aA]=function(){return"Your browser supports SVG.\nYou are running Rapha\xebl "+this.version;};var q=function(d,E){var e=aJ("path");E.canvas&&E.canvas[aL](e);var i=new ax(e,E);i.type="path";aa(i,{fill:"none",stroke:"#000",path:d});return i;};var b=function(E,a7,d){var a4="linear",a1=0.5,S=0.5,a9=E.style;a7=(a7+at)[aP](ar,function(bb,i,bc){a4="radial";if(i&&bc){a1=W(i);S=W(bc);var ba=((S>0.5)*2-1);aM(a1-0.5,2)+aM(S-0.5,2)>0.25&&(S=ab.sqrt(0.25-aM(a1-0.5,2))*ba+0.5)&&S!=0.5&&(S=S.toFixed(5)-0.00001*ba);}return at;});a7=a7[z](/\s*\-\s*/);if(a4=="linear"){var a0=a7.shift();a0=-W(a0);if(isNaN(a0)){return null;}var R=[0,0,ab.cos(a0*ab.PI/180),ab.sin(a0*ab.PI/180)],a6=1/(g(ab.abs(R[2]),ab.abs(R[3]))||1);R[2]*=a6;R[3]*=a6;if(R[2]<0){R[0]=-R[2];R[2]=0;}if(R[3]<0){R[1]=-R[3];R[3]=0;}}var a3=p(a7);if(!a3){return null;}var e=aJ(a4+"Gradient");e.id="r"+(an._id++)[aA](36);aJ(e,a4=="radial"?{fx:a1,fy:S}:{x1:R[0],y1:R[1],x2:R[2],y2:R[3]});d.defs[aL](e);for(var a2=0,a8=a3[m];a2<a8;a2++){var a5=aJ("stop");aJ(a5,{offset:a3[a2].offset?a3[a2].offset:!a2?"0%":"100%","stop-color":a3[a2].color||"#fff"});e[aL](a5);}aJ(E,{fill:"url(#"+e.id+")",opacity:1,"fill-opacity":1});a9.fill=at;a9.opacity=1;a9.fillOpacity=1;return 1;};var N=function(e){var d=e.getBBox();aJ(e.pattern,{patternTransform:an.format("translate({0},{1})",d.x,d.y)});};var aa=function(a6,bf){var a9={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},bb=a6.node,a7=a6.attrs,a3=a6.rotate(),S=function(bm,bl){bl=a9[aZ.call(bl)];if(bl){var bj=bm.attrs["stroke-width"]||"1",bh={round:bj,square:bj,butt:0}[bm.attrs["stroke-linecap"]||bf["stroke-linecap"]]||0,bk=[];var bi=bl[m];while(bi--){bk[bi]=bl[bi]*bj+((bi%2)?1:-1)*bh;}aJ(bb,{"stroke-dasharray":bk[az](",")});}};bf[Q]("rotation")&&(a3=bf.rotation);var a2=(a3+at)[z](a);if(!(a2.length-1)){a2=null;}else{a2[1]=+a2[1];a2[2]=+a2[2];}W(a3)&&a6.rotate(0,true);for(var ba in bf){if(bf[Q](ba)){if(!j[Q](ba)){continue;}var a8=bf[ba];a7[ba]=a8;switch(ba){case"rotation":a6.rotate(a8,true);break;case"href":case"title":case"target":var bd=bb.parentNode;if(aZ.call(bd.tagName)!="a"){var E=aJ("a");bd.insertBefore(E,bb);E[aL](bb);bd=E;}bd.setAttributeNS(a6.paper.xlink,ba,a8);break;case"cursor":bb.style.cursor=a8;break;case"clip-rect":var e=(a8+at)[z](a);if(e[m]==4){a6.clip&&a6.clip.parentNode.parentNode.removeChild(a6.clip.parentNode);var i=aJ("clipPath"),bc=aJ("rect");i.id="r"+(an._id++)[aA](36);aJ(bc,{x:e[0],y:e[1],width:e[2],height:e[3]});i[aL](bc);a6.paper.defs[aL](i);aJ(bb,{"clip-path":"url(#"+i.id+")"});a6.clip=bc;}if(!a8){var be=L.getElementById(bb.getAttribute("clip-path")[aP](/(^url\(#|\)$)/g,at));be&&be.parentNode.removeChild(be);aJ(bb,{"clip-path":at});delete a6.clip;}break;case"path":if(a8&&a6.type=="path"){a7.path=V(r(a8));aJ(bb,{d:a7.path});}break;case"width":bb[v](ba,a8);if(a7.fx){ba="x";a8=a7.x;}else{break;}case"x":if(a7.fx){a8=-a7.x-(a7.width||0);}case"rx":if(ba=="rx"&&a6.type=="rect"){break;}case"cx":a2&&(ba=="x"||ba=="cx")&&(a2[1]+=a8-a7[ba]);bb[v](ba,O(a8));a6.pattern&&N(a6);break;case"height":bb[v](ba,a8);if(a7.fy){ba="y";a8=a7.y;}else{break;}case"y":if(a7.fy){a8=-a7.y-(a7.height||0);}case"ry":if(ba=="ry"&&a6.type=="rect"){break;}case"cy":a2&&(ba=="y"||ba=="cy")&&(a2[2]+=a8-a7[ba]);bb[v](ba,O(a8));a6.pattern&&N(a6);break;case"r":if(a6.type=="rect"){aJ(bb,{rx:a8,ry:a8});}else{bb[v](ba,a8);}break;case"src":if(a6.type=="image"){bb.setAttributeNS(a6.paper.xlink,"href",a8);}break;case"stroke-width":bb.style.strokeWidth=a8;bb[v](ba,a8);if(a7["stroke-dasharray"]){S(a6,a7["stroke-dasharray"]);}break;case"stroke-dasharray":S(a6,a8);break;case"translation":var a0=(a8+at)[z](a);a0[0]=+a0[0]||0;a0[1]=+a0[1]||0;if(a2){a2[1]+=a0[0];a2[2]+=a0[1];}t.call(a6,a0[0],a0[1]);break;case"scale":var a0=(a8+at)[z](a);a6.scale(+a0[0]||1,+a0[1]||+a0[0]||1,+a0[2]||null,+a0[3]||null);break;case"fill":var R=(a8+at).match(c);if(R){var i=aJ("pattern"),a5=aJ("image");i.id="r"+(an._id++)[aA](36);aJ(i,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1});aJ(a5,{x:0,y:0});a5.setAttributeNS(a6.paper.xlink,"href",R[1]);i[aL](a5);var bg=L.createElement("img");bg.style.cssText="position:absolute;left:-9999em;top-9999em";bg.onload=function(){aJ(i,{width:this.offsetWidth,height:this.offsetHeight});aJ(a5,{width:this.offsetWidth,height:this.offsetHeight});L.body.removeChild(this);a6.paper.safari();};L.body[aL](bg);bg.src=R[1];a6.paper.defs[aL](i);bb.style.fill="url(#"+i.id+")";aJ(bb,{fill:"url(#"+i.id+")"});a6.pattern=i;a6.pattern&&N(a6);break;}if(!an.getRGB(a8).error){delete bf.gradient;delete a7.gradient;!an.is(a7.opacity,"undefined")&&an.is(bf.opacity,"undefined")&&aJ(bb,{opacity:a7.opacity});!an.is(a7["fill-opacity"],"undefined")&&an.is(bf["fill-opacity"],"undefined")&&aJ(bb,{"fill-opacity":a7["fill-opacity"]});}else{if((({circle:1,ellipse:1})[Q](a6.type)||(a8+at).charAt()!="r")&&b(bb,a8,a6.paper)){a7.gradient=a8;a7.fill="none";break;}}case"stroke":bb[v](ba,an.getRGB(a8).hex);break;case"gradient":(({circle:1,ellipse:1})[Q](a6.type)||(a8+at).charAt()!="r")&&b(bb,a8,a6.paper);break;case"opacity":case"fill-opacity":if(a7.gradient){var d=L.getElementById(bb.getAttribute("fill")[aP](/^url\(#|\)$/g,at));if(d){var a1=d.getElementsByTagName("stop");a1[a1[m]-1][v]("stop-opacity",a8);}break;}default:ba=="font-size"&&(a8=G(a8,10)+"px");var a4=ba[aP](/(\-.)/g,function(bh){return aN.call(bh.substring(1));});bb.style[a4]=a8;bb[v](ba,a8);break;}}}D(a6,bf);if(a2){a6.rotate(a2.join(am));}else{W(a3)&&a6.rotate(a3,true);}};var h=1.2;var D=function(d,R){if(d.type!="text"||!(R[Q]("text")||R[Q]("font")||R[Q]("font-size")||R[Q]("x")||R[Q]("y"))){return;}var a3=d.attrs,e=d.node,a5=e.firstChild?G(L.defaultView.getComputedStyle(e.firstChild,at).getPropertyValue("font-size"),10):10;if(R[Q]("text")){a3.text=R.text;while(e.firstChild){e.removeChild(e.firstChild);}var E=(R.text+at)[z]("\n");for(var S=0,a4=E[m];S<a4;S++){if(E[S]){var a1=aJ("tspan");S&&aJ(a1,{dy:a5*h,x:a3.x});a1[aL](L.createTextNode(E[S]));e[aL](a1);}}}else{var E=e.getElementsByTagName("tspan");for(var S=0,a4=E[m];S<a4;S++){S&&aJ(E[S],{dy:a5*h,x:a3.x});}}aJ(e,{y:a3.y});var a0=d.getBBox(),a2=a3.y-(a0.y+a0.height/2);a2&&isFinite(a2)&&aJ(e,{y:a3.y+a2});};var ax=function(e,d){var E=0,i=0;this[0]=e;this.id=an._oid++;this.node=e;e.raphael=this;this.paper=d;this.attrs=this.attrs||{};this.transformations=[];this._={tx:0,ty:0,rt:{deg:0,cx:0,cy:0},sx:1,sy:1};!d.bottom&&(d.bottom=this);this.prev=d.top;d.top&&(d.top.next=this);d.top=this;this.next=null;};ax[aY].rotate=function(e,d,E){if(this.removed){return this;}if(e==null){if(this._.rt.cx){return[this._.rt.deg,this._.rt.cx,this._.rt.cy][az](am);}return this._.rt.deg;}var i=this.getBBox();e=(e+at)[z](a);if(e[m]-1){d=W(e[1]);E=W(e[2]);}e=W(e[0]);if(d!=null){this._.rt.deg=e;}else{this._.rt.deg+=e;}(E==null)&&(d=null);this._.rt.cx=d;this._.rt.cy=E;d=d==null?i.x+i.width/2:d;E=E==null?i.y+i.height/2:E;if(this._.rt.deg){this.transformations[0]=an.format("rotate({0} {1} {2})",this._.rt.deg,d,E);this.clip&&aJ(this.clip,{transform:an.format("rotate({0} {1} {2})",-this._.rt.deg,d,E)});}else{this.transformations[0]=at;this.clip&&aJ(this.clip,{transform:at});}aJ(this.node,{transform:this.transformations[az](am)});return this;};ax[aY].hide=function(){!this.removed&&(this.node.style.display="none");return this;};ax[aY].show=function(){!this.removed&&(this.node.style.display="");return this;};ax[aY].remove=function(){if(this.removed){return;}ak(this,this.paper);this.node.parentNode.removeChild(this.node);for(var d in this){delete this[d];}this.removed=true;};ax[aY].getBBox=function(){if(this.removed){return this;}if(this.type=="path"){return U(this.attrs.path);}if(this.node.style.display=="none"){this.show();var E=true;}var a1={};try{a1=this.node.getBBox();}catch(S){}finally{a1=a1||{};}if(this.type=="text"){a1={x:a1.x,y:Infinity,width:0,height:0};for(var d=0,R=this.node.getNumberOfChars();d<R;d++){var a0=this.node.getExtentOfChar(d);(a0.y<a1.y)&&(a1.y=a0.y);(a0.y+a0.height-a1.y>a1.height)&&(a1.height=a0.y+a0.height-a1.y);(a0.x+a0.width-a1.x>a1.width)&&(a1.width=a0.x+a0.width-a1.x);}}E&&this.hide();return a1;};ax[aY].attr=function(){if(this.removed){return this;}if(arguments[m]==0){var R={};for(var E in this.attrs){if(this.attrs[Q](E)){R[E]=this.attrs[E];}}this._.rt.deg&&(R.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(R.scale=this.scale());R.gradient&&R.fill=="none"&&(R.fill=R.gradient)&&delete R.gradient;return R;}if(arguments[m]==1&&an.is(arguments[0],"string")){if(arguments[0]=="translation"){return t.call(this);}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}if(arguments[0]=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient){return this.attrs.gradient;}return this.attrs[arguments[0]];}if(arguments[m]==1&&an.is(arguments[0],"array")){var d={};for(var e in arguments[0]){if(arguments[0][Q](e)){d[arguments[0][e]]=this.attrs[arguments[0][e]];}}return d;}if(arguments[m]==2){var S={};S[arguments[0]]=arguments[1];aa(this,S);}else{if(arguments[m]==1&&an.is(arguments[0],"object")){aa(this,arguments[0]);}}return this;};ax[aY].toFront=function(){if(this.removed){return this;}this.node.parentNode[aL](this.node);var d=this.paper;d.top!=this&&Y(this,d);return this;};ax[aY].toBack=function(){if(this.removed){return this;}if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild);k(this,this.paper);var d=this.paper;}return this;};ax[aY].insertAfter=function(d){if(this.removed){return this;}var e=d.node;if(e.nextSibling){e.parentNode.insertBefore(this.node,e.nextSibling);}else{e.parentNode[aL](this.node);}A(this,d,this.paper);return this;};ax[aY].insertBefore=function(d){if(this.removed){return this;}var e=d.node;e.parentNode.insertBefore(this.node,e);aq(this,d,this.paper);return this;};var P=function(e,d,S,R){d=O(d);S=O(S);var E=aJ("circle");e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={cx:d,cy:S,r:R,fill:"none",stroke:"#000"};i.type="circle";aJ(E,i.attrs);return i;};var aF=function(i,d,a1,e,S,a0){d=O(d);a1=O(a1);var R=aJ("rect");i.canvas&&i.canvas[aL](R);var E=new ax(R,i);E.attrs={x:d,y:a1,width:e,height:S,r:a0||0,rx:a0||0,ry:a0||0,fill:"none",stroke:"#000"};E.type="rect";aJ(R,E.attrs);return E;};var ai=function(e,d,a0,S,R){d=O(d);a0=O(a0);var E=aJ("ellipse");e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={cx:d,cy:a0,rx:S,ry:R,fill:"none",stroke:"#000"};i.type="ellipse";aJ(E,i.attrs);return i;};var o=function(i,a0,d,a1,e,S){var R=aJ("image");aJ(R,{x:d,y:a1,width:e,height:S,preserveAspectRatio:"none"});R.setAttributeNS(i.xlink,"href",a0);i.canvas&&i.canvas[aL](R);var E=new ax(R,i);E.attrs={x:d,y:a1,width:e,height:S,src:a0};E.type="image";return E;};var X=function(e,d,S,R){var E=aJ("text");aJ(E,{x:d,y:S,"text-anchor":"middle"});e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={x:d,y:S,"text-anchor":"middle",text:R,font:j.font,stroke:"none",fill:"#000"};i.type="text";aa(i,i.attrs);return i;};var aV=function(e,d){this.width=e||this.width;this.height=d||this.height;this.canvas[v]("width",this.width);this.canvas[v]("height",this.height);return this;};var w=function(){var E=ao[aW](null,arguments),i=E&&E.container,e=E.x,a0=E.y,R=E.width,d=E.height;if(!i){throw new Error("SVG container not found.");}var S=aJ("svg");R=R||512;d=d||342;aJ(S,{xmlns:"http://www.w3.org/2000/svg",version:1.1,width:R,height:d});if(i==1){S.style.cssText="position:absolute;left:"+e+"px;top:"+a0+"px";L.body[aL](S);}else{if(i.firstChild){i.insertBefore(S,i.firstChild);}else{i[aL](S);}}i=new aT;i.width=R;i.height=d;i.canvas=S;aG.call(i,i,an.fn);i.clear();return i;};aT[aY].clear=function(){var d=this.canvas;while(d.firstChild){d.removeChild(d.firstChild);}this.bottom=this.top=null;(this.desc=aJ("desc"))[aL](L.createTextNode("Created with Rapha\xebl"));d[aL](this.desc);d[aL](this.defs=aJ("defs"));};aT[aY].remove=function(){this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var d in this){this[d]=s(d);}};}if(an.vml){var aH=function(a8){var a5=/[ahqstv]/ig,a0=r;(a8+at).match(a5)&&(a0=H);a5=/[clmz]/g;if(a0==r&&!(a8+at).match(a5)){var e={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},R=/([clmz]),?([^clmz]*)/gi,S=/-?[^,\s-]+/g;var a4=(a8+at)[aP](R,function(a9,bb,i){var ba=[];i[aP](S,function(bc){ba[f](O(bc));});return e[bb]+ba;});return a4;}var a6=a0(a8),E,a4=[],d;for(var a2=0,a7=a6[m];a2<a7;a2++){E=a6[a2];d=aZ.call(a6[a2][0]);d=="z"&&(d="x");for(var a1=1,a3=E[m];a1<a3;a1++){d+=O(E[a1])+(a1!=a3-1?",":at);}a4[f](d);}return a4[az](am);};an[aA]=function(){return"Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl "+this.version;};var q=function(d,S){var E=ah("group");E.style.cssText="position:absolute;left:0;top:0;width:"+S.width+"px;height:"+S.height+"px";E.coordsize=S.coordsize;E.coordorigin=S.coordorigin;var i=ah("shape"),e=i.style;e.width=S.width+"px";e.height=S.height+"px";i.coordsize=this.coordsize;i.coordorigin=this.coordorigin;E[aL](i);var R=new ax(i,E,S);R.isAbsolute=true;R.type="path";R.path=[];R.Path=at;d&&aa(R,{fill:"none",stroke:"#000",path:d});S.canvas[aL](E);return R;};var aa=function(a3,a8){a3.attrs=a3.attrs||{};var a6=a3.node,a9=a3.attrs,a0=a6.style,E,bd=a3;for(var a1 in a8){if(a8[Q](a1)){a9[a1]=a8[a1];}}a8.href&&(a6.href=a8.href);a8.title&&(a6.title=a8.title);a8.target&&(a6.target=a8.target);a8.cursor&&(a0.cursor=a8.cursor);if(a8.path&&a3.type=="path"){a9.path=a8.path;a6.path=aH(a9.path);}if(a8.rotation!=null){a3.rotate(a8.rotation,true);}if(a8.translation){E=(a8.translation+at)[z](a);t.call(a3,E[0],E[1]);if(a3._.rt.cx!=null){a3._.rt.cx+=+E[0];a3._.rt.cy+=+E[1];a3.setBox(a3.attrs,E[0],E[1]);}}if(a8.scale){E=(a8.scale+at)[z](a);a3.scale(+E[0]||1,+E[1]||+E[0]||1,+E[2]||null,+E[3]||null);}if("clip-rect" in a8){var d=(a8["clip-rect"]+at)[z](a);if(d[m]==4){d[2]=+d[2]+(+d[0]);d[3]=+d[3]+(+d[1]);var a2=a6.clipRect||L.createElement("div"),bc=a2.style,S=a6.parentNode;bc.clip=an.format("rect({1}px {2}px {3}px {0}px)",d);if(!a6.clipRect){bc.position="absolute";bc.top=0;bc.left=0;bc.width=a3.paper.width+"px";bc.height=a3.paper.height+"px";S.parentNode.insertBefore(a2,S);a2[aL](S);a6.clipRect=a2;}}if(!a8["clip-rect"]){a6.clipRect&&(a6.clipRect.style.clip=at);}}if(a3.type=="image"&&a8.src){a6.src=a8.src;}if(a3.type=="image"&&a8.opacity){a6.filterOpacity=" progid:DXImageTransform.Microsoft.Alpha(opacity="+(a8.opacity*100)+")";a0.filter=(a6.filterMatrix||at)+(a6.filterOpacity||at);}a8.font&&(a0.font=a8.font);a8["font-family"]&&(a0.fontFamily='"'+a8["font-family"][z](",")[0][aP](/^['"]+|['"]+$/g,at)+'"');a8["font-size"]&&(a0.fontSize=a8["font-size"]);a8["font-weight"]&&(a0.fontWeight=a8["font-weight"]);a8["font-style"]&&(a0.fontStyle=a8["font-style"]);if(a8.opacity!=null||a8["stroke-width"]!=null||a8.fill!=null||a8.stroke!=null||a8["stroke-width"]!=null||a8["stroke-opacity"]!=null||a8["fill-opacity"]!=null||a8["stroke-dasharray"]!=null||a8["stroke-miterlimit"]!=null||a8["stroke-linejoin"]!=null||a8["stroke-linecap"]!=null){a6=a3.shape||a6;var a7=(a6.getElementsByTagName("fill")&&a6.getElementsByTagName("fill")[0]),ba=false;!a7&&(ba=a7=ah("fill"));if("fill-opacity" in a8||"opacity" in a8){var e=((+a9["fill-opacity"]+1||2)-1)*((+a9.opacity+1||2)-1);e<0&&(e=0);e>1&&(e=1);a7.opacity=e;}a8.fill&&(a7.on=true);if(a7.on==null||a8.fill=="none"){a7.on=false;}if(a7.on&&a8.fill){var i=a8.fill.match(c);if(i){a7.src=i[1];a7.type="tile";}else{a7.color=an.getRGB(a8.fill).hex;a7.src=at;a7.type="solid";if(an.getRGB(a8.fill).error&&(bd.type in {circle:1,ellipse:1}||(a8.fill+at).charAt()!="r")&&b(bd,a8.fill)){a9.fill="none";a9.gradient=a8.fill;}}}ba&&a6[aL](a7);var R=(a6.getElementsByTagName("stroke")&&a6.getElementsByTagName("stroke")[0]),bb=false;!R&&(bb=R=ah("stroke"));if((a8.stroke&&a8.stroke!="none")||a8["stroke-width"]||a8["stroke-opacity"]!=null||a8["stroke-dasharray"]||a8["stroke-miterlimit"]||a8["stroke-linejoin"]||a8["stroke-linecap"]){R.on=true;}(a8.stroke=="none"||R.on==null||a8.stroke==0||a8["stroke-width"]==0)&&(R.on=false);R.on&&a8.stroke&&(R.color=an.getRGB(a8.stroke).hex);var e=((+a9["stroke-opacity"]+1||2)-1)*((+a9.opacity+1||2)-1),a4=(W(a8["stroke-width"])||1)*0.75;e<0&&(e=0);e>1&&(e=1);a8["stroke-width"]==null&&(a4=a9["stroke-width"]);a8["stroke-width"]&&(R.weight=a4);a4&&a4<1&&(e*=a4)&&(R.weight=1);R.opacity=e;a8["stroke-linejoin"]&&(R.joinstyle=a8["stroke-linejoin"]||"miter");R.miterlimit=a8["stroke-miterlimit"]||8;a8["stroke-linecap"]&&(R.endcap=a8["stroke-linecap"]=="butt"?"flat":a8["stroke-linecap"]=="square"?"square":"round");if(a8["stroke-dasharray"]){var a5={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};R.dashstyle=a5[Q](a8["stroke-dasharray"])?a5[a8["stroke-dasharray"]]:at;}bb&&a6[aL](R);}if(bd.type=="text"){var a0=bd.paper.span.style;a9.font&&(a0.font=a9.font);a9["font-family"]&&(a0.fontFamily=a9["font-family"]);a9["font-size"]&&(a0.fontSize=a9["font-size"]);a9["font-weight"]&&(a0.fontWeight=a9["font-weight"]);a9["font-style"]&&(a0.fontStyle=a9["font-style"]);bd.node.string&&(bd.paper.span.innerHTML=(bd.node.string+at)[aP](/</g,"&#60;")[aP](/&/g,"&#38;")[aP](/\n/g,"<br>"));bd.W=a9.w=bd.paper.span.offsetWidth;bd.H=a9.h=bd.paper.span.offsetHeight;bd.X=a9.x;bd.Y=a9.y+O(bd.H/2);switch(a9["text-anchor"]){case"start":bd.node.style["v-text-align"]="left";bd.bbx=O(bd.W/2);break;case"end":bd.node.style["v-text-align"]="right";bd.bbx=-O(bd.W/2);break;default:bd.node.style["v-text-align"]="center";break;}}};var b=function(d,a1){d.attrs=d.attrs||{};var a2=d.attrs,a4=d.node.getElementsByTagName("fill"),S="linear",a0=".5 .5";d.attrs.gradient=a1;a1=(a1+at)[aP](ar,function(a6,a7,i){S="radial";if(a7&&i){a7=W(a7);i=W(i);aM(a7-0.5,2)+aM(i-0.5,2)>0.25&&(i=ab.sqrt(0.25-aM(a7-0.5,2))*((i>0.5)*2-1)+0.5);a0=a7+am+i;}return at;});a1=a1[z](/\s*\-\s*/);if(S=="linear"){var e=a1.shift();e=-W(e);if(isNaN(e)){return null;}}var R=p(a1);if(!R){return null;}d=d.shape||d.node;a4=a4[0]||ah("fill");if(R[m]){a4.on=true;a4.method="none";a4.type=(S=="radial")?"gradientradial":"gradient";a4.color=R[0].color;a4.color2=R[R[m]-1].color;var a5=[];for(var E=0,a3=R[m];E<a3;E++){R[E].offset&&a5[f](R[E].offset+am+R[E].color);}a4.colors&&(a4.colors.value=a5[m]?a5[az](","):"0% "+a4.color);if(S=="radial"){a4.focus="100%";a4.focussize=a0;a4.focusposition=a0;}else{a4.angle=(270-e)%360;}}return 1;};var ax=function(R,a0,d){var S=0,i=0,e=0,E=1;this[0]=R;this.id=an._oid++;this.node=R;R.raphael=this;this.X=0;this.Y=0;this.attrs={};this.Group=a0;this.paper=d;this._={tx:0,ty:0,rt:{deg:0},sx:1,sy:1};!d.bottom&&(d.bottom=this);this.prev=d.top;d.top&&(d.top.next=this);d.top=this;this.next=null;};ax[aY].rotate=function(e,d,i){if(this.removed){return this;}if(e==null){if(this._.rt.cx){return[this._.rt.deg,this._.rt.cx,this._.rt.cy][az](am);}return this._.rt.deg;}e=(e+at)[z](a);if(e[m]-1){d=W(e[1]);i=W(e[2]);}e=W(e[0]);if(d!=null){this._.rt.deg=e;}else{this._.rt.deg+=e;}i==null&&(d=null);this._.rt.cx=d;this._.rt.cy=i;this.setBox(this.attrs,d,i);this.Group.style.rotation=this._.rt.deg;return this;};ax[aY].setBox=function(bb,e,d){if(this.removed){return this;}var a5=this.Group.style,R=(this.shape&&this.shape.style)||this.node.style;bb=bb||{};for(var a9 in bb){if(bb[Q](a9)){this.attrs[a9]=bb[a9];}}e=e||this._.rt.cx;d=d||this._.rt.cy;var a7=this.attrs,a1,a0,a2,ba;switch(this.type){case"circle":a1=a7.cx-a7.r;a0=a7.cy-a7.r;a2=ba=a7.r*2;break;case"ellipse":a1=a7.cx-a7.rx;a0=a7.cy-a7.ry;a2=a7.rx*2;ba=a7.ry*2;break;case"rect":case"image":a1=+a7.x;a0=+a7.y;a2=a7.width||0;ba=a7.height||0;break;case"text":this.textpath.v=["m",O(a7.x),", ",O(a7.y-2),"l",O(a7.x)+1,", ",O(a7.y-2)][az](at);a1=a7.x-O(this.W/2);a0=a7.y-this.H/2;a2=this.W;ba=this.H;break;case"path":if(!this.attrs.path){a1=0;a0=0;a2=this.paper.width;ba=this.paper.height;}else{var a8=U(this.attrs.path);a1=a8.x;a0=a8.y;a2=a8.width;ba=a8.height;}break;default:a1=0;a0=0;a2=this.paper.width;ba=this.paper.height;break;}e=(e==null)?a1+a2/2:e;d=(d==null)?a0+ba/2:d;var E=e-this.paper.width/2,a4=d-this.paper.height/2;if(this.type=="path"||this.type=="text"){(a5.left!=E+"px")&&(a5.left=E+"px");(a5.top!=a4+"px")&&(a5.top=a4+"px");this.X=this.type=="text"?a1:-E;this.Y=this.type=="text"?a0:-a4;this.W=a2;this.H=ba;(R.left!=-E+"px")&&(R.left=-E+"px");(R.top!=-a4+"px")&&(R.top=-a4+"px");}else{(a5.left!=E+"px")&&(a5.left=E+"px");(a5.top!=a4+"px")&&(a5.top=a4+"px");this.X=a1;this.Y=a0;this.W=a2;this.H=ba;(a5.width!=this.paper.width+"px")&&(a5.width=this.paper.width+"px");(a5.height!=this.paper.height+"px")&&(a5.height=this.paper.height+"px");(R.left!=a1-E+"px")&&(R.left=a1-E+"px");(R.top!=a0-a4+"px")&&(R.top=a0-a4+"px");(R.width!=a2+"px")&&(R.width=a2+"px");(R.height!=ba+"px")&&(R.height=ba+"px");var S=(+bb.r||0)/aI(a2,ba);if(this.type=="rect"&&this.arcsize.toFixed(4)!=S.toFixed(4)&&(S||this.arcsize)){var a6=ah("roundrect"),bc={},a9=0,a3=this.events&&this.events[m];a6.arcsize=S;a6.raphael=this;this.Group[aL](a6);this.Group.removeChild(this.node);this[0]=this.node=a6;this.arcsize=S;for(var a9 in a7){bc[a9]=a7[a9];}delete bc.scale;this.attr(bc);if(this.events){for(;a9<a3;a9++){this.events[a9].unbind=ae(this.node,this.events[a9].name,this.events[a9].f,this);}}}}};ax[aY].hide=function(){!this.removed&&(this.Group.style.display="none");return this;};ax[aY].show=function(){!this.removed&&(this.Group.style.display="block");return this;};ax[aY].getBBox=function(){if(this.removed){return this;}if(this.type=="path"){return U(this.attrs.path);}return{x:this.X+(this.bbx||0),y:this.Y,width:this.W,height:this.H};};ax[aY].remove=function(){if(this.removed){return;}ak(this,this.paper);this.node.parentNode.removeChild(this.node);this.Group.parentNode.removeChild(this.Group);this.shape&&this.shape.parentNode.removeChild(this.shape);for(var d in this){delete this[d];}this.removed=true;};ax[aY].attr=function(){if(this.removed){return this;}if(arguments[m]==0){var E={};for(var e in this.attrs){if(this.attrs[Q](e)){E[e]=this.attrs[e];}}this._.rt.deg&&(E.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(E.scale=this.scale());E.gradient&&E.fill=="none"&&(E.fill=E.gradient)&&delete E.gradient;return E;}if(arguments[m]==1&&an.is(arguments[0],"string")){if(arguments[0]=="translation"){return t.call(this);}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}if(arguments[0]=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient){return this.attrs.gradient;}return this.attrs[arguments[0]];}if(this.attrs&&arguments[m]==1&&an.is(arguments[0],"array")){var d={};for(var e=0,R=arguments[0][m];e<R;e++){d[arguments[0][e]]=this.attrs[arguments[0][e]];}return d;}var S;if(arguments[m]==2){S={};S[arguments[0]]=arguments[1];}arguments[m]==1&&an.is(arguments[0],"object")&&(S=arguments[0]);if(S){if(S.text&&this.type=="text"){this.node.string=S.text;}aa(this,S);if(S.gradient&&(({circle:1,ellipse:1})[Q](this.type)||(S.gradient+at).charAt()!="r")){b(this,S.gradient);}(this.type!="path"||this._.rt.deg)&&this.setBox(this.attrs);}return this;};ax[aY].toFront=function(){!this.removed&&this.Group.parentNode[aL](this.Group);this.paper.top!=this&&Y(this,this.paper);return this;};ax[aY].toBack=function(){if(this.removed){return this;}if(this.Group.parentNode.firstChild!=this.Group){this.Group.parentNode.insertBefore(this.Group,this.Group.parentNode.firstChild);k(this,this.paper);}return this;};ax[aY].insertAfter=function(d){if(this.removed){return this;}if(d.Group.nextSibling){d.Group.parentNode.insertBefore(this.Group,d.Group.nextSibling);}else{d.Group.parentNode[aL](this.Group);}A(this,d,this.paper);return this;};ax[aY].insertBefore=function(d){if(this.removed){return this;}d.Group.parentNode.insertBefore(this.Group,d.Group);aq(this,d,this.paper);return this;};var P=function(e,d,a1,S){var R=ah("group"),a0=ah("oval"),i=a0.style;R.style.cssText="position:absolute;left:0;top:0;width:"+e.width+"px;height:"+e.height+"px";R.coordsize=e.coordsize;R.coordorigin=e.coordorigin;R[aL](a0);var E=new ax(a0,R,e);E.type="circle";aa(E,{stroke:"#000",fill:"none"});E.attrs.cx=d;E.attrs.cy=a1;E.attrs.r=S;E.setBox({x:d-S,y:a1-S,width:S*2,height:S*2});e.canvas[aL](R);return E;},aF=function(e,a1,a0,a2,E,d){var R=ah("group"),i=ah("roundrect"),a3=(+d||0)/(aI(a2,E));R.style.cssText="position:absolute;left:0;top:0;width:"+e.width+"px;height:"+e.height+"px";R.coordsize=e.coordsize;R.coordorigin=e.coordorigin;R[aL](i);i.arcsize=a3;var S=new ax(i,R,e);S.type="rect";aa(S,{stroke:"#000"});S.arcsize=a3;S.setBox({x:a1,y:a0,width:a2,height:E,r:d});e.canvas[aL](R);return S;},ai=function(d,a2,a1,i,e){var R=ah("group"),E=ah("oval"),a0=E.style;R.style.cssText="position:absolute;left:0;top:0;width:"+d.width+"px;height:"+d.height+"px";R.coordsize=d.coordsize;R.coordorigin=d.coordorigin;R[aL](E);var S=new ax(E,R,d);S.type="ellipse";aa(S,{stroke:"#000"});S.attrs.cx=a2;S.attrs.cy=a1;S.attrs.rx=i;S.attrs.ry=e;S.setBox({x:a2-i,y:a1-e,width:i*2,height:e*2});d.canvas[aL](R);return S;},o=function(e,d,a2,a1,a3,E){var R=ah("group"),i=ah("image"),a0=i.style;R.style.cssText="position:absolute;left:0;top:0;width:"+e.width+"px;height:"+e.height+"px";R.coordsize=e.coordsize;R.coordorigin=e.coordorigin;i.src=d;R[aL](i);var S=new ax(i,R,e);S.type="image";S.attrs.src=d;S.attrs.x=a2;S.attrs.y=a1;S.attrs.w=a3;S.attrs.h=E;S.setBox({x:a2,y:a1,width:a3,height:E});e.canvas[aL](R);return S;},X=function(e,a2,a1,a3){var R=ah("group"),E=ah("shape"),a0=E.style,a4=ah("path"),d=a4.style,i=ah("textpath");R.style.cssText="position:absolute;left:0;top:0;width:"+e.width+"px;height:"+e.height+"px";R.coordsize=e.coordsize;R.coordorigin=e.coordorigin;a4.v=an.format("m{0},{1}l{2},{1}",O(a2),O(a1),O(a2)+1);a4.textpathok=true;a0.width=e.width;a0.height=e.height;i.string=a3+at;i.on=true;E[aL](i);E[aL](a4);R[aL](E);var S=new ax(i,R,e);S.shape=E;S.textpath=a4;S.type="text";S.attrs.text=a3;S.attrs.x=a2;S.attrs.y=a1;S.attrs.w=1;S.attrs.h=1;aa(S,{font:j.font,stroke:"none",fill:"#000"});S.setBox();e.canvas[aL](R);return S;},aV=function(i,d){var e=this.canvas.style;i==+i&&(i+="px");d==+d&&(d+="px");e.width=i;e.height=d;e.clip="rect(0 "+i+" "+d+" 0)";return this;},ah;L.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!L.namespaces.rvml&&L.namespaces.add("rvml","urn:schemas-microsoft-com:vml");ah=function(d){return L.createElement("<rvml:"+d+' class="rvml">');};}catch(af){ah=function(d){return L.createElement("<"+d+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');};}var w=function(){var i=ao[aW](null,arguments),d=i.container,a2=i.height,a3,e=i.width,a1=i.x,a0=i.y;if(!d){throw new Error("VML container not found.");}var R=new aT,S=R.canvas=L.createElement("div"),E=S.style;e=e||512;a2=a2||342;e==+e&&(e+="px");a2==+a2&&(a2+="px");R.width=1000;R.height=1000;R.coordsize="1000 1000";R.coordorigin="0 0";R.span=L.createElement("span");R.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";S[aL](R.span);E.cssText=an.format("width:{0};height:{1};position:absolute;clip:rect(0 {0} {1} 0);overflow:hidden",e,a2);if(d==1){L.body[aL](S);E.left=a1+"px";E.top=a0+"px";}else{d.style.width=e;d.style.height=a2;if(d.firstChild){d.insertBefore(S,d.firstChild);}else{d[aL](S);}}aG.call(R,R,an.fn);return R;};aT[aY].clear=function(){this.canvas.innerHTML=at;this.span=L.createElement("span");this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";this.canvas[aL](this.span);this.bottom=this.top=null;};aT[aY].remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var d in this){this[d]=s(d);}};}if((/^Apple|^Google/).test(navigator.vendor)&&!(navigator.userAgent.indexOf("Version/4.0")+1)){aT[aY].safari=function(){var d=this.rect(-99,-99,this.width+99,this.height+99);setTimeout(function(){d.remove();});};}else{aT[aY].safari=function(){};}var ae=(function(){if(L.addEventListener){return function(R,i,e,d){var E=function(S){return e.call(d,S);};R.addEventListener(i,E,false);return function(){R.removeEventListener(i,E,false);return true;};};}else{if(L.attachEvent){return function(S,E,i,e){var R=function(a0){return i.call(e,a0||au.event);};S.attachEvent("on"+E,R);var d=function(){S.detachEvent("on"+E,R);return true;};return d;};}}})();for(var ac=F[m];ac--;){(function(d){ax[aY][d]=function(e){if(an.is(e,"function")){this.events=this.events||[];this.events.push({name:d,f:e,unbind:ae(this.shape||this.node,d,e,this)});}return this;};ax[aY]["un"+d]=function(E){var i=this.events,e=i[m];while(e--){if(i[e].name==d&&i[e].f==E){i[e].unbind();i.splice(e,1);!i.length&&delete this.events;return this;}}return this;};})(F[ac]);}ax[aY].hover=function(e,d){return this.mouseover(e).mouseout(d);};ax[aY].unhover=function(e,d){return this.unmouseover(e).unmouseout(d);};aT[aY].circle=function(d,i,e){return P(this,d||0,i||0,e||0);};aT[aY].rect=function(d,R,e,i,E){return aF(this,d||0,R||0,e||0,i||0,E||0);};aT[aY].ellipse=function(d,E,i,e){return ai(this,d||0,E||0,i||0,e||0);};aT[aY].path=function(d){d&&!an.is(d,"string")&&!an.is(d[0],"array")&&(d+=at);return q(an.format[aW](an,arguments),this);};aT[aY].image=function(E,d,R,e,i){return o(this,E||"about:blank",d||0,R||0,e||0,i||0);};aT[aY].text=function(d,i,e){return X(this,d||0,i||0,e||at);};aT[aY].set=function(d){arguments[m]>1&&(d=Array[aY].splice.call(arguments,0,arguments[m]));return new T(d);};aT[aY].setSize=aV;aT[aY].top=aT[aY].bottom=null;aT[aY].raphael=an;function u(){return this.x+am+this.y;}ax[aY].scale=function(a6,a5,E,e){if(a6==null&&a5==null){return{x:this._.sx,y:this._.sy,toString:u};}a5=a5||a6;!+a5&&(a5=a6);var ba,a8,a9,a7,bm=this.attrs;if(a6!=0){var a4=this.getBBox(),a1=a4.x+a4.width/2,R=a4.y+a4.height/2,bl=a6/this._.sx,bk=a5/this._.sy;E=(+E||E==0)?E:a1;e=(+e||e==0)?e:R;var a3=~~(a6/ab.abs(a6)),a0=~~(a5/ab.abs(a5)),be=this.node.style,bo=E+(a1-E)*bl,bn=e+(R-e)*bk;switch(this.type){case"rect":case"image":var a2=bm.width*a3*bl,bd=bm.height*a0*bk;this.attr({height:bd,r:bm.r*aI(a3*bl,a0*bk),width:a2,x:bo-a2/2,y:bn-bd/2});break;case"circle":case"ellipse":this.attr({rx:bm.rx*a3*bl,ry:bm.ry*a0*bk,r:bm.r*aI(a3*bl,a0*bk),cx:bo,cy:bn});break;case"path":var bg=ad(bm.path),bh=true;for(var bj=0,bc=bg[m];bj<bc;bj++){var bf=bg[bj],bi,S=aN.call(bf[0]);if(S=="M"&&bh){continue;}else{bh=false;}if(S=="A"){bf[bg[bj][m]-2]*=bl;bf[bg[bj][m]-1]*=bk;bf[1]*=a3*bl;bf[2]*=a0*bk;bf[5]=+(a3+a0?!!+bf[5]:!+bf[5]);}else{if(S=="H"){for(bi=1,jj=bf[m];bi<jj;bi++){bf[bi]*=bl;}}else{if(S=="V"){for(bi=1,jj=bf[m];bi<jj;bi++){bf[bi]*=bk;}}else{for(bi=1,jj=bf[m];bi<jj;bi++){bf[bi]*=(bi%2)?bl:bk;}}}}}var d=U(bg),ba=bo-d.x-d.width/2,a8=bn-d.y-d.height/2;bg[0][1]+=ba;bg[0][2]+=a8;this.attr({path:bg});break;}if(this.type in {text:1,image:1}&&(a3!=1||a0!=1)){if(this.transformations){this.transformations[2]="scale("[aS](a3,",",a0,")");this.node[v]("transform",this.transformations[az](am));ba=(a3==-1)?-bm.x-(a2||0):bm.x;a8=(a0==-1)?-bm.y-(bd||0):bm.y;this.attr({x:ba,y:a8});bm.fx=a3-1;bm.fy=a0-1;}else{this.node.filterMatrix=" progid:DXImageTransform.Microsoft.Matrix(M11="[aS](a3,", M12=0, M21=0, M22=",a0,", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");be.filter=(this.node.filterMatrix||at)+(this.node.filterOpacity||at);}}else{if(this.transformations){this.transformations[2]=at;this.node[v]("transform",this.transformations[az](am));bm.fx=0;bm.fy=0;}else{this.node.filterMatrix=at;be.filter=(this.node.filterMatrix||at)+(this.node.filterOpacity||at);}}bm.scale=[a6,a5,E,e][az](am);this._.sx=a6;this._.sy=a5;}return this;};ax[aY].clone=function(){var d=this.attr();delete d.scale;delete d.translation;return this.paper[this.type]().attr(d);};var aB=function(d,e){return function(a9,S,a0){a9=H(a9);var a5,a4,E,a1,R="",a8={},a6,a3=0;for(var a2=0,a7=a9.length;a2<a7;a2++){E=a9[a2];if(E[0]=="M"){a5=+E[1];a4=+E[2];}else{a1=n(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6]);if(a3+a1>S){if(e&&!a8.start){a6=an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],(S-a3)/a1);R+=["C",a6.start.x,a6.start.y,a6.m.x,a6.m.y,a6.x,a6.y];if(a0){return R;}a8.start=R;R=["M",a6.x,a6.y+"C",a6.n.x,a6.n.y,a6.end.x,a6.end.y,E[5],E[6]][az]();a3+=a1;a5=+E[5];a4=+E[6];continue;}if(!d&&!e){a6=an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],(S-a3)/a1);return{x:a6.x,y:a6.y,alpha:a6.alpha};}}a3+=a1;a5=+E[5];a4=+E[6];}R+=E;}a8.end=R;a6=d?a3:e?a8:an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],1);a6.alpha&&(a6={x:a6.x,y:a6.y,alpha:a6.alpha});return a6;};},n=aj(function(E,d,a0,S,a6,a5,a4,a3){var R={x:0,y:0},a2=0;for(var a1=0;a1<1.01;a1+=0.01){var e=M(E,d,a0,S,a6,a5,a4,a3,a1);a1&&(a2+=ab.sqrt(aM(R.x-e.x,2)+aM(R.y-e.y,2)));R=e;}return a2;});var ap=aB(1),C=aB(),J=aB(0,1);ax[aY].getTotalLength=function(){if(this.type!="path"){return;}return ap(this.attrs.path);};ax[aY].getPointAtLength=function(d){if(this.type!="path"){return;}return C(this.attrs.path,d);};ax[aY].getSubpath=function(i,e){if(this.type!="path"){return;}if(ab.abs(this.getTotalLength()-e)<0.000001){return J(this.attrs.path,i).end;}var d=J(this.attrs.path,e,1);return i?J(d,i).end:d;};an.easing_formulas={linear:function(d){return d;},"<":function(d){return aM(d,3);},">":function(d){return aM(d-1,3)+1;},"<>":function(d){d=d*2;if(d<1){return aM(d,3)/2;}d-=2;return(aM(d,3)+2)/2;},backIn:function(e){var d=1.70158;return e*e*((d+1)*e-d);},backOut:function(e){e=e-1;var d=1.70158;return e*e*((d+1)*e+d)+1;},elastic:function(i){if(i==0||i==1){return i;}var e=0.3,d=e/4;return aM(2,-10*i)*ab.sin((i-d)*(2*ab.PI)/e)+1;},bounce:function(E){var e=7.5625,i=2.75,d;if(E<(1/i)){d=e*E*E;}else{if(E<(2/i)){E-=(1.5/i);d=e*E*E+0.75;}else{if(E<(2.5/i)){E-=(2.25/i);d=e*E*E+0.9375;}else{E-=(2.625/i);d=e*E*E+0.984375;}}}return d;}};var I={length:0},aR=function(){var a2=+new Date;for(var be in I){if(be!="length"&&I[Q](be)){var bj=I[be];if(bj.stop){delete I[be];I[m]--;continue;}var a0=a2-bj.start,bb=bj.ms,ba=bj.easing,bf=bj.from,a7=bj.diff,E=bj.to,a6=bj.t,a9=bj.prev||0,a1=bj.el,R=bj.callback,a8={},d;if(a0<bb){var S=an.easing_formulas[ba]?an.easing_formulas[ba](a0/bb):a0/bb;for(var bc in bf){if(bf[Q](bc)){switch(Z[bc]){case"along":d=S*bb*a7[bc];E.back&&(d=E.len-d);var bd=C(E[bc],d);a1.translate(a7.sx-a7.x||0,a7.sy-a7.y||0);a7.x=bd.x;a7.y=bd.y;a1.translate(bd.x-a7.sx,bd.y-a7.sy);E.rot&&a1.rotate(a7.r+bd.alpha,bd.x,bd.y);break;case"number":d=+bf[bc]+S*bb*a7[bc];break;case"colour":d="rgb("+[B(O(bf[bc].r+S*bb*a7[bc].r)),B(O(bf[bc].g+S*bb*a7[bc].g)),B(O(bf[bc].b+S*bb*a7[bc].b))][az](",")+")";break;case"path":d=[];for(var bh=0,a5=bf[bc][m];bh<a5;bh++){d[bh]=[bf[bc][bh][0]];for(var bg=1,bi=bf[bc][bh][m];bg<bi;bg++){d[bh][bg]=+bf[bc][bh][bg]+S*bb*a7[bc][bh][bg];}d[bh]=d[bh][az](am);}d=d[az](am);break;case"csv":switch(bc){case"translation":var a4=a7[bc][0]*(a0-a9),a3=a7[bc][1]*(a0-a9);a6.x+=a4;a6.y+=a3;d=a4+am+a3;break;case"rotation":d=+bf[bc][0]+S*bb*a7[bc][0];bf[bc][1]&&(d+=","+bf[bc][1]+","+bf[bc][2]);break;case"scale":d=[+bf[bc][0]+S*bb*a7[bc][0],+bf[bc][1]+S*bb*a7[bc][1],(2 in E[bc]?E[bc][2]:at),(3 in E[bc]?E[bc][3]:at)][az](am);break;case"clip-rect":d=[];var bh=4;while(bh--){d[bh]=+bf[bc][bh]+S*bb*a7[bc][bh];}break;}break;}a8[bc]=d;}}a1.attr(a8);a1._run&&a1._run.call(a1);}else{if(E.along){var bd=C(E.along,E.len*!E.back);a1.translate(a7.sx-(a7.x||0)+bd.x-a7.sx,a7.sy-(a7.y||0)+bd.y-a7.sy);E.rot&&a1.rotate(a7.r+bd.alpha,bd.x,bd.y);}(a6.x||a6.y)&&a1.translate(-a6.x,-a6.y);E.scale&&(E.scale=E.scale+at);a1.attr(E);delete I[be];I[m]--;a1.in_animation=null;an.is(R,"function")&&R.call(a1);}bj.prev=a0;}}an.svg&&a1&&a1.paper.safari();I[m]&&setTimeout(aR);},B=function(d){return d>255?255:(d<0?0:d);},t=function(d,i){if(d==null){return{x:this._.tx,y:this._.ty,toString:u};}this._.tx+=+d;this._.ty+=+i;switch(this.type){case"circle":case"ellipse":this.attr({cx:+d+this.attrs.cx,cy:+i+this.attrs.cy});break;case"rect":case"image":case"text":this.attr({x:+d+this.attrs.x,y:+i+this.attrs.y});break;case"path":var e=ad(this.attrs.path);e[0][1]+=+d;e[0][2]+=+i;this.attr({path:e});break;}return this;};ax[aY].animateWith=function(e,i,d,R,E){I[e.id]&&(i.start=I[e.id].start);return this.animate(i,d,R,E);};ax[aY].animateAlong=ay();ax[aY].animateAlongBack=ay(1);function ay(d){return function(E,i,e,S){var R={back:d};an.is(e,"function")?(S=e):(R.rot=e);E&&E.constructor==ax&&(E=E.attrs.path);E&&(R.along=E);return this.animate(R,i,S);};}ax[aY].onAnimation=function(d){this._run=d||0;return this;};ax[aY].animate=function(be,a5,a4,E){if(an.is(a4,"function")||!a4){E=a4||null;}var a9={},e={},a2={};for(var a6 in be){if(be[Q](a6)){if(Z[Q](a6)){a9[a6]=this.attr(a6);(a9[a6]==null)&&(a9[a6]=j[a6]);e[a6]=be[a6];switch(Z[a6]){case"along":var bc=ap(be[a6]),a7=C(be[a6],bc*!!be.back),R=this.getBBox();a2[a6]=bc/a5;a2.tx=R.x;a2.ty=R.y;a2.sx=a7.x;a2.sy=a7.y;e.rot=be.rot;e.back=be.back;e.len=bc;be.rot&&(a2.r=W(this.rotate())||0);break;case"number":a2[a6]=(e[a6]-a9[a6])/a5;break;case"colour":a9[a6]=an.getRGB(a9[a6]);var a8=an.getRGB(e[a6]);a2[a6]={r:(a8.r-a9[a6].r)/a5,g:(a8.g-a9[a6].g)/a5,b:(a8.b-a9[a6].b)/a5};break;case"path":var S=H(a9[a6],e[a6]);a9[a6]=S[0];var a3=S[1];a2[a6]=[];for(var bb=0,a1=a9[a6][m];bb<a1;bb++){a2[a6][bb]=[0];for(var ba=1,bd=a9[a6][bb][m];ba<bd;ba++){a2[a6][bb][ba]=(a3[bb][ba]-a9[a6][bb][ba])/a5;}}break;case"csv":var d=(be[a6]+at)[z](a),a0=(a9[a6]+at)[z](a);switch(a6){case"translation":a9[a6]=[0,0];a2[a6]=[d[0]/a5,d[1]/a5];break;case"rotation":a9[a6]=(a0[1]==d[1]&&a0[2]==d[2])?a0:[0,d[1],d[2]];a2[a6]=[(d[0]-a9[a6][0])/a5,0,0];break;case"scale":be[a6]=d;a9[a6]=(a9[a6]+at)[z](a);a2[a6]=[(d[0]-a9[a6][0])/a5,(d[1]-a9[a6][1])/a5,0,0];break;case"clip-rect":a9[a6]=(a9[a6]+at)[z](a);a2[a6]=[];var bb=4;while(bb--){a2[a6][bb]=(d[bb]-a9[a6][bb])/a5;}break;}e[a6]=d;}}}}this.stop();this.in_animation=1;I[this.id]={start:be.start||+new Date,ms:a5,easing:a4,from:a9,diff:a2,to:e,el:this,callback:E,t:{x:0,y:0}};++I[m]==1&&aR();return this;};ax[aY].stop=function(){I[this.id]&&I[m]--;delete I[this.id];return this;};ax[aY].translate=function(d,e){return this.attr({translation:d+" "+e});};ax[aY][aA]=function(){return"Rapha\xebl\u2019s object";};an.ae=I;var T=function(d){this.items=[];this[m]=0;if(d){for(var e=0,E=d[m];e<E;e++){if(d[e]&&(d[e].constructor==ax||d[e].constructor==T)){this[this.items[m]]=this.items[this.items[m]]=d[e];this[m]++;}}}};T[aY][f]=function(){var R,d;for(var e=0,E=arguments[m];e<E;e++){R=arguments[e];if(R&&(R.constructor==ax||R.constructor==T)){d=this.items[m];this[d]=this.items[d]=R;this[m]++;}}return this;};T[aY].pop=function(){delete this[this[m]--];return this.items.pop();};for(var y in ax[aY]){if(ax[aY][Q](y)){T[aY][y]=(function(d){return function(){for(var e=0,E=this.items[m];e<E;e++){this.items[e][d][aW](this.items[e],arguments);}return this;};})(y);}}T[aY].attr=function(e,a0){if(e&&an.is(e,"array")&&an.is(e[0],"object")){for(var d=0,S=e[m];d<S;d++){this.items[d].attr(e[d]);}}else{for(var E=0,R=this.items[m];E<R;E++){this.items[E].attr[aW](this.items[E],arguments);}}return this;};T[aY].animate=function(S,e,a2,a1){(an.is(a2,"function")||!a2)&&(a1=a2||null);var d=this.items[m],E=d,a0=this,R;a1&&(R=function(){!--d&&a1.call(a0);});this.items[--E].animate(S,e,a2||R,R);while(E--){this.items[E].animateWith(this.items[d-1],S,e,a2||R,R);}return this;};T[aY].insertAfter=function(e){var d=this.items[m];while(d--){this.items[d].insertAfter(e);}return this;};T[aY].getBBox=function(){var d=[],a0=[],e=[],R=[];for(var E=this.items[m];E--;){var S=this.items[E].getBBox();d[f](S.x);a0[f](S.y);e[f](S.x+S.width);R[f](S.y+S.height);}d=aI[aW](0,d);a0=aI[aW](0,a0);return{x:d,y:a0,width:g[aW](0,e)-d,height:g[aW](0,R)-a0};};an.registerFont=function(e){if(!e.face){return e;}this.fonts=this.fonts||{};var E={w:e.w,face:{},glyphs:{}},i=e.face["font-family"];for(var a0 in e.face){if(e.face[Q](a0)){E.face[a0]=e.face[a0];}}if(this.fonts[i]){this.fonts[i][f](E);}else{this.fonts[i]=[E];}if(!e.svg){E.face["units-per-em"]=G(e.face["units-per-em"],10);for(var R in e.glyphs){if(e.glyphs[Q](R)){var S=e.glyphs[R];E.glyphs[R]={w:S.w,k:{},d:S.d&&"M"+S.d[aP](/[mlcxtrv]/g,function(a1){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a1]||"M";})+"z"};if(S.k){for(var d in S.k){if(S[Q](d)){E.glyphs[R].k[d]=S.k[d];}}}}}}return e;};aT[aY].getFont=function(a2,a3,e,R){R=R||"normal";e=e||"normal";a3=+a3||{normal:400,bold:700,lighter:300,bolder:800}[a3]||400;var S=an.fonts[a2];if(!S){var E=new RegExp("(^|\\s)"+a2[aP](/[^\w\d\s+!~.:_-]/g,at)+"(\\s|$)","i");for(var d in an.fonts){if(an.fonts[Q](d)){if(E.test(d)){S=an.fonts[d];break;}}}}var a0;if(S){for(var a1=0,a4=S[m];a1<a4;a1++){a0=S[a1];if(a0.face["font-weight"]==a3&&(a0.face["font-style"]==e||!a0.face["font-style"])&&a0.face["font-stretch"]==R){break;}}}return a0;};aT[aY].print=function(R,E,d,a1,a2,bb){bb=bb||"middle";var a7=this.set(),ba=(d+at)[z](at),a8=0,a4=at,bc;an.is(a1,"string")&&(a1=this.getFont(a1));if(a1){bc=(a2||16)/a1.face["units-per-em"];var e=a1.face.bbox.split(a),a0=+e[0],a3=+e[1]+(bb=="baseline"?e[3]-e[1]+(+a1.face.descent):(e[3]-e[1])/2);for(var a6=0,S=ba[m];a6<S;a6++){var a5=a6&&a1.glyphs[ba[a6-1]]||{},a9=a1.glyphs[ba[a6]];a8+=a6?(a5.w||a1.w)+(a5.k&&a5.k[ba[a6]]||0):0;a9&&a9.d&&a7[f](this.path(a9.d).attr({fill:"#000",stroke:"none",translation:[a8,0]}));}a7.scale(bc,bc,a0,a3).translate(R-a0,E-a3);}return a7;};an.format=function(i){var e=an.is(arguments[1],"array")?[0][aS](arguments[1]):arguments,d=/\{(\d+)\}/g;i&&an.is(i,"string")&&e[m]-1&&(i=i[aP](d,function(R,E){return e[++E]==null?at:e[E];}));return i||at;};an.ninja=function(){var d=Raphael;if(l.was){Raphael=l.is;}else{delete Raphael;}return d;};an.el=ax[aY];return an;})();
\ No newline at end of file
diff --git a/luci-app-bmx6/jquery/jquery-1.4.js b/luci-app-bmx6/jquery/jquery-1.4.js
deleted file mode 100644 (file)
index 7c24308..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.4.2
- * http://jquery.com/
- *
- * Copyright 2010, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2010, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Sat Feb 13 22:33:48 2010 -0500
- */
-(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
-e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
-j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
-"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
-true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
-Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
-(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
-a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
-"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
-function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
-c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
-L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
-"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
-a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
-d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
-a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
-!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
-true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
-var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
-parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
-false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
-s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
-applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
-else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
-a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
-w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
-cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
-i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
-" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
-this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
-e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
-c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
-a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
-function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
-k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
-C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
-null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
-e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
-f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
-if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
-fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
-d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
-"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
-a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
-isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
-{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
-if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
-e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
-"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
-d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
-!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
-toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
-u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
-function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
-if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
-e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
-t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
-g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
-for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
-1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
-CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
-relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
-l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
-h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
-CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
-g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
-text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
-setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
-h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
-m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
-"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
-h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
-!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
-h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
-q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
-if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
-(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
-function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
-gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
-c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
-{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
-"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
-d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
-a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
-1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
-a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
-c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
-wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
-prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
-this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
-return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
-""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
-this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
-u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
-1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
-return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
-""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
-c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
-c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
-function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
-Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
-"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
-a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
-a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
-"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
-serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
-function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
-global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
-e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
-"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
-false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
-false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
-c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
-d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
-g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
-1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
-"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
-if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
-this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
-"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
-animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
-j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
-this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
-"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
-c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
-this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
-this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
-e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
-c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
-function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
-this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
-k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
-f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
-a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
-c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
-d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
-f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
-"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
-e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
diff --git a/luci-app-bmx7/COPYING b/luci-app-bmx7/COPYING
deleted file mode 100644 (file)
index d511905..0000000
+++ /dev/null
@@ -1,339 +0,0 @@
-                   GNU GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                   GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                           NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                    END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/luci-app-bmx7/Makefile b/luci-app-bmx7/Makefile
deleted file mode 100644 (file)
index a9e96f7..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-#    Copyright © 2011 Pau Escrich <pau@dabax.net>
-#    Contributors Roger Pueyo Centelles <roger.pueyo@guifi.net>
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License along
-#    with this program; if not, write to the Free Software Foundation, Inc.,
-#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-#    The full GNU General Public License is included in this distribution in
-#    the file called "COPYING".
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=luci-app-bmx7
-PKG_RELEASE:=0.0-alpha
-
-PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
-PKG_LICENSE:=GPL-2.0+
-
-include $(INCLUDE_DIR)/package.mk
-
-define Package/luci-app-bmx7
-  SECTION:=luci
-  CATEGORY:=LuCI
-  SUBMENU:=3. Applications
-  TITLE:= LuCI support for BMX7
-  DEPENDS:=+luci-lib-json +luci-mod-admin-full +luci-lib-httpclient +bmx7
-  MAINTAINER:= Roger Pueyo Centelles <roger.pueyo@guifi.net>
-endef
-
-define Package/luci-app-bmx7/description
-       LuCI application for web-based configuration and visualization of the BMX7 routing daemon
-endef
-
-define Package/luci-app-bmx7/conffiles
-       /etc/config/luci-bmx7
-endef
-
-define Build/Prepare
-endef
-
-define Build/Configure
-endef
-
-define Build/Compile
-endef
-
-define Package/luci-app-bmx7/install
-       $(CP) ./files/* $(1)/
-       chmod 755 $(1)/www/cgi-bin/bmx7-info
-endef
-
-$(eval $(call BuildPackage,luci-app-bmx7))
-
diff --git a/luci-app-bmx7/files/etc/config/luci-bmx7 b/luci-app-bmx7/files/etc/config/luci-bmx7
deleted file mode 100644 (file)
index 46a7727..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-config 'bmx7' 'luci'
-       option ignore '0'
-       option place 'admin network BMX7'
-       #option place 'qmp Mesh'
-       option position '3'
-       #option json 'http://127.0.0.1/cgi-bin/bmx7-info?'
-       option json 'exec:/www/cgi-bin/bmx7-info -s'
diff --git a/luci-app-bmx7/files/usr/lib/lua/luci/controller/bmx7.lua b/luci-app-bmx7/files/usr/lib/lua/luci/controller/bmx7.lua
deleted file mode 100644 (file)
index ed62628..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
---[[
-    Copyright (C) 2011 Pau Escrich <pau@dabax.net>
-    Contributors Jo-Philipp Wich <xm@subsignal.org>
-                 Roger Pueyo Centelles <roger.pueyo@guifi.net>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-    The full GNU General Public License is included in this distribution in
-    the file called "COPYING".
---]]
-
-module("luci.controller.bmx7", package.seeall)
-
-function index()
-       local place = {}
-       local ucim = require "luci.model.uci"
-       local uci = ucim.cursor()
-
-       -- checking if ignore is on
-       if uci:get("luci-bmx7","luci","ignore") == "1" then
-               return nil
-       end
-
-       -- getting value from uci database
-       local uci_place = uci:get("luci-bmx7","luci","place")
-
-       -- default values
-       if uci_place == nil then
-               place = {"bmx7"}
-       else
-               local util = require "luci.util"
-               place = util.split(uci_place," ")
-       end
-
-       -- getting position of menu
-       local uci_position = uci:get("luci-bmx7","luci","position")
-
-
-       ---------------------------
-       -- Placing the pages in the menu
-       ---------------------------
-
-       -- Status (default)
-       entry(place,call("action_status_j"),place[#place],tonumber(uci_position))
-
-       table.insert(place,"Status")
-       entry(place,call("action_status_j"),"Status",0)
-       table.remove(place)
-
-       -- Nodes list
-       table.insert(place,"Nodes")
-       entry(place,call("action_nodes_j"),"Nodes",1)
-       table.remove(place)
-end
-
-
-function action_status_j()
-       luci.template.render("bmx7/status_j", {})
-end
-
-function action_nodes_j()
-       local http = require "luci.http"
-       local link_non_js = "/cgi-bin/luci" .. http.getenv("PATH_INFO") .. '/nodes_nojs'
-       luci.template.render("bmx7/nodes_j", {link_non_js=link_non_js})
-end
diff --git a/luci-app-bmx7/files/usr/lib/lua/luci/view/bmx7/nodes_j.htm b/luci-app-bmx7/files/usr/lib/lua/luci/view/bmx7/nodes_j.htm
deleted file mode 100644 (file)
index 347af42..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-<%#
-   Copyright © 2011 Pau Escrich <pau@dabax.net>
-   Contributors Lluis Esquerda <eskerda@gmail.com>
-                Roger Pueyo Centelles <roger.pueyo@guifi.net>
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, write to the Free Software Foundation, Inc.,
-   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-   The full GNU General Public License is included in this distribution in
-   the file called "COPYING".
--%>
-
-<%+header%>
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
-<script type="text/javascript" src="<%=resource%>/bmx7/js/polling.js"></script>
-
-
-<style>
-
-       div.hideme{
-               display: none;
-       }
-
-       div.info{
-               background: #FFF;
-               border: solid 0px;
-               height: 90px;
-               display: block;
-               overflow: auto;
-       }
-
-       div.inforow{
-               text-align:left;
-               display:inline-block;
-               margin:10px;
-               vertical-align:top;
-               float: left;
-               white-space:nowrap;
-       }
-
-       div.inforow.newline{
-               clear: both;
-       }
-
-       u {
-    text-decoration: underline;
-       } 
-
-#extra-info ul { list-style: none outside none; margin-left: 0em; }
-
-</style>
-<div class="cbi-map">
-
-<h2>Mesh nodes</h2>
-<div class="cbi-map-descr"></div>
-<div id="extra-info" class="info">
-       <br />
-       <center>
-       Tip: click the <img src="<%=resource%>/bmx7/world.png" /> icon to see individual node information.
-       </center>
-</div>
-<fieldset class="cbi-section">
-       <legend><%:Originators%></legend>
-       <table class="cbi-section-table" id="descriptions_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"></th>
-                       <th class="cbi-section-table-cell"><%:Name%></th>
-                       <th class="cbi-section-table-cell"><%:Short ID%></th>
-                       <th class="cbi-section-table-cell"><%:S/s/T/t%></th>
-                       <th class="cbi-section-table-cell"><%:Primary IPv6 address%></th>
-                       <th class="cbi-section-table-cell"><%:Via neighbour%></th>
-                       <th class="cbi-section-table-cell"><%:Metric%></th>
-                       <th class="cbi-section-table-cell"><%:Last desc.%></th>
-                       <th class="cbi-section-table-cell"><%:Last ref.%></th>
-                       <th class="cbi-section-table-cell"><%: %></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="11"><br /><center><em><%:Collecting data...%></em></center></td>
-               </tr>
-       </table>
-</fieldset>
-
-</div>
-
-<script type="text/javascript">//<![CDATA[
-               var displayExtraInfo = function ( id ) {
-                       console.log('aaa'+id)
-                       document.getElementById('extra-info').innerHTML = document.getElementById(id).innerHTML;
-               }
-
-               new TablePooler(5,"/cgi-bin/bmx7-info", {'$originators':''}, "descriptions_table", function(st){
-                       var infoicon = "<%=resource%>/bmx7/world_small.png";
-                       var originators = st.originators;
-                       var res = Array();
-
-                       originators.forEach(function(originator,i){
-                               var name =  originator.name;
-                               var shortId =  originator.shortId;
-                               var nodeId = originator.nodeId;
-                               var extensions = originator.name;
-                               var SsTt = originator.S+'/'+originator.s+'/'+originator.T+'/'+originator.t;
-                               var nodeKey = originator.nodeKey;
-                               var descSize = originator.descSize;
-                               var primaryIp = originator.primaryIp;
-                               var nbName = originator.nbName;
-                               var dev = originator.dev;
-                               var nbLocalIp = originator.nbLocalIp;
-                               var metric = originator.metric;
-                               var lastDesc = originator.lastDesc;
-                               var lastRef = originator.lastRef;
-                               
-                       var extrainfo = '<a onclick="displayExtraInfo(\'ip-' + i + '\')"><img src="' + infoicon + '" / ></a>';
-                       var extrainfo_link = '<a onclick="displayExtraInfo(\'ip-' + i + '\')">' +  '<img src="' + infoicon + '" />' + '</a>';
-       
-                       extrainfo = '<div id="ip-'+ i +'" class="hideme">'
-
-                       + "<div class='inforow'>"
-                       + "<h4><u>" + name  + '</u></h4>\n'
-                       + 'Node ID: ' + nodeId + "</div>"
-
-                       + "<div class='inforow'>"
-                       + "<h5>Primary IPv6 address</h5>\n"
-                       + primaryIp + "</div>\n"
-
-                       + "<div class='inforow'>"
-                       + "<h5>Support & Trust</h5>\n"
-                       + SsTt + "</div>\n"
-
-                       + "<div class='inforow'>"
-                       + "<h5>Node key</h5>\n"
-                       + nodeKey + "</div>\n"
-
-                       + "<div class='inforow newline'>"
-                       + "<h5>Via neighbour</h5>\n"
-                       + nbName + "</div>\n"
-
-                       + "<div class='inforow'>"
-                       + "<h5>Via device</h5>\n"
-                       + dev + "</div>\n"
-
-                       + "<div class='inforow'>"
-                       + "<h5>Via remote link-local IPv6 address</h5>\n"
-                       + nbLocalIp + "</div>\n"
-                       
-                       + "<div class='inforow'>"
-                       + "<h5>Route metric</h5>\n"
-                       + metric + "</div>\n"
-
-                       + "<div class='inforow'>"
-                       + "<h5>Desc. size</h5>\n"
-                       + descSize + "</div>\n"
-
-                       + "\n</div>";
-
-                       res.push([extrainfo_link, name, shortId, SsTt, primaryIp,
-                                                               nbName, metric, lastDesc, lastRef, extrainfo]);
-
-                 });
-                 return res;
-               });
-//]]></script>
-
-<%+footer%>
-
diff --git a/luci-app-bmx7/files/usr/lib/lua/luci/view/bmx7/status_j.htm b/luci-app-bmx7/files/usr/lib/lua/luci/view/bmx7/status_j.htm
deleted file mode 100644 (file)
index c6920f9..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-<%+header%>
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
-<script type="text/javascript" src="<%=resource%>/bmx7/js/polling.js"></script>
-
-<style>
-       div.hideme{
-               display: none;
-       }
-
-       div.info{
-               background: #FFF;
-               border: solid 1px;
-               height: 80px;
-               display: block;
-               overflow: auto;
-       }
-
-       div.inforow{
-               text-align:left;
-               display:inline-block;
-               width:20%;
-               margin:5px;
-               vertical-align:top;
-       }
-
-       #extra-info ul { list-style: none outside none; margin-left: 0em; }
-</style>
-
-<div class="cbi-map">
-       <center>
-               <img src="<%=resource%>/bmx7/bmx7logo.png" />
-               <br />
-               <br />
-               A mesh routing protocol for Linux devices.<br />
-               Visit <a href="http://bmx6.net">bmx6.net</a> for more information.<br />
-               <br />
-       </center>
-
-<div class="cbi-map-descr"></div>
-
-<fieldset class="cbi-section">
-       <legend><%:Node configuration%></legend>
-       <table class="cbi-section-table" id="config_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Short ID%></th>
-                       <th class="cbi-section-table-cell"><%:Node name%></th>
-                       <th class="cbi-section-table-cell"><%:Primary IPv6 address%></th>
-                       <th class="cbi-section-table-cell"><%:Node key%></th>
-                       <th class="cbi-section-table-cell"><%:BMX7 revision%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="5"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
-
-<fieldset class="cbi-section">
-       <legend><%:Node status%></legend>
-       <table class="cbi-section-table" id="status_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Nodes seen%></th>
-                       <th class="cbi-section-table-cell"><%:Neighbours%></th>
-                       <th class="cbi-section-table-cell"><%:Tunnelled IPv6 address%></th>
-                       <th class="cbi-section-table-cell"><%:Tunnelled IPv4 address%></th>
-                       <th class="cbi-section-table-cell"><%:Uptime%></th>
-                       <th class="cbi-section-table-cell"><%:CPU usage%></th>
-                       <th class="cbi-section-table-cell"><%:Memory usage%></th>
-                       <th class="cbi-section-table-cell"><%:Tx queue%></th>
-
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="8"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
-
-<fieldset class="cbi-section">
-       <legend><%:Interfaces%></legend>
-       <table class="cbi-section-table" id="ifaces_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Interface%></th>
-                       <th class="cbi-section-table-cell"><%:State%></th>
-                       <th class="cbi-section-table-cell"><%:Type%></th>
-                       <th class="cbi-section-table-cell"><%:Max. rate%></th>
-                       <th class="cbi-section-table-cell"><%:Link-local IPv6 address%></th>
-                       <th class="cbi-section-table-cell"><%:Rx BpP%></th>
-                       <th class="cbi-section-table-cell"><%:Tx BpP%></th>
-
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="7"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
-
-<fieldset class="cbi-section">
-       <legend><%:Links%></legend>
-       <table class="cbi-section-table" id="links_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Short ID%></th>
-                       <th class="cbi-section-table-cell"><%:Name%></th>
-                       <th class="cbi-section-table-cell"><%:Link key%></th>
-                       <th class="cbi-section-table-cell"><%:Remote link-local IPv6 address%></th>
-                       <th class="cbi-section-table-cell"><%:Device%></th>
-                       <th class="cbi-section-table-cell"><%:Rx rate%></th>
-                       <th class="cbi-section-table-cell"><%:Tx rate%></th>
-                       <th class="cbi-section-table-cell"><%:Routes%></th>
-
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="8"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
-</fieldset>
-
-
-</div>
-
-<script type="text/javascript">//<![CDATA[
-       new TablePooler(1,"/cgi-bin/bmx7-info", {'$info':''}, "config_table", function(st){
-               var res = Array();
-               var sta = st.info[0].status;
-               var ifaces = st.info[1].interfaces;
-
-               res.push([sta.shortId, sta.name, sta.primaryIp, sta.nodeKey, sta.revision]);
-               res.push(['','','','',''])
-               res.push(['','','','',''])
-
-               return res;
-       });
-
-
-       new TablePooler(1,"/cgi-bin/bmx7-info", {'$info':''}, "status_table", function(st){
-               var res = Array();
-               var sta = st.info[0].status;
-               var mem = st.info[3].memory;
-
-               var txQ = sta.txQ.split('/');
-               console.log(txQ)
-
-               var ptxQ = '<p style="color:rgb('+parseInt(255*txQ[0]/txQ[1])+','+parseInt(128*(txQ[1]-txQ[0])/txQ[1])+',0)")>'+sta.txQ+'</p>';
-               console.log(ptxQ)
-
-               res.push([sta.nodes, sta.nbs, sta.tun6Address, sta.tun4Address, sta.uptime, sta.cpu, mem.bmx7, ptxQ]);
-
-               res.push(['','','','','','','',''])
-               res.push(['','','','','','','',''])
-
-               return res;
-       });
-
-               new TablePooler(1,"/cgi-bin/bmx7-info", {'$info':''}, "ifaces_table", function(st){
-               var res = Array();
-               var sta = st.info[0].status;
-               var ifaces = st.info[1].interfaces;
-
-               ifaces.forEach(function(iface){
-                       res.push([iface.dev, iface.state, iface.type, iface.rateMax, iface.localIp, iface.rxBpP, iface.txBpP]);
-               });
-               res.push(['','','','','','',''])
-               if (ifaces.length % 2 == 0)
-                       res.push('')
-               res.push(['','','','','','',''])
-               return res;
-       });
-
-               new TablePooler(1,"/cgi-bin/bmx7-info", {'links':''}, "links_table", function(st){
-               var res = Array();
-               links = st.links;
-
-               links.forEach(function(link){
-                       res.push([link.shortId, link.name, link.linkKey, link.nbLocalIp, link.dev, link.rxRate, link.txRate, link.routes]);
-               });
-               res.push(['','','','','','','',''])
-               if (links.length % 2 == 0)
-                       res.push([])
-               res.push(['','','','','','','',''])
-               return res;
-       });
-//]]></script>
-
-<%+footer%>
diff --git a/luci-app-bmx7/files/www/cgi-bin/bmx7-info b/luci-app-bmx7/files/www/cgi-bin/bmx7-info
deleted file mode 100755 (executable)
index 8c501c5..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/bin/sh
-#    Copyright © 2011 Pau Escrich
-#    Contributors Jo-Philipp Wich <xm@subsignal.org>
-#                 Roger Pueyo Centelles <roger.pueyo@guifi.net>
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License along
-#    with this program; if not, write to the Free Software Foundation, Inc.,
-#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-#    The full GNU General Public License is included in this distribution in
-#    the file called "COPYING".
-#
-#    This script gives information about bmx7
-#    Can be executed from a linux shell: ./bmx7-info -s links
-#    Or from web interfae (with cgi enabled): http://host/cgi-bin/bmx7-info?links
-#    If you ask for a directory you wil get the directory contents in JSON forman
-
-BMX7_DIR="$(uci get bmx7.general.runtimeDir 2>/dev/null)" || BMX7_DIR="/var/run/bmx7/json"
-
-#Checking if shell mode or cgi-bin mode
-if [ "$1" == "-s" ]; then
-       QUERY="$2"
-else
-       QUERY="${QUERY_STRING%%=*}"
-       echo "Content-type: application/json"
-       echo ""
-
-fi
-
-check_path() {
-        [ -d "$1" ] && path=$(cd $1; pwd)
-        [ -f "$1" ] && path=$(cd $1/..; pwd)
-        [ $(echo "$path" | grep -c "^$BMX7_DIR") -ne 1 ] && exit 1
-}
-
-print_mem() {
-       echo -n '{ "memory": { "bmx7": "'
-       cat /proc/$(cat /var/run/bmx7/pid)/status |grep -i VmSize | tr -s " " | cut -d " " -f 2,3 | tr -d "\n"
-       echo '"}}'
-}
-
-print_query() {
-       # If the query is a directory
-       [ -d "$BMX7_DIR/$1" ] &&
-        {
-       # If /all has not been specified
-               [ -z "$QALL" ] &&
-               {
-               total=$(ls $BMX7_DIR/$1 | wc -w)
-               i=1
-               echo -n "{ \"$1\": [ "
-               for f in $(ls $BMX7_DIR/$1); do
-                       echo -n "{ \"name\": \"$f\" }"
-                       [ $i -lt $total ]  && echo -n ','
-                       i=$(( $i + 1 ))
-               done
-               echo -n " ] }"
-
-       # If /all has been specified, printing all the files together
-               } || {
-               comma=""
-               echo -n "[ "
-               for entry in "$BMX7_DIR/$1/"*; do
-                       [ -f "$entry" ] &&
-                       {
-                               ${comma:+echo "$comma"}
-                               tr -d '\n' < "$entry"
-                               comma=","
-                       }
-               done
-               echo -n " ]"
-               }
-        }
-
-       # If the query is a file, just printing the file
-       [ -f "$BMX7_DIR/$1" ] && cat "$BMX7_DIR/$1";
-}
-
-if [ "${QUERY##*/}" == "all" ]; then
-       QUERY="${QUERY%/all}"
-       QALL=1
-fi
-
-if [ "$QUERY" == '$info' ]; then
-       echo '{ "info": [ '
-       print_query status
-       echo -n ","
-       print_query interfaces
-       echo -n ","
-       print_query links
-       echo -n ","
-       print_mem
-       echo "] }"
-fi
-
-if [ "$QUERY" == '$neighbours' ]; then
-       QALL=1
-       echo '{ "neighbours": [ '
-       echo '{ "originators": '
-       print_query originators
-       echo '}, '
-       echo '{ "descriptions": '
-       print_query descriptions
-       echo "} ] }"
-       exit 0
-
-else if [ "$QUERY" == '$tunnels' ]; then
-       bmx7 -c --jshow tunnels /r=0
-       exit 0
-
-       else if [ "$QUERY" == '$originators' ]; then
-               bmx7 -c --jshow originators /r=0
-               exit 0
-
-               else
-               check_path "$BMX7_DIR/$QUERY"
-               print_query $QUERY
-               exit 0
-               fi
-       fi
-fi
-fi
-
-ls -1F "$BMX7_DIR"
-exit 0
-
diff --git a/luci-app-bmx7/files/www/luci-static/resources/bmx7/bmx7logo.png b/luci-app-bmx7/files/www/luci-static/resources/bmx7/bmx7logo.png
deleted file mode 100644 (file)
index c7d9cea..0000000
Binary files a/luci-app-bmx7/files/www/luci-static/resources/bmx7/bmx7logo.png and /dev/null differ
diff --git a/luci-app-bmx7/files/www/luci-static/resources/bmx7/js/polling.js b/luci-app-bmx7/files/www/luci-static/resources/bmx7/js/polling.js
deleted file mode 100644 (file)
index 4a382eb..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
-    Copyright © 2011 Pau Escrich <pau@dabax.net>
-    Contributors Lluis Esquerda <eskerda@gmail.com>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-    The full GNU General Public License is included in this distribution in
-    the file called "COPYING".
-*/
-
-
-/*
-       Table pooler is a function to easy call XHR poller. 
-
-       new TablePooler(5,"/cgi-bin/bmx7-info", {'status':''}, "status_table", function(st){
-               var table = Array()
-               table.push(st.first,st.second)
-               return table
-       }
-
-       The parameters are: 
-               polling_time: time between pollings
-               json_url: the json url to fetch the data
-               json_call: the json call
-               output_table_id: the table where javascript will put the data
-               callback_function: the function that will be executed each polling_time
-       
-       The callback_function must return an array of arrays (matrix).
-       In the code st is the data obtained from the json call
-*/
-
-function TablePooler (time, jsonurl, getparams, table_id, callback) {
-       this.table = document.getElementById(table_id);
-       this.callback = callback;
-       this.jsonurl = jsonurl;
-       this.getparams = getparams;
-       this.time = time;
-
-       /* clear all rows */
-       this.clear = function(){
-               while( this.table.rows.length > 1 ) this.table.deleteRow(1);
-       }
-
-       this.start = function(){
-               XHR.poll(this.time, this.jsonurl, this.getparams, function(x, st){
-                       var data = this.callback(st);
-                       var content, tr, td;
-                       this.clear();
-                       for (var i = 0; i < data.length; i++){
-                               tr = this.table.insertRow(-1);
-                               tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
-                               for (var j = 0; j < data[i].length; j++){
-                                       td = tr.insertCell(-1);
-                                       if (data[i][j].length == 2) {
-                                               td.colSpan = data[i][j][1];
-                                               content = data[i][j][0];
-                                       }
-                                       else content = data[i][j];
-                                       td.innerHTML = content;
-                               }
-                       }
-               }.bind(this));
-       }
-
-
-       this.start();
-}
diff --git a/luci-app-bmx7/files/www/luci-static/resources/bmx7/world.png b/luci-app-bmx7/files/www/luci-static/resources/bmx7/world.png
deleted file mode 100644 (file)
index 29b53c9..0000000
Binary files a/luci-app-bmx7/files/www/luci-static/resources/bmx7/world.png and /dev/null differ
diff --git a/luci-app-bmx7/files/www/luci-static/resources/bmx7/world_small.png b/luci-app-bmx7/files/www/luci-static/resources/bmx7/world_small.png
deleted file mode 100644 (file)
index f5f3105..0000000
Binary files a/luci-app-bmx7/files/www/luci-static/resources/bmx7/world_small.png and /dev/null differ
index 9c92151ed89554cd0f349d45e6c865609d91745e..0b6485a1264a5f18d1972928a3a503ec4490b63a 100644 (file)
@@ -18,9 +18,10 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=luci-app-cjdns
 PKG_VERSION:=1.3
-PKG_RELEASE:=6
+PKG_RELEASE:=9
 
-PKG_LICENSE:=GPL-3.0
+PKG_MAINTAINER:=William Fleurant <meshnet@protonmail.com>
+PKG_LICENSE:=GPL-3.0-or-later
 
 include $(INCLUDE_DIR)/package.mk
 
@@ -30,16 +31,13 @@ define Package/luci-app-cjdns
        SUBMENU:=3. Applications
        TITLE:=Encrypted near-zero-conf mesh routing protocol
        URL:=https://github.com/cjdelisle/cjdns
-       MAINTAINER:=Lars Gierth <larsg@systemli.org>
-       DEPENDS:=+cjdns +luci-base
+       DEPENDS:=+cjdns +luci-compat +luci-base
 endef
 
 define Package/luci-app-cjdns/description
-       This package allows you to configure and inspect cjdns networking using LuCI.
-
-       Cjdns implements an encrypted IPv6 network using public-key cryptography
-       for address allocation and a distributed hash table for routing.
-       This provides near-zero-configuration networking, and prevents many
+       Cjdns implements an encrypted IPv6 network using public-key cryptography \
+       for address allocation and a distributed hash table for routing. \
+       This provides near-zero-configuration networking, and prevents many \
        of the security and scalability issues that plague existing networks.
 endef
 
@@ -47,8 +45,9 @@ define Build/Compile
 endef
 
 define Package/luci-app-cjdns/install
-       $(INSTALL_DIR) $(1)/usr/lib/lua/luci
+       $(INSTALL_DIR) $(1)/usr/lib/lua/luci $(1)/usr/share/rpcd/acl.d
        $(CP) ./luasrc/* $(1)/usr/lib/lua/luci
+       $(CP) ./files/luci-app-cjdns.json $(1)/usr/share/rpcd/acl.d
 endef
 
 $(eval $(call BuildPackage,luci-app-cjdns))
diff --git a/luci-app-cjdns/files/luci-app-cjdns.json b/luci-app-cjdns/files/luci-app-cjdns.json
new file mode 100644 (file)
index 0000000..5ec2170
--- /dev/null
@@ -0,0 +1,15 @@
+{
+        "luci-app-cjdns": {
+                "description": "Grant access to LuCI app cjdns",
+                "read": {
+                        "uci": [ "cjdns" ]
+                },
+                "write": {
+                        "file": {
+                                "/usr/bin/cjdrouteconf": [ "exec" ]
+                        },
+                        "uci": [ "cjdns" ]
+                }
+        }
+}
+
index 2b1fc1be95e2682826e5cbebcf977c514f106404..3526afe03f2766814d337c9ed50182a1d4446ce2 100644 (file)
@@ -70,4 +70,13 @@ eth_peers:option(Value, "address", translate("MAC address")).datatype = "macaddr
 eth_peers:option(Value, "public_key", translate("Public key"))
 eth_peers:option(Value, "password", translate("Password"))
 
+-- Supernodes
+supernodes = m:section(TypedSection, "supernodes", translate("List of Supernodes"),
+  translate("If none are specified they'll be taken from your peers"))
+supernodes.anonymous = true
+supernodes.addremove = true
+supernodes.template  = "cbi/tblsection"
+
+supernodes:option(Value, "public_key", translate("Public Key")).size = 55
+
 return m
diff --git a/luci-app-olsrd2/Makefile b/luci-app-olsrd2/Makefile
new file mode 100644 (file)
index 0000000..a14543e
--- /dev/null
@@ -0,0 +1,57 @@
+# call BuildPackage - OpenWrt buildroot signature
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=luci-app-olsrd2
+PKG_VERSION:=0.2.6
+PKG_RELEASE:=16
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/luci-app-olsrd2
+  SECTION:=luci
+  CATEGORY:=LuCI
+  SUBMENU:=3. Applications
+  TITLE:=OLSR2 configuration and status module
+  MAINTAINER:=Patrick Grimm <patrick@lunatiki.de>
+  EXTRA_DEPENDS:=oonf-olsrd2, luci-mod-admin-full
+  PKGARCH:=all
+endef
+
+define Build/Prepare
+endef
+
+define Build/Configure
+endef
+
+define Build/Compile
+endef
+
+define Package/$(PKG_NAME)/postinst
+#!/bin/sh
+if [ -z $${IPKG_INSTROOT} ] ; then
+       rm -f /tmp/luci-indexcache
+       rm -rf /tmp/luci-modulecache/
+       killall -HUP rpcd 2>/dev/null
+fi
+endef
+
+define Package/$(PKG_NAME)/install
+       $(INSTALL_DIR) $(1)/www/luci-static/resources/view/olsrd2
+       $(INSTALL_DATA) ./htdocs/cgi-bin-olsrd2-neigh.html $(1)/www
+       $(INSTALL_DATA) ./htdocs/luci-static/resources/view/olsrd2/* $(1)/www/luci-static/resources/view/olsrd2
+       $(INSTALL_DIR) $(1)/etc/config
+       $(INSTALL_DATA) ./root/etc/config/* $(1)/etc/config
+       $(INSTALL_DIR) $(1)/usr/share/ucitrack
+       $(INSTALL_DATA) ./root/usr/share/ucitrack/luci-app-olsrd2.json $(1)/usr/share/ucitrack
+       $(INSTALL_DIR) $(1)/usr/libexec/rpcd
+       $(INSTALL_BIN) ./root/usr/libexec/rpcd/status.olsrd2 $(1)/usr/libexec/rpcd/status.olsrd2
+       $(INSTALL_DIR) $(1)/usr/share/luci/menu.d
+       $(INSTALL_DATA) ./root/usr/share/luci/menu.d/* $(1)/usr/share/luci/menu.d
+       $(INSTALL_DIR) $(1)/usr/share/rpcd/acl.d
+       $(INSTALL_DATA) ./root/usr/share/rpcd/acl.d/* $(1)/usr/share/rpcd/acl.d
+       $(INSTALL_DIR) $(1)/lib/functions
+       $(INSTALL_DATA) ./root/lib/functions/* $(1)/lib/functions
+endef
+
+$(eval $(call BuildPackage,luci-app-olsrd2))
diff --git a/luci-app-olsrd2/htdocs/cgi-bin-olsrd2-neigh.html b/luci-app-olsrd2/htdocs/cgi-bin-olsrd2-neigh.html
new file mode 100644 (file)
index 0000000..849f55e
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="refresh" content="0; URL=/cgi-bin/luci/public/status/olsrd2/neighbors" />
+</head>
+<body style="background-color: black">
+<a style="color: white; text-decoration: none" href="/cgi-bin/luci/public/status/olsrd2/neighbors">LuCI - Lua Configuration Interface</a>
+</body>
+</html>
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/attachednetwork.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/attachednetwork.js
new file mode 100644 (file)
index 0000000..af4703b
--- /dev/null
@@ -0,0 +1,51 @@
+'use strict';
+'require view';
+'require ui';
+'require rpc';
+'require poll';
+
+var callgetData = rpc.declare({
+       object: 'status.olsrd2',
+       method: 'getAttached_network'
+});
+
+function createTable(data) {
+    let tableData = [];
+    data.attached_network.forEach(row => {
+               let node = E('a',{ 'href': 'https://' + row.node + '/cgi-bin-olsrd2-neigh.html'},row.node);
+        tableData.push([
+            node,
+            row.attached_net,
+            row.attached_net_src,
+            row.domain_metric_out
+        ])
+    });
+    return tableData;
+}
+
+return view.extend({
+       title: _('OLSRD2 networks'),
+       handleSaveApply: null,
+       handleSave: null,
+       handleReset: null,
+
+       render: function(data) {
+
+               var tr = E('table', { 'class': 'table' });
+               tr.appendChild(E('div', { 'class': 'tr cbi-section-table-titles' }, [
+                       E('th', { 'class': 'th left' }, [ 'IP address' ]),
+                       E('th', { 'class': 'th left' }, [ 'Network' ]),
+                       E('th', { 'class': 'th left' }, [ 'Source' ]),
+                       E('th', { 'class': 'th left' }, [ 'Metric' ])
+               ]));
+        poll.add(() => {
+            Promise.all([
+                               callgetData()
+            ]).then((results) => {
+                cbi_update_table(tr, createTable(results[0]));
+            })
+        }, 30);
+        return tr
+       }
+
+});
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/domain.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/domain.js
new file mode 100644 (file)
index 0000000..ea9597b
--- /dev/null
@@ -0,0 +1,32 @@
+'use strict';
+'require view';
+'require form';
+
+return view.extend({
+       render: function() {
+               var m, s, o;
+
+               m = new form.Map('olsrd2', 'OLSRD2 Daemon');
+
+               s = m.section(form.TypedSection, 'domain', _('domain configuration section'));
+               s.anonymous = true;
+               s.addremove = false;
+               o = s.option(form.Value, "table", _("table defines the routing table for the local routing entries."), "0-254");
+               o.optional = true;
+               o.placeholder = 254;
+               o.datatype = "range(0,254)";
+               o = s.option(form.Value, "protocol", _("protocol defines the protocol number for the local routing entries."), "0-254");
+               o.optional = true;
+               o.placeholder = 100;
+               o.datatype = "range(0,254)";
+               o = s.option(form.Value, "distance", _("distance defines the 'metric' (hopcount) of the local routing entries."), "0-254");
+               o.optional = true;
+               o.placeholder = 2;
+               o.datatype = "range(0,254)";
+               o = s.option(form.Flag, "srcip_routes", _("srcip_routes defines if the router sets the originator address as the source-ip entry into the local routing entries."), "");
+               o.optional = true;
+               o.datatype = "bool";
+
+               return m.render();
+       }
+});
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/global.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/global.js
new file mode 100644 (file)
index 0000000..d3a9e27
--- /dev/null
@@ -0,0 +1,32 @@
+'use strict';
+'require view';
+'require form';
+
+return view.extend({
+       render: function() {
+               var m, s, o;
+
+               m = new form.Map('olsrd2', 'OLSRD2 Daemon');
+
+               s = m.section(form.TypedSection, 'global', _('It controls the basic behavior of the OONF core.'));
+               s.anonymous = true;
+               s.addremove = false;
+
+               o = s.option(form.Flag, "failfast", _("failfast is another boolean setting which can activate an error during startup if a requested plugin does not load or an unknown configuration variable is set."), "");
+               o.optional = true;
+               o.rmempty = true;
+               o.datatype = 'bool';
+               o = s.option(form.Value, "pidfile", _("pidfile is used together with the fork option to store the pid of the background process in a file."), "Filename");
+               o.optional = true;
+               o.rmempty = true;
+               o.placeholder = '/var/run/olsrd2.pid';
+               o.datatype = 'string';
+               o = s.option(form.Value, "lockfile", _("lockfile creates a file on disk and keeps a lock on it as long as the OONF application is running to prevent the application from running multiple times at once."), "Filename");
+               o.rmempty = false;
+               o.optional = true;
+               o.placeholder = "/var/lock/olsrd2";
+               o.datatype = "string";
+
+               return m.render();
+       }
+});
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/interface.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/interface.js
new file mode 100644 (file)
index 0000000..26e0a89
--- /dev/null
@@ -0,0 +1,103 @@
+'use strict';
+'require view';
+'require form';
+'require tools.widgets as widgets';
+
+return view.extend({
+       render: function() {
+               var m, s, o;
+
+               m = new form.Map('olsrd2', 'OLSRD2 Daemon');
+               m.tabbed = true;
+               s = m.section(form.GridSection, 'interface', _('interface configuration section'));
+               s.anonymous = true;
+               s.addremove = true;
+               s.addbtntitle = _('Add new interface...');
+               s.tab('general', _('General Settings'));
+               s.tab('oonf', _('OONF RFC5444 Plugin'));
+               s.tab('nhdp', _('NHDP Plugin'));
+               s.tab('link', _('Link Config Plugin'));
+               s.modaltitle = function(section_id) {
+                       return _('Interfaces') + ' » ' + section_id.toUpperCase();
+               };
+
+               o = s.taboption("general", form.Flag, "ignore", _("Enabled"));
+               o.enabled = "0";
+               o.disabled = "1";
+               o.rmempty = false;
+               o = s.taboption("general", form.Value, "ifname", _("Network"), _("The interface OLSR2 should serve."));
+               o.datatype = "string";
+               o = s.taboption("oonf", form.DynamicList, "acl", _("acl defines the IP addresses that are allowed to use the RFC5444 socket."), _("ip6prefix, ip4prefix, default_accept, default_reject"));
+               o.datatype = "string";
+               o.optional = true;
+               o.modalonly = true;
+               o = s.taboption("oonf", form.DynamicList, "bindto", _("bindto defines the IP addresses which the RFC5444 socket will be bound to."), _("ip6prefix, ip4prefix, default_accept, default_reject"));
+               o.datatype = "string";
+               o.optional = true;
+               o.modalonly = true;
+               o = s.taboption("oonf", form.Value, "multicast_v4", _("multicast_v4 defines the IPv4 multicast address used for RFC5444 packets."), _("ip4addr"));
+               o.datatype = "ip4addr";
+               o.placeholder = "224.0.0.109";
+               o.optional = true;
+               o.modalonly = true;
+               o = s.taboption("oonf", form.Value, "multicast_v6", _("multicast_v6 defines the IPv6 multicast address used for RFC5444 packets."), _("ip6addr"));
+               o.datatype = "ip6addr";
+               o.placeholder = "ff02::6d";
+               o.optional = true;
+               o.modalonly = true;
+               o = s.taboption("oonf", form.Value, "dscp", _("dscp defines the DSCP value set for each outgoing RFC5444 packet. The value must be between 0 and 252 without fractional digits. The value should be a multiple of 4."), _("0-255"));
+               o.optional = true;
+               o.placeholder = 192;
+               o.datatype = "range(0,255)";
+               o.modalonly = true;
+               o = s.taboption("oonf", form.Value, "rawip", _("rawip defines if the interface should put RFC5444 packets directly into IP headers (skipping the UDP header)."), _("bool"));
+               o.optional = true;
+               o.rmempty = true;
+               o.datatype = "bool";
+               o.modalonly = true;
+               o = s.taboption("nhdp", form.DynamicList, "ifaddr_filter", _("ifaddr_filter defines the IP addresses that are allowed to NHDP interface addresses."), _("ip6prefix, ip4prefix, default_accept, default_reject"));
+               o.datatype = "string";
+               o.optional = true;
+               o.modalonly = true;
+               o = s.taboption("nhdp", form.Value, "hello_validity", _("hello_validity defines the time the local HELLO messages will be valid for the neighbors."), _(">0.1 s"));
+               o.optional = true;
+               o.placeholder = 20.0;
+               o.datatype = "and(min(0.1), ufloat)";
+               o.modalonly = true;
+               o = s.taboption("nhdp", form.Value, "hello_interval", _("hello_interval defines the time between two HELLO messages on the interface."), _(">0.1 s"));
+               o.optional = true;
+               o.placeholder = 2.0;
+               o.datatype = "and(min(0.1), ufloat)";
+               o.modalonly = true;
+               o = s.taboption("link", form.Value, "rx_bitrate", _("rx_bitrate"));
+               o.optional = true;
+               o.rmempty = false;
+               o.placeholder = "1G";
+               o.datatype = "string";
+               o = s.taboption("link", form.Value, "tx_bitrate", _("tx_bitrate"));
+               o.optional = true;
+               o.rmempty = false;
+               o.placeholder = "1G";
+               o.datatype = "string";
+               o = s.taboption("link", form.Value, "rx_max_bitrate", _("rx_max_bitrate"));
+               o.optional = true;
+               o.rmempty = false;
+               o.placeholder = "1G";
+               o.datatype = "string";
+               o.modalonly = true;
+               o = s.taboption("link", form.Value, "tx_max_bitrate", _("tx_max_bitrate"));
+               o.optional = true;
+               o.rmempty = false;
+               o.placeholder = "1G";
+               o.datatype = "string";
+               o.modalonly = true;
+               o = s.taboption("link", form.Value, "rx_signal", _("rx_signal"));
+               o.optional = true;
+               o.rmempty = false;
+               o.placeholder = "1G";
+               o.datatype = "string";
+               o.modalonly = true;
+
+               return m.render();
+       }
+});
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/lan_import.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/lan_import.js
new file mode 100644 (file)
index 0000000..3839f7b
--- /dev/null
@@ -0,0 +1,25 @@
+'use strict';
+'require view';
+'require form';
+
+return view.extend({
+       render: function() {
+               var m, s, o;
+
+               m = new form.Map('olsrd2', 'OLSRD2 Daemon');
+
+               s = m.section(form.TypedSection, 'lan_import', _('Automatic import of routing tables as locally attached networks.'));
+               s.anonymous = true;
+               s.addremove = true;
+               o = s.option(form.Value, "name", _("Name"), "Text");
+               o.datatype = "string";
+               o = s.option(form.Value, "interface", _("Interface"), "Name Interface");
+               o.datatype = "string";
+               o = s.option(form.Value, "table", _("IP Table"), "1-255");
+               o.datatype = "range(1,255)";
+               o = s.option(form.Value, "protocol", _("IP protocol"), "1-255");
+               o.datatype = "range(1,255)";
+
+               return m.render();
+       }
+});
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/log.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/log.js
new file mode 100644 (file)
index 0000000..f8fe2b5
--- /dev/null
@@ -0,0 +1,37 @@
+'use strict';
+'require view';
+'require form';
+
+return view.extend({
+       render: function() {
+               var m, s, o;
+
+               m = new form.Map('olsrd2', 'OLSRD2 Daemon');
+
+               s = m.section(form.TypedSection, 'log', _('OONF Logging'));
+               s.anonymous = true;
+               s.addremove = false;
+
+               o = s.option(form.Flag, "syslog", _("syslog are boolean options that activate or deactivate the syslog Logging Target."), "");
+               o.optional = true;
+               o.datatype = "bool";
+               o = s.option(form.Flag, "stderr", _("stderr are boolean options that activate or deactivate the stderr Logging Target."), "");
+               o.optional = true;
+               o.datatype = "bool";
+               o = s.option(form.Value, "file", _("file asks for a filename for logging output"),"Filename");
+               o.rmempty = false;
+               o.optional = true;
+               o.placeholder = "/tmp/olsrd2.log";
+               o.datatype = "string";
+               o = s.option(form.Value, "debug", _("debug ask for a list of Logging Sources that will be logged by the OONF Core Logging Targets."));
+               o.rmempty = false;
+               o.optional = true;
+               o.datatype = "string";
+               o = s.option(form.Value, "info", _("info ask for a list of Logging Sources that will be logged by the OONF Core Logging Targets."));
+               o.rmempty = false;
+               o.optional = true;
+               o.datatype = "string";
+
+               return m.render();
+       }
+});
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/luci.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/luci.js
new file mode 100644 (file)
index 0000000..7348040
--- /dev/null
@@ -0,0 +1,22 @@
+'use strict';
+'require view';
+'require form';
+
+return view.extend({
+       render: function() {
+               var m, s, o;
+
+               m = new form.Map('luci_olsrd2', 'Luci options');
+
+               s = m.section(form.TypedSection, 'olsrd2', _('LUCI'));
+               s.anonymous = true;
+               s.addremove = false;
+
+               o = s.option(form.Flag, "resolve", _("do Hostname lookup"), "");
+               o.datatype = "bool";
+               o = s.option(form.Value, "domain", _("optional Public domain forwarding with dnsmasq-full (auth-zone=example.com) on the internetgateway "), "default is olsr");
+               o.datatype = "string";
+
+               return m.render();
+       }
+});
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/mesh.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/mesh.js
new file mode 100644 (file)
index 0000000..763068b
--- /dev/null
@@ -0,0 +1,29 @@
+'use strict';
+'require view';
+'require form';
+
+return view.extend({
+       render: function() {
+               var m, s, o;
+
+               m = new form.Map('olsrd2', 'OLSRD2 Daemon');
+
+               s = m.section(form.TypedSection, 'mesh', _('mesh configuration section'));
+               s.anonymous = true;
+               s.addremove = false;
+               o = s.option(form.Value, "port", _("port defines the UDP port number of the RFC5444 socket."), "1-65535");
+               o.optional = true;
+               o.placeholder = 269;
+               o.datatype = "range(1,65535)";
+               o = s.option(form.Value, "ip_proto", _("ip_proto defines the IP protocol number that can be used for RFC5444 communication."), "1-255");
+               o.optional = true;
+               o.placeholder = 138;
+               o.datatype = "range(1,255)";
+               o = s.option(form.Value, "aggregation_interval", _("aggregation_interval defines the time the local RFC5444 implementation will keep messages to aggregate them before creating a new RFC5444 packet to forward them."), ">0.1 s");
+               o.optional = true;
+               o.placeholder = 1.0;
+               o.datatype = "and(min(0.1), ufloat)";
+
+               return m.render();
+       }
+});
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/neighbors.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/neighbors.js
new file mode 100644 (file)
index 0000000..e38af4a
--- /dev/null
@@ -0,0 +1,58 @@
+'use strict';
+'require view';
+'require ui';
+'require rpc';
+'require poll';
+
+var callgetData = rpc.declare({
+       object: 'status.olsrd2',
+       method: 'getNeighbors'
+});
+
+function createTable(data) {
+    let tableData = [];
+    data.neighbors.forEach(row => {
+               let hostname = E('a',{ 'href': 'https://' + row.hostname + '/cgi-bin-olsrd2-neigh.html'},row.hostname);
+               let orginator = E('a',{ 'href': 'https://[' + row.originator + ']/cgi-bin-olsrd2-neigh.html'},row.originator);
+        tableData.push([
+            hostname,
+            orginator,
+            row.lladdr,
+            row.interface,
+            row.metric_in,
+            row.metric_in_raw
+        ])
+    });
+    return tableData;
+};
+
+return view.extend({
+       title: _('OLSRD2 mesh neighbors'),
+       handleSaveApply: null,
+       handleSave: null,
+       handleReset: null,
+
+
+       render: function(data) {
+
+               var tr = E('table', { 'class': 'table' });
+               tr.appendChild(E('tr', { 'class': 'tr cbi-section-table-titles' }, [
+                       E('th', { 'class': 'th left' }, [ 'Hostname' ]),
+                       E('th', { 'class': 'th left' }, [ 'Orginator' ]),
+                       E('th', { 'class': 'th left' }, [ 'MAC' ]),
+                       E('th', { 'class': 'th left' }, [ 'Interface' ]),
+                       E('th', { 'class': 'th left' }, [ 'Metric' ]),
+                       E('th', { 'class': 'th left' }, [ 'raw' ])
+               ]));
+        poll.add(() => {
+            Promise.all([
+                               callgetData()
+            ]).then((results) => {
+                cbi_update_table(tr, createTable(results[0]));
+            })
+        }, 30);
+        return tr
+
+       }
+
+});
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/node.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/node.js
new file mode 100644 (file)
index 0000000..982d5a5
--- /dev/null
@@ -0,0 +1,46 @@
+'use strict';
+'require view';
+'require ui';
+'require rpc';
+'require poll';
+
+var callgetData = rpc.declare({
+       object: 'status.olsrd2',
+       method: 'getNode'
+});
+
+function createTable(data) {
+    let tableData = [];
+    data.node.forEach(row => {
+               let node = E('a',{ 'href': 'https://' + row.node + '/cgi-bin-olsrd2-neigh.html'},row.node);
+        tableData.push([
+            node
+        ])
+    });
+    return tableData;
+};
+
+return view.extend({
+       title: _('OLSRD2 mesh nodes'),
+       handleSaveApply: null,
+       handleSave: null,
+       handleReset: null,
+
+       render: function(data) {
+
+               var tr = E('table', { 'class': 'table' });
+               tr.appendChild(E('tr', { 'class': 'tr cbi-section-table-titles' }, [
+                       E('th', { 'class': 'th left' }, [ 'IP Address' ])
+               ]));
+        poll.add(() => {
+            Promise.all([
+                               callgetData()
+            ]).then((results) => {
+                cbi_update_table(tr, createTable(results[0]));
+            })
+        }, 30);
+
+               return tr;
+       }
+
+});
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/olsrv2.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/olsrv2.js
new file mode 100644 (file)
index 0000000..ae12e33
--- /dev/null
@@ -0,0 +1,60 @@
+'use strict';
+'require view';
+'require form';
+
+return view.extend({
+       render: function() {
+               var m, s, o;
+
+               m = new form.Map('olsrd2', 'OLSRD2 Daemon');
+
+               s = m.section(form.TypedSection, 'olsrv2', _('the OLSRv2 implementation including the OLSRv2 API for other plugins.'));
+               s.anonymous = true;
+               s.addremove = false;
+
+               o = s.option(form.Value, "tc_interval", _("defines the time between two TC messages."), "s");
+               o.optional = true;
+               o.placeholder = 5.0;
+               o.datatype = "ufloat";
+               o = s.option(form.Value, "tc_validity", _("tc_validity defines the validity time of the TC messages."), "s");
+               o.optional = true;
+               o.placeholder = 300.0;
+               o.datatype = "ufloat";
+               o = s.option(form.Value, "forward_hold_time", _("forward_hold_time defines the time until the router will forget an entry in its forwarding duplicate database."), "s");
+               o.optional = true;
+               o.placeholder = 300.0;
+               o.datatype = "ufloat";
+               o = s.option(form.Value, "processing_hold_time", _("processing_hold_time defines the time until the router will forget an entry in its processing duplicate database."), "s");
+               o.optional = true;
+               o.placeholder = 300.0;
+               o.datatype = "ufloat";
+               o = s.option(form.DynamicList, "routable", _("routable defines the ACL which declares an IP address routable. Other IP addresses will not be included in TC messages."), "ip6prefix, ip4prefix, default_accept, default_reject");
+               o.datatype = "string";
+//TODO
+//svc.datatype = "or(negm(ip6addr), negm(ip4addr), 'default_accept', 'default_reject')"
+//modules/luci-base/htdocs/luci-static/resources/cbi.js:545
+//                     negm: function() {
+//                     return this.apply('or', this.value.replace(/^[ \t]*-[ \t]*/, ''), arguments);
+//             },
+       //modules/luci-base/luasrc/cbi/datatypes.lua:51
+//function negm(v, ...)
+//     return _M['or'](v:gsub("^%s*-%s*", ""), ...)
+//end
+               o.optional = true;
+               o = s.option(form.DynamicList, "originator", _("originator defines the ACL which declares a valid originator IP address for the router."), "ip6prefix, ip4prefix, default_accept, default_reject");
+               o.datatype = "string";
+//TODO
+//svc.datatype = "or(negm(ip6addr), negm(ip4addr), 'default_accept', 'default_reject')"
+//modules/luci-base/htdocs/luci-static/resources/cbi.js:545
+//                     negm: function() {
+//                     return this.apply('or', this.value.replace(/^[ \t]*-[ \t]*/, ''), arguments);
+//             },
+       //modules/luci-base/luasrc/cbi/datatypes.lua:51
+//function negm(v, ...)
+//     return _M['or'](v:gsub("^%s*-%s*", ""), ...)
+//end
+               o.optional = true;
+
+               return m.render();
+       }
+});
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/olsrv2_lan.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/olsrv2_lan.js
new file mode 100644 (file)
index 0000000..f846c77
--- /dev/null
@@ -0,0 +1,32 @@
+'use strict';
+'require view';
+'require form';
+
+return view.extend({
+       render: function() {
+               var m, s, o;
+
+               m = new form.Map('olsrd2', 'OLSRD2 Daemon');
+
+               s = m.section(form.TypedSection, 'olsrv2_lan', _('Prefix configuration section'));
+               s.anonymous = true;
+               s.addremove = true;
+               o = s.option(form.Value, "name", _("Name"), "Text");
+               o.datatype = "string";
+               o = s.option(form.Value, "prefix", _("locally attached network prefix"), "");
+               o.datatype = "string";
+               o = s.option(form.Value, "domain", _("domain for this LAN entry, -1 for all domains"), "-1-254");
+               o.optional = true;
+               o.placeholder = -1;
+               o.datatype = "range(-1,254)";
+               o = s.option(form.Value, "metric", _("metric value for this LAN entry"), "0-254");
+               o.optional = true;
+               o.placeholder = 2;
+               o.datatype = "range(0,254)";
+               o = s.option(form.Flag, "source_prefix", _("source prefix for lan (source specific routing)"), "");
+               o.optional = true;
+               o.datatype = "bool";
+
+               return m.render();
+       }
+});
diff --git a/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/overview.js b/luci-app-olsrd2/htdocs/luci-static/resources/view/olsrd2/overview.js
new file mode 100644 (file)
index 0000000..8986359
--- /dev/null
@@ -0,0 +1,82 @@
+'use strict';
+'require view';
+'require ui';
+'require rpc';
+'require poll';
+
+var callgetVersion = rpc.declare({
+       object: 'status.olsrd2',
+       method: 'getVersion'
+});
+var callgetLan = rpc.declare({
+       object: 'status.olsrd2',
+       method: 'getLan'
+});
+
+function createTable(data) {
+    let tableData = [];
+       if ( data && data.version && data.version[0] ) {
+               if ( data.version[0].version_text != undefined ) {
+                       tableData.push([_('OLSRd2 Version'),data.version[0].version_text]);
+               }
+               if ( data.version[0].version_commit != undefined) {
+                       tableData.push([_('OLSRd2 GIT commit'),data.version[0].version_commit]);
+               }
+       }
+       tableData.push(['']);
+    return tableData;
+}
+
+function createTableDomain(data) {
+    let tableData = [];
+       if ( data && data.lan && data.lan[0] ) {
+               data.lan.forEach(row => {
+                       tableData.push([
+                               row.lan,
+                               row.domain,
+                               row.domain_metric,
+                               row.domain_metric_out,
+                               row.domain_metric_out_raw,
+                               row.domain_distance
+                       ])
+               });
+       }
+    return tableData;
+}
+
+return view.extend({
+       title: _('Version'),
+       handleSaveApply: null,
+       handleSave: null,
+       handleReset: null,
+
+       render: function() {
+
+               var tr = E('table',{ 'class': 'table'});
+               tr.appendChild(E('tr', { 'class': 'tr cbi-section-table-titles' }, [
+                       E('th', { 'class': 'th left' }),
+                       E('th', { 'class': 'th left' })
+               ]));
+               var trd = E('table', { 'class': 'table' });
+               trd.appendChild(E('trd', { 'class': 'tr cbi-section-table-titles' }, [
+                       E('th', { 'class': 'th left' }, [ 'LAN IP' ]),
+                       E('th', { 'class': 'th left' }, [ 'Domain' ]),
+                       E('th', { 'class': 'th left' }, [ 'Domain Metric' ]),
+                       E('th', { 'class': 'th left' }, [ 'Domain Metric out' ]),
+                       E('th', { 'class': 'th left' }, [ 'Domain Metric out' ]),
+                       E('th', { 'class': 'th left' }, [ 'Domain distance' ])
+               ]));
+        poll.add(() => {
+            Promise.all([
+                               callgetVersion(),
+                               callgetLan()
+            ]).then((results) => {
+                cbi_update_table(tr, createTable(results[0]));
+                cbi_update_table(trd, createTableDomain(results[1]));
+            })
+        }, 30);
+
+               return [tr,trd];
+       }
+
+});
diff --git a/luci-app-olsrd2/root/etc/config/luci_olsrd2 b/luci-app-olsrd2/root/etc/config/luci_olsrd2
new file mode 100644 (file)
index 0000000..9935410
--- /dev/null
@@ -0,0 +1,3 @@
+config 'olsrd2' 'general'
+       option 'resolve' '1'
+       option 'domain' 'olsr'
diff --git a/luci-app-olsrd2/root/lib/functions/olsrd2.sh b/luci-app-olsrd2/root/lib/functions/olsrd2.sh
new file mode 100644 (file)
index 0000000..b998073
--- /dev/null
@@ -0,0 +1,61 @@
+# 1: destination variable
+# 2: interface
+# 3: path
+# 4: separator
+# 5: limit
+__network_ifstatus() {
+       local __tmp
+
+       [ -z "$__NETWORK_CACHE" ] && {
+               __tmp="$(ubus call network.interface dump 2>&1)"
+               case "$?" in
+                       4) : ;;
+                       0) export __NETWORK_CACHE="$__tmp" ;;
+                       *) echo "$__tmp" >&2 ;;
+               esac
+       }
+
+       __tmp="$(jsonfilter ${4:+-F "$4"} ${5:+-l "$5"} -s "${__NETWORK_CACHE:-{}}" -e "$1=@.interface${2:+[@.interface='$2']}$3")"
+
+       [ -z "$__tmp" ] && \
+               unset "$1" && \
+               return 1
+
+       eval "$__tmp"
+}
+
+# 1: addr
+# 2: export var neighbour dev lladdr
+network_get_neighbour_by_ip()
+{
+       local __tmp
+       neighbour=''
+       dev=''
+       lladdr=''
+       local ipaddr="$1"
+       hostname=$(nslookup "$ipaddr" "$ipaddr" | grep name | cut -d " " -f 3 | cut -d '.' -f -1)
+       [ -z "$__NEIGH_CACHE" ] && {
+               __tmp="$(ip -6 neigh)"
+               export __NEIGH_CACHE="$__tmp"
+       }
+       [ -z "$__ROUTE_CACHE" ] && {
+               __tmp="$(ip -6 route)"
+               export __ROUTE_CACHE="$__tmp"
+       }
+       local gwaddr=$(echo "$__ROUTE_CACHE" | grep "^$ipaddr" | cut -d ' ' -f 3)
+       [ -z "$gwaddr" ] && return
+       local neigh=$(echo "$__NEIGH_CACHE" | grep "$gwaddr")
+       [ -z "$neigh" ] && return
+       set -- $neigh
+       eval "neighbour=$1;dev=$3;lladdr=$5"
+}
+
+# 1: destination variable
+# 2: addr
+network_get_name_by_device()
+{
+       __network_ifstatus "$1" "" \
+               "[@.device='$2' && !@.table].interface" "" 1 && \
+                       return 0
+}
+
diff --git a/luci-app-olsrd2/root/usr/libexec/rpcd/status.olsrd2 b/luci-app-olsrd2/root/usr/libexec/rpcd/status.olsrd2
new file mode 100644 (file)
index 0000000..fa4d668
--- /dev/null
@@ -0,0 +1,91 @@
+#!/bin/sh
+# Copyright (C) 2016 OpenWrt.org
+
+. /lib/functions.sh
+. /usr/share/libubox/jshn.sh
+. /lib/functions/olsrd2.sh
+
+case "$1" in
+       list)
+               json_init
+
+               json_add_object "getVersion"
+               json_close_object
+               json_add_object "getLan"
+               json_close_object
+               json_add_object "getNode"
+               json_close_object
+               json_add_object "getNeighbors"
+               json_close_object
+               json_add_object "getAttached_network"
+               json_close_object
+               json_add_object "getRoute"
+               json_close_object
+               json_add_object "getGraph"
+               json_close_object
+               json_add_object "getDomain"
+               json_close_object
+
+               json_dump
+       ;;
+       call)
+               case "$2" in
+                       getVersion)
+                               echo '/systeminfo json version /quit' | nc ::1 2009 2>/dev/null
+                       ;;
+                       getLan)
+                               echo '/olsrv2info json lan /quit' | nc ::1 2009 2>/dev/null
+                       ;;
+                       getNode)
+                               echo '/olsrv2info json node /quit' | nc ::1 2009 2>/dev/null
+                       ;;
+                       getNeighbors)
+                               domain="$(uci_get luci_olsr2 general domain)"
+                               [ -z "$domain" ] || domain=".$domain"
+                               json_init
+                               json_add_array "neighbors"
+                               OLDIFS="$IFS"
+                               IFS=$'\n'
+                               neighbor_status="$(echo '/nhdpinfo neighbor /quit' | nc ::1 2009 | cut -f 1,9,10,11,12)"
+                               for neighbor in $neighbor_status; do
+                                       json_add_object 0
+                                       IFS="$OLDIFS"
+                                       i=1
+                                       for value in $neighbor ; do
+                                               case $i in
+                                                       1) json_add_string "originator" "${value}"
+                                                               network_get_neighbour_by_ip "${value}"
+                                                               json_add_string "lladdr" "${lladdr}"
+                                                               json_add_string "hostname" "${hostname}${domain}"
+                                                               network_get_name_by_device interface $dev
+                                                               json_add_string "interface" "${interface}"
+                                                               ;;
+                                                       2) json_add_string "metric_in" "${value}";;
+                                                       3) json_add_string "metric_in_raw" "${value}";;
+                                                       4) json_add_string "metric_out" "${value}";;
+                                                       5) json_add_string "metric_out_raw" "${value}";;
+                                               esac
+                                               i=$(( i + 1 ))
+                                       done
+                                       IFS=$'\n'
+                                       json_close_object
+                               done
+                               IFS="$OLDIFS"
+                               json_close_array
+                               json_dump
+                       ;;
+                       getAttached_network)
+                               echo '/olsrv2info json attached_network /quit' | nc ::1 2009 2>/dev/null
+                       ;;
+                       getRoute)
+                               echo '/netjsoninfo filter route ipv6_0' | nc ::1 2009 2>/dev/null
+                       ;;
+                       getGraph)
+                               echo '/netjsoninfo filter graph ipv6_0' | nc ::1 2009 2>/dev/null
+                       ;;
+                       getDomain)
+                               echo '/netjsoninfo domain' | nc ::1 2009 2>/dev/null
+                       ;;
+               esac
+       ;;
+esac
diff --git a/luci-app-olsrd2/root/usr/share/luci/menu.d/luci-app-olsrd2.json b/luci-app-olsrd2/root/usr/share/luci/menu.d/luci-app-olsrd2.json
new file mode 100644 (file)
index 0000000..ab45e72
--- /dev/null
@@ -0,0 +1,171 @@
+{
+       "admin/services/olsrd2": {
+               "title": "OLSRD2",
+               "action": {
+                       "type": "firstchild"
+               },
+               "depends": {
+                       "acl": [ "luci-app-olsrd2" ]
+               }
+       },
+       "admin/services/olsrd2/global": {
+               "title": "Global",
+               "order": 1,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/global"
+               }
+       },
+       "admin/services/olsrd2/log": {
+               "title": "Logging",
+               "order": 2,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/log"
+               }
+       },
+       "admin/services/olsrd2/olsrv2": {
+               "title": "Daemon",
+               "order": 3,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/olsrv2"
+               }
+       },
+       "admin/services/olsrd2/olsrv2_lan": {
+               "title": "Prefix",
+               "order": 4,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/olsrv2_lan"
+               }
+       },
+       "admin/services/olsrd2/domain": {
+               "title": "Domain",
+               "order": 5,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/domain"
+               }
+       },
+       "admin/services/olsrd2/mesh": {
+               "title": "Mesh",
+               "order": 6,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/mesh"
+               }
+       },
+       "admin/services/olsrd2/lan_import": {
+               "title": "LAN Import",
+               "order": 7,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/lan_import"
+               }
+       },
+       "admin/services/olsrd2/interface": {
+               "title": "Interface",
+               "order": 8,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/interface"
+               }
+       },
+       "admin/services/olsrd2/luci": {
+               "title": "LUCI",
+               "order": 8,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/luci"
+               }
+       },
+       "admin/status/olsrd2": {
+               "title": "OLSRD2",
+               "action": {
+                       "type": "firstchild"
+               }
+       },
+       "admin/status/olsrd2/overview": {
+               "title": "Overview",
+               "order": 1,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/overview"
+               }
+       },
+       "admin/status/olsrd2/node": {
+               "title": "Nodes",
+               "order": 2,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/node"
+               }
+       },
+       "admin/status/olsrd2/attachednetwork": {
+               "title": "Attachednetwork",
+               "order": 3,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/attachednetwork"
+               }
+       },
+       "admin/status/olsrd2/neighbors": {
+               "title": "Neighbors",
+               "order": 4,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/neighbors"
+               }
+       },
+       "public/status": {
+               "title": "Status",
+               "order": 10,
+               "action": {
+                       "type": "firstchild",
+                       "recurse": true
+               },
+               "auth": {}
+       },
+       "public/status/olsrd2": {
+               "title": "OLSRD2",
+               "order": 20,
+               "action": {
+                       "type": "firstchild",
+                       "recurse": true
+               },
+               "auth": {}
+       },
+       "public/status/olsrd2/overview": {
+               "title": "Overview",
+               "order": 4,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/overview"
+               }
+       },
+       "public/status/olsrd2/node": {
+               "title": "Nodes",
+               "order": 2,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/node"
+               }
+       },
+       "public/status/olsrd2/attachednetwork": {
+               "title": "Attachednetwork",
+               "order": 3,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/attachednetwork"
+               }
+       },
+       "public/status/olsrd2/neighbors": {
+               "title": "Neighbors",
+               "order": 1,
+               "action": {
+                       "type": "view",
+                       "path": "olsrd2/neighbors"
+               }
+       }
+}
diff --git a/luci-app-olsrd2/root/usr/share/rpcd/acl.d/luci-app-olsrd2.json b/luci-app-olsrd2/root/usr/share/rpcd/acl.d/luci-app-olsrd2.json
new file mode 100644 (file)
index 0000000..61e8691
--- /dev/null
@@ -0,0 +1,27 @@
+{
+       "unauthenticated": {
+               "description": "Allow system feature probing",
+               "read": {
+                       "file": {
+                               "/www/luci-static/resources/view/olsrd2": [ "list" ]
+                       },
+                       "ubus": {
+                               "status.olsrd2": [ "getVersion", "getLan", "getNode", "getNeighbors", "getAttached_network" ],
+                               "file": [ "list" ]
+
+                       }
+               }
+       },
+       "luci-app-olsrd2": {
+               "description": "Grant UCI access for luci-app-olsrd2",
+               "read": {
+                       "uci": [ "olsrd2" ],
+                       "ubus": {
+                               "status.olsrd2": [ "getVersion", "getLan", "getNode", "getNeighbors", "getAttached_network" ]
+                       }
+               },
+               "write": {
+                       "uci": [ "olsrd2" ]
+               }
+       }
+}
diff --git a/luci-app-olsrd2/root/usr/share/ucitrack/luci-app-olsrd2.json b/luci-app-olsrd2/root/usr/share/ucitrack/luci-app-olsrd2.json
new file mode 100644 (file)
index 0000000..05dbbd8
--- /dev/null
@@ -0,0 +1,4 @@
+{
+       "config": "olsrd2",
+       "init": "olsrd2"
+}
index ca709c812702954d28eed6f5a0b311037f0dd16f..908b6c03b159a799a08fe9e32e32df6aa720e5d0 100644 (file)
@@ -8,17 +8,17 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=mcproxy
-PKG_SOURCE_VERSION:=93b5ace42268160ebbfff4c61818fb15fa2d9b99
-PKG_VERSION:=2017-08-24-$(PKG_SOURCE_VERSION)
-PKG_RELEASE:=1
+PKG_RELEASE:=9
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/mcproxy/mcproxy.git
-PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
-PKG_LICENSE:=GPL-2.0+
+PKG_SOURCE_DATE:=2017-08-24
+PKG_SOURCE_VERSION:=93b5ace42268160ebbfff4c61818fb15fa2d9b99
+PKG_MIRROR_HASH:=1999a4cd799514816159b2bf496e107231f6affbeb0f75a7298f0731e1320018
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
+PKG_LICENSE:=GPL-2.0-or-later
+PKG_LICENSE_FILES:=COPYING
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/cmake.mk
@@ -28,14 +28,14 @@ define Package/mcproxy
   CATEGORY:=Network
   SUBMENU:=Routing and Redirection
   TITLE:=Multicast Proxy for IGMP/MLD
-  URL:=http://mcproxy.realmv6.org
+  URL:=https://mcproxy.realmv6.org
   DEPENDS:=+libpthread +libstdcpp @(!GCC_VERSION_4_4&&!GCC_VERSION_4_6)
 endef
 
 define Package/mcproxy/description
- mcproxy is a free & open source implementation of the IGMP/MLD proxy function (see  RFC 4605) for Linux systems.
- It operates on the kernel tables for multicast routing and allows for multiple instantiations,
- as well as dynamically changing downstream interfaces.
 mcproxy is a free & open source implementation of the IGMP/MLD proxy function (see  RFC 4605) for Linux systems.
 It operates on the kernel tables for multicast routing and allows for multiple instantiations,
 as well as dynamically changing downstream interfaces.
 endef
 
 define Package/mcproxy/conffiles
index 10cc41066aab0a6af24f174280d3e44e27f8dad3..f0287950cfd74eae3d8de576109bff2155ab9b39 100644 (file)
@@ -229,3 +229,11 @@ config behaviour
        option direction 'out'
        option whitelist '1'
        option table '{(*|*)}'
+
+config blocks blocks
+       # mDNS
+       list entries '(*|239.255.255.0/24)'
+       # SSDP
+       list entries '(*|224.0.0.0/24)'
+       # SLP
+       list entries '(*|239.192.0.0/16)'
index 2f64975e47ab51f23750b54d10965c46bbc8c522..a47fcae191cfffc7e111b51a86d1d1536966481d 100644 (file)
@@ -4,7 +4,7 @@
  #include <numeric>
  #include <unistd.h>
  
-+#ifndef __GLIBC__
++#if !defined(__GLIBC__) || defined(__UCLIBC__)
 +#include "sourcefilter.cpp"
 +#endif /* __GLIBC__ */
 +
 +  else
 +    result = setsockopt (s, sol, MCAST_MSFILTER, gf, needed);
 +
-+    int save_errno = errno;
-+    free (gf);
-+    errno = save_errno;
++  int save_errno = errno;
++  free (gf);
++  errno = save_errno;
 +
 +  return result;
 +}
index a1105c9c5dc45b5953c1c1c990e35503d5110c97..19feb8864088fb15e6a8f43d603d003e6f257b05 100644 (file)
@@ -3,7 +3,7 @@
 @@ -38,6 +38,8 @@
  #include <unistd.h>
  
- #ifndef __GLIBC__
+ #if !defined(__GLIBC__) || defined(__UCLIBC__)
 +#define IP_MULTICAST_ALL 49
 +
  #include "sourcefilter.cpp"
diff --git a/mcproxy/patches/0005-fix-match-filter-calls.patch b/mcproxy/patches/0005-fix-match-filter-calls.patch
new file mode 100644 (file)
index 0000000..c6956e0
--- /dev/null
@@ -0,0 +1,46 @@
+--- a/mcproxy/src/proxy/simple_mc_proxy_routing.cpp
++++ b/mcproxy/src/proxy/simple_mc_proxy_routing.cpp
+@@ -118,13 +118,13 @@ void interface_memberships::process_upst
+             for (auto source_it = cs.first.m_source_list.begin(); source_it != cs.first.m_source_list.end();) {
+                 //downstream out
+-                if (!cs.second->match_output_filter(interfaces::get_if_name(upstr_e.m_if_index), gaddr, source_it->saddr)) {
++                if (!cs.second->match_output_filter(interfaces::get_if_name(upstr_e.m_if_index), source_it->saddr, gaddr)) {
+                     source_it = cs.first.m_source_list.erase(source_it);
+                     continue;
+                 }
+                 //upstream in
+-                if (!upstr_e.m_interface->match_input_filter(interfaces::get_if_name(upstr_e.m_if_index), gaddr, source_it->saddr)) {
++                if (!upstr_e.m_interface->match_input_filter(interfaces::get_if_name(upstr_e.m_if_index), source_it->saddr, gaddr)) {
+                     tmp_sstate.m_source_list.insert(*source_it);
+                     source_it = cs.first.m_source_list.erase(source_it);
+                     continue;
+@@ -175,13 +175,13 @@ void interface_memberships::process_upst
+             for (auto source_it = cs_it->first.m_source_list.begin(); source_it != cs_it->first.m_source_list.end();) {
+                 //downstream out
+-                if (!cs_it->second->match_output_filter(interfaces::get_if_name(upstr_e.m_if_index), gaddr, source_it->saddr)) {
++                if (!cs_it->second->match_output_filter(interfaces::get_if_name(upstr_e.m_if_index), source_it->saddr, gaddr)) {
+                     ++source_it;
+                     continue;
+                 }
+                 //upstream in
+-                if (!upstr_e.m_interface->match_input_filter(interfaces::get_if_name(upstr_e.m_if_index), gaddr, source_it->saddr)) {
++                if (!upstr_e.m_interface->match_input_filter(interfaces::get_if_name(upstr_e.m_if_index), source_it->saddr, gaddr)) {
+                     ++source_it;
+                     continue;
+                 }
+@@ -619,9 +619,9 @@ bool simple_mc_proxy_routing::check_inte
+     std::string input_if_index_name = interfaces::get_if_name(input_if_index);
+     if (!input_if_index_name.empty()) {
+         if (interface_direction == ID_IN) {
+-            return interf->match_input_filter(input_if_index_name, gaddr, saddr);
++            return interf->match_input_filter(input_if_index_name, saddr, gaddr);
+         } else if (interface_direction == ID_OUT) {
+-            return interf->match_output_filter(input_if_index_name, gaddr, saddr);
++            return interf->match_output_filter(input_if_index_name, saddr, gaddr);
+         } else {
+             HC_LOG_ERROR("unkown interface direction");
+             return false;
diff --git a/mcproxy/patches/0006-block-ingress.patch b/mcproxy/patches/0006-block-ingress.patch
new file mode 100644 (file)
index 0000000..730c6ce
--- /dev/null
@@ -0,0 +1,88 @@
+--- a/mcproxy/src/proxy/proxy_instance.cpp
++++ b/mcproxy/src/proxy/proxy_instance.cpp
+@@ -171,6 +171,9 @@ void proxy_instance::worker_thread()
+     HC_LOG_TRACE("");
+     while (m_running) {
+         auto msg = m_job_queue.dequeue();
++
++        HC_LOG_DEBUG("Proxy Message: " << msg->get_message_type_name(msg->get_type()) );
++
+         switch (msg->get_type()) {
+         case proxy_msg::TEST_MSG:
+             (*msg)();
+@@ -193,25 +196,66 @@ void proxy_instance::worker_thread()
+         }
+         break;
+         case proxy_msg::GROUP_RECORD_MSG: {
+-            auto r =  std::static_pointer_cast<group_record_msg>(msg);
++            auto gr = std::static_pointer_cast<group_record_msg>(msg);
+             if (m_in_debug_testing_mode) {
+                 std::cout << "!!--ACTION: receive record" << std::endl;
+-                std::cout << *r << std::endl;
++                std::cout << *gr << std::endl;
+                 std::cout << std::endl;
+             }
+-            auto it = m_downstreams.find(r->get_if_index());
++            auto slist = gr->get_slist();
++            addr_storage saddr;
++            if (slist.empty()) {
++                saddr = "0.0.0.0";
++            } else {
++                saddr = slist.begin()->saddr;
++            }
++            auto it = m_downstreams.find(gr->get_if_index());
+             if (it != std::end(m_downstreams)) {
+-                it->second.m_querier->receive_record(msg);
++                // Check for input filters
++                if (!it->second.m_interface->match_input_filter(interfaces::get_if_name(gr->get_if_index()), saddr, gr->get_gaddr()))
++                {
++                    HC_LOG_DEBUG("group report " << gr->get_gaddr() << " filtered");
++                }
++                else
++                {
++                    it->second.m_querier->receive_record(msg);
++                }
+             } else {
+-                HC_LOG_DEBUG("failed to find querier of interface: " << interfaces::get_if_name(std::static_pointer_cast<timer_msg>(msg)->get_if_index()));
++                HC_LOG_DEBUG("failed to find querier of interface: " << interfaces::get_if_name( gr->get_if_index() ));
+             }
+-        }
++              }
++        break;
++        case proxy_msg::NEW_SOURCE_MSG: {
++            auto sm = std::static_pointer_cast<new_source_msg>(msg);
++            // Find the interface
++            std::shared_ptr<interface> interf;
++            auto it = m_downstreams.find(sm->get_if_index());
++            if (it != std::end(m_downstreams)) {
++                interf = it->second.m_interface;
++            } else {
++                for (auto & e : m_upstreams) {
++                    if (e.m_if_index == sm->get_if_index()) {
++                        interf = e.m_interface;
++                        break;
++                    }
++                }
++            }
++            if ( !interf )
++            {
++                HC_LOG_DEBUG("failed to find interface: " << interfaces::get_if_name( sm->get_if_index() ) << " for Source message " << sm->get_saddr()  << " | " << sm->get_gaddr() );
++                break;
++            }
++            // Check for input filters
++            if (!interf->match_input_filter(interfaces::get_if_name(sm->get_if_index()), sm->get_saddr(), sm->get_gaddr()))
++            {
++                HC_LOG_DEBUG("source " << sm->get_saddr()  << " | " << sm->get_gaddr() << " filtered");
++            } else {
++                m_routing_management->event_new_source(msg);
++            }
++              }
+         break;
+-        case proxy_msg::NEW_SOURCE_MSG:
+-            m_routing_management->event_new_source(msg);
+-            break;
+         case proxy_msg::NEW_SOURCE_TIMER_MSG:
+             m_routing_management->timer_triggerd_maintain_routing_table(msg);
+             break;
diff --git a/mcproxy/patches/0007-igmpv2-queries.patch b/mcproxy/patches/0007-igmpv2-queries.patch
new file mode 100644 (file)
index 0000000..005b56d
--- /dev/null
@@ -0,0 +1,116 @@
+--- a/mcproxy/include/proxy/igmp_sender.hpp
++++ b/mcproxy/include/proxy/igmp_sender.hpp
+@@ -37,9 +37,10 @@ class igmp_sender : public sender
+ {
+ private:
+     bool send_igmpv3_query(unsigned int if_index, const timers_values& tv, const addr_storage& gaddr, bool s_flag, const source_list<source>& slist) const;
++    bool send_igmpv2_query(unsigned int if_index, const timers_values& tv, const addr_storage& gaddr ) const;
+ public:
+-    igmp_sender(const std::shared_ptr<const interfaces>& interfaces);
++    igmp_sender(const std::shared_ptr<const interfaces>& interfaces, const group_mem_protocol gmp);
+     bool send_record(unsigned int if_index, mc_filter filter_mode, const addr_storage& gaddr, const source_list<source>& slist) const override;
+--- a/mcproxy/src/proxy/igmp_sender.cpp
++++ b/mcproxy/src/proxy/igmp_sender.cpp
+@@ -32,7 +32,7 @@
+ #include <memory>
+-igmp_sender::igmp_sender(const std::shared_ptr<const interfaces>& interfaces): sender(interfaces, IGMPv3)
++igmp_sender::igmp_sender(const std::shared_ptr<const interfaces>& interfaces, const group_mem_protocol gmp): sender(interfaces, gmp)
+ {
+     HC_LOG_TRACE("");
+@@ -119,10 +119,79 @@ bool igmp_sender::send_mc_addr_and_src_s
+     return rc;
+ }
++bool igmp_sender::send_igmpv2_query(unsigned int if_index, const timers_values& tv, const addr_storage& gaddr ) const
++{
++    HC_LOG_TRACE("");
++
++    std::unique_ptr<unsigned char[]> packet;
++    unsigned int size;
++
++      size = sizeof(ip) + sizeof(router_alert_option) + sizeof(igmp);
++      packet.reset(new unsigned char[size]);
++
++    addr_storage dst_addr;
++
++    if (gaddr == addr_storage(AF_INET)) { //is general query
++        dst_addr = IPV4_ALL_HOST_ADDR;
++    } else {
++        dst_addr = gaddr;
++    }
++
++    //-------------------------------------------------------------------
++    //fill ip header
++    ip* ip_hdr = reinterpret_cast<ip*>(packet.get());
++
++    ip_hdr->ip_v = 4;
++    ip_hdr->ip_hl = (sizeof(ip) + sizeof(router_alert_option)) / 4;
++    ip_hdr->ip_tos = 0;
++    ip_hdr->ip_len = htons(size);
++    ip_hdr->ip_id = 0;
++    ip_hdr->ip_off = htons(0 | IP_DF); //dont fragment flag
++    ip_hdr->ip_ttl = 1;
++    ip_hdr->ip_p = IPPROTO_IGMP;
++    ip_hdr->ip_sum = 0;
++    ip_hdr->ip_src = m_interfaces->get_saddr(interfaces::get_if_name(if_index)).get_in_addr();
++    ip_hdr->ip_dst = dst_addr.get_in_addr();
++
++    //-------------------------------------------------------------------
++    //fill router_alert_option header
++    router_alert_option* ra_hdr = reinterpret_cast<router_alert_option*>(reinterpret_cast<unsigned char*>(ip_hdr) + sizeof(ip));
++    *ra_hdr = router_alert_option();
++
++    ip_hdr->ip_sum = m_sock.calc_checksum(reinterpret_cast<unsigned char*>(ip_hdr), sizeof(ip) + sizeof(router_alert_option));
++
++    //-------------------------------------------------------------------
++    //fill igmpv3 query
++    igmp* query = reinterpret_cast<igmp*>(reinterpret_cast<unsigned char*>(ra_hdr) + sizeof(router_alert_option));
++
++    query->igmp_type = IGMP_MEMBERSHIP_QUERY;
++
++    if (gaddr == addr_storage(AF_INET)) { //general query
++        query->igmp_code = tv.maxrespi_to_maxrespc_igmpv3(tv.get_query_response_interval());
++    } else {
++        query->igmp_code = tv.maxrespi_to_maxrespc_igmpv3(tv.get_last_listener_query_time());
++    }
++
++    query->igmp_cksum = 0;
++    query->igmp_group = gaddr.get_in_addr();
++
++    query->igmp_cksum = m_sock.calc_checksum(reinterpret_cast<unsigned char*>(query), (sizeof(igmp) ));
++
++    if (!m_sock.choose_if(if_index)) {
++        return false;
++    }
++
++    return m_sock.send_packet(dst_addr, reinterpret_cast<unsigned char*>(ip_hdr), size);
++}
++
+ bool igmp_sender::send_igmpv3_query(unsigned int if_index, const timers_values& tv, const addr_storage& gaddr, bool s_flag, const source_list<source>& slist) const
+ {
+     HC_LOG_TRACE("");
++    if ( (m_group_mem_protocol & IGMPv3) == 0 ) {
++              return send_igmpv2_query( if_index, tv, gaddr );
++      }
++
+     std::unique_ptr<unsigned char[]> packet;
+     unsigned int size;
+--- a/mcproxy/src/proxy/proxy_instance.cpp
++++ b/mcproxy/src/proxy/proxy_instance.cpp
+@@ -119,7 +119,7 @@ bool proxy_instance::init_sender()
+ {
+     HC_LOG_TRACE("");
+     if (is_IPv4(m_group_mem_protocol)) {
+-        m_sender = std::make_shared<igmp_sender>(m_interfaces);
++        m_sender = std::make_shared<igmp_sender>(m_interfaces, m_group_mem_protocol );
+     } else if (is_IPv6(m_group_mem_protocol)) {
+         m_sender = std::make_shared<mld_sender>(m_interfaces);
+     } else {
diff --git a/mesh11sd/Makefile b/mesh11sd/Makefile
new file mode 100644 (file)
index 0000000..d932a5c
--- /dev/null
@@ -0,0 +1,66 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+# Copyright (C) 2022 - 2024 BlueWave Projects and Services  <licence@blue-wave.net>
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=mesh11sd
+PKG_VERSION:=3.1.1
+PKG_RELEASE:=1
+
+PKG_MAINTAINER:=Rob White <rob@blue-wave.net>
+PKG_LICENSE:=GPL-2.0-or-later
+PKG_LICENSE_FILES:=LICENSE
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://codeload.github.com/opennds/mesh11sd/tar.gz/v$(PKG_VERSION)?
+PKG_HASH:=98f6c00a510dc102822a75916eb9fbbf97008e34f7226e8d555bc31c46fba187
+PKG_BUILD_DIR:=$(BUILD_DIR)/mesh11sd-$(PKG_VERSION)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/mesh11sd
+  SUBMENU:=Captive Portals
+  SECTION:=net
+  CATEGORY:=Network
+  TITLE:=Dynamic 802.11s Mesh Configuration Daemon
+  PKGARCH:=all
+  URL:=https://github.com/opennds/mesh11sd
+endef
+
+define Package/mesh11sd/description
+  Mesh11sd is a dynamic parameter configuration daemon for 802.11s mesh networks.
+  It was originally designed to leverage 802.11s mesh networking at Captive Portal venues.
+  This is the open source version and it enables easy and automated mesh network operation with multiple mesh nodes.
+  It allows all mesh parameters supported by the wireless driver to be set in the uci config file.
+  Settings take effect immediately without having to restart the wireless network.
+  Default settings give rapid and reliable layer 2 mesh convergence.
+  Without mesh11sd, many mesh parameters cannot be set in the uci wireless config file as the mesh interface must be up before the parameters can be set.
+  Some of those that are supported, would fail to be implemented when the network is (re)started resulting in errors or dropped nodes.
+  The mesh11sd daemon dynamically checks configured parameters and sets them as required.
+  Upstream wan connectivity is checked (eg Internet feed) and when not present, layer 2 peer mode is autonomously enabled,
+  and when it is present, layer 3 portal mode is enabled. This allows the same simple router configuration to be used on all meshnodes in the layer 2 mesh.
+  Remote terminal sessions and remote file transfers are supported using the meshnode mac address as an identifier.
+  This version does not require a Captive Portal to be running.
+endef
+
+define Package/mesh11sd/install
+       $(INSTALL_DIR) $(1)/usr/sbin
+       $(INSTALL_DIR) $(1)/etc/config
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/mesh11sd $(1)/usr/sbin
+       $(INSTALL_CONF) $(PKG_BUILD_DIR)/linux_openwrt/mesh11sd/files/etc/config/mesh11sd $(1)/etc/config/
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/linux_openwrt/mesh11sd/files/etc/init.d/mesh11sd $(1)/etc/init.d/
+endef
+
+define Package/mesh11sd/conffiles
+/etc/config/mesh11sd
+endef
+
+define Build/Compile
+endef
+
+$(eval $(call BuildPackage,mesh11sd))
index 8b8cf24c7bd4935b99955818f082140d83553f5f..c1e1227e06c28ee6e87454a1d459f7531f595af5 100644 (file)
@@ -7,17 +7,17 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=minimalist-pcproxy
-PKG_SOURCE_VERSION:=2d6d1b0b0a3b79a9b4a9b0a7606a84600a967bcb
-PKG_VERSION:=2015-01-12-$(PKG_SOURCE_VERSION)
-PKG_RELEASE:=1
+PKG_RELEASE:=7
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/fingon/minimalist-pcproxy.git
-PKG_MAINTAINER:=Markus Stenberg <fingon@iki.fi>
-PKG_LICENSE:=GPL-2.0
+PKG_SOURCE_DATE:=2014-12-12
+PKG_SOURCE_VERSION:=2d6d1b0b0a3b79a9b4a9b0a7606a84600a967bcb
+PKG_MIRROR_HASH:=26dcfe5fa2a4924a02830c243cf59d61055f43ec3df8eb77e86d74acf9ac034f
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_MAINTAINER:=Markus Stenberg <fingon@iki.fi>
+PKG_LICENSE:=BSD-3-Clause
+PKG_LICENSE_FILES:=LICENSE
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/cmake.mk
@@ -31,12 +31,12 @@ define Package/minimalist-pcproxy
 endef
 
 define Package/minimalist-pcproxy/description
-This package contains a daemon which can be used to forward
-PCP (Port Control Protocol - RFC6887) requests requests to PCP remote servers.
+  This package contains a daemon which can be used to forward
+  PCP (Port Control Protocol - RFC6887) requests requests to PCP remote servers.
 
-In and of itself, it is not very useful, but combined with hnetd+miniupnpd
-it allows for control of NAT forwarding and firewall pinholes from multiple
-hops away.
+  In and of itself, it is not very useful, but combined with hnetd+miniupnpd
+  it allows for control of NAT forwarding and firewall pinholes from multiple
+  hops away.
 endef
 
 define Package/minimalist-pcproxy/install
index 7537f8a31ff907cc67e0bade692025f01518f969..a54f56e29dc1a7362e25bc962667bdc1fb6ed14d 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-if [ `uci -q get upnpd.config._pcproxy_configured` = "1" ]
+if [ "`uci -q get upnpd.config._pcproxy_configured`" = "1" ]
 then
     exit
 fi
diff --git a/mrd6/Makefile b/mrd6/Makefile
deleted file mode 100644 (file)
index 8cdd8d1..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-#
-# Copyright (C) 2006-2011 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=mrd6
-PKG_SOURCE_VERSION:=c805eb33255dbc0b6647d463c6c67d1c9d3105a0
-PKG_VERSION:=2013-11-30-$(PKG_SOURCE_VERSION)
-PKG_RELEASE:=2
-
-PKG_SOURCE_PROTO:=git
-PKG_SOURCE_URL:=https://github.com/hugosantos/mrd6.git
-PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
-PKG_LICENSE:=GPL-2.0+
-
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-
-PKG_BUILD_PARALLEL:=1
-PKG_INSTALL:=1
-
-include $(INCLUDE_DIR)/package.mk
-
-define Package/mrd6
-  SECTION:=net
-  CATEGORY:=Network
-  TITLE:=IPv6 multicast routing daemon
-  URL:=http://fivebits.net/proj/mrd6
-  DEPENDS:=@IPV6 +libstdcpp
-endef
-
-define Package/mrd6/description
- Multicast is becoming a major component in next generation networks, used 
- in several scenarios, from video broadcasting to multimedia conferencing. 
- In order to be implemented, new technology needs supporting hardware and 
- software across a set of devices and systems. MRD6 is an implementation of 
- a modular IPv6 Multicast Routing Framework for the Linux operating system 
- and provides MLDv2 (as well as MLDv1), PIM-SM and MBGP support.
-endef
-
-MRD6_MAKEFLAGS:= \
-       $(TARGET_CONFIGURE_OPTS) \
-       OPTIMIZE=yes \
-       SPACE_OPTIMIZE=yes \
-       FULL_STATIC=no \
-       CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS) -DNO_INET6_OPTION -fno-builtin -fno-rtti" \
-       LDFLAGS="$(TARGET_LDFLAGS) -ldl -lm" \
-       MODULE_CXX="\$$$$(CC) -shared \$$$$(CXXFLAGS) \$$$$(LDFLAGS)" \
-       DESTDIR="$(PKG_INSTALL_DIR)" \
-       PREFIX="/usr"
-
-define Build/Compile
-       +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/src $(MRD6_MAKEFLAGS) all
-endef
-
-define Build/Install
-       $(MAKE) -C $(PKG_BUILD_DIR)/src $(MRD6_MAKEFLAGS) install
-endef
-
-define Package/mrd6/conffiles
-/etc/mrd6.conf
-endef
-
-define Package/mrd6/install
-       $(INSTALL_DIR) $(1)/etc/init.d
-       $(INSTALL_CONF) ./files/mrd6.conf $(1)/etc
-       $(INSTALL_BIN) ./files/mrd6.init $(1)/etc/init.d/mrd6
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/mrd $(1)/usr/sbin/mrd6
-       $(INSTALL_DIR) $(1)/usr/bin
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mrd6sh $(1)/usr/bin/mrd6sh
-       $(INSTALL_DIR) $(1)/usr/lib/mrd6
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/mrd6/bgp.so $(1)/usr/lib/mrd6/bgp.so
-endef
-
-$(eval $(call BuildPackage,mrd6))
diff --git a/mrd6/files/mrd6.conf b/mrd6/files/mrd6.conf
deleted file mode 100644 (file)
index e3ad78a..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-log {
-       attach stderr normal;
-       attach default "/var/log/mrd6.log" message_err;
-}
-
-//interfaces disable br-lan;  // Should be vlan0 + eth1 but Linux bridge seems broken for multicast
-//interfaces disable eth0; // Interface to internal bridge
-//handle-proper-bridge = true;    // use ETH_P_ALL to see all packets on wrt54g
-
-// The default configured RP is m6bone's Renater RP.
-// Change this according to your setup
-
-groups ff00::/8 pim rp = 2001:660:3007:300:1::;
-
diff --git a/mrd6/files/mrd6.init b/mrd6/files/mrd6.init
deleted file mode 100644 (file)
index 2481840..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2006-2011 OpenWrt.org
-
-START=50
-
-start() {
-       service_start /usr/sbin/mrd6 -f /etc/mrd6.conf -D
-}
-
-stop() {
-       service_stop /usr/sbin/mrd6
-}
-
diff --git a/mrd6/patches/002-missing_netlink_defs.patch b/mrd6/patches/002-missing_netlink_defs.patch
deleted file mode 100644 (file)
index 678dd35..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
---- /dev/null
-+++ b/include/mrdpriv/linux/netlink_missing_defs.h
-@@ -0,0 +1,41 @@
-+#include <linux/version.h>
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
-+
-+#include <linux/if_link.h>
-+#include <linux/if_addr.h>
-+#include <linux/neighbour.h>
-+
-+#ifndef IFA_RTA
-+#define IFA_RTA(r) \
-+       ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
-+#endif
-+#ifndef IFA_PAYLOAD
-+#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
-+#endif
-+
-+#ifndef IFLA_RTA
-+#define IFLA_RTA(r) \
-+       ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
-+#endif
-+#ifndef IFLA_PAYLOAD
-+#define IFLA_PAYLOAD(n)        NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
-+#endif
-+
-+#ifndef NDA_RTA
-+#define NDA_RTA(r) \
-+       ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
-+#endif
-+#ifndef NDA_PAYLOAD
-+#define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg))
-+#endif
-+
-+#ifndef NDTA_RTA
-+#define NDTA_RTA(r) \
-+       ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg))))
-+#endif
-+#ifndef NDTA_PAYLOAD
-+#define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg))
-+#endif
-+
-+#endif
---- a/src/linux/linux_unicast_route.cpp
-+++ b/src/linux/linux_unicast_route.cpp
-@@ -23,6 +23,7 @@
-  */
- #include <mrdpriv/linux/unicast_route.h>
-+#include <mrdpriv/linux/netlink_missing_defs.h>
- #include <mrd/mrd.h>
- #include <mrd/interface.h>
diff --git a/mrd6/patches/101-Accept-default-routes-without-RTA_DST.patch b/mrd6/patches/101-Accept-default-routes-without-RTA_DST.patch
deleted file mode 100644 (file)
index 780a9b1..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From b70c7d519ddd178b76d89bca7d3fe1fd186af862 Mon Sep 17 00:00:00 2001
-From: Oryon <pierre@darou.fr>
-Date: Tue, 11 Mar 2014 12:12:07 +0100
-Subject: [PATCH 1/2] Accept default routes without RTA_DST
-
----
- src/linux/linux_unicast_route.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/src/linux/linux_unicast_route.cpp
-+++ b/src/linux/linux_unicast_route.cpp
-@@ -335,7 +335,7 @@ void linux_unicast_router::handle_route_
-       netlink_msg::parse_rtatable(tb, RTA_MAX, RTM_RTA(NLMSG_DATA(hdr)),
-                               hdr->nlmsg_len - NLMSG_LENGTH(sizeof(rtmsg)));
--      if (tb[RTA_DST]) {
-+      //if (tb[RTA_DST]) { /* Accept default routes */
-               lookup_result res;
-               parse_prefix_rec(tb, msg->r.rtm_dst_len,
-@@ -361,7 +361,7 @@ void linux_unicast_router::handle_route_
-               }
-               prefix_changed(isnew, res);
--      }
-+      //}
- }
- void linux_unicast_router::handle_intf_event(bool isnew, nlmsghdr *hdr) {
diff --git a/mrd6/patches/102-Metric-should-be-more-important-than-distance.patch b/mrd6/patches/102-Metric-should-be-more-important-than-distance.patch
deleted file mode 100644 (file)
index ebf843d..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-From 46093914a5f95f50c9aef088b7172d6774d204cb Mon Sep 17 00:00:00 2001
-From: Oryon <pierre@darou.fr>
-Date: Tue, 11 Mar 2014 16:03:58 +0100
-Subject: [PATCH 2/2] Metric should be more important than distance at lookup
-
----
- src/mrib.cpp | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
---- a/src/mrib.cpp
-+++ b/src/mrib.cpp
-@@ -327,16 +327,16 @@ mrib_def::mrib_node *mrib_def::prefix_lo
- void mrib_def::insert_prefix_in_node(mrib_node *n, prefix *p) {
-       prefix *curr = n->head, *prev = 0;
--      /* first check the proper place based on distance */
--      while (curr && curr->distance < p->distance) {
-+      /* first check the proper place based on metric */
-+      while (curr && curr->metric < p->metric) {
-               prev = curr;
-               curr = curr->next;
-       }
--      if (prev && prev->distance == p->distance) {
--              /* if distance matches, take metric into place */
-+      if (prev && prev->metric == p->metric) {
-+              /* if metric matches, take distance into place */
-               curr = prev;
--              while (curr && curr->metric <= p->metric) {
-+              while (curr && curr->distance <= p->distance) {
-                       prev = curr;
-                       curr = curr->next;
-               }
diff --git a/mrd6/patches/103-Make-build-reproducible.patch b/mrd6/patches/103-Make-build-reproducible.patch
deleted file mode 100644 (file)
index e0a32e6..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-From deb013d93c3ce78891386637d6b3300289130df6 Mon Sep 17 00:00:00 2001
-From: Thomas Preud'homme <robotux@celest.fr>
-Date: Sun, 7 Aug 2016 22:28:50 +0100
-Subject: Make build reproducible
-
-Remove build date from the binary so that two builds on different dates
-are binary identical.
-
-Origin: upstream, https://github.com/hugosantos/mrd6/commit/14f27d5528a3e4c8e5369bdee0e35961a2491661
-Forwarded: https://github.com/hugosantos/mrd6/pull/30
-Last-Update: 2016-08-09
-Applied-Upstream: commit: 14f27d5528a3e4c8e5369bdee0e35961a2491661
----
- src/Makefile | 1 -
- src/mrd.cpp  | 2 --
- 2 files changed, 3 deletions(-)
-
---- a/src/Makefile
-+++ b/src/Makefile
-@@ -185,7 +185,6 @@ endif
- $(MRD_VERSION_CPP): $(SOURCES) Makefile Makefile.options
-       @set -e; mkdir -p $(dir $@); \
-               echo '/* This file is automatically generated */' > $(MRD_VERSION_CPP); \
--              echo 'const char *BuildDate = "$(NOW)";' >> $(MRD_VERSION_CPP)
- $(MODULES_CPP): Makefile Makefile.options
-       @set -e; mkdir -p $(dir $@); \
---- a/src/mrd.cpp
-+++ b/src/mrd.cpp
-@@ -75,7 +75,6 @@
- mrd *g_mrd = 0;
--extern const char *BuildDate;
- static const char *VersionInfo = "mrd6 0.10.0";
- static const char *defaultconffiles[] = {
-@@ -2335,7 +2334,6 @@ bool mrd::socket_regs(base_stream &out,
- void mrd::show_base_info(base_stream &out) const {
-       out.xprintf("Version: %s\n", VersionInfo);
--      out.xprintf("Build date: %s\n", BuildDate);
- }
- bool mrd::show_info(base_stream &out, const std::vector<std::string> &ctx) {
diff --git a/nat46/Makefile b/nat46/Makefile
deleted file mode 100644 (file)
index c708499..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-#
-# Copyright (C) 2014-2015 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-include $(TOPDIR)/rules.mk
-include $(INCLUDE_DIR)/kernel.mk
-
-PKG_NAME:=nat46
-PKG_VERSION:=11
-PKG_RELEASE:=$(PKG_SOURCE_VERSION)
-
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_MIRROR_HASH:=18b36fcb30c6c56e39c20f3363f806f909d08bb21041ac5c930c9216b6d3e2aa
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_URL:=https://github.com/ayourtch/nat46.git
-PKG_SOURCE_PROTO:=git
-PKG_SOURCE_VERSION:=683fbd2b765506332a1af141545652bf58f03166
-PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
-PKG_LICENSE:=GPL-2.0
-
-include $(INCLUDE_DIR)/package.mk
-
-define Package/map-t
-  SECTION:=net
-  CATEGORY:=Network
-  DEPENDS:=+map +kmod-nat46
-  TITLE:=MAP-T configuration support
-endef
-
-define Package/464xlat
-  SECTION:=net
-  CATEGORY:=Network
-  DEPENDS:=+kmod-nat46 +ip
-  TITLE:=464xlat CLAT support
-endef
-
-define KernelPackage/nat46
-  DEPENDS:=@IPV6
-  TITLE:=Stateless NAT46 translation kernel module
-  SECTION:=kernel
-  SUBMENU:=Network Support
-  FILES:=$(PKG_BUILD_DIR)/nat46/modules/nat46.ko 
-  AUTOLOAD:=$(call AutoLoad,33,nat46)
-endef
-
-include $(INCLUDE_DIR)/kernel-defaults.mk
-
-define Build/Prepare
-       $(call Build/Prepare/Default)
-       $(CP) ./src/* $(PKG_BUILD_DIR)/
-endef
-
-define Build/Compile
-       $(MAKE) -C $(PKG_BUILD_DIR) \
-               CC="$(TARGET_CC)" \
-               CFLAGS="$(TARGET_CFLAGS) -Wall" \
-               LDFLAGS="$(TARGET_LDFLAGS)"
-       $(MAKE) $(KERNEL_MAKEOPTS) SUBDIRS="$(PKG_BUILD_DIR)/nat46/modules" \
-               MODFLAGS="-DMODULE -mlong-calls" \
-               EXTRA_CFLAGS="-DNAT46_VERSION=\\\"$(PKG_SOURCE_VERSION)\\\"" \
-               modules
-endef
-
-define Package/map-t/install
-       true
-endef
-
-define Package/464xlat/install
-       $(INSTALL_DIR) $(1)/lib/netifd/proto
-       $(INSTALL_BIN) ./files/464xlat.sh $(1)/lib/netifd/proto/464xlat.sh
-       $(INSTALL_DIR) $(1)/sbin
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/464xlatcfg $(1)/sbin
-endef
-
-$(eval $(call KernelPackage,nat46))
-$(eval $(call BuildPackage,map-t))
-$(eval $(call BuildPackage,464xlat))
diff --git a/nat46/files/464xlat.sh b/nat46/files/464xlat.sh
deleted file mode 100755 (executable)
index 1d52e2c..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/bin/sh
-# 464xlat.sh - 464xlat CLAT
-#
-# Copyright (c) 2015 Steven Barth <cyrus@openwrt.org>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2
-# as published by the Free Software Foundation
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-[ -n "$INCLUDE_ONLY" ] || {
-       . /lib/functions.sh
-       . /lib/functions/network.sh
-       . ../netifd-proto.sh
-       init_proto "$@"
-}
-
-proto_464xlat_setup() {
-       local cfg="$1"
-       local iface="$2"
-       local link="464-$cfg"
-
-       local ip6addr ip6prefix tunlink zone
-       json_get_vars ip6addr ip6prefix tunlink zone
-
-       [ -z "$zone" ] && zone="wan"
-
-       ( proto_add_host_dependency "$cfg" "::" "$tunlink" )
-
-       if [ -z "$tunlink" ] && ! network_find_wan6 tunlink; then
-               proto_notify_error "$cfg" "NO_WAN_LINK"
-               return
-       fi
-       network_get_device tundev "$tunlink"
-
-       ip6addr=$(464xlatcfg "$link" "$tundev" "$ip6prefix" 192.0.0.1 $ip6addr)
-       if [ -z "$ip6addr" ]; then
-               proto_notify_error "$cfg" "CLAT_CONFIG_FAILED"
-               return
-       fi
-
-       ip -6 rule del from all lookup local
-       ip -6 rule add from all lookup local pref 1
-       ip -6 rule add to $ip6addr lookup prelocal pref 0
-       echo "$ip6addr" > /tmp/464-$cfg-anycast
-
-       proto_init_update "$link" 1
-       proto_add_ipv4_route "0.0.0.0" 0 "" "" 2048
-       proto_add_ipv6_route $ip6addr 128 "" "" "" "" 128
-
-       proto_add_data
-       [ "$zone" != "-" ] && json_add_string zone "$zone"
-
-       json_add_array firewall
-               json_add_object ""
-                       json_add_string type nat
-                       json_add_string target SNAT
-                       json_add_string family inet
-                       json_add_string snat_ip 192.0.0.1
-               json_close_object
-               json_add_object ""
-                       json_add_string type rule
-                       json_add_string family inet6
-                       json_add_string proto all
-                       json_add_string direction in
-                       json_add_string dest "$zone"
-                       json_add_string src "$zone"
-                       json_add_string src_ip $ip6addr
-                       json_add_string target ACCEPT
-               json_close_object
-       json_close_array
-       proto_close_data
-
-       proto_send_update "$cfg"
-}
-
-proto_464xlat_teardown() {
-       local cfg="$1"
-       local link="464-$cfg"
-
-       [ -f /tmp/464-$cfg-anycast ] || return
-       local ip6addr=$(cat /tmp/464-$cfg-anycast)
-
-       464xlatcfg "$link"
-
-       rm -rf /tmp/464-$cfg-anycast
-       [ -n "$ip6addr" ] && ip -6 rule del to $ip6addr lookup prelocal
-
-       if [ -z "$(ls /tmp/464-*-anycast 2>&-)" ]; then
-               ip -6 rule del from all lookup local
-               ip -6 rule add from all lookup local pref 0
-       fi
-}
-
-proto_464xlat_init_config() {
-       no_device=1
-       available=1
-
-       proto_config_add_string "ip6prefix"
-       proto_config_add_string "ip6addr"
-       proto_config_add_string "tunlink"
-       proto_config_add_string "zone"
-}
-
-[ -n "$INCLUDE_ONLY" ] || {
-        add_protocol 464xlat
-}
diff --git a/nat46/src/464xlatcfg.c b/nat46/src/464xlatcfg.c
deleted file mode 100644 (file)
index 288733e..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-/* 464xlatcfg.c
- *
- * Copyright (c) 2015 Steven Barth <cyrus@openwrt.org>
- * Copyright (c) 2017 Hans Dedecker <dedeckeh@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <netinet/icmp6.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <net/if.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <stdio.h>
-#include <netdb.h>
-
-static void sighandler(__attribute__((unused)) int signal)
-{
-}
-
-int main(int argc, const char *argv[])
-{
-       char buf[INET6_ADDRSTRLEN], prefix[INET6_ADDRSTRLEN + 4];
-       int pid;
-
-       if (argc <= 1) {
-               fprintf(stderr, "Usage: %s <name> [ifname] [ipv6prefix] [ipv4addr] [ipv6addr]\n", argv[0]);
-               return 1;
-       }
-
-       snprintf(buf, sizeof(buf), "/var/run/%s.pid", argv[1]);
-       FILE *fp = fopen(buf, "r");
-       if (fp) {
-               if (fscanf(fp, "%d", &pid) == 1)
-                       kill(pid, SIGTERM);
-
-               unlink(buf);
-               fclose(fp);
-       }
-
-       if (!argv[2])
-               return 0;
-
-       if (!argv[3] || !argv[4] || !(fp = fopen(buf, "wx")))
-               return 1;
-
-       signal(SIGTERM, SIG_DFL);
-       setvbuf(fp, NULL, _IOLBF, 0);
-       fprintf(fp, "%d\n", getpid());
-
-       prefix[sizeof(prefix) - 1] = 0;
-       strncpy(prefix, argv[3], sizeof(prefix) - 1);
-
-       if (!prefix[0]) {
-               struct addrinfo hints = { .ai_family = AF_INET6 }, *res;
-               if (getaddrinfo("ipv4only.arpa", NULL, &hints, &res) || !res) {
-                       sleep(3);
-                       if (getaddrinfo("ipv4only.arpa", NULL, &hints, &res) || !res)
-                               return 2;
-               }
-
-               struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)res->ai_addr;
-               inet_ntop(AF_INET6, &sin6->sin6_addr, prefix, sizeof(prefix) - 4);
-               strcat(prefix, "/96");
-               freeaddrinfo(res);
-       }
-
-       int i = 0;
-       int sock;
-       struct sockaddr_in6 saddr;
-
-       do {
-               socklen_t saddrlen = sizeof(saddr);
-               struct icmp6_filter filt;
-
-               sock = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
-               ICMP6_FILTER_SETBLOCKALL(&filt);
-               setsockopt(sock, IPPROTO_ICMPV6, ICMP6_FILTER, &filt, sizeof(filt));
-               setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, argv[2], strlen(argv[2]));
-               memset(&saddr, 0, sizeof(saddr));
-               saddr.sin6_family = AF_INET6;
-               saddr.sin6_addr.s6_addr32[0] = htonl(0x2001);
-               saddr.sin6_addr.s6_addr32[1] = htonl(0xdb8);
-               if (connect(sock, (struct sockaddr*)&saddr, sizeof(saddr)) ||
-                               getsockname(sock, (struct sockaddr*)&saddr, &saddrlen))
-                       return 3;
-
-               if (!IN6_IS_ADDR_LINKLOCAL(&saddr.sin6_addr) || argv[5])
-                       break;
-
-               close(sock);
-               sleep(3);
-               i++;
-       } while (i < 3);
-
-       struct ipv6_mreq mreq = {saddr.sin6_addr, if_nametoindex(argv[2])};
-       if (!argv[5]) {
-               if (IN6_IS_ADDR_LINKLOCAL(&mreq.ipv6mr_multiaddr))
-                       return 5;
-
-               srandom(mreq.ipv6mr_multiaddr.s6_addr32[0] ^ mreq.ipv6mr_multiaddr.s6_addr32[1] ^
-                               mreq.ipv6mr_multiaddr.s6_addr32[2] ^ mreq.ipv6mr_multiaddr.s6_addr32[3]);
-               mreq.ipv6mr_multiaddr.s6_addr32[2] = random();
-               mreq.ipv6mr_multiaddr.s6_addr32[3] = random();
-       } else if (inet_pton(AF_INET6, argv[5], &mreq.ipv6mr_multiaddr) != 1) {
-               return 1;
-       }
-
-       if (setsockopt(sock, SOL_IPV6, IPV6_JOIN_ANYCAST, &mreq, sizeof(mreq)))
-               return 3;
-
-       inet_ntop(AF_INET6, &mreq.ipv6mr_multiaddr, buf, sizeof(buf));
-       fputs(buf, stdout);
-       fputc('\n', stdout);
-       fflush(stdout);
-
-       FILE *nat46 = fopen("/proc/net/nat46/control", "w");
-       if (!nat46 || fprintf(nat46, "add %s\nconfig %s local.style NONE local.v4 %s/32 local.v6 %s/128 "
-                       "remote.style RFC6052 remote.v6 %s\n", argv[1], argv[1], argv[4], buf, prefix) < 0 ||
-                       fclose(nat46))
-               return 4;
-
-       if (!(pid = fork())) {
-               fclose(fp);
-               fclose(stdin);
-               fclose(stdout);
-               fclose(stderr);
-               chdir("/");
-               setsid();
-               signal(SIGTERM, sighandler);
-               pause();
-
-               nat46 = fopen("/proc/net/nat46/control", "w");
-               if (nat46) {
-                       fprintf(nat46, "del %s\n", argv[1]);
-                       fclose(nat46);
-               }
-       } else {
-               rewind(fp);
-               fprintf(fp, "%d\n", pid);
-       }
-
-       return 0;
-}
diff --git a/nat46/src/Makefile b/nat46/src/Makefile
deleted file mode 100644 (file)
index 3950a6b..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-all: 464xlatcfg
-
-464xlatcfg: 464xlatcfg.c
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<
-
-clean:
-       rm -f 464xlatcfg
-
diff --git a/naywatch/Makefile b/naywatch/Makefile
new file mode 100644 (file)
index 0000000..c0e1867
--- /dev/null
@@ -0,0 +1,50 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (C) 2021 Nick Hainke <vincent@systemli.org>
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=naywatch
+PKG_VERSION:=1
+PKG_RELEASE:=7
+
+PKG_MAINTAINER:=Nick Hainke <vincent@systemli.org>
+PKG_LICENSE:=GPL-2.0-only
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/naywatch
+  SECTION:=utils
+  CATEGORY:=Utilities
+  TITLE:=Watchdog for IPv6 links
+  PKGARCH:=all
+  DEPENDS:=@IPV6 +owipcalc
+endef
+
+define Package/naywatch/description
+Reboots or triggers watchdog if no link-local neighbor is available.
+
+Important:
+Be careful when you do a sysupgrade. Stop naywatch first, and make
+sure procd took control again of the watchdog.
+You can do this using 'ubus call system watchdog'.  Status should be "running".
+endef
+
+define Package/naywatch/conffiles
+/etc/config/naywatch
+endef
+
+define Build/Compile
+endef
+
+define Package/naywatch/install
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) ./files/naywatch.init $(1)/etc/init.d/naywatch
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) ./files/naywatch.sh $(1)/usr/bin/naywatch
+       $(INSTALL_DIR) $(1)/etc/config
+       $(INSTALL_DATA) ./files/naywatch.config $(1)/etc/config/naywatch
+endef
+
+$(eval $(call BuildPackage,naywatch))
diff --git a/naywatch/files/naywatch.config b/naywatch/files/naywatch.config
new file mode 100644 (file)
index 0000000..b25e1f2
--- /dev/null
@@ -0,0 +1,8 @@
+config naywatch general
+    option check_interval   '50'
+    option watchdog_timeout '60'
+    option use_watchdog     '0'
+    option save_logs        '1'
+    list interface          'lan'
+    list interface          'wan'
+    list save_cmd           'dmesg'
diff --git a/naywatch/files/naywatch.init b/naywatch/files/naywatch.init
new file mode 100644 (file)
index 0000000..82f53c6
--- /dev/null
@@ -0,0 +1,89 @@
+#!/bin/sh /etc/rc.common
+
+. /usr/share/libubox/jshn.sh
+
+USE_PROCD=1
+START=95
+STOP=01
+
+log() {
+    local msg="$1"
+    logger -t naywatch "$msg"
+}
+
+wait_for_network()
+{
+    ubus -t 15 wait_for network.interface.$1 2>/dev/null
+}
+
+boot()
+{
+    local _interfaces
+    config_load naywatch
+    config_get _interfaces general interface
+
+    for interface in $_interfaces; do
+        wait_for_network interface
+    done
+
+    rc_procd start_service
+}
+
+start_service() {
+    procd_open_instance
+
+    config_load naywatch
+    local _check_interval
+    local _watchdog_timeout
+    local _use_watchdog
+    local _save_logs
+    local _interfaces
+
+    config_get _check_interval general "check_interval"
+    config_get _watchdog_timeout general "watchdog_timeout"
+    config_get _use_watchdog general "use_watchdog"
+    config_get _save_logs general "save_logs"
+    config_get _interfaces general "interface"
+
+    procd_set_param command /usr/bin/naywatch "$_check_interval" "$_watchdog_timeout" "$_use_watchdog" "$_save_logs" "$_interfaces"
+
+    procd_set_param respawn 3600 15 0
+
+    procd_set_param stdout 1
+    procd_set_param stderr 1
+
+    procd_close_instance
+}
+
+stop_service() {
+    exec 3>&- # close file again
+    sync && wait
+}
+
+watchdog_procd_runnig() {
+       watch=$(ubus call system watchdog)
+       json_load "$watch"
+       json_get_var watchdogstatus status
+       if [[ "$watchdogstatus" == "running" ]] ; then
+        echo "1"
+        return
+       fi
+    echo "0"
+}
+
+service_stopped() {
+    log "Naywatch Stopped!"
+    log "Try to handover watchdog to procd again."
+    for i in 1 2 3 4 5 6 7 8 9 10 ; do
+        sleep 5
+        ubus call system watchdog '{"stop":false}' > /dev/null
+        if [[ $(watchdog_procd_runnig) == "1" ]] ; then
+            break
+        fi
+    done
+    if [[ $(watchdog_procd_runnig) == "1" ]] ; then
+        log "Handover sucessfully!"
+    else
+        log "Handover to procd failed! Device can reboot!"
+    fi
+}
diff --git a/naywatch/files/naywatch.sh b/naywatch/files/naywatch.sh
new file mode 100644 (file)
index 0000000..73f5ff0
--- /dev/null
@@ -0,0 +1,125 @@
+#!/bin/sh
+
+. /lib/functions.sh
+. /lib/functions/network.sh
+
+CHECK_INTERVAL=$1
+shift
+WATCHDOG_TIMEOUT=$1
+shift
+USE_WATCHDOG=$1
+shift
+SAVE_LOGS=$1
+shift
+INTERFACES="$*"
+
+ACTIVE=0
+NO_NEIGHBORS_COUNT=0
+MIN_KICK=5
+
+log() {
+    local msg="$1"
+    logger -t naywatch "$msg"
+}
+
+write_logs() {
+    save_log() {
+        eval $1 > /root/$(date +%s)-"$1".log
+    }
+    config_load naywatch
+    config_list_foreach general save_cmd save_log
+    sync
+}
+
+neighbors_available() {
+    local phy
+
+    for interface in $INTERFACES; do
+        network_get_physdev phy $interface > /dev/null 2>&1
+        linklocal=$(ip -6 a list dev $phy | grep "scope link" | awk '{print $2}' | sed 's/\/64//') 2> /dev/null
+        ips=$(ping ff02::1%$phy -w5 -W5 -c2 | awk '/from/{print($4)}' | sed 's/.$//') 2> /dev/null
+        for ip in $ips; do
+            if [ $ip != $linklocal ] && [ $(owipcalc $ip linklocal) -eq 1 ]; then
+                echo 1
+                return 0
+            fi
+        done
+    done
+
+    echo 0
+}
+
+activate_watchdog() {
+    # disable openwrt instrumentation:
+    ubus call system watchdog '{"magicclose":true,"stop":true,"timeout":'${WATCHDOG_TIMEOUT}'}' > /dev/null
+    exec 3>/dev/watchdog
+}
+
+reboot_now() {
+    # copied from watch-cat
+    reboot &
+
+    [ "$1" -ge 1 ] && {
+        sleep "$1"
+        echo 1 >/proc/sys/kernel/sysrq
+        echo b >/proc/sysrq-trigger
+    }
+}
+
+no_neighbors() {
+    log "No Neighbors Available!"
+
+    NO_NEIGHBORS_COUNT=$(($NO_NEIGHBORS_COUNT+1))
+
+    if [ $ACTIVE -eq 0 ]; then
+        return 0
+    fi
+
+    if [ $SAVE_LOGS -eq 1 ]; then
+        log "Saving Logs!"
+        write_logs
+    fi
+
+    if [ $USE_WATCHDOG -eq 0 ] && [ $NO_NEIGHBORS_COUNT -gt $MIN_KICK ]; then
+        reboot_now 10
+    fi
+}
+
+log "Naywatch Started!"
+
+neighbors() {
+    if [ $ACTIVE -eq 0 ]; then
+        log "Naywatch Activated!"
+    fi
+    ACTIVE=1
+    NO_NEIGHBORS_COUNT=0
+    if [ $USE_WATCHDOG -eq 1 ]; then
+        echo 1 >&3
+    fi
+}
+
+not_active() {
+    if [ $USE_WATCHDOG -eq 1 ]; then
+        echo 1 >&3
+    fi 
+}
+
+if [ $USE_WATCHDOG -eq 1 ]; then
+    activate_watchdog
+fi
+
+while [ 1 ]; do
+    # first sleep
+    sleep $CHECK_INTERVAL
+
+    has_neighbor=$(neighbors_available)
+    if [ $has_neighbor -eq 0 ] && [ $ACTIVE -eq 1 ]; then
+        no_neighbors
+    elif [ $has_neighbor -eq 1 ]; then
+        neighbors
+    else
+        not_active
+    fi
+done
+
+exit 0
index d889f5238768ad3ce7cab946aadfd1b0239ca4ed..8fcc93fdad3141757d378e261bac48278edeb81b 100644 (file)
@@ -9,20 +9,19 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ndppd
 PKG_VERSION:=0.2.5
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 # Latest release
 PKG_SOURCE_URL:=https://codeload.github.com/DanielAdolfsson/ndppd/tar.gz/$(PKG_VERSION)?
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_HASH:=ee934167f8357f0bd0015e201a77fbe4d028c59e89dc98113805c6855e1c3992
-PKG_LICENSE:=GPL-3.0+
+PKG_LICENSE:=GPL-3.0-or-later
 
 # Development snapshot
 #PKG_SOURCE_URL=git://github.com/Tuhox/ndppd.git
 #PKG_SOURCE_VERSION=master
 #PKG_SOURCE_SUBDIR=$(PKG_NAME)-$(PKG_VERSION)
 
-include $(INCLUDE_DIR)/uclibc++.mk
 include $(INCLUDE_DIR)/package.mk
 
 define Package/ndppd
@@ -31,7 +30,7 @@ define Package/ndppd
   TITLE:=NDP Proxy Daemon
   URL:=http://www.priv.nu/projects/ndppd/
   MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>
-  DEPENDS:=@IPV6 $(CXX_DEPENDS)
+  DEPENDS:=@IPV6 +libstdcpp
 endef
 
 define Package/ndppd/description
index 46ff9b12c3264946692f1eb3711f6c3936ae960a..09a81310f01d6afa6cbf8104e4b8656e523a419c 100644 (file)
@@ -6,52 +6,57 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=nodogsplash
-PKG_FIXUP:=autoreconf
-PKG_VERSION:=3.2.1
+PKG_VERSION:=5.0.2
 PKG_RELEASE:=1
 
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=https://codeload.github.com/nodogsplash/nodogsplash/tar.gz/v$(PKG_VERSION)?
-PKG_SOURCE:=nodogsplash-$(PKG_VERSION).tar.gz
-PKG_HASH:=16da76ecf7820cd8b32081237e05b24a7d2d8a9db8a47242badc7937d6cf1ae8
-PKG_BUILD_DIR:=$(BUILD_DIR)/nodogsplash-$(PKG_VERSION)
+PKG_HASH:=908d3674e93726fdcefb4c3b6705c745753435df9d46425781a57e3f6b417797
 
 PKG_MAINTAINER:=Moritz Warning <moritzwarning@web.de>
+PKG_LICENSE:=GPL-2.0-or-later
+PKG_LICENSE_FILES:=COPYING
+
+PKG_FIXUP:=autoreconf
 PKG_BUILD_PARALLEL:=1
-PKG_LICENSE:=GPL-2.0+
 
 include $(INCLUDE_DIR)/package.mk
 
-
 define Package/nodogsplash
-       SUBMENU:=Captive Portals
-       SECTION:=net
-       CATEGORY:=Network
-       DEPENDS:=+libpthread +iptables-mod-ipopt +libmicrohttpd-no-ssl
-       TITLE:=Open public network gateway daemon
-       URL:=https://github.com/nodogsplash/nodogsplash
-       CONFLICTS:=nodogsplash2
+  SUBMENU:=Captive Portals
+  SECTION:=net
+  CATEGORY:=Network
+  DEPENDS:=+libpthread +libmicrohttpd-no-ssl +iptables-nft \
+           +iptables-mod-nat-extra +iptables-mod-ipopt \
+           +iptables-mod-conntrack-extra
+  TITLE:=Open public network gateway daemon
+  URL:=https://github.com/nodogsplash/nodogsplash
 endef
 
 define Package/nodogsplash/description
-       Nodogsplash is a Captive Portal that offers a simple way to
-       provide restricted access to the Internet by showing a splash
-       page to the user before Internet access is granted.
-       It also incorporates an API that allows the creation of
-       sophisticated authentication applications.
+  Nodogsplash is a Captive Portal that offers a simple way to
+  provide restricted access to the Internet by showing a splash
+  page to the user before Internet access is granted.
 endef
 
 define Package/nodogsplash/install
-       $(CP) ./files/* $(1)/
-
+       $(INSTALL_DIR) $(1)/usr/lib/nodogsplash
+       $(INSTALL_BIN) ./files/usr/lib/nodogsplash/restart.sh $(1)/usr/lib/nodogsplash/
        $(INSTALL_DIR) $(1)/usr/bin
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/nodogsplash $(1)/usr/bin/
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/ndsctl $(1)/usr/bin/
-
+       $(INSTALL_DIR) $(1)/etc/nodogsplash/htdocs/
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/resources/splash.html $(1)/etc/nodogsplash/htdocs/
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/resources/splash.css $(1)/etc/nodogsplash/htdocs/
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/resources/status.html $(1)/etc/nodogsplash/htdocs/
        $(INSTALL_DIR) $(1)/etc/nodogsplash/htdocs/images
-       $(CP) $(PKG_BUILD_DIR)/resources/splash.html $(1)/etc/nodogsplash/htdocs/
-       $(CP) $(PKG_BUILD_DIR)/resources/splash.css $(1)/etc/nodogsplash/htdocs/
-       $(CP) $(PKG_BUILD_DIR)/resources/status.html $(1)/etc/nodogsplash/htdocs/
-       $(CP) $(PKG_BUILD_DIR)/resources/splash.jpg $(1)/etc/nodogsplash/htdocs/images/
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/resources/splash.jpg $(1)/etc/nodogsplash/htdocs/images/
+       $(INSTALL_DIR) $(1)/etc/config
+       $(INSTALL_CONF) ./files/etc/config/nodogsplash $(1)/etc/config/
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) ./files/etc/init.d/nodogsplash $(1)/etc/init.d/
+       $(INSTALL_DIR) $(1)/etc/uci-defaults
+       $(INSTALL_BIN) ./files/etc/uci-defaults/40_nodogsplash $(1)/etc/uci-defaults/
 endef
 
 define Package/nodogsplash/postrm
index 714d9bfecf715b8d62e006498089411a32dcb1ac..c7372b7822dfdaefd83f0176dcde021121eb8f94 100644 (file)
@@ -10,21 +10,34 @@ config nodogsplash
   # This hook is needed as a restart of Firewall overwrites nodogsplash iptables entries.
   option fwhook_enabled '1'
 
-  # Serve the file splash.html from this directory
-  option webroot '/etc/nodogsplash/htdocs'
+  # WebRoot
+  # Default: /etc/nodogsplash/htdocs
+  #
+  # The local path where the splash page content resides.
+  # ie. Serve the file splash.html from this directory
+  #option webroot '/etc/nodogsplash/htdocs'
 
   # Use plain configuration file
   #option config '/etc/nodogsplash/nodogsplash.conf'
 
-  # Use this option to set the device nogogsplash will bind to.
+  # Use this option to set the device nodogsplash will bind to.
   # The value may be an interface section in /etc/config/network or a device name such as br-lan.
   option gatewayinterface 'br-lan'
 
+  # GatewayPort
+  # Default: 2050
+  #
+  # Nodogsplash's own http server uses gateway address as its IP address.
+  # The port it listens to at that IP can be set here; default is 2050.
+  #
+  #option gatewayport '2050'
+
+
   option gatewayname 'OpenWrt Nodogsplash'
   option maxclients '250'
 
-  # Enables debug output (0-7)
-  #option debuglevel '7'
+  # Enables debug output (0-3)
+  #option debuglevel '1'
 
   # Client timeouts in minutes
   option preauthidletimeout '30'
@@ -61,33 +74,28 @@ config nodogsplash
   # Values session_start and session_start are in seconds since 1970 or 0 for unknown/unlimited.
   #
   #option binauth '/bin/myauth.sh'
-
-  # Enable Forwarding Authentication Service (FAS)
-  # If set redirection is changed from splash.html to a FAS (provided by the system administrator)
-  # The value is the IP port number of the FAS
-  #option fasport '80'
-
-  # Option: fasremoteip
-  # Default: GatewayAddress (the IP of NDS)
-  # If set, this is the remote ip address of the FAS.
-  #option fasremoteip '46.32.240.41'
-
-  # Option: faspath
-  # Default: /
-  # This is the path from the FAS Web Root to the FAS login page
-  # (not the file system root).
-  #option faspath '/onboard-wifi.net/nodog/fas.php'
-
-  # Option: fas_secure_enabled
-  # Default: 1
-  # If set to "1", authaction and the client token are not revealed and it is the responsibility
-  # of the FAS to request the token from NDSCTL.
-  # If set to "0", the client token is sent to the FAS in clear text in the query string of the
-  # redirect along with authaction and redir.
-  #option fas_secure_enabled '0'
+  # Enable PreAuth Support.
+  #
+  # A simple login script is provided in the package.
+  # This generates a login page asking for usename and email address.
+  # User logins are recorded in the log file /tmp/ndslog.log
+  # Details of how the script works are contained in comments in the script itself.
+  #
+  # The Preauth program will output html code that will be served to the client by NDS
+  # Using html GET the Preauth program may call:
+  # /nodogsplash_preauth/ to ask the client for more information
+  # or
+  # /nodogsplash_auth/ to authenticate the client
+  #
+  # The Preauth program should append at least the client ip to the query string
+  # (using html input type hidden) for all calls to /nodogsplash_preauth/
+  # It must also obtain the client token using ndsctl (or the original query string if fas_secure_enabled=0)
+  # for NDS authentication when calling /nodogsplash_auth/
+  #
+  #option preauth '/usr/lib/nodogsplash/login.sh'
 
   # Your router may have several interfaces, and you
-  # probably want to keep them private from the network/gatewayinterface.
+  # probably want to keep them private from the gatewayinterface.
   # If so, you should block the entire subnets on those interfaces, e.g.:
   #list authenticated_users 'block to 192.168.0.0/16'
   #list authenticated_users 'block to 10.0.0.0/8'
@@ -138,7 +146,7 @@ config nodogsplash
   # List: fw_mark_blocked
   # Default: 10000 (0001|0000|0000|0000|0000 binary)
   #
-  #list fw_mark_authenticated '30000'
-  #list fw_mark_trusted '20000'
-  #list fw_mark_blocked '10000'
+  #option fw_mark_authenticated '30000'
+  #option fw_mark_trusted '20000'
+  #option fw_mark_blocked '10000'
 
index 3c3335c06d98c4fe03aee8d610ddbeb1adfb1239..4af51ca2476f6f6649ac07266927fc1ed1b7dc50 100755 (executable)
@@ -11,9 +11,11 @@ USE_PROCD=1
 
 IPT=/usr/sbin/iptables
 WD_DIR=/usr/bin
-# -s -d 5 runs in background, with level 5 (not so verbose) messages to syslog
-# -f -d 7 runs in foreground, with level 7 (verbose) debug messages to terminal
-OPTIONS="-s -f -d 5"
+
+# Run in PROCD (-f) and log to SYSLOG (-s)
+OPTIONS="-f -s"
+#
+
 CONFIG=""
 
 
@@ -44,13 +46,15 @@ setup_mac_lists() {
     fi
   elif [ "$val" = "allow" ]; then
     config_list_foreach "$cfg" allowedmac append_mac
+    addline "MACmechanism allow"
     addline "AllowedMACList $macs"
   elif [ "$val" = "block" ]; then
     config_list_foreach "$cfg" blockedmac append_mac
+    addline "MACmechanism block"
     addline "BlockedMACList $macs"
   else
     echo "Invalid macmechanism '$val' - allow or block are valid." >&2
-    exit 1
+    return 1
   fi
 
   macs=""
@@ -58,6 +62,8 @@ setup_mac_lists() {
   if [ -n "$macs" ]; then
     addline "TrustedMACList $macs"
   fi
+
+  return 0
 }
 
 setup_firewall() {
@@ -93,9 +99,11 @@ wait_for_interface() {
     sleep 1
     if [ $i = $timeout ]; then
       echo "Interface $ifname not detected." >&2
-      exit 1
+      return 1
     fi
   done
+
+  return 0
 }
 
 generate_uci_config() {
@@ -112,33 +120,30 @@ generate_uci_config() {
   if [ -n "$val" ]; then
     if [ ! -f "$val" ]; then
       echo "Configuration file '$file' doesn't exist." >&2
-      exit 1
+      return 1
     fi
     addline "$(cat $val)"
   fi
 
   config_get ifname "$cfg" gatewayinterface
-  if [ -z "$ifname" ]; then
-    config_get ifname "$cfg" network
-  fi
 
   # Get device name if interface name is a section name in /etc/config/network
   if network_get_device tmp "$ifname"; then
-      ifname="$tmp"
+    ifname="$tmp"
   fi
 
   if [ -z "$ifname" ]; then
-      echo "Option network or gatewayinterface missing." >&2
-      exit 1
+    echo "Option network or gatewayinterface missing." >&2
+    return 1
   fi
 
-  wait_for_interface "$ifname"
+  wait_for_interface "$ifname" || return 1
 
   addline "GatewayInterface $ifname"
 
-  for option in binauth fasport fasremoteip faspath fas_secure_enabled \
+  for option in preauth binauth \
     daemon debuglevel maxclients gatewayname gatewayinterface gatewayiprange \
-    gatewayaddress gatewayport webroot splashpage statuspage imagesdir pagesdir \
+    gatewayaddress gatewayport webroot splashpage statuspage \
     redirecturl sessiontimeout preauthidletimeout authidletimeout checkinterval \
     setmss mssvalue trafficcontrol downloadlimit uploadlimit \
     syslogfacility ndsctlsocket fw_mark_authenticated \
@@ -150,7 +155,13 @@ generate_uci_config() {
       addline "$option $val"
     fi
   done
-
+  for option in fasport fasremoteip faspath fas_secure_enabled ; do
+    config_get val "$cfg" "$option"
+    if [ -n "$val" ]; then
+      echo "Warning: nodogsplash does not support $val"
+      return 1
+    fi
+  done
   config_get download "$cfg" downloadlimit
   config_get upload "$cfg" uploadlimit
 
@@ -158,10 +169,11 @@ generate_uci_config() {
     addline "TrafficControl yes"
   fi
 
-  setup_mac_lists "$cfg"
+  setup_mac_lists "$cfg" || return 1
   setup_firewall "$cfg"
 
   echo "$CONFIG" > "/tmp/etc/nodogsplash_$cfg.conf"
+  return 0
 }
 
 # setup configuration and start instance
@@ -172,7 +184,10 @@ create_instance() {
   config_get_bool val "$cfg" enabled 0
   [ $val -gt 0 ] || return 0
 
-  generate_uci_config "$cfg"
+  if ! generate_uci_config "$cfg"; then
+    echo "Can not generate uci config. Will not start instance $cfg." >&2
+    return 1
+  fi
 
   procd_open_instance $cfg
   procd_set_param command /usr/bin/nodogsplash -c "/tmp/etc/nodogsplash_$cfg.conf" $OPTIONS
index ea23137f311122cc6525aa2870010bbb11cff8b5..95f3465364dc929d362816dfca34876e0cd41203 100644 (file)
@@ -7,24 +7,23 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ohybridproxy
-PKG_SOURCE_VERSION:=8a28ae92c97099e771c9ede5641e3782ae809c27
-PKG_VERSION:=2016-06-28-$(PKG_SOURCE_VERSION)
-PKG_RELEASE:=1
+PKG_SOURCE_VERSION:=0dfef1eb5f067250a5f24a899536879ea4fdc4c5
+PKG_SOURCE_DATE:=2020-05-22
+PKG_RELEASE:=3
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/sbyx/ohybridproxy.git
+PKG_MIRROR_HASH:=378559afd98a4336f327fde981e55167e988dc5ab7a19773c8ef24aa7fca0689
+
 PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
-PKG_LICENSE:=GPL-2.0
+PKG_LICENSE:=GPL-2.0-only
+PKG_LICENSE_FILES:=LICENSE
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_PARALLEL:=1
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/cmake.mk
 
-# Spammy debug builds for now
-CMAKE_OPTIONS += -DL_LEVEL=7
-
 define Package/ohybridproxy
   SECTION:=net
   CATEGORY:=Network
diff --git a/ohybridproxy/patches/0001-find-libubox.patch b/ohybridproxy/patches/0001-find-libubox.patch
deleted file mode 100644 (file)
index e29db5c..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-From c015e7e62ed4c7645595f7f83cf156810433d0cd Mon Sep 17 00:00:00 2001
-From: Florian Fainelli <f.fainelli@gmail.com>
-Date: Mon, 5 Jun 2017 17:56:33 -0700
-Subject: [PATCH] Cmake: Search and find libubox/utils.h
-
----
- CMakeLists.txt | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 2556669d2a52..1c970d92ff56 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -16,6 +16,9 @@ else(${APPLE})
- set(dns_sd "dns_sd")
- endif(${APPLE})
-+FIND_PATH(ubox_include_dir libubox/utils.h)
-+INCLUDE_DIRECTORIES(${ubox_include_dir})
-+
- set(CORE src/cache.c src/io.c src/socket.c)
- add_executable(ohybridproxy src/ohybridproxy.c src/dns2mdns.c ${CORE})
--- 
-2.9.3
-
index 75f377e689da2deac12c2f460cc45f2243384275..9d348e8c669ce670904736de8cb7d71038614d70 100644 (file)
@@ -1,22 +1,20 @@
-# 
-# Copyright (C) 2009-2016 OpenWrt.org
+# SPDX-License-Identifier: GPL-2.0-or-later
 #
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
+# Copyright (C) 2009-2016 OpenWrt.org
 #
 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=olsrd
-PKG_VERSION:=0.9.6.2
-PKG_RELEASE=$(PKG_SOURCE_VERSION)
+PKG_SOURCE_DATE:=2023-06-12
+PKG_RELEASE:=1
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/OLSR/olsrd.git
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_VERSION:=v0.9.6.2
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
+PKG_SOURCE_VERSION:=a9b3f1ac6e73a39b5bd97d1e66b1e039998314f5
+PKG_MIRROR_HASH:=2bd60af2a79711d7db2a9e42b48f757ab48712cfdeb0115d5384718010818e19
 
+PKG_MAINTAINER:=Nick Hainke <vincent@systemli.org>
 PKG_BUILD_PARALLEL:=0
 PKG_LICENSE:=BSD-3-Clause
 
@@ -36,7 +34,7 @@ endef
 define Package/olsrd
   $(call Package/olsrd/template)
   MENU:=1
-  DEPENDS:=+libpthread
+  DEPENDS:=+libpthread +libubus +iptables +IPV6:ip6tables
 endef
 
 define Package/olsrd/conffiles
@@ -56,6 +54,13 @@ define Package/olsrd-mod-dot-draw
   TITLE:=Dot topology information plugin
 endef
 
+
+define Package/olsrd-mod-filtergw
+  $(call Package/olsrd/template)
+  DEPENDS:=olsrd
+  TITLE:=Filter Gateway plugin
+endef
+
 define Package/olsrd-mod-bmf
   $(call Package/olsrd/template)
   DEPENDS:=olsrd +kmod-tun
@@ -95,7 +100,7 @@ endef
 define Package/olsrd-mod-mdns
   $(call Package/olsrd/template)
   DEPENDS:=olsrd
-  TITLE:=MDNS/Zeroconf/Bonjour packet distribution 
+  TITLE:=MDNS/Zeroconf/Bonjour packet distribution
 endef
 
 define Package/olsrd-mod-nameservice
@@ -152,6 +157,12 @@ define Package/olsrd-mod-watchdog
   TITLE:=Watchdog plugin
 endef
 
+define Package/olsrd-utils
+  $(call Package/olsrd/template)
+  DEPENDS:=olsrd
+  TITLE:=Utils for OLSRD
+endef
+
 define Package/olsrd-mod-pud/conffiles
 /etc/olsrd.d/olsrd.pud.position.conf
 endef
@@ -170,7 +181,7 @@ MAKE_FLAGS+= \
        DESTDIR="$(PKG_INSTALL_DIR)" \
        STRIP="true" \
        INSTALL_LIB="true" \
-       SUBDIRS="arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo jsoninfo netjson mdns nameservice p2pd pgraph pud quagga secure sgwdynspeed txtinfo watchdog"
+       SUBDIRS="arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo filtergw jsoninfo netjson mdns nameservice p2pd pgraph pud quagga secure sgwdynspeed txtinfo watchdog"
 
 define Build/Compile
        $(call Build/Compile/Default,all)
@@ -179,7 +190,7 @@ endef
 
 define Package/olsrd/install
        $(INSTALL_DIR) $(1)/lib/functions
-       $(INSTALL_DATA) ./files/olsrd.init $(1)/lib/functions/olsrd.sh
+       $(INSTALL_DATA) ./files/olsrd.sh $(1)/lib/functions/olsrd.sh
        $(INSTALL_DIR) $(1)/etc/config
        $(INSTALL_DATA) ./files/olsrd.config $(1)/etc/config/olsrd
        $(INSTALL_DATA) ./files/olsrd6.config $(1)/etc/config/olsrd6
@@ -188,8 +199,6 @@ define Package/olsrd/install
        $(INSTALL_DIR) $(1)/etc/init.d
        $(INSTALL_BIN) ./files/olsrd4.init $(1)/etc/init.d/olsrd
        $(INSTALL_BIN) ./files/olsrd6.init $(1)/etc/init.d/olsrd6
-       $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
-       $(INSTALL_BIN) ./files/olsrd.hotplug.sh $(1)/etc/hotplug.d/iface/50-olsrd
 endef
 
 define Package/olsrd-mod-arprefresh/install
@@ -197,6 +206,11 @@ define Package/olsrd-mod-arprefresh/install
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/arprefresh/olsrd_arprefresh.so.* $(1)/usr/lib/
 endef
 
+define Package/olsrd-mod-filtergw/install
+       $(INSTALL_DIR) $(1)/usr/lib
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/filtergw/olsrd_filtergw.so.* $(1)/usr/lib/
+endef
+
 define Package/olsrd-mod-dot-draw/install
        $(INSTALL_DIR) $(1)/usr/lib
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/dot_draw/olsrd_dot_draw.so.* $(1)/usr/lib/
@@ -290,9 +304,15 @@ define Package/olsrd-mod-watchdog/install
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/watchdog/olsrd_watchdog.so.* $(1)/usr/lib/
 endef
 
+define Package/olsrd-utils/install
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) ./files/olsrd-neigh.sh $(1)/usr/bin/olsrd-neigh
+endef
+
 $(eval $(call BuildPackage,olsrd))
 $(eval $(call BuildPackage,olsrd-mod-arprefresh))
 $(eval $(call BuildPackage,olsrd-mod-dot-draw))
+$(eval $(call BuildPackage,olsrd-mod-filtergw))
 $(eval $(call BuildPackage,olsrd-mod-bmf))
 $(eval $(call BuildPackage,olsrd-mod-dyn-gw))
 $(eval $(call BuildPackage,olsrd-mod-dyn-gw-plain))
@@ -309,3 +329,4 @@ $(eval $(call BuildPackage,olsrd-mod-secure))
 $(eval $(call BuildPackage,olsrd-mod-sgwdynspeed))
 $(eval $(call BuildPackage,olsrd-mod-txtinfo))
 $(eval $(call BuildPackage,olsrd-mod-watchdog))
+$(eval $(call BuildPackage,olsrd-utils))
diff --git a/olsrd/files/olsrd-neigh.sh b/olsrd/files/olsrd-neigh.sh
new file mode 100755 (executable)
index 0000000..65a32a6
--- /dev/null
@@ -0,0 +1,109 @@
+#!/bin/sh
+
+. /usr/share/libubox/jshn.sh
+
+hostsfile_getname()
+{
+       local config="$1"
+       local i=0
+       local value file
+
+       while value="$( uci -q get $config.@LoadPlugin[$i].library )"; do {
+               case "$value" in
+                       'olsrd_nameservice'*)
+                               file="$( uci -q get $config.@LoadPlugin[$i].hosts_file )"
+                               break
+                       ;;
+               esac
+
+               i=$(( i + 1 ))
+       } done
+
+       echo "${file:-/var/run/hosts_olsr}"
+}
+
+read_hostnames()
+{
+       local file_list=" $( hostsfile_getname 'olsrd' ) $(hostsfile_getname 'olsrd6' ) "
+       local line ip hostname file file_list_uniq
+
+       for file in $file_list; do {
+               case " $file_list_uniq " in
+                       *" $file "*)
+                       ;;
+                       *)
+                               file_list_uniq="$file_list_uniq $file"
+                       ;;
+               esac
+       } done
+
+       for file in $file_list_uniq; do {
+               [ -e "$file" ] || continue
+
+               while read -r line; do {
+                       case "$line" in
+                               [0-9]*)
+                                       # 2001:ffff:ffff:ffff::1 SomeNode-core.olsr   # myself
+                                       # 10.0.0.1  SomeNode    # 10.0.0.1
+                                       set -f
+                                       set +f -- $line
+                                       ip="$1"
+                                       hostname="$2"
+
+                                       # global vars, e.g.
+                                       # IP_1_2_3_4='foo' or IP_2001_ffff_ffff_ffff__1='bar'
+                                       eval IP_${ip//[.:]/_}="$hostname"
+                               ;;
+                       esac
+               } done <"$file"
+       } done
+}
+
+read_hostnames
+
+VARS='localIP:Local remoteIP:Remote validityTime:vTime linkQuality:LQ'
+VARS="$VARS neighborLinkQuality:NLQ linkCost:Cost remoteHostname:Host"
+
+for HOST in '127.0.0.1' '::1';do
+       # check for availability of HOST
+       nc $HOST 9090 >/dev/null 2>&1
+       if [ $? != 0 ]; then
+               continue
+       fi
+
+       json_init
+       json_load "$( echo /links | nc $HOST 9090 | sed -n '/^[}{ ]/p' )"       # remove header/non-json
+
+       if json_is_a links array;then
+               json_select links
+               for v in ${VARS};do
+                       eval _${v%:*}=0
+               done
+               for j in 0 1;do
+                       case ${j} in 1)
+                               for v in ${VARS};do
+                                       eval printf \"%-\${_${v%:*}}s \" ${v#*:}
+                               done
+                               echo
+                       ;;esac
+                       i=1;while json_is_a ${i} object;do
+                               json_select ${i}
+                               json_get_vars $(for v in ${VARS};do echo ${v%:*};done)
+                               case ${j} in 0)
+                                       for v in ${VARS};do
+                                               eval "test \${_${v%:*}} -lt \${#${v%:*}} && _${v%:*}=\${#${v%:*}}"
+                                       done
+                               ;;*)
+                                       for v in ${VARS};do
+                                               eval printf \"%-\${_${v%:*}}s \" \$${v%:*}
+                                               eval remoteHostname="\$IP_${remoteIP//[.:]/_}"
+                                       done
+                                       echo
+                               ;;esac
+                               json_select ..
+                               i=$(( i + 1 ))
+                       done
+               done
+       fi
+       echo
+done
index 15ea80a41867e7e5a3f3c4c0de7a3c4676bddd4c..68024ed3bda82d5383519712c50d96d28a9e6da0 100644 (file)
@@ -22,3 +22,8 @@ config LoadPlugin
 
 config Interface
        list interface 'wlan'
+
+config procd procd
+       option respawn_threshold '3600'
+       option respawn_timeout '15'
+       option respawn_retry '0'
diff --git a/olsrd/files/olsrd.hotplug.sh b/olsrd/files/olsrd.hotplug.sh
deleted file mode 100755 (executable)
index ee41a2e..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/bin/sh
-
-olsrd_list_configured_interfaces()
-{
-       local i=0
-       local interface
-
-       while interface="$( uci -q get $OLSRD.@Interface[$i].interface )"; do {
-               case "$( uci -q get $OLSRD.@Interface[$i].ignore )" in
-                       1|on|true|enabled|yes)
-                               # is disabled
-                       ;;
-                       *)
-                               echo "$interface"       # e.g. 'lan'
-                       ;;
-               esac
-
-               i=$(( i + 1 ))
-       } done
-}
-
-olsrd_interface_already_in_config()
-{
-       # e.g.: 'Interface "eth0.1" "eth0.2" "wlan0"'
-       if grep -s ^'Interface ' "/var/etc/$OLSRD.conf" | grep -q "\"$DEVICE\""; then
-               logger -t olsrd_hotplug -p daemon.debug "[OK] already_active: '$INTERFACE' => '$DEVICE'"
-               return 0
-       else
-               logger -t olsrd_hotplug -p daemon.info "[OK] ifup: '$INTERFACE' => '$DEVICE'"
-               return 1
-       fi
-}
-
-olsrd_interface_needs_adding()
-{
-       local interface
-
-       # likely and cheap operation:
-       olsrd_interface_already_in_config && return 1
-
-       for interface in $(olsrd_list_configured_interfaces); do {
-               [ "$interface" = "$INTERFACE" ] && {
-                       olsrd_interface_already_in_config || return 0
-               }
-       } done
-
-       logger -t olsrd_hotplug -p daemon.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
-               OLSRD=olsrd
-               [ -e "/var/etc/$OLSRD.conf" ] && {
-                       # INTERFACE = e.g. 'wlanadhocRADIO1' or 'cfg144d8f'
-                       # DEVICE    = e.g. 'wlan1-1'
-                       olsrd_interface_needs_adding && {
-                               . /etc/rc.common /etc/init.d/$OLSRD restart
-                       }
-               }
-
-               OLSRD=olsrd6
-               [ -e "/var/etc/$OLSRD.conf" ] && {
-                       olsrd_interface_needs_adding && {
-                               . /etc/rc.common /etc/init.d/$OLSRD restart
-                       }
-               }
-       ;;
-esac
diff --git a/olsrd/files/olsrd.init b/olsrd/files/olsrd.init
deleted file mode 100644 (file)
index 8e562c1..0000000
+++ /dev/null
@@ -1,823 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2008-2017 OpenWrt.org
-
-START=65
-
-SERVICE_DAEMONIZE=1
-SERVICE_WRITE_PID=1
-
-OLSRD_OLSRD_SCHEMA='ignore:internal config_file:internal DebugLevel=0 AllowNoInt=yes'
-OLSRD_IPCCONNECT_SCHEMA='ignore:internal Host:list Net:list2'
-OLSRD_LOADPLUGIN_SCHEMA='ignore:internal library:internal Host4:list Net4:list2 Host:list Net:list2 Host6:list Net6:list2 Ping:list redistribute:list NonOlsrIf:list name:list lat lon latlon_infile HNA:list2 hosts:list2 ipv6only:bool'
-OLSRD_INTERFACE_SCHEMA='ignore:internal interface:internal AutoDetectChanges:bool LinkQualityMult:list2'
-OLSRD_INTERFACE_DEFAULTS_SCHEMA='AutoDetectChanges:bool'
-
-T='    '
-N='
-'
-
-log() {
-       logger -t olsrd -p daemon.info -s "${initscript}: $*"
-}
-
-error() {
-        logger -t olsrd -p daemon.err -s "${initscript}: ERROR: $*"
-}
-
-warn() {
-        logger -t olsrd -p daemon.warn -s "${initscript}: WARNING: $*"
-}
-
-validate_varname() {
-       local varname="$1"
-       [ -z "$varname" -o "$varname" != "${varname%%[!A-Za-z0-9_]*}" ] && return 1
-       return 0
-}
-
-validate_olsrd_option() {
-       local str="$1"
-       [ -z "$str" -o "$str" != "${str%%[!     0-9A-Za-z.%/|:_-]*}" ] && return 1
-       return 0
-}
-
-system_config() {
-       local cfg="$1"
-       local cfgt hostname latlon oldIFS
-
-       config_get cfgt "$cfg" TYPE
-
-       if [ "$cfgt" = "system" ]; then
-               config_get hostname "$cfg" hostname
-               hostname="${hostname:-OpenWrt}"
-               SYSTEM_HOSTNAME="$hostname"
-       fi
-
-       if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then
-               config_get latlon "$cfg" latlon
-               oldIFS="$IFS"; IFS=" ${T}${N},"; set -- $latlon; IFS="$oldIFS"
-               SYSTEM_LAT="$1"
-               SYSTEM_LON="$2"
-       fi
-
-       if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then
-               config_get latlon "$cfg" latitude
-               SYSTEM_LAT="$latlon"
-               config_get latlon "$cfg" longitude
-               SYSTEM_LON="$latlon"
-       fi
-}
-
-olsrd_find_config_file() {
-       local cfg="$1"
-       validate_varname "$cfg" || return 0
-
-       config_get_bool ignore "$cfg" ignore 0
-       [ "$ignore" -ne 0 ] && return 0
-       config_get OLSRD_CONFIG_FILE "$cfg" config_file
-
-       return 0
-}
-
-warning_invalid_value() {
-       local funcname="warning_invalid_value"
-       local package="$1"
-       validate_varname "$package" || package=
-       local config="$2"
-       validate_varname "$config" || config=
-       local option="$3"
-       validate_varname "$option" || option=
-
-       if [ -n "$package" -a -n "$config" ]; then
-               log "$funcname() in option '$package.$config${option:+.}$option', skipped"
-       else
-               log "$funcname() skipped"
-       fi
-
-       return 0
-}
-
-olsrd_write_option() {
-       local param="$1"
-       local cfg="$2"
-       validate_varname "$cfg" || return 1
-       local option="$3"
-       validate_varname "$option" || return 1
-       local value="$4"
-       local option_type="$5"
-
-       if [ "$option_type" = bool ]; then
-               case "$value" in
-                       1|on|true|enabled|yes) value=yes;;
-                       0|off|false|disabled|no) value=no;;
-                       *) warning_invalid_value olsrd "$cfg" "$option"; return 1;;
-               esac
-       fi
-
-       if ! validate_olsrd_option "$value"; then
-               warning_invalid_value olsrd "$cfg" "$option"
-               return 1
-       fi
-
-       if [ "$value" != "${value%%[G-Zg-z_-]*}" ]; then
-               if [ "$option" != "Ip6AddrType" -a "$option" != "LinkQualityMult" -a "$value" != "yes" -a "$value" != "no" ]; then
-                       value="\"$value\""
-               fi
-       fi
-
-       printf '%s' "${N}$param$option $value"
-}
-
-olsrd_write_plparam() {
-       local funcname="olsrd_write_plparam"
-       local param="$1"
-       local cfg="$2"
-       local option="$3"
-       local value="$4"
-       local option_type="$5"
-       local _option oldIFS
-
-       validate_varname "$cfg" || return 1
-       validate_varname "$option" || return 1
-
-       if [ "$option_type" = bool ]; then
-               case "$value" in
-                       1|on|true|enabled|yes) value=yes;;
-                       0|off|false|disabled|no) value=no;;
-                       *) warning_invalid_value olsrd "$cfg" "$option"; return 1;;
-               esac
-       fi
-
-       if ! validate_olsrd_option "$value"; then
-               warning_invalid_value olsrd "$cfg" "$option"
-               return 1
-       fi
-
-       oldIFS="$IFS"
-       IFS='-_'
-       set -- $option
-       option="$*"
-       IFS="$oldIFS"
-       _option="$option"
-
-       if [ "$option" = 'hosts' ]; then
-               set -- $value
-               option="$1"
-               shift
-               value="$*"
-       fi
-
-       if [ "$option" = 'NonOlsrIf' ]; then
-               if validate_varname "$value"; then
-                       if network_get_device ifname "$value"; then
-                               log "$funcname() Info: mdns Interface '$value' ifname '$ifname' found"
-                       else
-                               log "$funcname() Warning: mdns Interface '$value' not found, skipped"
-                       fi
-               else
-                       warning_invalid_value olsrd "$cfg" "NonOlsrIf"
-               fi
-
-               [ -z "$ifname" ] || value=$ifname
-       fi
-
-       printf '%s' "${N}${param}PlParam \"$option\" \"$value\""
-}
-
-config_update_schema() {
-       local schema_varname="$1"
-       local command="$2"
-       local option="$3"
-       local value="$4"
-       local schema
-       local cur_option
-
-       validate_varname "$schema_varname" || return 1
-       validate_varname "$command" || return 1
-       validate_varname "$option" || return 1
-
-       case "$varname" in
-               *_LENGTH) return 0;;
-               *_ITEM*) return 0;;
-       esac
-
-       eval "export -n -- \"schema=\${$schema_varname}\""
-
-       for cur_option in $schema; do
-               [ "${cur_option%%[:=]*}" = "$option" ] && return 0
-       done
-
-       if [ "$command" = list ]; then
-               set -- $value
-               if [ "$#" -ge "3" ]; then
-                       schema_entry="$option:list3"
-               elif [ "$#" -ge "2" ]; then
-                       schema_entry="$option:list2"
-               else
-                       schema_entry="$option:list"
-               fi
-       else
-               schema_entry="$option"
-       fi
-
-       append "$schema_varname" "$schema_entry"
-
-       return 0
-}
-
-config_write_options() {
-       local funcname="config_write_options"
-       local schema="$1"
-       local cfg="$2"
-       validate_varname "$cfg" || return 1
-       local write_func="$3"
-       [ -z "$write_func" ] && output_func=echo
-       local write_param="$4"
-
-       local schema_entry option option_length option_type default value list_size list_item list_value i position speed oldIFS
-       local list_speed_vars="HelloInterval HelloValidityTime TcInterval TcValidityTime MidInterval MidValidityTime HnaInterval HnaValidityTime"
-
-       get_value_for_entry()
-       {
-               local schema_entry="$1"
-
-               default="${schema_entry#*[=]}"
-               [ "$default" = "$schema_entry" ] && default=
-               option="${schema_entry%%[=]*}"
-
-               oldIFS="$IFS"; IFS=':'; set -- $option; IFS="$oldIFS"
-               option="$1"
-               option_type="$2"
-
-               validate_varname "$option" || return 1
-               [ -z "$option_type" ] || validate_varname "$option_type" || return 1
-               [ "$option_type" = internal ] && return 1
-
-               config_get value "$cfg" "$option"
-               [ "$option" = "speed" ] && return 1
-
-               return 0
-       }
-
-       already_in_schema()
-       {
-               case " $schema " in
-                       *" $1 "*)
-                               return 0
-                       ;;
-                       *)
-                               return 1
-                       ;;
-               esac
-       }
-
-       already_in_schema "speed" && {
-               get_value_for_entry "speed"
-
-               if test 2>/dev/null "$value" -gt 0 -a "$value" -le 20 ; then
-                       speed="$value"
-               else
-                       log "$funcname() Warning: invalid speed-value: '$value' - allowed integers: 1...20, fallback to 6"
-                       speed=6
-               fi
-
-               for schema_entry in $list_speed_vars; do {
-                       already_in_schema "$schema_entry" || schema="$schema $schema_entry"
-               } done
-       }
-
-       for schema_entry in $schema; do
-               if [ -n "$speed" ]; then                # like sven-ola freifunk firmware fff-1.7.4
-                       case "$schema_entry" in
-                               HelloInterval)
-                                       value="$(( speed / 2 + 1 )).0"
-                               ;;
-                               HelloValidityTime)
-                                       value="$(( speed * 25 )).0"
-                               ;;
-                               TcInterval)     # todo: not fisheye? -> $(( speed * 2 ))
-                                       value=$(( speed / 2 ))
-                                       [ $value -eq 0 ] && value=1
-                                       value="$value.0"
-                               ;;
-                               TcValidityTime)
-                                       value="$(( speed * 100 )).0"
-                               ;;
-                               MidInterval)
-                                       value="$(( speed * 5 )).0"
-                               ;;
-                               MidValidityTime)
-                                       value="$(( speed * 100 )).0"
-                               ;;
-                               HnaInterval)
-                                       value="$(( speed * 2 )).0"
-                               ;;
-                               HnaValidityTime)
-                                       value="$(( speed * 25 )).0"
-                               ;;
-                               *)
-                                       get_value_for_entry "$schema_entry" || continue
-                               ;;
-                       esac
-
-                       is_speed_var()
-                       {
-                               case " $list_speed_vars " in
-                                       *" $1 "*)
-                                               return 0
-                                       ;;
-                                       *)
-                                               return 1
-                                       ;;
-                               esac
-                       }
-
-                       is_speed_var "$schema_entry" && option="$schema_entry"
-               else
-                       get_value_for_entry "$schema_entry" || continue
-               fi
-
-               if [ -z "$value" ]; then
-                       oldIFS="$IFS"; IFS='+'; set -- $default; IFS="$oldIFS"
-                       value=$*
-               elif [ "$value" = '-' -a -n "$default" ]; then
-                       continue
-               fi
-
-               [ -z "$value" ] && continue
-
-               case "$option_type" in
-                       list) list_size=1;;
-                       list2) list_size=2;;
-                       list3) list_size=3;;
-                       *) list_size=0;;
-               esac
-
-               if [ "$list_size" -gt 0 ]; then
-                       config_get option_length "$cfg" "${option}_LENGTH"
-                       if [ -n "$option_length" ]; then
-                               i=1
-                               while [ "$i" -le "$option_length" ]; do
-                                       config_get list_value "$cfg" "${option}_ITEM$i"
-                                       "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break
-                                       i=$((i + 1))
-                               done
-                       else
-                               list_value=
-                               i=0
-                               for list_item in $value; do
-                                       append "list_value" "$list_item"
-                                       i=$((i + 1))
-                                       position=$((i % list_size))
-                                       if [ "$position" -eq 0 ]; then
-                                               "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break
-                                               list_value=
-                                       fi
-                               done
-                               [ "$position" -ne 0 ] && "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type"
-                       fi
-               else
-                       "$write_func" "$write_param" "$cfg" "$option" "$value" "$option_type"
-               fi
-       done
-
-       return 0
-}
-
-olsrd_write_olsrd() {
-       local cfg="$1"
-       validate_varname "$cfg" || return 0
-       local ignore
-
-       config_get_bool ignore "$cfg" ignore 0
-       [ "$ignore" -ne 0 ] && return 0
-
-       [ "$OLSRD_COUNT" -gt 0 ] && return 0
-
-       config_get smartgateway "$cfg" SmartGateway
-       config_get smartgatewayuplink "$cfg" SmartGatewayUplink
-       export smartgateway
-       export smartgatewayuplink
-
-       config_write_options "$OLSRD_OLSRD_SCHEMA" "$cfg" olsrd_write_option
-       echo
-       OLSRD_COUNT=$((OLSRD_COUNT + 1))
-       return 0
-}
-
-olsrd_write_ipcconnect() {
-       local cfg="$1"
-       validate_varname "$cfg" || return 0
-       local ignore
-
-       config_get_bool ignore "$cfg" ignore 0
-       [ "$ignore" -ne 0 ] && return 0
-
-       [ "$IPCCONNECT_COUNT" -gt 0 ] && return 0
-
-       printf '%s' "${N}IpcConnect${N}{"
-       config_write_options "$OLSRD_IPCCONNECT_SCHEMA" "$cfg" olsrd_write_option "${T}"
-       echo "${N}}"
-       IPCCONNECT_COUNT=$((IPCCONNECT_COUNT + 1))
-}
-
-olsrd_write_hna4() {
-       local cfg="$1"
-       validate_varname "$cfg" || return 0
-       local ignore
-
-       config_get_bool ignore "$cfg" ignore 0
-       [ "$ignore" -ne 0 ] && return 0
-
-       config_get netaddr "$cfg" netaddr
-       if ! validate_olsrd_option "$netaddr"; then
-               warning_invalid_value olsrd "$cfg" "netaddr"
-               return 0
-       fi
-
-       config_get netmask "$cfg" netmask
-       if ! validate_olsrd_option "$netmask"; then
-               warning_invalid_value olsrd "$cfg" "netmask"
-               return 0
-       fi
-
-       [ "$HNA4_COUNT" -le 0 ] && printf '%s' "${N}Hna4${N}{"
-       printf '%s' "${N}${T}${T}$netaddr $netmask"
-       HNA4_COUNT=$((HNA4_COUNT + 1))
-}
-
-olsrd_write_hna6() {
-       local cfg="$1"
-       validate_varname "$cfg" || return 0
-       local ignore
-
-       config_get_bool ignore "$cfg" ignore 0
-       [ "$ignore" -ne 0 ] && return 0
-
-       config_get netaddr "$cfg" netaddr
-       if ! validate_olsrd_option "$netaddr"; then
-               warning_invalid_value olsrd "$cfg" "netaddr"
-               return 0
-       fi
-
-       config_get prefix "$cfg" prefix
-       if ! validate_olsrd_option "$prefix"; then
-               warning_invalid_value olsrd "$cfg" "prefix"
-               return 0
-       fi
-
-       [ "$HNA6_COUNT" -le 0 ] && printf '%s' "${N}Hna6${N}{"
-       printf '%s' "${N}${T}${T}$netaddr $prefix"
-       HNA6_COUNT=$((HNA6_COUNT + 1))
-}
-
-find_most_recent_plugin_libary()
-{
-       local library="$1"      # e.g. 'olsrd_dyn_gw' or 'olsrd_txtinfo.so.1.1'
-       local file file_fullpath unixtime
-
-       for file in "/lib/$library"* "/usr/lib/$library"* "/usr/local/lib/$library"*; do {
-               [ -f "$file" ] && {
-                       file_fullpath="$file"
-                       file="$( basename "$file" )"
-                       # make sure that we do not select
-                       # 'olsrd_dyn_gw_plain.so.0.4' if user wants
-                       # 'olsrd_dyn_gw.so.0.5' -> compare part before 1st dot
-                       [ "${library%%.*}" = "${file%%.*}" ] && {
-                               unixtime="$( date +%s -r "$file_fullpath" )"
-                               echo "$unixtime $file"
-                       }
-               }
-       } done | sort -n | tail -n1 | cut -d' ' -f2
-}
-
-olsrd_write_loadplugin()
-{
-       local funcname='olsrd_write_loadplugin'
-       local cfg="$1"
-       local ignore name suffix lat lon latlon_infile
-
-       validate_varname "$cfg" || return 0
-
-       config_get_bool ignore "$cfg" ignore 0
-       [ "$ignore" -ne 0 ] && return 0
-
-       # e.g. olsrd_txtinfo.so.1.1 or 'olsrd_txtinfo'
-       config_get library "$cfg" library
-
-       library="$( find_most_recent_plugin_libary "$library" )"
-       if [ -z "$library" ]; then
-               log "$funcname() Warning: Plugin library '$library' not found, skipped"
-               return 0
-       else
-               library="$( basename "$library" )"
-       fi
-
-       validate_olsrd_option "$library" || {
-               warning_invalid_value olsrd "$cfg" 'library'
-               return 0
-       }
-
-       case "$library" in
-               'olsrd_nameservice.'*)
-                       config_get name "$cfg" name
-                       [ -z "$name" ] && config_set "$cfg" name $SYSTEM_HOSTNAME
-
-                       config_get suffix "$cfg" suffix
-                       [ -z "$suffix" ] && config_set "$cfg" suffix '.olsr'
-
-                       config_get lat "$cfg" lat
-                       config_get lon "$cfg" lon
-                       config_get latlon_infile "$cfg" latlon_infile
-                       if [ \( -z "$lat" -o -z "$lat" \) -a -z "$latlon_infile" ]; then
-                               if [ -f '/var/run/latlon.txt' ]; then
-                                       config_set "$cfg" lat ''
-                                       config_set "$cfg" lon ''
-                                       config_set "$cfg" latlon_infile '/var/run/latlon.txt'
-                               else
-                                       config_set "$cfg" lat "$SYSTEM_LAT"
-                                       config_set "$cfg" lon "$SYSTEM_LON"
-                               fi
-                       fi
-
-                       for f in latlon_file hosts_file services_file resolv_file macs_file; do
-                               config_get $f "$cfg" $f
-                       done
-
-                       [ -z "$latlon_file" ] && config_set "$cfg" latlon_file '/var/run/latlon.js'
-               ;;
-               'olsrd_watchdog.'*)
-                       config_get wd_file "$cfg" file
-               ;;
-       esac
-
-       printf '%s' "${N}LoadPlugin \"$library\"${N}{"
-       config_write_options "$OLSRD_LOADPLUGIN_SCHEMA" "$cfg" olsrd_write_plparam "${T}"
-       echo "${N}}"
-}
-
-olsrd_write_interface() {
-       local funcname="olsrd_write_interface"
-       local cfg="$1"
-       validate_varname "$cfg" || return 0
-       local ignore
-       local interfaces
-       local interface
-       local ifnames
-
-       config_get_bool ignore "$cfg" ignore 0
-       [ "$ignore" -ne 0 ] && return 0
-
-       ifnames=
-       config_get interfaces "$cfg" interface
-
-       for interface in $interfaces; do
-               if validate_varname "$interface"; then
-                       if network_get_device IFNAME "$interface"; then
-                               ifnames="$ifnames \"$IFNAME\""
-                               ifsglobal="$ifsglobal $IFNAME"
-                       elif network_get_physdev IFNAME "$interface"; then
-                               local proto="$(uci -q get network.${interface}.proto)"
-                               if [ "$proto" = "static" -o "$proto" = "none" ]; then
-                                       ifnames="$ifnames \"$IFNAME\""
-                                       ifsglobal="$ifsglobal $IFNAME"
-                               fi
-                       else
-                               log "$funcname() Warning: Interface '$interface' not found, skipped"
-                       fi
-               else
-                       warning_invalid_value olsrd "$cfg" "interface"
-               fi
-       done
-
-       [ -z "$ifnames" ] && return 0
-
-       printf '%s' "${N}Interface$ifnames${N}{"
-       config_write_options "$OLSRD_INTERFACE_SCHEMA" "$cfg" olsrd_write_option "${T}"
-       echo "${N}}"
-       INTERFACES_COUNT=$((INTERFACES_COUNT + 1))
-}
-
-olsrd_write_interface_defaults() {
-       local cfg="$1"
-       validate_varname "$cfg" || return 0
-
-       printf '%s' "${N}InterfaceDefaults$ifnames${N}{"
-       config_write_options "$OLSRD_INTERFACE_DEFAULTS_SCHEMA" "$cfg" olsrd_write_option "${T}"
-       echo "${N}}"
-
-       return 1
-}
-
-olsrd_update_schema() {
-       local command="$1"
-       local varname="$2"
-       local value="$3"
-       local cfg="$CONFIG_SECTION"
-       local cfgt
-
-       validate_varname "$command" || return 0
-       validate_varname "$varname" || return 0
-
-       config_get cfgt "$cfg" TYPE
-       case "$cfgt" in
-               olsrd) config_update_schema OLSRD_OLSRD_SCHEMA "$command" "$varname" "$value";;
-               IpcConnect) config_update_schema OLSRD_IPCCONNECT_SCHEMA "$command" "$varname" "$value";;
-               LoadPlugin) config_update_schema OLSRD_LOADPLUGIN_SCHEMA "$command" "$varname" "$value";;
-               Interface) config_update_schema OLSRD_INTERFACE_SCHEMA "$command" "$varname" "$value";;
-               InterfaceDefaults) config_update_schema OLSRD_INTERFACE_DEFAULTS_SCHEMA "$command" "$varname" "$value";;
-       esac
-
-       return 0
-}
-
-olsrd_write_config() {
-       OLSRD_COUNT=0
-       config_foreach olsrd_write_olsrd olsrd
-       IPCCONNECT_COUNT=0
-       config_foreach olsrd_write_ipcconnect IpcConnect
-       HNA4_COUNT=0
-       config_foreach olsrd_write_hna4 Hna4
-       [ "$HNA4_COUNT" -gt 0 ] && echo "${N}}"
-       HNA6_COUNT=0
-       config_foreach olsrd_write_hna6 Hna6
-       [ "$HNA6_COUNT" -gt 0 ] && echo "${N}}"
-       config_foreach olsrd_write_loadplugin LoadPlugin
-       INTERFACES_COUNT=0
-       config_foreach olsrd_write_interface_defaults InterfaceDefaults
-       config_foreach olsrd_write_interface Interface
-       echo
-
-       return 0
-}
-
-get_wan_ifnames()
-{
-       local wanifnames word catch_next
-
-       command -v ip >/dev/null || return 1
-
-       set -- $( ip route list exact 0.0.0.0/0 table all )
-       for word in $*; do
-               case "$word" in
-                       dev)
-                               catch_next="true"
-                       ;;
-                       *)
-                               [ -n "$catch_next" ] && {
-                                       case "$wanifnames" in
-                                               *" $word "*)
-                                               ;;
-                                               *)
-                                                       wanifnames="$wanifnames $word "
-                                               ;;
-                                       esac
-
-                                       catch_next=
-                               }
-                       ;;
-               esac
-       done
-
-       echo "$wanifnames"
-}
-
-olsrd_setup_smartgw_rules() {
-       local funcname="olsrd_setup_smartgw_rules"
-       local file=
-
-       for file in /etc/modules.d/[0-9]*-ipip; do :; done
-       [ -e "$file" ] || {
-               log "$funcname() Warning: kmod-ipip is missing. SmartGateway will not work until you install it."
-               return 1
-       }
-
-       local wanifnames="$( get_wan_ifnames )"
-
-       if [ -z "$wanifnames" ]; then
-               nowan=1
-       else
-               nowan=0
-       fi
-
-       IP4T="$( command -v iptables )"
-       IP6T="$( command -v ip6tables )"
-
-       # Delete smartgw firewall rules first
-       if [ "$UCI_CONF_NAME" = "olsrd6" ]; then
-               while $IP6T -D forwarding_rule -o tnl_+ -j ACCEPT 2> /dev/null; do :;done
-               for IFACE in $wanifnames; do
-                       while $IP6T -D forwarding_rule -i tunl0 -o $IFACE -j ACCEPT 2> /dev/null; do :; done
-               done
-               for IFACE in $ifsglobal; do
-                       while $IP6T -D input_rule -i $IFACE -p 4 -j ACCEPT 2> /dev/null; do :; done
-               done
-       else
-               while $IP4T -D forwarding_rule -o tnl_+ -j ACCEPT 2> /dev/null; do :;done
-               for IFACE in $wanifnames; do
-                       while $IP4T -D forwarding_rule -i tunl0 -o $IFACE -j ACCEPT 2> /dev/null; do :; done
-               done
-               for IFACE in $ifsglobal; do
-                       while $IP4T -D input_rule -i $IFACE -p 4 -j ACCEPT 2> /dev/null; do :; done
-               done
-               while $IP4T -t nat -D postrouting_rule -o tnl_+ -j MASQUERADE 2> /dev/null; do :;done
-       fi
-
-       # var 'smartgateway' + 'smartgatewayuplink' build in olsrd_write_olsrd()
-       if [ "$smartgateway" = "yes" ]; then
-               log "$funcname() Notice: Inserting firewall rules for SmartGateway"
-
-               if [ ! "$smartgatewayuplink" = "none" ]; then
-                       if [ "$smartgatewayuplink" = "ipv4" ]; then
-                               # Allow everything to be forwarded to tnl_+ and use NAT for it
-                               $IP4T -I forwarding_rule -o tnl_+ -j ACCEPT
-                               $IP4T -t nat -I postrouting_rule -o tnl_+ -j MASQUERADE
-                               # Allow forwarding from tunl0 to (all) wan-interfaces
-                               if [ "$nowan" = '0' ]; then
-                                       for IFACE in $wanifnames; do
-                                               $IP4T -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
-                                       done
-                               fi
-                               # Allow incoming ipip on all olsr-interfaces
-                               for IFACE in $ifsglobal; do
-                                       $IP4T -I input_rule -i $IFACE -p 4 -j ACCEPT
-                               done
-                       elif [ "$smartgatewayuplink" = "ipv6" ]; then
-                               $IP6T -I forwarding_rule -o tnl_+ -j ACCEPT
-                               if [ "$nowan" = '0' ]; then
-                                       for IFACE in $wanifnames; do
-                                               $IP6T -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
-                                       done
-                               fi
-                               for IFACE in $ifsglobal; do
-                                       $IP6T -I input_rule -i $IFACE -p 4 -j ACCEPT
-                               done
-                       else
-                               $IP4T -t nat -I postrouting_rule -o tnl_+ -j MASQUERADE
-                               for IPT in $IP4T $IP6T; do
-                                       $IPT -I forwarding_rule -o tnl_+ -j ACCEPT
-                                       if [ "$nowan" = '0' ]; then
-                                               for IFACE in $wanifnames; do
-                                                       $IPT -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
-                                               done
-                                       fi
-                                       for IFACE in $ifsglobal; do
-                                               $IPT -I input_rule -i $IFACE -p 4 -j ACCEPT
-                                       done
-                               done
-                       fi
-               fi
-       fi
-}
-
-start() {
-       SYSTEM_HOSTNAME=
-       SYSTEM_LAT=
-       SYSTEM_LON=
-       config_load system
-       config_foreach system_config system
-
-       option_cb() {
-               olsrd_update_schema "option" "$@"
-       }
-
-       list_cb() {
-               olsrd_update_schema "list" "$@"
-       }
-
-       . /lib/functions/network.sh
-
-       config_load $UCI_CONF_NAME
-       reset_cb
-
-       OLSRD_CONFIG_FILE=
-       config_foreach olsrd_find_config_file olsrd
-
-       if [ -z "$OLSRD_CONFIG_FILE" ]; then
-               mkdir -p -- /var/etc/
-               olsrd_write_config > /var/etc/$UCI_CONF_NAME.conf || return 1
-               if [ "$INTERFACES_COUNT" -gt 0 -a "$OLSRD_COUNT" -gt 0 ]; then
-                       OLSRD_CONFIG_FILE=/var/etc/$UCI_CONF_NAME.conf
-               fi
-       fi
-
-       [ -z "$OLSRD_CONFIG_FILE" ] && return 1
-
-       SERVICE_PID_FILE="$PID"
-       if service_check /usr/sbin/olsrd; then
-               error "there is already an instance of $UCI_CONF_NAME running (pid: '$(cat $PID)'), not starting."
-               return 1
-       else
-               service_start /usr/sbin/olsrd -f "$OLSRD_CONFIG_FILE" -nofork
-               sleep 1
-               service_check /usr/sbin/olsrd || {
-                       log "startup-error: check via: '/usr/sbin/olsrd -f \"$OLSRD_CONFIG_FILE\" -nofork'"
-               }
-       fi
-
-       olsrd_setup_smartgw_rules
-}
-
-stop() {
-       SERVICE_PID_FILE="$PID"
-       service_stop /usr/sbin/olsrd
-}
diff --git a/olsrd/files/olsrd.sh b/olsrd/files/olsrd.sh
new file mode 100644 (file)
index 0000000..cb52d19
--- /dev/null
@@ -0,0 +1,852 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2008-2017 OpenWrt.org
+
+OLSRD_OLSRD_SCHEMA='ignore:internal config_file:internal DebugLevel=0 AllowNoInt=yes'
+OLSRD_IPCCONNECT_SCHEMA='ignore:internal Host:list Net:list2'
+OLSRD_LOADPLUGIN_SCHEMA='ignore:internal library:internal Host4:list Net4:list2 Host:list Net:list2 Host6:list Net6:list2 Ping:list redistribute:list NonOlsrIf:list name:list lat lon latlon_infile HNA:list2 hosts:list2 ipv6only:bool'
+OLSRD_INTERFACE_SCHEMA='ignore:internal interface:internal AutoDetectChanges:bool LinkQualityMult:list2'
+OLSRD_INTERFACE_DEFAULTS_SCHEMA='AutoDetectChanges:bool'
+
+T='    '
+N='
+'
+
+log() {
+       logger -t olsrd -p daemon.info -s "${initscript}: $*"
+}
+
+error() {
+        logger -t olsrd -p daemon.err -s "${initscript}: ERROR: $*"
+}
+
+warn() {
+        logger -t olsrd -p daemon.warn -s "${initscript}: WARNING: $*"
+}
+
+validate_varname() {
+       local varname="$1"
+       [ -z "$varname" -o "$varname" != "${varname%%[!A-Za-z0-9_]*}" ] && return 1
+       return 0
+}
+
+olsrd_list_configured_interfaces()
+{
+       local i=0
+       local interface
+
+       while interface="$( uci -q get $OLSRD.@Interface[$i].interface )"; do {
+               case "$( uci -q get $OLSRD.@Interface[$i].ignore )" in
+                       1|on|true|enabled|yes)
+                               # is disabled
+                       ;;
+                       *)
+                               echo "$interface"       # e.g. 'lan'
+                       ;;
+               esac
+
+               i=$(( i + 1 ))
+       } done
+}
+
+olsrd_interface_already_in_config()
+{
+       # e.g.: 'Interface "eth0.1" "eth0.2" "wlan0"'
+       if grep -s ^'Interface ' "/var/etc/$OLSRD.conf" | grep -q "\"$DEVICE\""; then
+               logger -t olsrd_hotplug -p daemon.debug "[OK] already_active: '$INTERFACE' => '$DEVICE'"
+               return 0
+       else
+               logger -t olsrd_hotplug -p daemon.info "[OK] ifup: '$INTERFACE' => '$DEVICE'"
+               return 1
+       fi
+}
+
+olsrd_interface_needs_adding()
+{
+       local interface
+
+       # likely and cheap operation:
+       olsrd_interface_already_in_config && return 1
+
+       for interface in $(olsrd_list_configured_interfaces); do {
+               [ "$interface" = "$INTERFACE" ] && {
+                       olsrd_interface_already_in_config || return 0
+               }
+       } done
+
+       logger -t olsrd_hotplug -p daemon.debug "[OK] interface '$INTERFACE' => '$DEVICE' not used for $OLSRD"
+       return 1
+}
+
+validate_olsrd_option() {
+       local str="$1"
+       [ -z "$str" -o "$str" != "${str%%[!     0-9A-Za-z.%/|:_-]*}" ] && return 1
+       return 0
+}
+
+system_config() {
+       local cfg="$1"
+       local cfgt hostname latlon oldIFS
+
+       config_get cfgt "$cfg" TYPE
+
+       if [ "$cfgt" = "system" ]; then
+               config_get hostname "$cfg" hostname
+               hostname="${hostname:-OpenWrt}"
+               SYSTEM_HOSTNAME="$hostname"
+       fi
+
+       if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then
+               config_get latlon "$cfg" latlon
+               oldIFS="$IFS"; IFS=" ${T}${N},"; set -- $latlon; IFS="$oldIFS"
+               SYSTEM_LAT="$1"
+               SYSTEM_LON="$2"
+       fi
+
+       if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then
+               config_get latlon "$cfg" latitude
+               SYSTEM_LAT="$latlon"
+               config_get latlon "$cfg" longitude
+               SYSTEM_LON="$latlon"
+       fi
+}
+
+olsrd_find_config_file() {
+       local cfg="$1"
+       validate_varname "$cfg" || return 0
+
+       config_get_bool ignore "$cfg" ignore 0
+       [ "$ignore" -ne 0 ] && return 0
+       config_get OLSRD_CONFIG_FILE "$cfg" config_file
+
+       return 0
+}
+
+warning_invalid_value() {
+       local funcname="warning_invalid_value"
+       local package="$1"
+       validate_varname "$package" || package=
+       local config="$2"
+       validate_varname "$config" || config=
+       local option="$3"
+       validate_varname "$option" || option=
+
+       if [ -n "$package" -a -n "$config" ]; then
+               log "$funcname() in option '$package.$config${option:+.}$option', skipped"
+       else
+               log "$funcname() skipped"
+       fi
+
+       return 0
+}
+
+olsrd_write_option() {
+       local param="$1"
+       local cfg="$2"
+       validate_varname "$cfg" || return 1
+       local option="$3"
+       validate_varname "$option" || return 1
+       local value="$4"
+       local option_type="$5"
+
+       if [ "$option_type" = bool ]; then
+               case "$value" in
+                       1|on|true|enabled|yes) value=yes;;
+                       0|off|false|disabled|no) value=no;;
+                       *) warning_invalid_value olsrd "$cfg" "$option"; return 1;;
+               esac
+       fi
+
+       if ! validate_olsrd_option "$value"; then
+               warning_invalid_value olsrd "$cfg" "$option"
+               return 1
+       fi
+
+       if [ "$value" != "${value%%[G-Zg-z_-]*}" ]; then
+               if [ "$option" != "Ip6AddrType" -a "$option" != "LinkQualityMult" -a "$value" != "yes" -a "$value" != "no" ]; then
+                       value="\"$value\""
+               fi
+       fi
+
+       printf '%s' "${N}$param$option $value"
+}
+
+olsrd_write_plparam() {
+       local funcname="olsrd_write_plparam"
+       local param="$1"
+       local cfg="$2"
+       local option="$3"
+       local value="$4"
+       local option_type="$5"
+       local _option oldIFS
+
+       validate_varname "$cfg" || return 1
+       validate_varname "$option" || return 1
+
+       if [ "$option_type" = bool ]; then
+               case "$value" in
+                       1|on|true|enabled|yes) value=yes;;
+                       0|off|false|disabled|no) value=no;;
+                       *) warning_invalid_value olsrd "$cfg" "$option"; return 1;;
+               esac
+       fi
+
+       if ! validate_olsrd_option "$value"; then
+               warning_invalid_value olsrd "$cfg" "$option"
+               return 1
+       fi
+
+       oldIFS="$IFS"
+       IFS='-_'
+       set -- $option
+       option="$*"
+       IFS="$oldIFS"
+       _option="$option"
+
+       if [ "$option" = 'hosts' ]; then
+               set -- $value
+               option="$1"
+               shift
+               value="$*"
+       fi
+
+       if [ "$option" = 'NonOlsrIf' ]; then
+               if validate_varname "$value"; then
+                       if network_get_device ifname "$value"; then
+                               log "$funcname() Info: mdns Interface '$value' ifname '$ifname' found"
+                       else
+                               log "$funcname() Warning: mdns Interface '$value' not found, skipped"
+                       fi
+               else
+                       warning_invalid_value olsrd "$cfg" "NonOlsrIf"
+               fi
+
+               [ -z "$ifname" ] || value=$ifname
+       fi
+
+       printf '%s' "${N}${param}PlParam \"$option\" \"$value\""
+}
+
+config_update_schema() {
+       local schema_varname="$1"
+       local command="$2"
+       local option="$3"
+       local value="$4"
+       local schema
+       local cur_option
+
+       validate_varname "$schema_varname" || return 1
+       validate_varname "$command" || return 1
+       validate_varname "$option" || return 1
+
+       case "$varname" in
+               *_LENGTH) return 0;;
+               *_ITEM*) return 0;;
+       esac
+
+       eval "export -n -- \"schema=\${$schema_varname}\""
+
+       for cur_option in $schema; do
+               [ "${cur_option%%[:=]*}" = "$option" ] && return 0
+       done
+
+       if [ "$command" = list ]; then
+               set -- $value
+               if [ "$#" -ge "3" ]; then
+                       schema_entry="$option:list3"
+               elif [ "$#" -ge "2" ]; then
+                       schema_entry="$option:list2"
+               else
+                       schema_entry="$option:list"
+               fi
+       else
+               schema_entry="$option"
+       fi
+
+       append "$schema_varname" "$schema_entry"
+
+       return 0
+}
+
+config_write_options() {
+       local funcname="config_write_options"
+       local schema="$1"
+       local cfg="$2"
+       validate_varname "$cfg" || return 1
+       local write_func="$3"
+       [ -z "$write_func" ] && output_func=echo
+       local write_param="$4"
+
+       local schema_entry option option_length option_type default value list_size list_item list_value i position speed oldIFS
+       local list_speed_vars="HelloInterval HelloValidityTime TcInterval TcValidityTime MidInterval MidValidityTime HnaInterval HnaValidityTime"
+
+       get_value_for_entry()
+       {
+               local schema_entry="$1"
+
+               default="${schema_entry#*[=]}"
+               [ "$default" = "$schema_entry" ] && default=
+               option="${schema_entry%%[=]*}"
+
+               oldIFS="$IFS"; IFS=':'; set -- $option; IFS="$oldIFS"
+               option="$1"
+               option_type="$2"
+
+               validate_varname "$option" || return 1
+               [ -z "$option_type" ] || validate_varname "$option_type" || return 1
+               [ "$option_type" = internal ] && return 1
+
+               config_get value "$cfg" "$option"
+               [ "$option" = "speed" ] && return 1
+
+               return 0
+       }
+
+       already_in_schema()
+       {
+               case " $schema " in
+                       *" $1 "*)
+                               return 0
+                       ;;
+                       *)
+                               return 1
+                       ;;
+               esac
+       }
+
+       already_in_schema "speed" && {
+               get_value_for_entry "speed"
+
+               if test 2>/dev/null "$value" -gt 0 -a "$value" -le 20 ; then
+                       speed="$value"
+               else
+                       log "$funcname() Warning: invalid speed-value: '$value' - allowed integers: 1...20, fallback to 6"
+                       speed=6
+               fi
+
+               for schema_entry in $list_speed_vars; do {
+                       already_in_schema "$schema_entry" || schema="$schema $schema_entry"
+               } done
+       }
+
+       for schema_entry in $schema; do
+               if [ -n "$speed" ]; then                # like sven-ola freifunk firmware fff-1.7.4
+                       case "$schema_entry" in
+                               HelloInterval)
+                                       value="$(( speed / 2 + 1 )).0"
+                               ;;
+                               HelloValidityTime)
+                                       value="$(( speed * 25 )).0"
+                               ;;
+                               TcInterval)     # todo: not fisheye? -> $(( speed * 2 ))
+                                       value=$(( speed / 2 ))
+                                       [ $value -eq 0 ] && value=1
+                                       value="$value.0"
+                               ;;
+                               TcValidityTime)
+                                       value="$(( speed * 100 )).0"
+                               ;;
+                               MidInterval)
+                                       value="$(( speed * 5 )).0"
+                               ;;
+                               MidValidityTime)
+                                       value="$(( speed * 100 )).0"
+                               ;;
+                               HnaInterval)
+                                       value="$(( speed * 2 )).0"
+                               ;;
+                               HnaValidityTime)
+                                       value="$(( speed * 25 )).0"
+                               ;;
+                               *)
+                                       get_value_for_entry "$schema_entry" || continue
+                               ;;
+                       esac
+
+                       is_speed_var()
+                       {
+                               case " $list_speed_vars " in
+                                       *" $1 "*)
+                                               return 0
+                                       ;;
+                                       *)
+                                               return 1
+                                       ;;
+                               esac
+                       }
+
+                       is_speed_var "$schema_entry" && option="$schema_entry"
+               else
+                       get_value_for_entry "$schema_entry" || continue
+               fi
+
+               if [ -z "$value" ]; then
+                       oldIFS="$IFS"; IFS='+'; set -- $default; IFS="$oldIFS"
+                       value=$*
+               elif [ "$value" = '-' -a -n "$default" ]; then
+                       continue
+               fi
+
+               [ -z "$value" ] && continue
+
+               case "$option_type" in
+                       list) list_size=1;;
+                       list2) list_size=2;;
+                       list3) list_size=3;;
+                       *) list_size=0;;
+               esac
+
+               if [ "$list_size" -gt 0 ]; then
+                       config_get option_length "$cfg" "${option}_LENGTH"
+                       if [ -n "$option_length" ]; then
+                               i=1
+                               while [ "$i" -le "$option_length" ]; do
+                                       config_get list_value "$cfg" "${option}_ITEM$i"
+                                       "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break
+                                       i=$((i + 1))
+                               done
+                       else
+                               list_value=
+                               i=0
+                               for list_item in $value; do
+                                       append "list_value" "$list_item"
+                                       i=$((i + 1))
+                                       position=$((i % list_size))
+                                       if [ "$position" -eq 0 ]; then
+                                               "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break
+                                               list_value=
+                                       fi
+                               done
+                               [ "$position" -ne 0 ] && "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type"
+                       fi
+               else
+                       "$write_func" "$write_param" "$cfg" "$option" "$value" "$option_type"
+               fi
+       done
+
+       return 0
+}
+
+olsrd_write_olsrd() {
+       local cfg="$1"
+       validate_varname "$cfg" || return 0
+       local ignore
+
+       config_get_bool ignore "$cfg" ignore 0
+       [ "$ignore" -ne 0 ] && return 0
+
+       [ "$OLSRD_COUNT" -gt 0 ] && return 0
+
+       config_get smartgateway "$cfg" SmartGateway
+       config_get smartgatewayuplink "$cfg" SmartGatewayUplink
+       export smartgateway
+       export smartgatewayuplink
+
+       config_write_options "$OLSRD_OLSRD_SCHEMA" "$cfg" olsrd_write_option
+       echo
+       OLSRD_COUNT=$((OLSRD_COUNT + 1))
+       return 0
+}
+
+olsrd_write_ipcconnect() {
+       local cfg="$1"
+       validate_varname "$cfg" || return 0
+       local ignore
+
+       config_get_bool ignore "$cfg" ignore 0
+       [ "$ignore" -ne 0 ] && return 0
+
+       [ "$IPCCONNECT_COUNT" -gt 0 ] && return 0
+
+       printf '%s' "${N}IpcConnect${N}{"
+       config_write_options "$OLSRD_IPCCONNECT_SCHEMA" "$cfg" olsrd_write_option "${T}"
+       echo "${N}}"
+       IPCCONNECT_COUNT=$((IPCCONNECT_COUNT + 1))
+}
+
+olsrd_write_hna4() {
+       local cfg="$1"
+       validate_varname "$cfg" || return 0
+       local ignore
+
+       config_get_bool ignore "$cfg" ignore 0
+       [ "$ignore" -ne 0 ] && return 0
+
+       config_get netaddr "$cfg" netaddr
+       if ! validate_olsrd_option "$netaddr"; then
+               warning_invalid_value olsrd "$cfg" "netaddr"
+               return 0
+       fi
+
+       config_get netmask "$cfg" netmask
+       if ! validate_olsrd_option "$netmask"; then
+               warning_invalid_value olsrd "$cfg" "netmask"
+               return 0
+       fi
+
+       [ "$HNA4_COUNT" -le 0 ] && printf '%s' "${N}Hna4${N}{"
+       printf '%s' "${N}${T}${T}$netaddr $netmask"
+       HNA4_COUNT=$((HNA4_COUNT + 1))
+}
+
+olsrd_write_hna6() {
+       local cfg="$1"
+       validate_varname "$cfg" || return 0
+       local ignore
+
+       config_get_bool ignore "$cfg" ignore 0
+       [ "$ignore" -ne 0 ] && return 0
+
+       config_get netaddr "$cfg" netaddr
+       if ! validate_olsrd_option "$netaddr"; then
+               warning_invalid_value olsrd "$cfg" "netaddr"
+               return 0
+       fi
+
+       config_get prefix "$cfg" prefix
+       if ! validate_olsrd_option "$prefix"; then
+               warning_invalid_value olsrd "$cfg" "prefix"
+               return 0
+       fi
+
+       [ "$HNA6_COUNT" -le 0 ] && printf '%s' "${N}Hna6${N}{"
+       printf '%s' "${N}${T}${T}$netaddr $prefix"
+       HNA6_COUNT=$((HNA6_COUNT + 1))
+}
+
+find_most_recent_plugin_libary()
+{
+       local library="$1"      # e.g. 'olsrd_dyn_gw' or 'olsrd_txtinfo.so.1.1'
+       local file file_fullpath unixtime
+
+       for file in "/lib/$library"* "/usr/lib/$library"* "/usr/local/lib/$library"*; do {
+               [ -f "$file" ] && {
+                       file_fullpath="$file"
+                       file="$( basename "$file" )"
+                       # make sure that we do not select
+                       # 'olsrd_dyn_gw_plain.so.0.4' if user wants
+                       # 'olsrd_dyn_gw.so.0.5' -> compare part before 1st dot
+                       [ "${library%%.*}" = "${file%%.*}" ] && {
+                               unixtime="$( date +%s -r "$file_fullpath" )"
+                               echo "$unixtime $file"
+                       }
+               }
+       } done | sort -n | tail -n1 | cut -d' ' -f2
+}
+
+olsrd_write_loadplugin()
+{
+       local funcname='olsrd_write_loadplugin'
+       local cfg="$1"
+       local ignore name suffix lat lon latlon_infile
+
+       validate_varname "$cfg" || return 0
+
+       config_get_bool ignore "$cfg" ignore 0
+       [ "$ignore" -ne 0 ] && return 0
+
+       # e.g. olsrd_txtinfo.so.1.1 or 'olsrd_txtinfo'
+       config_get library "$cfg" library
+
+       library="$( find_most_recent_plugin_libary "$library" )"
+       if [ -z "$library" ]; then
+               log "$funcname() Warning: Plugin library '$library' not found, skipped"
+               return 0
+       else
+               library="$( basename "$library" )"
+       fi
+
+       validate_olsrd_option "$library" || {
+               warning_invalid_value olsrd "$cfg" 'library'
+               return 0
+       }
+
+       case "$library" in
+               'olsrd_nameservice.'*)
+                       config_get name "$cfg" name
+                       [ -z "$name" ] && config_set "$cfg" name $SYSTEM_HOSTNAME
+
+                       config_get suffix "$cfg" suffix
+                       [ -z "$suffix" ] && config_set "$cfg" suffix '.olsr'
+
+                       config_get lat "$cfg" lat
+                       config_get lon "$cfg" lon
+                       config_get latlon_infile "$cfg" latlon_infile
+                       if [ \( -z "$lat" -o -z "$lat" \) -a -z "$latlon_infile" ]; then
+                               if [ -f '/var/run/latlon.txt' ]; then
+                                       config_set "$cfg" lat ''
+                                       config_set "$cfg" lon ''
+                                       config_set "$cfg" latlon_infile '/var/run/latlon.txt'
+                               else
+                                       config_set "$cfg" lat "$SYSTEM_LAT"
+                                       config_set "$cfg" lon "$SYSTEM_LON"
+                               fi
+                       fi
+
+                       for f in latlon_file hosts_file services_file resolv_file macs_file; do
+                               config_get $f "$cfg" $f
+                       done
+
+                       [ -z "$latlon_file" ] && config_set "$cfg" latlon_file '/var/run/latlon.js'
+               ;;
+               'olsrd_watchdog.'*)
+                       config_get wd_file "$cfg" file
+               ;;
+       esac
+
+       printf '%s' "${N}LoadPlugin \"$library\"${N}{"
+       config_write_options "$OLSRD_LOADPLUGIN_SCHEMA" "$cfg" olsrd_write_plparam "${T}"
+       echo "${N}}"
+}
+
+olsrd_write_interface() {
+       local funcname="olsrd_write_interface"
+       local cfg="$1"
+       validate_varname "$cfg" || return 0
+       local ignore
+       local interfaces
+       local interface
+       local ifnames
+
+       config_get_bool ignore "$cfg" ignore 0
+       [ "$ignore" -ne 0 ] && return 0
+
+       ifnames=
+       config_get interfaces "$cfg" interface
+
+       for interface in $interfaces; do
+               if validate_varname "$interface"; then
+                       if network_get_device IFNAME "$interface"; then
+                               ifnames="$ifnames \"$IFNAME\""
+                               ifsglobal="$ifsglobal $IFNAME"
+                       elif network_get_physdev IFNAME "$interface"; then
+                               local proto="$(uci -q get network.${interface}.proto)"
+                               if [ "$proto" = "static" -o "$proto" = "none" ]; then
+                                       ifnames="$ifnames \"$IFNAME\""
+                                       ifsglobal="$ifsglobal $IFNAME"
+                               fi
+                       elif [[ "$(ip -details link show dev $interface)" == *"wireguard"* ]]; then
+                               # wireguard interface
+                               ifnames="$ifnames \"$interface\""
+                               ifsglobal="$ifsglobal $interface"
+                       else
+                               log "$funcname() Warning: Interface '$interface' not found, skipped"
+                       fi
+               else
+                       warning_invalid_value olsrd "$cfg" "interface"
+               fi
+       done
+
+       [ -z "$ifnames" ] && return 0
+
+       printf '%s' "${N}Interface$ifnames${N}{"
+       config_write_options "$OLSRD_INTERFACE_SCHEMA" "$cfg" olsrd_write_option "${T}"
+       echo "${N}}"
+       INTERFACES_COUNT=$((INTERFACES_COUNT + 1))
+}
+
+olsrd_write_interface_defaults() {
+       local cfg="$1"
+       validate_varname "$cfg" || return 0
+
+       printf '%s' "${N}InterfaceDefaults$ifnames${N}{"
+       config_write_options "$OLSRD_INTERFACE_DEFAULTS_SCHEMA" "$cfg" olsrd_write_option "${T}"
+       echo "${N}}"
+
+       return 1
+}
+
+olsrd_update_schema() {
+       local command="$1"
+       local varname="$2"
+       local value="$3"
+       local cfg="$CONFIG_SECTION"
+       local cfgt
+
+       validate_varname "$command" || return 0
+       validate_varname "$varname" || return 0
+
+       config_get cfgt "$cfg" TYPE
+       case "$cfgt" in
+               olsrd) config_update_schema OLSRD_OLSRD_SCHEMA "$command" "$varname" "$value";;
+               IpcConnect) config_update_schema OLSRD_IPCCONNECT_SCHEMA "$command" "$varname" "$value";;
+               LoadPlugin) config_update_schema OLSRD_LOADPLUGIN_SCHEMA "$command" "$varname" "$value";;
+               Interface) config_update_schema OLSRD_INTERFACE_SCHEMA "$command" "$varname" "$value";;
+               InterfaceDefaults) config_update_schema OLSRD_INTERFACE_DEFAULTS_SCHEMA "$command" "$varname" "$value";;
+       esac
+
+       return 0
+}
+
+olsrd_write_config() {
+       OLSRD_COUNT=0
+       config_foreach olsrd_write_olsrd olsrd
+       IPCCONNECT_COUNT=0
+       config_foreach olsrd_write_ipcconnect IpcConnect
+       HNA4_COUNT=0
+       config_foreach olsrd_write_hna4 Hna4
+       [ "$HNA4_COUNT" -gt 0 ] && echo "${N}}"
+       HNA6_COUNT=0
+       config_foreach olsrd_write_hna6 Hna6
+       [ "$HNA6_COUNT" -gt 0 ] && echo "${N}}"
+       config_foreach olsrd_write_loadplugin LoadPlugin
+       INTERFACES_COUNT=0
+       config_foreach olsrd_write_interface_defaults InterfaceDefaults
+       config_foreach olsrd_write_interface Interface
+       echo
+
+       return 0
+}
+
+get_wan_ifnames()
+{
+       local wanifnames word catch_next
+
+       command -v ip >/dev/null || return 1
+
+       set -- $( ip route list exact 0.0.0.0/0 table all )
+       for word in $*; do
+               case "$word" in
+                       dev)
+                               catch_next="true"
+                       ;;
+                       *)
+                               [ -n "$catch_next" ] && {
+                                       case "$wanifnames" in
+                                               *" $word "*)
+                                               ;;
+                                               *)
+                                                       wanifnames="$wanifnames $word "
+                                               ;;
+                                       esac
+
+                                       catch_next=
+                               }
+                       ;;
+               esac
+       done
+
+       echo "$wanifnames"
+}
+
+olsrd_setup_smartgw_rules() {
+       local funcname="olsrd_setup_smartgw_rules"
+       local file=
+
+       for file in /etc/modules.d/[0-9]*-ipip; do :; done
+       [ -e "$file" ] || {
+               log "$funcname() Warning: kmod-ipip is missing. SmartGateway will not work until you install it."
+               return 1
+       }
+
+       local wanifnames="$( get_wan_ifnames )"
+
+       if [ -z "$wanifnames" ]; then
+               nowan=1
+       else
+               nowan=0
+       fi
+
+       IP4T="$( command -v iptables )"
+       IP6T="$( command -v ip6tables )"
+
+       # Delete smartgw firewall rules first
+       if [ "$UCI_CONF_NAME" = "olsrd6" ]; then
+               while $IP6T -D forwarding_rule -o tnl_+ -j ACCEPT 2> /dev/null; do :;done
+               for IFACE in $wanifnames; do
+                       while $IP6T -D forwarding_rule -i tunl0 -o $IFACE -j ACCEPT 2> /dev/null; do :; done
+               done
+               for IFACE in $ifsglobal; do
+                       while $IP6T -D input_rule -i $IFACE -p 4 -j ACCEPT 2> /dev/null; do :; done
+               done
+       else
+               while $IP4T -D forwarding_rule -o tnl_+ -j ACCEPT 2> /dev/null; do :;done
+               for IFACE in $wanifnames; do
+                       while $IP4T -D forwarding_rule -i tunl0 -o $IFACE -j ACCEPT 2> /dev/null; do :; done
+               done
+               for IFACE in $ifsglobal; do
+                       while $IP4T -D input_rule -i $IFACE -p 4 -j ACCEPT 2> /dev/null; do :; done
+               done
+               while $IP4T -t nat -D postrouting_rule -o tnl_+ -j MASQUERADE 2> /dev/null; do :;done
+       fi
+
+       # var 'smartgateway' + 'smartgatewayuplink' build in olsrd_write_olsrd()
+       if [ "$smartgateway" = "yes" ]; then
+               log "$funcname() Notice: Inserting firewall rules for SmartGateway"
+
+               if [ ! "$smartgatewayuplink" = "none" ]; then
+                       if [ "$smartgatewayuplink" = "ipv4" ]; then
+                               # Allow everything to be forwarded to tnl_+ and use NAT for it
+                               $IP4T -I forwarding_rule -o tnl_+ -j ACCEPT
+                               $IP4T -t nat -I postrouting_rule -o tnl_+ -j MASQUERADE
+                               # Allow forwarding from tunl0 to (all) wan-interfaces
+                               if [ "$nowan" = '0' ]; then
+                                       for IFACE in $wanifnames; do
+                                               $IP4T -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
+                                       done
+                               fi
+                               # Allow incoming ipip on all olsr-interfaces
+                               for IFACE in $ifsglobal; do
+                                       $IP4T -I input_rule -i $IFACE -p 4 -j ACCEPT
+                               done
+                       elif [ "$smartgatewayuplink" = "ipv6" ]; then
+                               $IP6T -I forwarding_rule -o tnl_+ -j ACCEPT
+                               if [ "$nowan" = '0' ]; then
+                                       for IFACE in $wanifnames; do
+                                               $IP6T -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
+                                       done
+                               fi
+                               for IFACE in $ifsglobal; do
+                                       $IP6T -I input_rule -i $IFACE -p 4 -j ACCEPT
+                               done
+                       else
+                               $IP4T -t nat -I postrouting_rule -o tnl_+ -j MASQUERADE
+                               for IPT in $IP4T $IP6T; do
+                                       $IPT -I forwarding_rule -o tnl_+ -j ACCEPT
+                                       if [ "$nowan" = '0' ]; then
+                                               for IFACE in $wanifnames; do
+                                                       $IPT -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
+                                               done
+                                       fi
+                                       for IFACE in $ifsglobal; do
+                                               $IPT -I input_rule -i $IFACE -p 4 -j ACCEPT
+                                       done
+                               done
+                       fi
+               fi
+       fi
+}
+
+olsrd_generate_config() {
+       UCI_CONF_NAME="$1"
+       SYSTEM_HOSTNAME=
+       SYSTEM_LAT=
+       SYSTEM_LON=
+       config_load system
+       config_foreach system_config system
+
+       option_cb() {
+               olsrd_update_schema "option" "$@"
+       }
+
+       list_cb() {
+               olsrd_update_schema "list" "$@"
+       }
+
+       . /lib/functions/network.sh
+
+       config_load $UCI_CONF_NAME
+       reset_cb
+
+       OLSRD_CONFIG_FILE=
+       config_foreach olsrd_find_config_file olsrd
+
+       if [ -z "$OLSRD_CONFIG_FILE" ]; then
+               mkdir -p -- /var/etc/
+               olsrd_write_config > /var/etc/$UCI_CONF_NAME.conf || return 1
+               if [ "$INTERFACES_COUNT" -gt 0 -a "$OLSRD_COUNT" -gt 0 ]; then
+                       OLSRD_CONFIG_FILE=/var/etc/$UCI_CONF_NAME.conf
+               fi
+       fi
+
+       [ -z "$OLSRD_CONFIG_FILE" ] && return 1
+}
index 718b3e01216bb17e3d816c95b7297225313a5dce..62cb66d6ffac32834552789f073fc3e859cce344 100644 (file)
@@ -4,11 +4,76 @@
 . $IPKG_INSTROOT/lib/functions/olsrd.sh
 
 START=65
+USE_PROCD=1
+BIN=/usr/sbin/olsrd
+OLSRD=olsrd
+CONF=/var/etc/$OLSRD.conf
+PID=/var/run/olsrd.pid
 
-SERVICE_DAEMONIZE=1
-SERVICE_WRITE_PID=1
+wait_for_network()
+{
+       ubus -t 15 wait_for network.interface.$1 2>/dev/null
+}
 
-CONF=/var/etc/olsrd.conf
-PID=/var/run/olsrd.pid
+wait_for_wireless()
+{
+       local count=0
+       ubus -t 15 wait_for network.wireless 2>/dev/null
+       while [ $count -lt 30 ]; do
+               if  [ "$(ubus call network.wireless status | jsonfilter -e '@[*]["pending"]' | grep true | wc -l)" == "0" ]; then
+                       break
+               fi
+               count=$((count+1))
+               sleep 1
+       done
+}
+
+boot()
+{
+       config_load network
+       config_foreach wait_for_network interface
+       wait_for_wireless
+       rc_procd start_service
+}
+
+start_service() {
+       olsrd_generate_config $OLSRD
+
+       procd_open_instance
+
+       config_load olsrd
+       local _respawn_threshold
+       local _respawn_timeout
+       local _respawn_retry
+
+       config_get _respawn_threshold procd respawn_threshold 3600
+       config_get _respawn_timeout procd respawn_timeout 15
+       config_get _respawn_retry procd respawn_retry 0
+
+       procd_set_param command "$BIN"
+       procd_append_param command -f ${CONF}
+       procd_append_param command -nofork
+       procd_append_param command -pidfile ${PID}
+
+       # restart if olsrd dies
+       procd_set_param respawn $_respawn_threshold $_respawn_timeout $_respawn_retry
+
+       # automatically restart olsrd if generated cfg has changed
+       procd_set_param file $CONF
+
+       procd_set_param pidfile $PID
+
+       procd_close_instance
+
+       olsrd_setup_smartgw_rules
+}
+
+service_triggers() {
+       # reload if config changed via uci
+       procd_add_reload_trigger "olsrd"
 
-UCI_CONF_NAME=olsrd
+       # restart on ifup interface events
+       for n in $(olsrd_list_configured_interfaces $OLSRD); do
+               procd_add_reload_interface_trigger $n /etc/init.d/$OLSRD reload
+       done
+}
index 7a03f28de70f15a183a5910661ea3fa7240393d7..52a9b21cd73aa8ce44b0472dfe456eb18f278375 100644 (file)
@@ -9,3 +9,8 @@ config LoadPlugin
 
 config Interface
        list interface 'wlan'
+
+config procd procd
+       option respawn_threshold '3600'
+       option respawn_timeout '15'
+       option respawn_retry '0'
index 1dcc4a0bdd9215ac4c243ccb78234d357436935d..a20e96728aff1a7ce162d5d83a6f440b249c5a86 100644 (file)
@@ -4,11 +4,76 @@
 . $IPKG_INSTROOT/lib/functions/olsrd.sh
 
 START=65
+USE_PROCD=1
+BIN=/usr/sbin/olsrd
+OLSRD=olsrd6
+CONF=/var/etc/$OLSRD.conf
+PID=/var/run/olsrd6.pid
 
-SERVICE_DAEMONIZE=1
-SERVICE_WRITE_PID=1
+wait_for_network()
+{
+       ubus -t 15 wait_for network.interface.$1 2>/dev/null
+}
 
-CONF=/var/etc/olsrd6.conf
-PID=/var/run/olsrd6.pid
+wait_for_wireless()
+{
+       local count=0
+       ubus -t 15 wait_for network.wireless 2>/dev/null
+       while [ $count -lt 30 ]; do
+               if  [ "$(ubus call network.wireless status | jsonfilter -e '@[*]["pending"]' | grep true | wc -l)" == "0" ]; then
+                       break
+               fi
+               count=$((count+1))
+               sleep 1
+       done
+}
+
+boot()
+{
+       config_load network
+       config_foreach wait_for_network interface
+       wait_for_wireless
+       rc_procd start_service
+}
+
+start_service() {
+       olsrd_generate_config $OLSRD
+
+       procd_open_instance
+
+       config_load olsrd6
+       local _respawn_threshold
+       local _respawn_timeout
+       local _respawn_retry
+
+       config_get _respawn_threshold procd _respawn_threshold 3600
+       config_get _respawn_timeout procd respawn_timeout 15
+       config_get _respawn_retry procd respawn_retry 0
+
+       procd_set_param command "$BIN"
+       procd_append_param command -f ${CONF}
+       procd_append_param command -nofork
+       procd_append_param command -pidfile ${PID}
+
+       # restart if olsrd dies
+       procd_set_param respawn $_respawn_threshold $_respawn_timeout $_respawn_retry
+
+       # automatically restart olsrd if generated cfg has changed
+       procd_set_param file $CONF
+
+       procd_set_param pidfile $PID
+
+       procd_close_instance
+
+       olsrd_setup_smartgw_rules
+}
+
+service_triggers() {
+       # reload if config changed via uci
+       procd_add_reload_trigger "olsrd6"
 
-UCI_CONF_NAME=olsrd6
+       # restart on ifup interface events
+       for n in $(olsrd_list_configured_interfaces $OLSRD); do
+               procd_add_reload_interface_trigger $n /etc/init.d/$OLSRD reload
+       done
+}
diff --git a/olsrd/patches/.gitignore b/olsrd/patches/.gitignore
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/olsrd/patches/102-olsrd-prevent-storm-patches.patch b/olsrd/patches/102-olsrd-prevent-storm-patches.patch
new file mode 100644 (file)
index 0000000..69d5952
--- /dev/null
@@ -0,0 +1,83 @@
+From 4dabd94d598dd893aaaffbd71c315923c8827a14 Mon Sep 17 00:00:00 2001
+From: Nick Hainke <vincent@systemli.org>
+Date: Wed, 22 Jun 2022 14:08:04 +0200
+Subject: [PATCH] olsrd: prevent storm patches
+
+As described in the PR:
+
+  Limit the positive sequence number difference which is considered valid,
+  and prevent network storms.
+  Source: https://github.com/aredn/aredn_packages/pull/5
+
+Signed-off-by: Nick Hainke <vincent@systemli.org>
+---
+ src/duplicate_set.c | 16 ++++++++--------
+ src/duplicate_set.h |  5 +++--
+ 2 files changed, 11 insertions(+), 10 deletions(-)
+
+--- a/src/duplicate_set.c
++++ b/src/duplicate_set.c
+@@ -70,7 +70,7 @@ void olsr_cleanup_duplicates(union olsr_
+   entry = (struct dup_entry *)olsrd_avl_find(&duplicate_set, orig);
+   if (entry != NULL) {
+-    entry->too_low_counter = DUP_MAX_TOO_LOW - 2;
++    entry->out_of_bounds_counter = DUP_MAX_OUT_OF_BOUNDS - 2;
+   }
+ }
+@@ -82,7 +82,7 @@ olsr_create_duplicate_entry(void *ip, ui
+   if (entry != NULL) {
+     memcpy(&entry->ip, ip, olsr_cnf->ip_version == AF_INET ? sizeof(entry->ip.v4) : sizeof(entry->ip.v6));
+     entry->seqnr = seqnr;
+-    entry->too_low_counter = 0;
++    entry->out_of_bounds_counter = 0;
+     entry->olsrd_avl.key = &entry->ip;
+     entry->array = 0;
+   }
+@@ -160,12 +160,12 @@ olsr_message_is_duplicate(union olsr_mes
+   }
+   diff = olsr_seqno_diff(seqnr, entry->seqnr);
+-  if (diff < -31) {
+-    entry->too_low_counter++;
++  if (diff < -31 || diff > DUP_SEQNR_DIFF_HIGH_LIMIT) {
++    entry->out_of_bounds_counter++;
+-    // client did restart with a lower number ?
+-    if (entry->too_low_counter > DUP_MAX_TOO_LOW) {
+-      entry->too_low_counter = 0;
++    // client did restart with a too low or too high number ?
++    if (entry->out_of_bounds_counter > DUP_MAX_OUT_OF_BOUNDS) {
++      entry->out_of_bounds_counter = 0;
+       entry->seqnr = seqnr;
+       entry->array = 1;
+       return false;             /* start with a new sequence number, so NO duplicate */
+@@ -174,7 +174,7 @@ olsr_message_is_duplicate(union olsr_mes
+     return true;                /* duplicate ! */
+   }
+-  entry->too_low_counter = 0;
++  entry->out_of_bounds_counter = 0;
+   if (diff <= 0) {
+     uint32_t bitmask = 1u << ((uint32_t) (-diff));
+--- a/src/duplicate_set.h
++++ b/src/duplicate_set.h
+@@ -54,13 +54,14 @@
+ #define DUPLICATE_CLEANUP_INTERVAL 15000
+ #define DUPLICATE_CLEANUP_JITTER 25
+ #define DUPLICATE_VTIME 120000
+-#define DUP_MAX_TOO_LOW 16
++#define DUP_MAX_OUT_OF_BOUNDS 16
++#define DUP_SEQNR_DIFF_HIGH_LIMIT 0x2000
+ struct dup_entry {
+   struct olsrd_avl_node olsrd_avl;
+   union olsr_ip_addr ip;
+   uint16_t seqnr;
+-  uint16_t too_low_counter;
++  uint16_t out_of_bounds_counter;
+   uint32_t array;
+   uint32_t valid_until;
+ };
diff --git a/olsrd/patches/600-add-ubus-support.patch b/olsrd/patches/600-add-ubus-support.patch
new file mode 100644 (file)
index 0000000..c43e78d
--- /dev/null
@@ -0,0 +1,60 @@
+--- a/src/scheduler.c
++++ b/src/scheduler.c
+@@ -59,6 +59,8 @@
+ #include <assert.h>
+ #include <time.h>
++#include "ubus.h"
++
+ #ifdef __MACH__
+ #include "mach/clock_gettime.h"
+ #endif
+@@ -363,6 +365,8 @@ poll_sockets(void)
+   }
+   OLSR_FOR_ALL_SOCKETS_END(entry);
++  hfd = olsrd_ubus_add_read_sock(&ibits, hfd);
++
+   /* Running select on the FD set */
+   do {
+     n = olsr_select(hfd, fdsets & SP_PR_READ ? &ibits : NULL, fdsets & SP_PR_WRITE ? &obits : NULL, NULL, &tvp);
+@@ -395,6 +399,7 @@ poll_sockets(void)
+     }
+   }
+   OLSR_FOR_ALL_SOCKETS_END(entry);
++  olsrd_ubus_receive(&ibits);
+ }
+ static void
+--- a/src/main.c
++++ b/src/main.c
+@@ -74,6 +74,8 @@
+ #include "lock_file.h"
+ #include "cli.h"
++#include "ubus.h"
++
+ #if defined(__GLIBC__) && defined(__linux__) && !defined(__ANDROID__) && !defined(__UCLIBC__)
+   #define OLSR_HAVE_EXECINFO_H
+ #endif
+@@ -771,6 +773,9 @@ int main(int argc, char *argv[]) {
+   signal(SIGUSR2, SIG_IGN);
+ #endif /* _WIN32 */
++  /* Adding ubus */
++  olsrd_add_ubus();
++
+   /* Starting scheduler */
+   olsr_scheduler();
+--- a/Makefile.inc
++++ b/Makefile.inc
+@@ -252,7 +252,7 @@ else
+ ifeq ($(OS),win32)
+   LDFLAGS +=  -Wl,-export-all-symbols
+ else 
+-  LDFLAGS +=  -Wl,-export-dynamic 
++  LDFLAGS +=  -Wl,-export-dynamic,-lubus,-lubox
+ endif
+ ifeq ($(NORPATH),0)
+ LDFLAGS +=    -Wl,-rpath,$(LIBDIR)
diff --git a/olsrd/src/src/ubus.c b/olsrd/src/src/ubus.c
new file mode 100644 (file)
index 0000000..37c2dbf
--- /dev/null
@@ -0,0 +1,229 @@
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <sys/select.h>
+
+#include <libubox/blob.h>
+#include <libubox/blobmsg.h>
+#include <libubus.h>
+
+#include <arpa/inet.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+
+#include "defs.h"
+#include "ifnet.h"
+#include "interfaces.h"
+#include "link_set.h"
+#include "log.h"
+#include "olsr.h"
+#include "olsr_cfg.h"
+
+#include "ubus.h"
+
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+
+// Shared state maintained throughout calls to handle ubus messages.
+static struct ubus_context *shared_ctx;
+
+enum { INTERFACE_IFNAME, INTERFACE_LQM, __INTERFACE_MAX };
+
+static const struct blobmsg_policy interface_policy[__INTERFACE_MAX] = {
+    [INTERFACE_IFNAME] = {"ifname", BLOBMSG_TYPE_STRING},
+    [INTERFACE_LQM] = {"lqm", BLOBMSG_TYPE_STRING},
+};
+
+static int olsrd_ubus_add_interface(struct ubus_context *ctx_local,
+                                    struct ubus_object *obj,
+                                    struct ubus_request_data *req,
+                                    const char *method, struct blob_attr *msg) {
+  struct blob_attr *tb[__INTERFACE_MAX];
+  struct blob_buf b = {0};
+  union olsr_ip_addr addr;
+  int ret;
+  char *ifname, *lqm;
+
+  blobmsg_parse(interface_policy, __INTERFACE_MAX, tb, blob_data(msg),
+                blob_len(msg));
+
+  if (!tb[INTERFACE_IFNAME])
+    return UBUS_STATUS_INVALID_ARGUMENT;
+
+  ifname = blobmsg_get_string(tb[INTERFACE_IFNAME]);
+
+  struct interface_olsr *tmp = if_ifwithname(ifname);
+  if (tmp != NULL) {
+    return UBUS_STATUS_PERMISSION_DENIED;
+  }
+
+  struct olsr_if *temp;
+  for (temp = olsr_cnf->interfaces; temp != NULL; temp = temp->next) {
+    if (strcmp(temp->name, ifname) == 0)
+      return UBUS_STATUS_PERMISSION_DENIED;
+  }
+
+  struct olsr_if *tmp_ifs = olsr_create_olsrif(ifname, false);
+  tmp_ifs->cnf =
+      olsr_malloc(sizeof(struct if_config_options), "Set default config");
+  *tmp_ifs->cnf = *olsr_cnf->interface_defaults;
+
+  if (tb[INTERFACE_LQM]) { // add interface lqm
+    lqm = blobmsg_get_string(tb[INTERFACE_LQM]);
+    memset(&addr, 0, sizeof(addr));
+
+    struct olsr_lq_mult *mult = malloc(sizeof(*mult));
+    if (mult == NULL) {
+      olsr_syslog(OLSR_LOG_ERR, "Out of memory (LQ multiplier).\n");
+      return UBUS_STATUS_UNKNOWN_ERROR;
+    }
+
+    double lqm_value = atof(lqm);
+    mult->addr = addr;
+    mult->value = (uint32_t)(lqm_value * LINK_LOSS_MULTIPLIER);
+    tmp_ifs->cnf->lq_mult = mult;
+    tmp_ifs->cnf->orig_lq_mult_cnt++;
+  }
+
+  blob_buf_init(&b, 0);
+  blobmsg_add_string(&b, "adding", ifname);
+
+  ret = ubus_send_reply(ctx_local, req, b.head);
+  if (ret)
+    olsr_syslog(OLSR_LOG_ERR, "Failed to send reply: %s\n", ubus_strerror(ret));
+
+  blob_buf_free(&b);
+
+  return ret;
+}
+
+static int olsrd_ubus_del_interface(struct ubus_context *ctx_local,
+                                    struct ubus_object *obj,
+                                    struct ubus_request_data *req,
+                                    const char *method, struct blob_attr *msg) {
+  struct blob_attr *tb[__INTERFACE_MAX];
+  struct blob_buf b = {0};
+  int ret;
+  char *ifname;
+  struct olsr_if *tmp_if, *del_if;
+
+  blobmsg_parse(interface_policy, __INTERFACE_MAX, tb, blob_data(msg),
+                blob_len(msg));
+
+  if (!tb[INTERFACE_IFNAME])
+    return UBUS_STATUS_INVALID_ARGUMENT;
+
+  ifname = blobmsg_get_string(tb[INTERFACE_IFNAME]);
+
+  struct interface_olsr *tmp = if_ifwithname(ifname);
+
+  if (tmp != NULL) {
+
+    struct olsr_if *temp = olsr_cnf->interfaces, *prev;
+    if (temp != NULL && (strcmp(temp->name, ifname) == 0)) {
+      olsr_cnf->interfaces = temp->next;
+      olsr_remove_interface(temp);
+      goto send_reply;
+    }
+
+    while (temp != NULL && (strcmp(temp->name, ifname) != 0)) {
+      prev = temp;
+      temp = temp->next;
+    }
+
+    if (temp == NULL) {
+      goto send_reply;
+    }
+
+    prev->next = temp->next;
+    olsr_remove_interface(temp);
+  } else {
+    return UBUS_STATUS_PERMISSION_DENIED;
+  }
+
+send_reply:
+
+  blob_buf_init(&b, 0);
+  blobmsg_add_string(&b, "deleting", ifname);
+
+  ret = ubus_send_reply(ctx_local, req, b.head);
+  if (ret)
+    olsr_syslog(OLSR_LOG_ERR, "Failed to send reply: %s\n", ubus_strerror(ret));
+
+  blob_buf_free(&b);
+
+  return ret;
+}
+
+// List of functions we expose via the ubus bus.
+static const struct ubus_method olsrd_methods[] = {
+    UBUS_METHOD("add_interface", olsrd_ubus_add_interface, interface_policy),
+    UBUS_METHOD("del_interface", olsrd_ubus_del_interface, interface_policy),
+};
+
+// Definition of the ubus object type.
+static struct ubus_object_type olsrd_object_type =
+    UBUS_OBJECT_TYPE("olsrd", olsrd_methods);
+
+// Object we announce via the ubus bus.
+static struct ubus_object olsrd_object = {
+    .name = "olsrd",
+    .type = &olsrd_object_type,
+    .methods = olsrd_methods,
+    .n_methods = ARRAY_SIZE(olsrd_methods),
+};
+
+// Registers handlers for olsrd methods in the global ubus context.
+static bool ubus_init_object() {
+  int ret;
+
+  ret = ubus_add_object(shared_ctx, &olsrd_object);
+  if (ret) {
+    olsr_syslog(OLSR_LOG_ERR, "Failed to add object: %s\n", ubus_strerror(ret));
+    return false;
+  }
+
+  return true;
+}
+
+// Initializes the global ubus context, connecting to the bus to be able to
+// receive and send messages.
+static bool olsrd_ubus_init(void) {
+  if (shared_ctx)
+    return true;
+
+  shared_ctx = ubus_connect(NULL);
+  if (!shared_ctx)
+    return false;
+
+  return true;
+}
+
+void olsrd_ubus_receive(fd_set *readfds) {
+  if (!shared_ctx)
+    return;
+  if (FD_ISSET(shared_ctx->sock.fd, readfds))
+    ubus_handle_event(shared_ctx);
+}
+
+int olsrd_ubus_add_read_sock(fd_set *readfds, int maxfd) {
+  if (!shared_ctx)
+    return maxfd;
+
+  FD_SET(shared_ctx->sock.fd, readfds);
+  return MAX(maxfd, shared_ctx->sock.fd + 1);
+}
+
+bool olsrd_add_ubus() {
+  if (!olsrd_ubus_init()) {
+    olsr_syslog(OLSR_LOG_ERR, "Failed to initialize ubus!\n");
+    return false;
+  }
+  if (!ubus_init_object()) {
+    olsr_syslog(OLSR_LOG_ERR, "Failed to add objects to ubus!\n");
+    return false;
+  }
+  return true;
+}
diff --git a/olsrd/src/src/ubus.h b/olsrd/src/src/ubus.h
new file mode 100644 (file)
index 0000000..10bd59f
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+    IPC integration of olsrd with OpenWrt.
+
+    The ubus interface offers following functions:
+    - add_inteface '{"ifname":"wg_51820", "lqm": "0.5"}'
+    - del_inteface '{"ifname":"wg_51820"}'
+*/
+
+#include <stdbool.h>
+#include <sys/select.h>
+
+/**
+ * Initialize ubus interface.
+ *
+ * Connect to the ubus daemon and expose the ubus functions.
+ *
+ * @return if initializing ubus was successful
+ */
+bool olsrd_add_ubus();
+
+/**
+ * Add ubus socket to given filedescriptor set.
+ *
+ * We need to check repeatedly if the ubus socket has something to read.
+ * The functions allows to add the ubus socket to the normal while(1)-loop of
+ * olsrd.
+ *
+ * @param readfs: the filedescriptor set
+ * @param maxfd: the current maximum file descriptor
+ * @return the maximum file descriptor
+ */
+int olsrd_ubus_add_read_sock(fd_set *readfds, int maxfd);
+
+/**
+ * Check and process ubus socket.
+ *
+ * If the ubus-socket signals that data is available, the ubus_handle_event is
+ * called.
+ */
+void olsrd_ubus_receive(fd_set *readfds);
index 28e16fd3e8b77aa6ab9ad92abe9ab06408c57b96..1599e26d8500f2ff4c7426967564c5f0d03dce7e 100644 (file)
@@ -1,33 +1,31 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=oonf-dlep-proxy
-PKG_VERSION:=0.14.1-1
-PKG_REV:=d86825c0bdf144db706da444be7b0a2e8722b54d
-PKG_RELEASE:=$(PKG_REV)
+PKG_RELEASE:=1
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_URL:=https://github.com/OLSR/OONF.git
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_VERSION:=$(PKG_REV)
+PKG_SOURCE_URL:=https://github.com/OLSR/OONF.git
+PKG_SOURCE_DATE:=2022-08-25
+PKG_SOURCE_VERSION:=fb15d54d6a7a087cb0c5ec37c49804f6ce432396
+PKG_MIRROR_HASH:=f3a4512a53a56c27564c602a0efec211988825caf77bf52e86769cd8d413522c
 
 CMAKE_INSTALL:=1
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/cmake.mk
 
-CMAKE_OPTIONS=-D OONF_NO_WERROR:Bool=true \
-              -D OONF_LOGGING_LEVEL:String=debug \
-              -D OONF_NO_TESTING:Bool=true \
-              -D UCI:Bool=true \
-              -D OONF_APP_DEFAULT_CFG_HANDLER:String=uci \
-              -D OONF_STATIC_PLUGINS:String="class;clock;layer2;packet_socket;socket;stream_socket;telnet;timer;viewer;os_clock;os_fd;os_interface;os_system;nl80211_listener;layer2info;systeminfo;cfg_uciloader;cfg_compact;dlep_proxy" \
-              -D OONF_LIB_GIT:String=v$(PKG_VERSION)-archive \
-              -D OONF_VERSION:String=$(PKG_VERSION) \
-              -D INSTALL_LIB_DIR:Path=lib/oonf \
-              -D INSTALL_INCLUDE_DIR:Path=include/oonf \
-              -D INSTALL_CMAKE_DIR:Path=lib/oonf \
-              -D CMAKE_PREFIX_PATH=$(STAGING_DIR)/usr
+CMAKE_OPTIONS+=-D OONF_NO_WERROR:Bool=true \
+               -D OONF_LOGGING_LEVEL:String=debug \
+               -D OONF_NO_TESTING:Bool=true \
+               -D UCI:Bool=true \
+               -D OONF_APP_DEFAULT_CFG_HANDLER:String=uci \
+               -D OONF_STATIC_PLUGINS:String="class;clock;layer2;packet_socket;socket;stream_socket;telnet;timer;viewer;os_clock;os_fd;os_interface;os_system;nl80211_listener;layer2info;systeminfo;cfg_uciloader;cfg_compact;dlep_proxy" \
+               -D OONF_LIB_GIT:String=v$(PKG_SOURCE_VERSION) \
+               -D VERSION_SUB_TAG:String=$(PKG_SOURCE_DATE) \
+               -D INSTALL_LIB_DIR:Path=lib/oonf \
+               -D INSTALL_INCLUDE_DIR:Path=include/oonf \
+               -D INSTALL_CMAKE_DIR:Path=lib/oonf \
+               -D CMAKE_PREFIX_PATH=$(STAGING_DIR)/usr
 
 define Package/oonf-git/template
        SECTION:=net
index c47ff84000a850962312c748cf8eed163e95441e..fe26aaf94656826d7cdda198c76cffcc3b7c880b 100755 (executable)
@@ -3,4 +3,6 @@
 START=82
 DAEMON='dlep_proxy'
 
-. /lib/functions/oonf_init.sh
+[ -n "$IPKG_INSTROOT" ] || {
+        . /lib/functions/oonf_init.sh
+}
\ No newline at end of file
index 4357e5b6fa58f2fc2cbb2f826012c6bc19c12551..cda90b5202d2b98cb8dbe42853302f29605b316d 100644 (file)
@@ -1,33 +1,33 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=oonf-dlep-radio
-PKG_VERSION:=0.14.1-1
-PKG_REV:=d86825c0bdf144db706da444be7b0a2e8722b54d
-PKG_RELEASE:=$(PKG_REV)
+PKG_RELEASE:=1
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_URL:=https://github.com/OLSR/OONF.git
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_VERSION:=$(PKG_REV)
+PKG_SOURCE_URL:=https://github.com/OLSR/OONF.git
+PKG_SOURCE_DATE:=2022-08-25
+PKG_SOURCE_VERSION:=fb15d54d6a7a087cb0c5ec37c49804f6ce432396
+PKG_MIRROR_HASH:=9a17ada9ba95bef28ded5f8855a96950d9c0fde95612eb9e102d6ec967f8c304
+
+PKG_MAINTAINER:=Henning Rogge <hrogge@gmail.com>
 
 CMAKE_INSTALL:=1
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/cmake.mk
 
-CMAKE_OPTIONS=-D OONF_NO_WERROR:Bool=true \
-              -D OONF_LOGGING_LEVEL:String=debug \
-              -D OONF_NO_TESTING:Bool=true \
-              -D UCI:Bool=true \
-              -D OONF_APP_DEFAULT_CFG_HANDLER:String=uci \
-              -D OONF_STATIC_PLUGINS:String="class;clock;layer2;packet_socket;socket;stream_socket;telnet;timer;viewer;os_clock;os_fd;os_interface;os_system;nl80211_listener;layer2info;systeminfo;cfg_uciloader;cfg_compact;dlep_radio" \
-              -D OONF_LIB_GIT:String=v$(PKG_VERSION)-archive \
-              -D OONF_VERSION:String=$(PKG_VERSION) \
-              -D INSTALL_LIB_DIR:Path=lib/oonf \
-              -D INSTALL_INCLUDE_DIR:Path=include/oonf \
-              -D INSTALL_CMAKE_DIR:Path=lib/oonf \
-              -D CMAKE_PREFIX_PATH=$(STAGING_DIR)/usr
+CMAKE_OPTIONS+=-D OONF_NO_WERROR:Bool=true \
+               -D OONF_LOGGING_LEVEL:String=debug \
+               -D OONF_NO_TESTING:Bool=true \
+               -D UCI:Bool=true \
+               -D OONF_APP_DEFAULT_CFG_HANDLER:String=uci \
+               -D OONF_STATIC_PLUGINS:String="class;clock;layer2;packet_socket;socket;stream_socket;telnet;timer;viewer;os_clock;os_fd;os_interface;os_system;nl80211_listener;layer2info;systeminfo;cfg_uciloader;cfg_compact;dlep_radio" \
+               -D OONF_LIB_GIT:String=$(PKG_SOURCE_VERSION) \
+               -D VERSION_SUB_TAG:String=$(PKG_SOURCE_DATE) \
+               -D INSTALL_LIB_DIR:Path=lib/oonf \
+               -D INSTALL_INCLUDE_DIR:Path=include/oonf \
+               -D INSTALL_CMAKE_DIR:Path=lib/oonf \
+               -D CMAKE_PREFIX_PATH=$(STAGING_DIR)/usr
 
 define Package/oonf-git/template
        SECTION:=net
@@ -39,7 +39,7 @@ endef
 
 define Package/oonf-dlep-radio
        $(call Package/oonf-git/template)
-       TITLE:= Build DLEP Radio Agent
+       TITLE:=Build DLEP Radio Agent
        DEPENDS:=+librt +libnl-tiny +libuci +oonf-init-scripts
        VERSION:=$(PKG_VERSION)
 endef
index c660a216b4873e961359b2d5e2ce75919537507f..d0a5b230e289833c3469b0bfcf3f35eaf9bafe0a 100755 (executable)
@@ -3,4 +3,6 @@
 START=82
 DAEMON='dlep_radio'
 
-. /lib/functions/oonf_init.sh
+[ -n "$IPKG_INSTROOT" ] || {
+        . /lib/functions/oonf_init.sh
+}
index 8ab5b3b90661fcbe01b884e191d9159af87c1b0a..a945c4e6643e80252f9b4d8301c7e2cd3b1cd921 100755 (executable)
@@ -118,3 +118,20 @@ reload()
   oonf_add_devices_to_configuration
   oonf_reread_config
 }
+
+running()
+{
+  # check if we have a pidfile and then check if that pid still exists.
+  # since we don't use -e this has to be explicitly returned. exit would stop the process.
+  test -e "/tmp/run/olsrd2.pid" && test -e "/proc/$(cat "/tmp/run/olsrd2.pid")" && return 0
+  return 1
+}
+
+status()
+{
+  if running; then
+    echo "running"
+  else
+    echo "stopped"
+  fi
+}
index 1cc037aff3ebc9a2a1ea2d2c94857d62b8b28006..e4621e44e5a4ff55fbfe94ff7b4d5b9f27909034 100644 (file)
                bool "Lan_import plugin enabled"
                help
                        The lan_import plugin can read routing tables and automatically export them as locally attached networks in olsrd2.
-               default n
+               default y
 
        config OONF_OLSRV2_ROUTE_MODIFIER
                bool "route_modifier plugin enabled"
                help
                        The route_modifier plugin allows you to overwrite aspects of routes (like table/protocol) for certain destinations. 
-               default n
+               default y
 
        config OONF_GENERIC_DLEP_ROUTER
                bool "dlep_router plugin enabled"
@@ -30,7 +30,7 @@
                bool "remotecontrol plugin enabled"
                help
                        The remotecontrol plugin allows you to control configuration and logging over the telnet plugin. Be careful not to open this functionality over the network without securing it.
-               default n
+               default y
 
        config OONF_GENERIC_HTTP
                bool "http plugin enabled"
                bool "MPR plugin enabled"
                help
                        The MPR plugin reduce the routing graph to limit the overhead of the OLSRv2 protocol
+               default y
+
+       config OONF_OLSRV2_LAN
+               bool "New config option for Locally attached entries"
+               help
+                       Adds the 'lan' section to the config to configure LANs without setting multiple settings in a single key/value pair
+               default y
+
+       config OONF_OLSRV2_OLD_LAN
+               bool "Legacy option for Locally attached entries"
+               help
+                       Adds the olsr 'lan' config key in the olsrv2 section
                default n
 
        endmenu
index 727bd16721b09ad05a36780fa52f5d0bc5a6b29f..51fa8460306f9053b4ad751e00c9b653b53d583e 100644 (file)
@@ -1,48 +1,49 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=oonf-olsrd2
-PKG_VERSION:=0.14.1-1
-PKG_REV:=d86825c0bdf144db706da444be7b0a2e8722b54d
-PKG_RELEASE:=$(PKG_REV)
+PKG_RELEASE:=2
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_URL:=https://github.com/OLSR/OONF.git
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_VERSION:=$(PKG_REV)
+PKG_SOURCE_URL:=https://github.com/OLSR/OONF.git
+PKG_SOURCE_DATE:=2022-08-25
+PKG_SOURCE_VERSION:=1cec9b21086fb52ab4262c69aabd087e4d2d3a44
+PKG_MIRROR_HASH:=3350037ecb4d2e08f54a3fb8afe4f2d4e4884e1dec42ffdba1a6c5233df1b6cf
 
 CMAKE_INSTALL:=1
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/cmake.mk
 
-SPACE:=
-SPACE+=
+# ref https://stackoverflow.com/a/10571900/3990041
+SPACE:= $(subst ,, )
 CMAKE_OPTIONAL_PLUGINS:= $(subst $(SPACE),;,$(strip \
         $(if $(filter y,$(CONFIG_OONF_NHDP_AUTOLL4)),auto_ll4,) \
         $(if $(filter y,$(CONFIG_OONF_OLSRV2_LAN_IMPORT)),lan_import,) \
         $(if $(filter y,$(CONFIG_OONF_OLSRV2_ROUTE_MODIFIER)),route_modifier,) \
-        $(if $(filter y,$(CONFIG_OONF_GENERIC_DLEP_ROUTER)),dlep_router,) \
+        $(if $(filter y,$(CONFIG_OONF_GENERIC_DLEP_ROUTER)),dlep,) \
         $(if $(filter y,$(CONFIG_OONF_GENERIC_REMOTECONTROL)),remotecontrol,) \
         $(if $(filter y,$(CONFIG_OONF_OLSRV2_MPR)),mpr,) \
         $(if $(filter y,$(CONFIG_OONF_GENERIC_HTTP)),http,) \
+        $(if $(filter y,$(CONFIG_OONF_OLSRV2_LAN)),olsrv2_lan,) \
+        $(if $(filter y,$(CONFIG_OONF_OLSRV2_OLD_LAN)),olsrv2_old_lan,) \
     ))
 
 BUILD_TYPE:= $(if $(filter y,$(CONFIG_DEBUG)),Debug,Release)
 
-CMAKE_OPTIONS=-D CMAKE_BUILD_TYPE:String=$(BUILD_TYPE) \
-              -D OONF_NO_WERROR:Bool=true \
-              -D OONF_LOGGING_LEVEL:String=debug \
-              -D OONF_NO_TESTING:Bool=true \
-              -D UCI:Bool=true \
-              -D OONF_APP_DEFAULT_CFG_HANDLER:String=uci \
-              -D OONF_STATIC_PLUGINS:String="class;clock;duplicate_set;layer2;packet_socket;rfc5444;socket;stream_socket;telnet;timer;viewer;os_clock;os_fd;os_interface;os_routing;os_system;nhdp;olsrv2;ff_dat_metric;neighbor_probing;nl80211_listener;link_config;layer2info;systeminfo;cfg_uciloader;cfg_compact;nhdpinfo;olsrv2info;netjsoninfo;${CMAKE_OPTIONAL_PLUGINS}" \
-              -D OONF_LIB_GIT:String=v$(PKG_VERSION)-archive \
-              -D OONF_VERSION:String=$(PKG_VERSION) \
-              -D INSTALL_LIB_DIR:Path=lib/oonf \
-              -D INSTALL_INCLUDE_DIR:Path=include/oonf \
-              -D INSTALL_CMAKE_DIR:Path=lib/oonf \
-              -D CMAKE_PREFIX_PATH=$(STAGING_DIR)/usr
+CMAKE_OPTIONS+=-D CMAKE_BUILD_TYPE:String=$(BUILD_TYPE) \
+               -D OONF_NO_WERROR:Bool=true \
+               -D OONF_LOGGING_LEVEL:String=debug \
+               -D OONF_NO_TESTING:Bool=true \
+               -D UCI:Bool=true \
+               -D OONF_APP_DEFAULT_CFG_HANDLER:String=uci \
+               -D OONF_STATIC_PLUGINS:String="class;callback;clock;duplicate_set;layer2;packet_socket;rfc5444;socket;stream_socket;telnet;timer;viewer;os_clock;os_fd;os_interface;os_routing;os_system;nhdp;olsrv2;ff_dat_metric;neighbor_probing;nl80211_listener;link_config;layer2info;systeminfo;cfg_uciloader;cfg_compact;nhdpinfo;olsrv2info;netjsoninfo;${CMAKE_OPTIONAL_PLUGINS}" \
+               -D OONF_LIB_GIT:String=$(PKG_SOURCE_VERSION) \
+               -D VERSION_SUB_TAG:String=$(PKG_SOURCE_DATE) \
+               -D INSTALL_LIB_DIR:Path=lib/oonf \
+               -D INSTALL_INCLUDE_DIR:Path=include/oonf \
+               -D INSTALL_CMAKE_DIR:Path=lib/oonf \
+               -D CMAKE_PREFIX_PATH=$(STAGING_DIR)/usr \
+               -D CMAKE_GENERATOR=Ninja
 
 define Package/oonf-git/template
        SECTION:=net
index debae9883258b821a5ea0aecebe879ddc84e29eb..59795c2a16add0206bd61bcda0d995b48e903166 100755 (executable)
@@ -3,4 +3,9 @@
 START=82
 DAEMON='olsrd2'
 
-. /lib/functions/oonf_init.sh
+[ -n "$IPKG_INSTROOT" ] || {
+        . /lib/functions/oonf_init.sh
+
+        extra_command "running" "Check if service is running"
+        extra_command "status" "Service status"
+}
diff --git a/oonf-olsrd2/patches/100-enable-lan-import-plugin.patch b/oonf-olsrd2/patches/100-enable-lan-import-plugin.patch
new file mode 100644 (file)
index 0000000..e076a2a
--- /dev/null
@@ -0,0 +1,8 @@
+--- a/src/olsrv2/CMakeLists.txt
++++ b/src/olsrv2/CMakeLists.txt
+@@ -6,4 +6,5 @@ add_subdirectory(olsrv2_old_lan)
+ add_subdirectory(olsrv2_l2import)
+ add_subdirectory(olsrv2_lan)
+ add_subdirectory(route_modifier)
++add_subdirectory(lan_import)
diff --git a/opennds/Makefile b/opennds/Makefile
new file mode 100644 (file)
index 0000000..6941ebe
--- /dev/null
@@ -0,0 +1,89 @@
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=opennds
+PKG_VERSION:=10.2.0
+PKG_RELEASE:=1
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://codeload.github.com/opennds/opennds/tar.gz/v$(PKG_VERSION)?
+PKG_HASH:=c2da51e3051e390fc1ddae2a4fa751f7b62919eb8e5526710067ca4622331017
+PKG_BUILD_DIR:=$(BUILD_DIR)/openNDS-$(PKG_VERSION)
+
+PKG_MAINTAINER:=Rob White <rob@blue-wave.net>
+PKG_LICENSE:=GPL-2.0-or-later
+PKG_LICENSE_FILES:=COPYING
+
+PKG_FIXUP:=autoreconf
+PKG_BUILD_PARALLEL:=1
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/opennds
+  SUBMENU:=Captive Portals
+  SECTION:=net
+  CATEGORY:=Network
+  DEPENDS:=+libmicrohttpd-no-ssl
+  TITLE:=open Network Demarcation Service
+  URL:=https://github.com/opennds/opennds
+  CONFLICTS:=nodogsplash
+endef
+
+define Package/opennds/description
+  openNDS (open Network Demarcation Service) is a high performance, small footprint, Captive Portal.
+  It provides a border control gateway between a public local area network and the Internet.
+  It supports all scenarios ranging from small stand alone venues through to large mesh networks with multiple portal entry points.
+  Both the client driven Captive Portal Detection method (CPD) and gateway driven Captive Portal Identification method (CPI - RFC 8910 and RFC 8908) are supported.
+  This version uses nftables.
+endef
+
+define Package/opennds/install
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/opennds $(1)/usr/bin/
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/ndsctl $(1)/usr/bin/
+       $(INSTALL_DIR) $(1)/etc/opennds/htdocs/images
+       $(INSTALL_DIR) $(1)/etc/config
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_DIR) $(1)/etc/uci-defaults
+       $(INSTALL_DIR) $(1)/usr/lib/opennds
+       $(CP) $(PKG_BUILD_DIR)/resources/splash.css $(1)/etc/opennds/htdocs/
+       $(CP) $(PKG_BUILD_DIR)/resources/splash.jpg $(1)/etc/opennds/htdocs/images/
+       $(CP) $(PKG_BUILD_DIR)/linux_openwrt/opennds/files/etc/config/opennds $(1)/etc/config/
+       $(CP) $(PKG_BUILD_DIR)/linux_openwrt/opennds/files/etc/config/opennds $(1)/etc/opennds/config.uci
+       $(CP) $(PKG_BUILD_DIR)/linux_openwrt/opennds/files/etc/init.d/opennds $(1)/etc/init.d/
+       $(CP) $(PKG_BUILD_DIR)/linux_openwrt/opennds/files/etc/uci-defaults/40_opennds $(1)/etc/uci-defaults/
+       $(CP) $(PKG_BUILD_DIR)/linux_openwrt/opennds/files/usr/lib/opennds/restart.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/binauth/binauth_log.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/binauth/custombinauth.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/libs/libopennds.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/PreAuth/theme_click-to-continue-basic.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/PreAuth/theme_click-to-continue-custom-placeholders.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/PreAuth/theme_user-email-login-basic.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/PreAuth/theme_user-email-login-custom-placeholders.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/libs/get_client_interface.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/libs/client_params.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/libs/authmon.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/libs/dnsconfig.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/libs/download_resources.sh $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/libs/post-request.php $(1)/usr/lib/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/fas-aes/fas-aes.php $(1)/etc/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/fas-hid/fas-hid.php $(1)/etc/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/fas-hid/fas-hid-https.php $(1)/etc/opennds/
+       $(CP) $(PKG_BUILD_DIR)/forward_authentication_service/fas-aes/fas-aes-https.php $(1)/etc/opennds/
+endef
+
+define Package/opennds/postrm
+#!/bin/sh
+uci delete firewall.opennds
+uci commit firewall
+endef
+
+define Package/opennds/conffiles
+/etc/config/opennds
+endef
+
+$(eval $(call BuildPackage,opennds))
index a091119b801e33dc40c64842ccbbc1a65994c42f..2eb2ad8f135d65666caca434128600ff0206e8ec 100644 (file)
@@ -1,17 +1,17 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=pimbd
-PKG_SOURCE_VERSION:=dbf4e5913b06e3160f506df15e6a047a403a5f21
-PKG_VERSION:=2018-06-19-$(PKG_SOURCE_VERSION)
-PKG_RELEASE:=1
+PKG_RELEASE:=4
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=https://github.com/Oryon/pimbd.git
+PKG_SOURCE_DATE:=2018-06-19
+PKG_SOURCE_VERSION:=dbf4e5913b06e3160f506df15e6a047a403a5f21
+PKG_MIRROR_HASH:=ed794402da1959e0c8cdf819a8bd7370f9bb092e62b33d96f94ad1228a4975d7
+
 PKG_MAINTAINER:=Pierre Pfister <pierre.pfister@darou.fr>
 PKG_LICENSE:=Apache-2.0
-
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_LICENSE_FILES:=LICENSE
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/cmake.mk
@@ -30,9 +30,9 @@ define Package/pimbd
 endef
 
 define Package/pimbd/description
-This package provides a daemon which implements the Protocol Independent
-Multicast BIDIR routing protocol. Note that a routing protocol must be 
-installed and running in order for PIM to function.
+  This package provides a daemon which implements the Protocol Independent
+  Multicast BIDIR routing protocol. Note that a routing protocol must be
+  installed and running in order for PIM to function.
 endef
 
 define Package/pimbd/install
@@ -44,6 +44,8 @@ define Package/pimbd/install
        $(INSTALL_BIN) ./files/pimbd.init $(1)/etc/init.d/pimbd
        $(INSTALL_DIR) $(1)/etc/uci-defaults
        $(INSTALL_BIN) files/firewall-uci.sh $(1)/etc/uci-defaults/99_pimbd_firewall
+       $(INSTALL_DIR) $(1)/etc/config
+       $(INSTALL_CONF) ./files/pimb.config $(1)/etc/config/pimb
 endef
 
 $(eval $(call BuildPackage,pimbd))
diff --git a/pimbd/files/pimb.config b/pimbd/files/pimb.config
new file mode 100644 (file)
index 0000000..f529348
--- /dev/null
@@ -0,0 +1,34 @@
+# The interface section allows to enable pimb on an interface.
+# Several options can be enabled for the interface.
+# All options are disabled by default.
+#
+#config interface '<interface section name>'
+# option pim '<on | off>'     - enable or disable pim
+# option ssbidir '<on | off>' - enable or disable ssbidir
+# option mld '<on | off>'     - enable or disable mld
+# option igmp '<on | off>'    - enable or disable igmp
+# option dev '<device name>'  - set the device name
+
+# The rpa section allows to configure a rendevous point.
+# The interface and the networks must be configured for every rendevous.
+#
+#config rpa '<rendevous point name>'
+# option address '<ip address>'       - rendevous point address
+# list prefix '<net>/<prefix length>' - prefix for the rpa
+
+
+
+# Uncomment the following following section to enable pimb on the interface eth1.
+#config interface 'ETH1'
+#      option pim 'on'
+#      option ssbidir 'on'
+#      option mld 'on'
+#      option igmp 'on'
+#      option dev 'eth1'
+
+
+# Uncomment the following section to configure a rendevous point.
+#config rpa '172_16_0_1'
+#      option address '172.16.0.1'
+#      list prefix '224.0.0.0/4'
+
index 20b27bd93d49deb5e3c6904c6a19577875ab5cee..d2b5fc97ff2e1c97dd9b38e3fa6d6ee325f77287 100644 (file)
@@ -4,18 +4,147 @@ START=90
 STOP=10
 USE_PROCD=1
 
+TYPE=''
+
+DEV=''
+PIM='off'
+SSBIDIR='off'
+MLD='off'
+IGMP='off'
+
+RPAADDRESS=''
+RPALIST=''
+
+reset_link_values() {
+    PIM='off'
+    SSBIDIR='off'
+    MLD='off'
+    IGMP='off'
+}
+
+apply_link() {
+    if test ! -z "$DEV"; then
+        echo "Setting pimbc link set $DEV pim $PIM ssbidir $SSBIDIR mld $MLD igmp $IGMP"
+        echo "link set $DEV pim $PIM ssbidir $SSBIDIR mld $MLD igmp $IGMP" >> /tmp/pimbd.conf
+    fi
+    reset_link_values
+}
+
+apply_rpa() {
+    if test -z "$RPAADDRESS"; then
+        echo "No RPA address is set!"
+        return
+    fi
+    for i in $RPALIST; do
+        echo "adding pimbc rpa add $RPAADDRESS $i"
+        echo "rpa add $RPAADDRESS $i" >> /tmp/pimbd.conf
+    done
+    RPAADDRESS=''
+    RPALIST=''
+}
+
+store_interface_option() {
+    local name="$1"
+    local value="$2"
+    case $name in
+    dev)
+        DEV=$value
+        ;;
+    pim)
+        PIM=$value
+        ;;
+    ssbidir)
+        SSBIDIR=$value
+        ;;
+    mld)
+        MLD=$value
+        ;;
+    igmp)
+        IGMP=$value
+        ;;
+    esac
+}
+
+store_rpa_option() {
+    local name="$1"
+    local value="$2"
+    echo "store_rpa_option $name $value"
+    case $name in
+    address)
+        RPAADDRESS="$value"
+        ;;
+    esac
+}
+
+store_rpa_list() {
+    local name="$1"
+    local value="$2"
+    echo "store rpa_list $name $value"
+    case $name in
+    prefix)
+        RPALIST="${RPALIST} $value"
+        ;;
+    esac
+}
+
 start_service() {
     . /lib/functions.sh
     . /lib/functions/network.sh
+
+    rm -f /tmp/pimbd.conf
+
+    config_cb() {
+        local name="$1"
+        local value="$2"
+        # commands to be run for every option
+        echo "config_cb $name $value"
+        case $TYPE in
+        interface)
+            apply_link
+            ;;
+        rpa)
+            apply_rpa
+            ;;
+        esac
+        TYPE=$name
+        DEV=$value
+    }
+
+    option_cb() {
+        local name="$1"
+        local value="$2"
+        # commands to be run for every option
+        echo "option_cb $name $value"
+        case $TYPE in
+        interface)
+            store_interface_option "$name" "$value"
+            ;;
+        rpa)
+            store_rpa_option "$name" "$value"
+            ;;
+        esac
+    }
+
+    list_cb() {
+        local name="$1"
+        local value="$2"
+        # commands to be run for every list item
+        echo "list_cb $name $value"
+
+        case $TYPE in
+        rpa)
+            store_rpa_list "$name" "$value"
+            ;;
+        esac
+    }
     config_load pimb
 
     procd_open_instance
     procd_set_param command /usr/sbin/pimbd
     procd_append_param command -S
     procd_append_param command -L 6
+    procd_append_param command -c /tmp/pimbd.conf
 
     procd_set_param respawn
     procd_close_instance
 }
-
-
index 046dc179ced7c34ab4de1ed15cb8c18c9f5b09da..ce13f43c9bc1777b1f06ef94c23df0352e7db51e 100644 (file)
@@ -8,56 +8,55 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=prince
-PKG_VERSION:=v0.4
-PKG_RELEASE:=1
+PKG_VERSION:=0.4
+PKG_RELEASE:=3
 
-# out of source build
-CMAKE_BINARY_SUBDIR:=build
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://github.com/AdvancedNetworkingSystems/prince/archive/refs/tags/v$(PKG_VERSION).tar.gz?
+PKG_HASH:=9e3ce87343f5ea1d66757f8c704b62ff47d5eb245a191cf1e6a9ec106c5da90e
 
-PKG_BUILD_DIR:=$(BUILD_DIR)/prince-$(PKG_VERSION)
-PKG_MIRROR_HASH:=19a3cae09f28a5ef07fc0f5ff12cf62c776a94fbf1626336ab04951775c104de
-PKG_INSTALL:=0
+PKG_MAINTAINER:=Gabriele Gemmi <gabriel@autistici.org>
 PKG_LICENSE:=MIT
-PKG_SOURCE:=prince-$(PKG_VERSION).tar.xz
-PKG_SOURCE_PROTO:=git
-PKG_SOURCE_SUBDIR:=prince-$(PKG_VERSION)
-PKG_SOURCE_URL:=https://github.com/AdvancedNetworkingSystems/prince.git
-PKG_SOURCE_VERSION:=v0.4
-PKG_USE_MIPS16:=0
+PKG_LICENSE_FILES:=LICENSE
+
+PKG_BUILD_FLAGS:=no-mips16
+
+# out of source build
+CMAKE_BINARY_SUBDIR:=build
 
 include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/cmake.mk
 
 define Package/prince
-       SECTION :=net
-       CATEGORY :=Network
-       SUBMENU :=Routing and Redirection
-       Mantainer :=Gabriele Gemmi <gabriel@autistici.org>
-       TITLE :=Prince
-       URL :=https://github.com/AdvancedNetworkingSystems/prince
-       MENU :=0
-       DEPENDS := +libjson-c +libpthread
+  SECTION:=net
+  CATEGORY:=Network
+  SUBMENU:=Routing and Redirection
+  TITLE:=Prince
+  URL:=https://github.com/AdvancedNetworkingSystems/prince
+  DEPENDS:=+libjson-c +libpthread
 endef
 
 define Package/prince/description
-       Prince is an open source implementation of the PopRouting Algorithm.
-       It has been developed as a Google Summer of Code Project in collaboration with Freifunk and the University of Trento.
+  Prince is an open source implementation of the PopRouting Algorithm.
+  It has been developed as a Google Summer of Code Project in collaboration with Freifunk and the University of Trento.
 
-       Prince fetches topology data from a Link State routing daemon (OONF, OLSR, OSPF, etc),
-       calculates the betweenness centrality using the topology and then computes the
-       the timers' optimal values using these data. At the end of the computation the timers are pushed back to the routing daemon.
-       Since v0.4 it supports both OONF and OLSRd.
+  Prince fetches topology data from a Link State routing daemon (OONF, OLSR, OSPF, etc),
+  calculates the betweenness centrality using the topology and then computes the
+  the timers' optimal values using these data. At the end of the computation the timers are pushed back to the routing daemon.
+  Since v0.4 it supports both OONF and OLSRd.
 endef
 
 define Package/prince/install
        $(INSTALL_DIR) $(1)/usr/bin
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/build/prince $(1)/usr/bin/prince
+
        $(INSTALL_DIR) $(1)/usr/lib
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/libprince_oonf.so $(1)/usr/lib
+       $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/libprince_olsr.so $(1)/usr/lib
+       
        $(INSTALL_DIR) $(1)/etc/init.d
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/build/prince $(1)/usr/bin/prince
        $(INSTALL_BIN) ./files/prince.init $(1)/etc/init.d/prince
        $(INSTALL_DATA) ./files/prince.conf $(1)/etc/prince.conf
-       $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/libprince_oonf.so $(1)/usr/lib
-       $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/libprince_olsr.so $(1)/usr/lib
 endef
 
 CFLAGS += $(TARGET_CFLAGS) $(TARGET_CPPFLAGS)
diff --git a/prince/patches/010-gcc10.patch b/prince/patches/010-gcc10.patch
new file mode 100644 (file)
index 0000000..43b6976
--- /dev/null
@@ -0,0 +1,20 @@
+--- a/prince/include/common.h
++++ b/prince/include/common.h
+@@ -35,12 +35,12 @@ typedef struct routing_plugin_ {
+ } routing_plugin;
+-routing_plugin *(*new_plugin_p)(char *host, int port, int json_type,
++static routing_plugin *(*new_plugin_p)(char *host, int port, int json_type,
+                               int timer_port);
+-int (*get_initial_timers_p)(routing_plugin *o, struct timers *t);
+-int (*get_topology_p)(routing_plugin *o);
+-int (*push_timers_p)(routing_plugin *o, struct timers t);
+-void (*delete_plugin_p)(routing_plugin *o);
++static int (*get_initial_timers_p)(routing_plugin *o, struct timers *t);
++static int (*get_topology_p)(routing_plugin *o);
++static int (*push_timers_p)(routing_plugin *o, struct timers t);
++static void (*delete_plugin_p)(routing_plugin *o);
+ #endif /* SRC_COMMON_H_ */
diff --git a/quagga/Makefile b/quagga/Makefile
deleted file mode 100644 (file)
index e2751f4..0000000
+++ /dev/null
@@ -1,283 +0,0 @@
-#
-# Copyright (C) 2006-2016 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=quagga
-PKG_VERSION:=1.1.0
-PKG_RELEASE:=1
-PKG_HASH:=f7a43a9c59bfd3722002210530b2553c8d5cc05bfea5acd56d4f102b9f55dc63
-
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=@SAVANNAH/quagga/
-PKG_CONFIG_DEPENDS:= \
-       CONFIG_IPV6 \
-       CONFIG_PACKAGE_quagga-watchquagga \
-       CONFIG_PACKAGE_quagga-zebra \
-       CONFIG_PACKAGE_quagga-libzebra \
-       CONFIG_PACKAGE_quagga-libospf \
-       CONFIG_PACKAGE_quagga-bgpd \
-       CONFIG_PACKAGE_quagga-isisd \
-       CONFIG_PACKAGE_quagga-ospf6d \
-       CONFIG_PACKAGE_quagga-ripd \
-       CONFIG_PACKAGE_quagga-ripngd \
-       CONFIG_PACKAGE_quagga-vtysh
-PKG_BUILD_PARALLEL:=1
-PKG_FIXUP:=autoreconf
-PKG_INSTALL:=1
-PKG_LICENSE:=GPL-2.0
-
-include $(INCLUDE_DIR)/package.mk
-
-define Package/quagga/Default
-  SECTION:=net
-  CATEGORY:=Network
-  SUBMENU:=Routing and Redirection
-  DEPENDS:=quagga
-  TITLE:=The Quagga Software Routing Suite
-  URL:=http://www.quagga.net
-  MAINTAINER:=Vasilis Tsiligiannis <acinonyx@openwrt.gr>
-endef
-
-define Package/quagga
-  $(call Package/quagga/Default)
-  DEPENDS:=+librt
-  MENU:=1
-endef
-
-define Package/quagga/description
-  A routing software package that provides TCP/IP based routing services
-  with routing protocols support such as RIPv1, RIPv2, RIPng, OSPFv2,
-  OSPFv3, BGP-4, and BGP-4+
-endef
-
-define Package/quagga-watchquagga
-  $(call Package/quagga/Default)
-  TITLE:=Quagga watchdog
-  DEPENDS+=+quagga-libzebra
-  DEFAULT:=y if PACKAGE_quagga
-endef
-
-define Package/quagga-zebra
-  $(call Package/quagga/Default)
-  TITLE:=Zebra daemon
-  DEPENDS+=+quagga-libzebra
-  DEFAULT:=y if PACKAGE_quagga
-endef
-
-define Package/quagga-libzebra
-  $(call Package/quagga/Default)
-  TITLE:=zebra library
-endef
-
-define Package/quagga-libospf
-  $(call Package/quagga/Default)
-  DEPENDS+=+quagga-libzebra
-  TITLE:=OSPF library
-endef
-
-define Package/quagga-bgpd
-  $(call Package/quagga/Default)
-  DEPENDS+=+quagga-libzebra
-  TITLE:=BGPv4, BGPv4+, BGPv4- routing engine
-endef
-
-define Package/quagga-isisd
-  $(call Package/quagga/Default)
-  DEPENDS+=+quagga-libzebra
-  TITLE:=IS-IS routing engine
-endef
-
-define Package/quagga-ospfd
-  $(call Package/quagga/Default)
-  DEPENDS+=+quagga-libospf
-  TITLE:=OSPFv2 routing engine
-endef
-
-define Package/quagga-ospf6d
-  $(call Package/quagga/Default)
-  DEPENDS+=+quagga-libospf @IPV6
-  TITLE:=OSPFv3 routing engine
-endef
-
-define Package/quagga-ripd
-  $(call Package/quagga/Default)
-  DEPENDS+=+quagga-libzebra
-  TITLE:=RIP routing engine
-endef
-
-define Package/quagga-ripngd
-  $(call Package/quagga/Default)
-  DEPENDS+=+quagga-libzebra @IPV6
-  TITLE:=RIPNG routing engine
-endef
-
-define Package/quagga-vtysh
-  $(call Package/quagga/Default)
-  DEPENDS+=+quagga-libzebra +libreadline +libncurses
-  TITLE:=integrated shell for Quagga routing software
-endef
-
-define Package/quagga-zebra/conffiles
-/etc/quagga/zebra.conf
-endef
-
-define Package/quagga-bgpd/conffiles
-/etc/quagga/bgpd.conf
-endef
-
-define Package/quagga-isisd/conffiles
-/etc/quagga/isisd.conf
-endef
-
-define Package/quagga-ospfd/conffiles
-/etc/quagga/ospfd.conf
-endef
-
-define Package/quagga-ospf6d/conffiles
-/etc/quagga/ospf6d.conf
-endef
-
-define Package/quagga-ripd/conffiles
-/etc/quagga/ripd.conf
-endef
-
-define Package/quagga-ripngd/conffiles
-/etc/quagga/ripngd.conf
-endef
-
-ifneq ($(SDK),)
-CONFIG_PACKAGE_quagga-libzebra:=m
-CONFIG_PACKAGE_quagga-libospf:=m
-CONFIG_PACKAGE_quagga-watchquagga:=m
-CONFIG_PACKAGE_quagga-zebra:=m
-CONFIG_PACKAGE_quagga-bgpd:=m
-CONFIG_PACKAGE_quagga-isisd:=m
-CONFIG_PACKAGE_quagga-ospf6d:=m
-CONFIG_PACKAGE_quagga-ripd:=m
-CONFIG_PACKAGE_quagga-ripngd:=m
-CONFIG_PACKAGE_quagga-vtysh:=m
-endif
-
-CONFIGURE_ARGS+= \
-       --localstatedir=/var/run/quagga \
-       --sysconfdir=/etc/quagga/ \
-       --enable-shared \
-       --disable-static \
-       --enable-user=network \
-       --enable-group=network \
-       --enable-multipath=8 \
-       --disable-ospfclient \
-       --disable-capabilities \
-       --disable-doc \
-       $(call autoconf_bool,CONFIG_PACKAGE_quagga-libzebra,zebra) \
-       $(call autoconf_bool,CONFIG_PACKAGE_quagga-libospf,ospfd) \
-       $(call autoconf_bool,CONFIG_PACKAGE_quagga-bgpd,bgpd) \
-       $(call autoconf_bool,CONFIG_PACKAGE_quagga-isisd,isisd) \
-       $(call autoconf_bool,CONFIG_PACKAGE_quagga-ospf6d,ospf6d) \
-       $(call autoconf_bool,CONFIG_PACKAGE_quagga-ripd,ripd) \
-       $(call autoconf_bool,CONFIG_PACKAGE_quagga-ripngd,ripngd) \
-       $(call autoconf_bool,CONFIG_PACKAGE_quagga-vtysh,vtysh) \
-
-MAKE_FLAGS += \
-       CFLAGS="$(TARGET_CFLAGS) -std=gnu99"
-
-define Package/quagga/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) ./files/quagga $(1)/usr/sbin/quagga.init
-       $(INSTALL_DIR) $(1)/etc/init.d
-       $(INSTALL_BIN) ./files/quagga.init $(1)/etc/init.d/quagga
-endef
-
-define Package/quagga-watchquagga/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/watchquagga $(1)/usr/sbin/
-endef
-
-define Package/quagga-zebra/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/zebra $(1)/usr/sbin/
-       $(INSTALL_DIR) $(1)/etc/quagga
-       chmod 0750 $(1)/etc/quagga
-       $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/zebra.conf
-endef
-
-define Package/quagga-bgpd/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/bgpd $(1)/usr/sbin/
-       $(INSTALL_DIR) $(1)/etc/quagga
-       chmod 0750 $(1)/etc/quagga
-       $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/bgpd.conf
-endef
-
-define Package/quagga-isisd/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/isisd $(1)/usr/sbin/
-       $(INSTALL_DIR) $(1)/etc/quagga
-       chmod 0750 $(1)/etc/quagga
-       $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/isisd.conf
-endef
-
-define Package/quagga-ospfd/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ospfd $(1)/usr/sbin/
-       $(INSTALL_DIR) $(1)/etc/quagga
-       chmod 0750 $(1)/etc/quagga
-       $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/ospfd.conf
-endef
-
-define Package/quagga-ospf6d/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ospf6d $(1)/usr/sbin/
-       $(INSTALL_DIR) $(1)/etc/quagga
-       chmod 0750 $(1)/etc/quagga
-       $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/ospf6d.conf
-endef
-
-define Package/quagga-ripd/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ripd $(1)/usr/sbin/
-       $(INSTALL_DIR) $(1)/etc/quagga
-       chmod 0750 $(1)/etc/quagga
-       $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/ripd.conf
-endef
-
-define Package/quagga-ripngd/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ripngd $(1)/usr/sbin/
-       $(INSTALL_DIR) $(1)/etc/quagga
-       chmod 0750 $(1)/etc/quagga
-       $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/ripngd.conf
-endef
-
-define Package/quagga-vtysh/install
-       $(INSTALL_DIR) $(1)/usr/bin
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/vtysh $(1)/usr/bin/
-endef
-
-define Package/quagga-libospf/install
-       $(INSTALL_DIR) $(1)/usr/lib
-       $(CP) $(PKG_INSTALL_DIR)/usr/lib/libospf.so.* $(1)/usr/lib/
-endef
-
-define Package/quagga-libzebra/install
-       $(INSTALL_DIR) $(1)/usr/lib
-       $(CP) $(PKG_INSTALL_DIR)/usr/lib/libzebra.so.* $(1)/usr/lib/
-endef
-
-$(eval $(call BuildPackage,quagga))
-$(eval $(call BuildPackage,quagga-libzebra))
-$(eval $(call BuildPackage,quagga-libospf))
-$(eval $(call BuildPackage,quagga-watchquagga))
-$(eval $(call BuildPackage,quagga-zebra))
-$(eval $(call BuildPackage,quagga-bgpd))
-$(eval $(call BuildPackage,quagga-isisd))
-$(eval $(call BuildPackage,quagga-ospfd))
-$(eval $(call BuildPackage,quagga-ospf6d))
-$(eval $(call BuildPackage,quagga-ripd))
-$(eval $(call BuildPackage,quagga-ripngd))
-$(eval $(call BuildPackage,quagga-vtysh))
diff --git a/quagga/files/quagga b/quagga/files/quagga
deleted file mode 100644 (file)
index b172090..0000000
+++ /dev/null
@@ -1,335 +0,0 @@
-#!/bin/sh
-#
-# quagga       Starts/stops quagga daemons and watchquagga.
-#              Create a daemon.conf file to have that routing daemon
-#              started/stopped automagically when using this script
-#              without any daemon names as args.
-#              If watchquagga is available, it will also be
-#              started/stopped if the script is called without
-#              any daemon names.
-#
-
-ME=$(basename $0)
-
-usage() {
-       echo "Usage: ${ME} {start|stop|restart} [daemon ...]"
-       exit 2
-}
-
-if [ -z "$1" ]
-then
-       usage
-else
-       COMMAND=$1
-fi
-shift
-ARG_DAEMONS=$*
-BINDIR=/usr/sbin
-CONFDIR=/etc/quagga
-STATEDIR=/var/run/quagga
-RUNUSER=network
-RUNGROUP=$RUNUSER
-DAEMONS="zebra ripd ripngd ospfd ospf6d bgpd"
-DAEMON_FLAGS=-d
-WATCHQUAGGA_FLAGS="-d -z -T 60 -R"
-WATCHQUAGGA_CMD="$0 watchrestart"
-if [ ${COMMAND} != "watchrestart" -a -x "${BINDIR}/watchquagga" ]
-then
-       DAEMONS="${DAEMONS} watchquagga"
-fi
-DAEMONS_STARTSEQ=${DAEMONS}
-
-reverse()
-{
-       local revlist r
-        revlist=
-        for r
-       do
-                revlist="$r $revlist"
-        done
-        echo $revlist
-}
-
-DAEMONS_STOPSEQ=$(reverse ${DAEMONS_STARTSEQ})
-
-#pidof() {
-#      ps ax | awk 'match($5, "(^|/)'"$1"'$") > 0 { printf " %s", $1 }'
-#}
-
-quit() {
-       echo "${ME}: $1"
-       exit 0
-}
-
-die() {
-       echo "${ME}: $1"
-       exit 1
-}
-
-is_in() {
-       local i
-       for i in $2
-       do
-               [ "$1" = "$i" ] && return 0
-       done
-       return 1
-}
-
-select_subset() {
-       local unknown i j
-       unknown=
-       RESULT=
-       for i in $1
-       do
-               is_in $i "$2" || unknown="$unknown $i"
-       done
-       if [ -n "$unknown" ]
-       then
-               RESULT=$unknown
-               return 1
-       else
-               for j in $2
-               do
-                       is_in $j "$1" && RESULT="$RESULT $j"
-               done
-               return 0
-       fi
-}
-
-# check command
-
-case ${COMMAND}
-in
-       start|stop|restart)
-               ;;
-       watchrestart)
-               if [ -n "$ARG_DAEMONS" ]
-               then
-                       echo "${ME}: watchrestart mode is only for use by watchquagga"
-                       exit 2
-               fi
-               ;;
-       *)
-               usage
-               ;;
-esac
-
-# select daemons to start
-
-case ${COMMAND}
-in
-       start|restart|watchrestart)
-               START_DAEMONS=
-               for d in ${DAEMONS_STARTSEQ}
-               do
-                       [ -x "${BINDIR}/${d}" -a -f "${CONFDIR}/${d}.conf" ] \
-                       && START_DAEMONS="${START_DAEMONS}${d} "
-               done
-               WATCHQUAGGA_DAEMONS=${START_DAEMONS}
-               if is_in watchquagga "${DAEMONS_STARTSEQ}"
-               then
-                       START_DAEMONS="${START_DAEMONS} watchquagga"
-               fi
-               if [ -n "${ARG_DAEMONS}" ]
-               then
-                       if select_subset "${ARG_DAEMONS}" "${DAEMONS}"
-                       then
-                               if select_subset "${ARG_DAEMONS}" "${START_DAEMONS}"
-                               then
-                                       START_DAEMONS=${RESULT}
-                               else
-                                       die "these daemons are not startable:${RESULT}."
-                               fi
-                       else
-                               die "unknown daemons:${RESULT}; choose from: ${DAEMONS}."
-                       fi
-               fi
-               ;;
-esac
-
-# select daemons to stop
-
-case ${COMMAND}
-in
-       stop|restart|watchrestart)
-               STOP_DAEMONS=${DAEMONS_STOPSEQ}
-               if [ -n "${ARG_DAEMONS}" ]
-               then
-                       if select_subset "${ARG_DAEMONS}" "${STOP_DAEMONS}"
-                       then
-                               STOP_DAEMONS=${RESULT}
-                       else
-                               die "unknown daemons:${RESULT}; choose from: ${DAEMONS}."
-                       fi
-               fi
-               stop_daemons=
-               for d in ${STOP_DAEMONS}
-               do
-                       pidfile=${STATEDIR}/${d}.pid
-                       if [ -f "${pidfile}" -o -n "$(pidof ${d})" ]
-                       then
-                               stop_daemons="${stop_daemons}${d} "
-                       elif [ -n "${ARG_DAEMONS}" ]
-                       then
-                               echo "${ME}: found no ${d} process running."
-                       fi
-               done
-               STOP_DAEMONS=${stop_daemons}
-               ;;
-esac
-
-# stop daemons
-
-for d in $STOP_DAEMONS
-do
-       echo -n "${ME}: Stopping ${d} ... "
-       pidfile=${STATEDIR}/${d}.pid
-       if [ -f "${pidfile}" ]
-       then
-               file_pid=$(cat ${pidfile})
-               if [ -z "${file_pid}" ]
-               then
-                       echo -n "no pid file entry found ... "
-               fi
-       else
-               file_pid=
-               echo -n "no pid file found ... "
-       fi
-       proc_pid=$(pidof ${d})
-       if [ -z "${proc_pid}" ]
-       then
-               echo -n "found no ${d} process running ... "
-       else
-               count=0
-               notinpidfile=
-               for p in ${proc_pid}
-               do
-                       count=$((${count}+1))
-                       if kill ${p}
-                       then
-                               echo -n "killed ${p} ... "
-                       else
-                               echo -n "failed to kill ${p} ... "
-                       fi
-                       [ "${p}" = "${file_pid}" ] \
-                       || notinpidfile="${notinpidfile} ${p}"
-               done
-               [ ${count} -le 1 ] \
-               || echo -n "WARNING: ${count} ${d} processes were found running ... "
-               for n in ${notinpidfile}
-               do
-                       echo -n "WARNING: process ${n} was not in pid file ... "
-               done
-       fi
-       count=0
-       survivors=$(pidof ${d})
-       while [ -n "${survivors}" ]
-       do
-               sleep 1
-               count=$((${count}+1))
-               survivors=$(pidof ${d})
-               [ -z "${survivors}" -o ${count} -gt 5 ] && break
-               for p in ${survivors}
-               do
-                       sleep 1
-                       echo -n "${p} "
-                       kill ${p}
-               done
-       done
-       survivors=$(pidof ${d})
-       [ -n "${survivors}" ] && \
-       if kill -KILL ${survivors}
-       then
-               echo -n "KILLed ${survivors} ... "
-       else
-               echo -n "failed to KILL ${survivors} ... "
-       fi
-       sleep 1
-       survivors=$(pidof ${d})
-       if [ -z "${survivors}" ]
-       then
-               echo -n "done."
-               if [ -f "${pidfile}" ]
-               then
-                       rm -f ${pidfile} \
-                       || echo -n " Failed to remove pidfile."
-               fi
-       else
-               echo -n "failed to stop ${survivors} - giving up."
-               if [ "${survivors}" != "${file_pid}" ]
-               then
-                       if echo "${survivors}" > ${pidfile}
-                       then
-                               chown ${RUNUSER}:${RUNGROUP} ${pidfile}
-                               echo -n " Wrote ${survivors} to pidfile."
-                       else
-                               echo -n " Failed to write ${survivors} to pidfile."
-                       fi
-               fi
-       fi
-       echo
-done
-
-# start daemons
-
-if [ -n "$START_DAEMONS" ]
-then
-       [ -d ${CONFDIR} ] \
-       || quit "${ME}: no config directory ${CONFDIR} - exiting."
-       chown -R ${RUNUSER}:${RUNGROUP} ${CONFDIR}
-       [ -d ${STATEDIR} ] || mkdir -p ${STATEDIR} \
-       || die "${ME}: could not create state directory ${STATEDIR} - exiting."
-       chown -R ${RUNUSER}:${RUNGROUP} ${STATEDIR}
-
-       for d in $START_DAEMONS
-       do
-               echo -n "${ME}: Starting ${d} ... "
-               proc_pid=$(pidof ${d})
-               pidfile=${STATEDIR}/${d}.pid
-               file_pid=
-               if [ -f "${pidfile}" ]
-               then
-                       file_pid=$(cat ${pidfile})
-                       if [ -n "${file_pid}" ]
-                       then
-                               echo -n "found old pid file entry ${file_pid} ... "
-                       fi
-               fi
-               if [ -n "${proc_pid}" ]
-               then
-                       echo -n "found ${d} running (${proc_pid}) - skipping ${d}."
-                       if [ "${proc_pid}" != "${file_pid}" ]
-                       then
-                               if echo "${proc_pid}" > ${pidfile}
-                               then
-                                       chown ${RUNUSER}:${RUNGROUP} ${pidfile}
-                                       echo -n " Wrote ${proc_pid} to pidfile."
-                               else
-                                       echo -n " Failed to write ${proc_pid} to pidfile."
-                               fi
-                       fi
-               elif rm -f "${pidfile}"
-               then
-                       if [ "${d}" = "watchquagga" ]
-                       then
-                               "${BINDIR}/${d}" \
-                                       ${WATCHQUAGGA_FLAGS} \
-                                       "${WATCHQUAGGA_CMD}" \
-                                       ${WATCHQUAGGA_DAEMONS}
-                               status=$?
-                       else
-                               "${BINDIR}/${d}" ${DAEMON_FLAGS}
-                               status=$?
-                       fi
-                       if [ $status -eq 0 ]
-                       then
-                               echo -n "done."
-                       else
-                               echo -n "failed."
-                       fi
-               else
-                       echo -n " failed to remove pidfile."
-               fi
-               echo
-       done
-fi
diff --git a/quagga/files/quagga.conf b/quagga/files/quagga.conf
deleted file mode 100644 (file)
index fb7a54e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-password zebra
-!
-access-list vty permit 127.0.0.0/8
-access-list vty deny any
-!
-line vty
- access-class vty
diff --git a/quagga/files/quagga.init b/quagga/files/quagga.init
deleted file mode 100644 (file)
index 21fbf2c..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2006 OpenWrt.org
-
-START=60
-start() {
-       /usr/sbin/quagga.init start
-}
-
-stop() {
-       /usr/sbin/quagga.init stop
-}
diff --git a/quagga/patches/140-holdtimer-set.patch b/quagga/patches/140-holdtimer-set.patch
deleted file mode 100644 (file)
index 6d1c1ea..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
---- a/bgpd/bgp_network.c
-+++ b/bgpd/bgp_network.c
-@@ -257,8 +257,7 @@ bgp_accept (struct thread *thread)
-     peer->fd = bgp_sock;
-     peer->status = Active;
-     peer->local_id = peer1->local_id;
--    peer->v_holdtime = peer1->v_holdtime;
--    peer->v_keepalive = peer1->v_keepalive;
-+    peer->v_holdtime = BGP_LARGE_HOLDTIME;
-     /* Make peer's address string. */
-     sockunion2str (&su, buf, SU_ADDRSTRLEN);
---- a/bgpd/bgpd.h
-+++ b/bgpd/bgpd.h
-@@ -752,6 +752,7 @@ struct bgp_nlri
- /* BGP timers default value.  */
- #define BGP_INIT_START_TIMER                     1
-+#define BGP_LARGE_HOLDTIME                     240
- #define BGP_DEFAULT_HOLDTIME                   180
- #define BGP_DEFAULT_KEEPALIVE                   60 
- #define BGP_DEFAULT_EBGP_ROUTEADV               30
diff --git a/quagga/patches/150-no-cross-fs-link.patch b/quagga/patches/150-no-cross-fs-link.patch
deleted file mode 100644 (file)
index 8445103..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
---- a/lib/command.c
-+++ b/lib/command.c
-@@ -3198,6 +3198,13 @@ DEFUN (config_write_file,
-                VTY_NEWLINE);
-         goto finished;
-       }
-+
-+#if 0
-+  /* This code fails on UNION MOUNTs and similar filesystems if the
-+   * config file is still on the RO layer. Hardlinks across layers
-+   * will not work and cause quagga to fail saving the configuration...
-+   * should use rename() to move files around...
-+   */
-   if (link (config_file, config_file_sav) != 0)
-     {
-       vty_out (vty, "Can't backup old configuration file %s.%s", config_file_sav,
-@@ -3211,7 +3218,23 @@ DEFUN (config_write_file,
-               VTY_NEWLINE);
-       goto finished;
-     }
-+#else
-+  /* And this is the code that hopefully does work */
-+  if (rename (config_file, config_file_sav) != 0)
-+    {
-+      vty_out (vty, "Can't backup old configuration file %s.%s", config_file_sav,
-+              VTY_NEWLINE);
-+      goto finished;
-+    }
-+  sync ();
-+#endif
-+
-+#if 0
-+  /* same here. Please no cross-filesystem hardlinks... */
-   if (link (config_file_tmp, config_file) != 0)
-+#else
-+  if (rename (config_file_tmp, config_file) != 0)
-+#endif
-     {
-       vty_out (vty, "Can't save configuration file %s.%s", config_file,
-              VTY_NEWLINE);
diff --git a/quagga/patches/170-use-supported-pagers.patch b/quagga/patches/170-use-supported-pagers.patch
deleted file mode 100644 (file)
index ad4c4db..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
---- a/vtysh/vtysh.c
-+++ b/vtysh/vtysh.c
-@@ -251,7 +251,7 @@ vtysh_pager_init (void)
-   if (pager_defined)
-     vtysh_pager_name = strdup (pager_defined);
-   else
--    vtysh_pager_name = strdup ("more");
-+    vtysh_pager_name = strdup ("cat");
- }
- /* Command execution over the vty interface. */
-@@ -2047,7 +2047,7 @@ DEFUN (vtysh_terminal_length,
- {
-   int lines;
-   char *endptr = NULL;
--  char default_pager[10];
-+  char default_pager[12];
-   lines = strtol (argv[0], &endptr, 10);
-   if (lines < 0 || lines > 512 || *endptr != '\0')
-@@ -2064,7 +2064,7 @@ DEFUN (vtysh_terminal_length,
-   if (lines != 0)
-     {
--      snprintf(default_pager, 10, "more -%i", lines);
-+      snprintf(default_pager, 12, "head -n %i", lines);
-       vtysh_pager_name = strdup (default_pager);
-     }
diff --git a/smcroute/Makefile b/smcroute/Makefile
deleted file mode 100644 (file)
index e65c1de..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-# Copyright (C) 2014 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=smcroute
-PKG_VERSION:=2.0.0
-PKG_RELEASE:=2
-PKG_LICENSE:=GPL-2.0+
-
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_SOURCE_URL:=https://github.com/troglobit/smcroute/releases/download/$(PKG_VERSION)
-PKG_MD5SUM:=cbf478e52ab9ae411adca41b9d22f68a
-
-PKG_FIXUP:=autoreconf
-
-include $(INCLUDE_DIR)/package.mk
-
-define Package/smcroute
-       SECTION:=net
-       CATEGORY:=Network
-       SUBMENU:=Routing and Redirection
-       TITLE:=Static Multicast Routing Daemon
-       URL:=http://troglobit.com/smcroute.html
-       MAINTAINER:=Leonardo Brondani Schenkel <leonardo@schenkel.net>
-endef
-
-define Package/smcroute/description
-       SMCRoute is a command line tool to manipulate the multicast routes of the Linux kernel.
-endef
-
-ifeq ($(HOST_OS),FreeBSD)
-       TARGET_CFLAGS += -fno-builtin-log
-       TARGET_LDFLAGS += -fno-builtin-log
-endif
-
-define Build/Compile
-       $(MAKE) CC="$(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS)" -C $(PKG_BUILD_DIR) all
-endef
-
-define Package/smcroute/conffiles
-       /etc/smcroute.conf
-endef
-
-define Package/smcroute/install
-       $(INSTALL_DIR) $(1)/usr/sbin
-       $(INSTALL_DIR) $(1)/usr/bin
-       $(INSTALL_DIR) $(1)/etc/init.d/
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/smcroute $(1)/usr/sbin/
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/mcsender $(1)/usr/bin/
-       $(INSTALL_CONF) $(PKG_BUILD_DIR)/smcroute.conf $(1)/etc
-       $(INSTALL_BIN) ./files/smcroute.init $(1)/etc/init.d/smcroute
-endef
-
-$(eval $(call BuildPackage,smcroute))
diff --git a/smcroute/files/smcroute.init b/smcroute/files/smcroute.init
deleted file mode 100644 (file)
index 3e36272..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2006-2010 OpenWrt.org
-START=50
-
-start() {
-       smcroute -d
-}
-
-stop() {
-       smcroute -k
-}
diff --git a/smcroute/patches/001-Make-output-of-build-id-optional.patch b/smcroute/patches/001-Make-output-of-build-id-optional.patch
deleted file mode 100644 (file)
index bffecc9..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-Author: Micha Lenk <micha@lenk.info>
-Date: Thu, 7 May 2015 21:54:31 +0200
-Description: Make output of build id optional
- With free software, anyone can inspect the source code for malicious flaws.
- But the software is often provided as binary packages to its users. The idea
- of “deterministic” or “reproducible” builds is to empower anyone to verify
- that no flaws have been introduced during the build process by reproducing
- byte-for-byte identical binary packages from a given source.  See also:
- https://wiki.debian.org/ReproducibleBuilds
- .
- Prior to this change a timestamp generated at build time is included in the
- output of 'smcroute -v'. As a result the binary is unreproducible.
- .
- With this change, users that still want 'smcroute -v' to include a build id
- can run './configure --enable-build-id' to get the build id back (or even
- specify a custom build id).
-Origin: upstream, https://github.com/troglobit/smcroute/commit/73f6f14907f709e40689216291621ad26cd22ecd
-Bug-Debian: https://bugs.debian.org/784694
-Last-Update: 2017-08-08
-
----
- configure.ac | 9 ++++++++-
- smcroute.c   | 6 +++++-
- 2 files changed, 13 insertions(+), 2 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index 556d958..eb4a291 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -181,7 +181,14 @@ AC_COMPILE_IFELSE(
-   [AC_MSG_RESULT(no)])
- # Add build number to config.h.in
--AC_DEFINE_UNQUOTED([BUILD], "`date +%y%m%d`", [Build number, abbreviated date.])
-+AC_ARG_ENABLE([build-id],
-+  [AS_HELP_STRING([--enable-build-id@<:@=ID@:>@],
-+              [show build id in output of 'smcroute -v'])],
-+  [AS_IF([test "x$enableval" = "xyes" ],
-+    [build_id=`date +%y%m%d`],
-+    [build_id=$enableval])
-+   AC_DEFINE_UNQUOTED([BUILD], "$build_id", [Build number, abbreviated date.])])
-+
- # Checks for library functions.
- AC_FUNC_FORK
-diff --git a/smcroute.c b/smcroute.c
-index 7bd3c72..0287458 100644
---- a/smcroute.c
-+++ b/smcroute.c
-@@ -46,7 +46,11 @@ static const char *conf_file = SMCROUTE_SYSTEM_CONF;
- extern char *__progname;
- static const char version_info[] =
--      "SMCRoute version " PACKAGE_VERSION " build " BUILD "\n";
-+      "SMCRoute version " PACKAGE_VERSION
-+#ifdef BUILD
-+        " build " BUILD
-+#endif
-+        "\n";
- static const char usage_info[] =
-       "Usage: smcroute [OPTIONS]... [ARGS]...\n"
--- 
-2.11.0
-
index af58f5e00390360d53d5dc08446bae7478d9d1cc..ef17a516eda046bac3d4eacd06aec196b5c9a6f5 100644 (file)
@@ -8,21 +8,18 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=vis
+PKG_RELEASE:=9
 
 PKG_SOURCE_PROTO:=git
+PKG_SOURCE_DATE:=2013-04-07
+PKG_SOURCE_VERSION:=7710cce42e8d63ea114056a4a140835d4a452933
 PKG_SOURCE_URL:=https://git.open-mesh.org/vis.git
-PKG_REV:=e141311c6a4fc824efbad536c137ed279905d825
-PKG_VERSION:=1440
-PKG_RELEASE:=0
-PKG_LICENSE:=GPL-2.0
+PKG_MIRROR_HASH:=2544df816f9294e192cd6bb3592695416796fc6b254d182f1f124e686833f50d
 
-PKG_SOURCE_VERSION:=$(PKG_REV)
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
-PKG_MIRROR_HASH:=fd4b337a56993eec9a03ad8e7918bccc7691aa8b2e5ab6dd7863350f07503285
-PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
+PKG_MAINTAINER:=Corinna "Elektra" Aichele <onelektra@gmx.net>
+PKG_LICENSE:=GPL-2.0-only
 
-PKG_EXTRA_CFLAGS=-DDEBUG_MALLOC -DMEMORY_USAGE -DPROFILE_DATA -DREVISION_VERSION=\"\ rv$(PKG_REV)\" -D_GNU_SOURCE
+PKG_BUILD_PARALLEL:=1
 
 include $(INCLUDE_DIR)/package.mk
 
@@ -33,36 +30,21 @@ define Package/vis
   DEPENDS:=+libpthread
   TITLE:=visualization server for B.A.T.M.A.N. layer 3
   URL:=https://www.open-mesh.org/
-  MAINTAINER:=Corinna "Elektra" Aichele <onelektra@gmx.net>
 endef
 
 define Package/vis/description
 visualization server for B.A.T.M.A.N. layer 3
 endef
 
-MAKE_VIS_ARGS += \
-       EXTRA_CFLAGS='$(TARGET_CFLAGS) $(PKG_EXTRA_CFLAGS)' \
-       CCFLAGS="$(TARGET_CFLAGS)" \
-       OFLAGS="$(TARGET_CFLAGS)" \
+MAKE_FLAGS += \
+       EXTRA_CFLAGS='-DDEBUG_MALLOC -DMEMORY_USAGE -DPROFILE_DATA -DREVISION_VERSION=\"\ rv$(PKG_REV)\" -D_GNU_SOURCE' \
        REVISION="$(PKG_REV)" \
        CC="$(TARGET_CC)" \
-       NODEBUG=1 \
-       UNAME="Linux" \
-       INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
-       STRIP="/bin/true" \
-       vis install
-
-
-define Build/Configure
-endef
-
-define Build/Compile
-       $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_VIS_ARGS)
-endef
+       vis
 
 define Package/vis/install
        $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/vis $(1)/usr/sbin/
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/vis $(1)/usr/sbin/
        $(INSTALL_BIN) ./files/etc/init.d/vis $(1)/etc/init.d
        $(INSTALL_DATA) ./files/etc/config/vis $(1)/etc/config
 endef
index ef18eb718c7902249c7ea52a3d2adb73974a564a..8c19f135e2e7c9abce214db1182ecbbf257e7de7 100644 (file)
@@ -1,19 +1,36 @@
 #!/bin/sh /etc/rc.common
 START=90
+USE_PROCD=1
 
-start () {
-       interface=$(uci get vis.general.interface)
+vis_start() {
+       local config="$1"
+       local interface
+
+       [ "$config" = "general" ] || return 1
+
+       config_get interface "$config" interface
        if [ "$interface" = "" ]; then
                echo $1 Error, you must specify at least a network interface
-               exit
+               return 1
        fi
-       vis_args=$interface
 
-       vis $vis_args >/dev/null 2>&1
+       procd_open_instance "${config}"
+       procd_set_param command /usr/sbin/vis
+       procd_append_param command -D
+       procd_append_param command ${interface}
+       procd_set_param netdev $interface
+       procd_close_instance
 }
 
-stop () {
-        killall vis
+start_service() {
+       config_load "vis"
+       config_foreach vis_start vis
 }
 
-        
+service_triggers() {
+       procd_add_reload_trigger "vis"
+
+       procd_open_trigger
+       procd_add_raw_trigger "interface.*" 1000 /etc/init.d/vis reload
+       procd_close_trigger
+}
diff --git a/vis/patches/0001-Allow-one-to-disable-forking-to-background-in-debug_.patch b/vis/patches/0001-Allow-one-to-disable-forking-to-background-in-debug_.patch
new file mode 100644 (file)
index 0000000..066892b
--- /dev/null
@@ -0,0 +1,56 @@
+From: Sven Eckelmann <sven@narfation.org>
+Date: Sun, 1 Dec 2013 14:39:00 +0100
+Subject: Allow one to disable forking to background in debug_mode 0
+
+---
+ posix/init.c | 19 ++++++++++++++-----
+ 1 file changed, 14 insertions(+), 5 deletions(-)
+
+--- a/vis.c
++++ b/vis.c
+@@ -58,6 +58,7 @@ buffer_t *fillme = NULL;
+ static int8_t stop;
+ uint8_t debug_level = 0;
++static int no_detach = 0;
+ formats selected_formats = dot_draw;
+@@ -718,6 +719,7 @@ void print_usage() {
+       printf( "Usage: vis <interface(s)> \n" );
+       printf( "\t-j output mesh topology as json on port %d\n", JSON_PORT );
+       printf( "\t-d debug level\n" );
++      printf( "\t-D run in foreground\n" );
+       printf( "\t-h help\n" );
+       printf( "\t-v Version\n\n" );
+       printf( "Olsrs3d / Meshs3d is an application to visualize a mesh network.\nIt is a part of s3d, have a look at s3d.sourceforge.net\n\n" );
+@@ -738,7 +740,7 @@ int main( int argc, char **argv ) {
+       fd_set wait_sockets, tmp_wait_sockets;
+-      while ( ( optchar = getopt ( argc, argv, "jd:hv" ) ) != -1 ) {
++      while ( ( optchar = getopt ( argc, argv, "jd:hvD" ) ) != -1 ) {
+               switch( optchar ) {
+@@ -773,6 +775,11 @@ int main( int argc, char **argv ) {
+                               selected_formats |= json;
+                               found_args++;
+                               break;
++ 
++                      case 'D':
++                              no_detach = 1;
++                              found_args++;
++                              break;
+                       default:
+                               print_usage();
+@@ -891,7 +898,7 @@ int main( int argc, char **argv ) {
+       /* daemonize */
+-      if ( debug_level == 0 ) {
++      if ( debug_level == 0 && !no_detach) {
+               if ( my_daemon() < 0 )
+                       exit_error( "Error - can't fork to background: %s\n", strerror(errno) );