diff --git a/owm/Makefile b/owm/Makefile new file mode 100644 index 0000000..169f5b7 --- /dev/null +++ b/owm/Makefile @@ -0,0 +1,57 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=owm +PKG_VERSION:=1 +PKG_RELEASE:=$(AUTORELEASE) + +PKG_MAINTAINER:=Nick Hainke +PKG_LICENSE:=GPL-2.0-only + +include $(INCLUDE_DIR)/package.mk + +define Package/owm + SECTION:=utils + CATEGORY:=Utilities + TITLE:=Open Wireless Map Client + PKGARCH:=all +endef + +define Package/owm/description +Sends data to open wireless map. +endef + +define Package/owmd + SECTION:=utils + CATEGORY:=Utilities + TITLE:=Open Wireless Map Daemon + PKGARCH:=all + DEPENDS:=+owm +endef + +define Package/owmd/description +Send Periodically updates to Open Wireless Map +endef + +define Package/owmd/conffiles +/etc/config/owmd +endef + +define Build/Compile +endef + +define Package/owm/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) ./files/owm.sh $(1)/usr/bin/owm +endef + +define Package/owmd/install + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/owmd.init $(1)/etc/init.d/owmd + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) ./files/owmd.sh $(1)/usr/bin/owmd + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_DATA) ./files/owmd.config $(1)/etc/config/owmd +endef + +$(eval $(call BuildPackage,owm)) +$(eval $(call BuildPackage,owmd)) diff --git a/owm/files/owm.sh b/owm/files/owm.sh new file mode 100644 index 0000000..aeb3911 --- /dev/null +++ b/owm/files/owm.sh @@ -0,0 +1,323 @@ +#!/bin/sh + +. /lib/functions.sh +. /usr/share/libubox/jshn.sh + +OWM_API_VER="1.0" + +printhelp() { + printf "owm.sh - Tool for registering routers at openwifimap.net\n +Options: +\t--help|-h:\tprint this text + +\t--dry-run:\tcheck if owm.lua is working (does not paste any data). +\t\t\tWith this option you can check for errors in your +\t\t\tconfiguration and test the transmission of data to +\t\t\tthe map.\n\n +If invoked without any options, this tool will try to register +your node at the community-map and print the servers response. +To work correctly, this tool will need at least the geo-location +of the node (check correct execution with --dry-run). + +To override the server used by this script, set freifunk.community.owm_api. +" +} + +SERVER="$1" +shift +PORT="$1" +shift + +# save positional argument, as it would get overwritten otherwise. +CMD_1="$1" +if [ -n "$CMD_1" ] && [ "$CMD_1" != "--dry-run" ]; then + [ "$CMD_1" != "-h" ] && [ "$CMD_1" != "--help" ] && printf "Unrecognized argument %s.\n\n" "$CMD_1" + printhelp + exit 1 +fi + + +###################### +# # +# Collect OWM-Data # +# # +###################### + +# Draft for OLSRv2-Links currently not used +olsr2_links() { + json_select $2 + json_get_var localIP link_bindto + json_get_var remoteIP neighbor_originator + remotehost="$(nslookup $remoteIP | grep name | sed -e 's/.*name = \(.*\)/\1/' -e 's/\..*//')"".olsr" + # Maybe add some stuff here. + json_get_var linkQuality domain_metric_out_raw + #json_get_var linkQuality domain_metric_in_raw + json_get_var ifName "if" + json_select .. + olsr2links="$olsr2links$localIP $remoteIP $remotehost $linkQuality $ifName;" +} + +olsr4_links() { + json_select $2 + json_get_var localIP localIP + json_get_var remoteIP remoteIP + remotehost="$(nslookup $remoteIP | grep name | sed -e 's/.*name = \(.*\)/\1/')" + json_get_var linkQuality linkQuality + json_get_var olsrInterface olsrInterface + json_get_var ifName ifName + json_select .. + olsr4links="$olsr4links$localIP $remoteIP $remotehost $linkQuality $ifName;" +} + +olsr6_links() { + json_select $2 + json_get_var localIP localIP + json_get_var remoteIP remoteIP + remotehost="$(nslookup $remoteIP | grep name | sed -e 's/.*name = \(.*\)/\1/')" + json_get_var linkQuality linkQuality + json_get_var olsrInterface olsrInterface + json_get_var ifName ifName + json_select .. + olsr6links="$olsr6links$localIP $remoteIP $remotehost $linkQuality $ifName;" +} + +# This section is relevant for hopglass statistics feature (isUplink/isHotspot) +OLSRCONFIG=$(printf "/config" | nc localhost 9090) + +# collect nodes location +uci_load system +longitude="$(uci_get system @system[-1] longitude)" +latitude="$(uci_get system @system[-1] latitude)" + +# +# Stop execution if lat/lon is not set. +# +if [ -z "$latitude" ] || [ -z "$longitude" ]; then + printf "latitude/longitude is not set.\nStopping now...\n" + exit 2 +fi + + +# collect data on OLSR-links +json_load "$(printf "/nhdpinfo" json link | nc ::1 2009 2>/dev/null)" 2>/dev/null +olsr2links="" +if json_is_a link array;then + json_for_each_item olsr2_links link +fi +json_cleanup +json_load "$( printf "/links" | nc 127.0.0.1 9090 2>/dev/null)" 2>/dev/null +#json_get_var timeSinceStartup timeSinceStartup +olsr4links="" +if json_is_a links array;then + json_for_each_item olsr4_links links +fi +json_cleanup +json_load "$( printf "/links" | nc ::1 9090 2>/dev/null)" 2>/dev/null +#json_get_var timeSinceStartup timeSinceStartup +olsr6links="" +if json_is_a links array;then + json_for_each_item olsr6_links links +fi +json_cleanup + + +# collect board info +json_load "$(ubus call system board)" +json_get_var model model +json_get_var hostname hostname +json_get_var system system +json_select release +json_get_var revision revision +json_get_var distribution distribution +json_get_var version version +json_select .. +json_load "$(ubus call system info)" +json_get_var uptime uptime +json_get_values loads load + +# if file freifunk_release is available, override version and revision +if [ -f /etc/freifunk_release ]; then + . /etc/freifunk_release + distribution="$FREIFUNK_DISTRIB_ID" + version="$FREIFUNK_RELEASE" + revision="$FREIFUNK_REVISION" +fi + +# Get Sysload +sysload=$(cat /proc/loadavg) +load1=$(echo "$sysload" | cut -d' ' -f1) +load5=$(echo "$sysload" | cut -d' ' -f2) +load15=$(echo "$sysload" | cut -d' ' -f3) + +# Date when the firmware was build. +kernelString=$(cat /proc/version) +buildDate=$(echo $kernelString | cut -d'#' -f2 | cut -c 3-) +kernelVersion=$(echo $kernelString | cut -d' ' -f3) + +# contact information +uci_load freifunk +name="$(uci_get freifunk contact name)" +nick="$(uci_get freifunk contact nickname)" +mail="$(uci_get freifunk contact mail)" +phone="$(uci_get freifunk contact phone)" +homepage="$(uci_get freifunk contact homepage)" # whitespace-separated, with single quotes, if string contains whitspace +note="$(uci_get freifunk contact note)" + +# community info +ssid="$(uci_get freifunk community ssid)" +mesh_network="$(uci_get freifunk community mesh_network)" +uci_owm_apis="$(uci_get freifunk community owm_api)" +com_name="$(uci_get freifunk community name)" +com_homepage="$(uci_get freifunk community homepage)" +com_longitude="$(uci_get freifunk community longitude)" +com_latitude="$(uci_get freifunk community latitude)" +com_ssid_scheme=$(uci_get freifunk community ssid_scheme) +com_splash_network=$(uci_get freifunk community splash_network) +com_splash_prefix=$(uci_get freifunk community splash_prefix) + + + +########################### +# # +# Construct JSON-string # +# # +########################### + +json_init +json_add_object freifunk + + json_add_object contact + if [ -n "$name" ]; then json_add_string name "$name"; fi + if [ -n "$mail" ]; then json_add_string mail "$mail"; fi + if [ -n "$nick" ]; then json_add_string nickname "$nick"; fi + if [ -n "$phone" ]; then json_add_string phone "$phone"; fi + if [ -n "$homepage" ]; then json_add_string homepage "$homepage"; fi # was array of homepages + if [ -n "$note" ]; then json_add_string note "$note"; fi + json_close_object + + json_add_object community + json_add_string ssid "$ssid" + json_add_string mesh_network "$mesh_network" + json_add_string owm_api "$uci_owm_api" + json_add_string name "$com_name" + json_add_string homepage "$com_homepage" + json_add_string longitude "$com_longitude" + json_add_string latitude "$com_latitude" + json_add_string ssid_scheme "$com_ssid_scheme" + json_add_string splash_network "$com_splash_network" + json_add_int splash_prefix $com_splash_prefix + json_close_object +json_close_object + +# script infos +json_add_string type "node" +json_add_string script "owm.sh" +json_add_double api_rev $OWM_API_VER + +json_add_object system + json_add_array sysinfo + json_add_string "" "system is deprecated" + json_add_string "" "$model" + json_close_array + json_add_array + json_add_int "" $uptime + json_close_array + json_add_array loadavg + json_add_double "" $load5 + json_close_array +json_close_object + +# OLSR-Config +# That string gets substituted by the olsrd-config-string afterwards +json_add_object olsr + json_add_string ipv4Config '$OLSRCONFIG' +json_close_object + +json_add_array links + IFSORIG="$IFS" + IFS=';' + for i in ${olsr2links} ; do + IFS="$IFSORIG" + set -- $i + json_add_object + json_add_string sourceAddr6 "$1" + json_add_string destAddr6 "$2" + json_add_string id "$3" + json_add_double quality "$4" + json_close_object + IFS=';' + done + for i in ${olsr4links} ; do + IFS="$IFSORIG" + set -- $i + json_add_object + json_add_string sourceAddr4 "$1" + json_add_string destAddr4 "$2" + json_add_string id "$3" + json_add_double quality "$4" + json_close_object + IFS=';' + done + for i in ${olsr6links} ; do + IFS="$IFSORIG" + set -- $i + json_add_object + json_add_string sourceAddr6 "$1" + json_add_string destAddr6 "$2" + json_add_string id "$3" + json_add_double quality "$4" + json_close_object + IFS=';' + done + IFS="$IFSORIG" +json_close_array + +# General node info +# Bug in add_double function. Mostly it adds unwanted digits +# but they disappear, if we send stuff to the server +json_add_double latitude $latitude +json_add_double longitude $longitude +json_add_string hostname "$hostname" +json_add_int updateInterval 3600 +json_add_string hardware "$system" +json_add_object firmware + json_add_string name "$distribution $version" + json_add_string revision "$revision" + json_add_string kernelVersion "$kernelVersion" + json_add_string kernelBuildDate "$buildDate" +json_close_object + +json_close_object + +JSON_STRING=$(json_dump) +#insert json-string from OLSR and repair wrong syntax at string-borders (shell-quotes...) +JSON_STRING=$(echo "$JSON_STRING" | sed -e 's|$OLSRCONFIG|'"$OLSRCONFIG"'|; s|"{|{|; s|}"|}|' ) + +# just print data to stdout, if we have test-run. +if [ "$CMD_1" = "--dry-run" ]; then + printf "%s\n" "$JSON_STRING" + exit 0 +fi + + +################################ +# # +# Send data to openwifimap # +# # +################################ + +#echo $JSON_STRING +# get message lenght for request +LEN=$(echo $JSON_STRING | wc -m) + +MSG="\ +PUT /update_node/$hostname.olsr HTTP/1.1\r +User-Agent: nc/0.0.1\r +Host: api.openwifimap.net\r +Content-type: application/json\r +Content-length: $LEN\r +\r +$JSON_STRING\r\n" + +printf "$MSG" | nc "$SERVER" "$PORT" +printf "\n\n" diff --git a/owm/files/owmd.config b/owm/files/owmd.config new file mode 100644 index 0000000..c5f332d --- /dev/null +++ b/owm/files/owmd.config @@ -0,0 +1,5 @@ + +config owmd general + option interval '600' # Send every x seconds + option server 'owm.server.org' # Send to x server + option port '80' # Port for API server diff --git a/owm/files/owmd.init b/owm/files/owmd.init new file mode 100644 index 0000000..02e643c --- /dev/null +++ b/owm/files/owmd.init @@ -0,0 +1,18 @@ +#!/bin/sh /etc/rc.common + +USE_PROCD=1 +START=95 +STOP=01 + +start_service() { + procd_open_instance + procd_set_param command /usr/bin/owmd + procd_set_param stdout 0 + procd_set_param stderr 0 + procd_set_param user nobody + procd_close_instance +} + +service_stopped() { + echo "owmd stopped!" +} diff --git a/owm/files/owmd.sh b/owm/files/owmd.sh new file mode 100644 index 0000000..99586c7 --- /dev/null +++ b/owm/files/owmd.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +. /lib/functions.sh + +log() { + local msg="$1" + logger -t owmd -s "$msg" +} + +main() { + log "started!" + + config_load owmd + config_get cfg_interval general interval 600 + config_get server general server api.openwifi.net + config_get port general port 80 + + while :; + do + owm $server $port + sleep $cfg_interval + done +} + +main