Italiano English
Modifica History Actions

netring

The Problem

Actually each community network do a lot of duplicated work to develop/maintain/manage their monitoring/managing systems

The Idea

Join forces to develop a common code base for ours map servers.

Very different community networks have, many differents needs, but very tiny core of common needs is still present.

Step 1

Find What is really common, for example

Can we assume on every community network:

Each node have one or more device? Yes core for me

Each device can belong just to one node? Yes core for me

Each device have one or more neighbor ( that can belong to the same or to a different node ) attached by a link? Yes core for me

Each link can be characterized by different values ( for example in Pisa we have TQ, but in Rome they have dBm and ETX )so here i think we can assume as common part that the link may exist or not and do "quality measurement" an extension <- Not core for me

and so on

so we can define a set of property i suggest in a json like sintax that all node and devices have so for example

node.status={active, potencial}

node.readeableName="Pisa::Eigenlab"

node.slug="eigenlab"

.

.

.

device.father="" <- node sluf or id or something like that goes here

device.reachMeAt="" <- something that permit to reach the device, can be for example one or more of eigenlab.n.ninux.org, 2001:1418:1a9:eeab:0:15:6dfd:71ce, 00:15:6d:fc:71:ce

device.neigh="" <- things like 00:15:6d:7c:09:9e, pacinotti.n.ninux.org, 2001:1418:1a9:eeab:0:15:6d7d:99e

and so on

Step 2

Wow it is just the core but there are already a lot of information i have to put all of this manually :( ? No we have to do that more automatic possible, so we should put on netRing just device.reachMeAt more an userid+pass or an ssh authorized key or stuf like that so netRing can suck by himself all that stuff

But how netRing know how to do that ?? Go to step 4 if you cannot wait ;)

Step 3

Each community can define one or more extension property that some of their nodes/devices may have for example someone can be interested in what clients are connected to their node or how much traffic the node routed

Step 4

We have to add supply a "template file" that explain to netRing ( obviously nerRing have to understand that language ) how to do that and it could be somethings like that

<template name="UBNT_PICO_OWRT_EGN" description="Picostation M* OpenWrt + eigenNet template">
        <property name="reachMeAt" coreId="device.reachMeAt" get="manual" />
        <property name="user" coreId="device.auth.user" get="manual" />
        <property name="user" extId="device.auth.passwd" get="manual" />
        <property name="user" extId="device.auth.sshAuthKey" get="manual" />
        <property name="accept_clients" extId="uci.eigennet.network.accept_clients">
                <description>
                        1 if the device accept clients.
                        0 if the device is a pure node ( doesn't accept ethernet and wireless clients )
                </description>
                <method name="get">
                        <?bash
                                #!/bin/bash
                                ssh_shot ${device.reachMeAt} '
                                . /etc/functions.sh
                                config_load eigennet
                                local accept_clients
                                config_get_bool accept_clients network "accept_clients" 1
                                echo $accept_clients
                                '
                        ?>
                </method>
                <method name="set">
                        <?bash
                                #!/bin/bash
                                ssh_shot ${device.reachMeAt} "uci set eigennet.network.accept_clients=$1"
                        ?>
                </method>
        </property>
        <property name="wifi_clients" extId="uci.eigennet.network.wifi_clients">
                <description>
                        1 if the device is accepting wireless clients
                        0 otherwise
                </description>
                <method name="get">
                        <?bash
                                #!/bin/bash
                                ssh_shot ${device.reachMeAt} '
                                . /etc/functions.sh
                                config_load eigennet
                                local wifi_clients
                                config_get_bool wifi_clients network "wifi_clients" 1
                                echo $wifi_clients
                                '
                        ?>
                </method>
                <method name="set">
                        <?bash
                                #!/bin/bash
                                ssh_shot ${device.reachMeAt} "uci set eigennet.network.wifi_clients=$1"
                        ?>
                </method>
        </property>
        <property name="meshSSID" extId="uci.eigennet.wireless.meshSSID">
                <description>
                        Broadcasted SSID on wireless mesh interfaces
                </description>
                <method name="get">
                        <?bash
                                #!/bin/bash
                                ssh_shot ${device.reachMeAt} '
                                . /etc/functions.sh
                                config_load eigennet
                                local meshSSID
                                config_get meshSSID wireless "meshSSID"
                                echo $meshSSID
                                '
                        ?>
                </method>
                <method name="set">
                        <?bash
                                #!/bin/bash
                                ssh_shot ${device.reachMeAt} "uci set eigennet.wireless.meshSSID=$1"
                        ?>
                </method>
        </property>
        <property name="meshChannel" extId="uci.eigennet.wireless.meshChannel">
                <description>
                        Wireless mesh channel
                </description>
                <method name="get">
                        <?bash
                                #!/bin/bash
                                ssh_shot ${device.reachMeAt} '
                                . /etc/functions.sh
                                config_load eigennet
                                local meshChannel
                                config_get meshChannel wireless "meshChannel"
                                echo $meshChannel
                                '
                        ?>
                </method>
                <method name="set">
                        <?bash
                                #!/bin/bash
                                ssh_shot ${device.reachMeAt} "uci set eigennet.wireless.meshSSID=$1"
                        ?>
                </method>
        </property>
        <property name="clientsMacList" extId="batman-adv.tl">
                <method name="get">
                <?bash
                        #!/bin/bash
                        ssh_shot ${device.reachMeAt} "batctl tl" | tail -n +2 bat | grep --only-matching -i '[0-9A-F]\{2\}\(:[0-9A-F]\{2\}\)\{5\}'
                ?>
                </method>
        </property>
        <method name="apply">
                <?bash
                        #!/bin/bash
                        ssh_shot ${device.reachMeAt} "
                        cp -r /etc/config /etc/config.back
                        uci set eigennet.bootmode=4
                        /etc/init.d/eigennet restart"
                ?>
        </method>
        <method name="test">
                <method name="apply">
                <?bash
                        #!/bin/bash
                        ssh_shot ${device.reachMeAt} "
                        uci set eigennet.bootmode=1
                        /etc/init.d/eigennet restart"
                ?>
        </method>
</template>