diff --git a/README.md b/README.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f8ba65714c5af43c0597b09f029af1e7ff55f5f5 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,197 @@ + +This document describes the `hostmngr` utility daemon that can detect and show +host devices in the network. + +The term 'host devices' here refer to devices that must contain atleast one +network interface capable of being configured with IPv4/IPv6 address either via +DHCP or Static method. + +Examples of host devices - desktop/laptop, router/AP, IP-camera, smart-TV etc. + +## Build and build config ## + +Run 'make' from within the "src" directory to build the 'hostmngr' utility +daemon. See **Dependencies** section for the prerequisites. + +For install, run 'make install'. This will install 'hostmngr' to the default +install path at '/usr/sbin'. + +Following config options may be passed during build to enable/disable certain +features or change the values from their default - + +Enable and maintain history of host devices: + +`CONFIG_HOSTMNGR_HOSTS_HISTORY=y` + +Configure hostmngr to use libwifi APIs when target device has WiFi: + +`HOSTMNGR_PLATFORM_HAS_WIFI=y` + + +## Configuration ## + +The default configuration file is '/etc/config/hosts', which keeps the run-time +configuration for hostmngr. + +Sample '/etc/config/hosts' file - + +````bash +config global 'global' + option enabled '1' + option history '1' + option history_file '/etc/hosts_history.json' + option history_timeout '604800' + +config interface + list ifname 'br-lan' + +```` +The format of the config file is UCI compliant. + + +Section | Name | Type | Required | Default | Description +--------|------|------|----------|---------|------------- +global | - | - | - | - | - | + " |enabled | boolean | no | 1 | When set to 0, disables hostmngr. The daemon will however keep running, and can be re-enabled by setting to 1. | + " |history| boolean | no | 1 | When set to 0, disables history. | + " |history_file | string | no | '/etc/hosts_history.json' | Specifies history file name. History records are stored in this file in JSON format. | + " |history_timeout | integer | no | 604800 | Specifies the duration in seconds a _non-live_ history record will be kept in history. | +interface | - | - | - | - | - | + " | ifname | string | no | br-lan | Interface name over which hostmngr runs. Default is 'br-lan', which is the bridge interface facing the LAN side. This means hostmngr detects host devices in the LAN side. | + +----------- + +## CLI (through UBUS) ## + +The hostmngr daemon provides UBUS methods through which user or any service +can interact with for fetching status and stats of the host devices in the network. + +````bash +root@iopsys:~# ubus -v list hosts +'hosts' @1000ffff + "show":{} + "history":{} + "debug":{} +```` + +Sample output of the 'ubus call hosts show' invocation - + +````bash +root@eagle-44d43771baa0:~# ubus call hosts show +{ + "hosts": [ + { + "macaddress": "00:02:02:aa:bb:cc", + "hostname": "acx-laptop", + "ipv4addr": "192.168.1.160", + "address_source": "DHCP", + "lease_time_remaining": 3369, + "iswifi": false, + "is1905": false, + "state": "reachable", + "num_tcp": 0, + "num_udp": 10, + "interface": "eth3", + "ipv4_address": [ + { + "ip": "192.168.1.160" + } + ], + "ipv6_address": [ + + ], + "wan_stats": { + "tx_packets": 70, + "tx_bytes": 7323, + "rx_packets": 61, + "rx_bytes": 5860 + } + } + ] +} +```` + +Sample output of the 'ubus call hosts history' - + +````bash +root@eagle-44d43771baa0:~# ubus call hosts history +{ + "history": [ + { + "idx": 4, + "macaddress": "00:02:02:aa:bb:cc", + "hostname": "acx-laptop", + "first_seen": "2023-05-30T21:30:38", + "last_seen": "2023-05-30T21:31:57", + "alive": true, + "iswifi": false, + "wan_stats": { + "tx_packets": 0, + "tx_bytes": 0, + "rx_packets": 0, + "rx_bytes": 0 + } + } + ] +} +```` + +The value of **'alive'** changes to **false** when the host device is no longer +present in the network. A _non-live_ host device is one that is not present in the +network at that time. + +## Dependencies ## + +'hostmngr' requires the following components for build and runtime dependencies: + +| Dependency | Link | License | +| ----------------- | ---------------------------------------------------------------- | -------------- | +| libeasy | https://dev.iopsys.eu/hal/libeasy.git | LGPL 2.1 | +| libwifi | https://dev.iopsys.eu/hal/libwifi.git | LGPL 2.1 | +| libuci | https://git.openwrt.org/project/uci.git | LGPL 2.1 | +| libubox | https://git.openwrt.org/project/libubox.git | ISC | +| libblobmsg_json | https://git.openwrt.org/project/libubox.git | ISC | +| libubus | https://git.openwrt.org/project/ubus.git | LGPL 2.1 | +| libjson-c | https://s3.amazonaws.com/json-c_releases | MIT | +| libnl-3 | https://github.com/thom311/libnl.git | LGPLv2.1 | +| libnl-genl-3 | https://github.com/thom311/libnl.git | LGPLv2.1 | +| libnl-route-3 | https://github.com/thom311/libnl.git | LGPLv2.1 | +| libnetfilter_conntrack| https://git.netfilter.org/libnetfilter_conntrack | GPLv2+ | +| libnfnetlink | https://git.netfilter.org/libnfnetlink | GPLv2+ | +| libmnl | https://git.netfilter.org/libmnl | LGPLv2.1 | + + + +## Code structure ## + +The source code is within the `src` directory. + +Files within the `src` directory - + +*topology.h* - defines hosts and network topology related data structures. + +*hostmngr.c* - implements the hostmngr daemon. + +*config.c,h* - for configuration related structures and functions. + +*neigh.c,h* - for managing the connected host devices. + +*netlink.c* - implements rtnetlink events handling. + +*stats.c* - for IPv4/IPv6 connection statistics of the host devices. + +*history.c* - includes functions for storing and loading history to/from history file. + +*ubus.c* - implements UBUS objects and methods provided by hostmngr. + +*wifi_api.c,h* - implements WiFi functions for target having HAS_WIFI=y. + +*main.c* - includes the main() entry point for hostmngr daemon. + +*debug.c,h* - contain functions used for debugging and logging. + +*util.c,h +timer.c,h +timer_impl.h +lookup3_hash.c,h* - these files implement utility and helper functions. +