--- /dev/null
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=rpcd-mod-poe
+PKG_VERSION:=0.1
+PKG_RELEASE:=1
+PKG_LICENSE:=GPL-2.0
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/rpcd-mod-poe
+ SECTION:=utils
+ CATEGORY:=Base system
+ TITLE:=OpenWrt ubus PoE interface
+ MAINTAINER:=Paul Spooren <mail@aparcar.org>
+ DEPENDS:=+rpcd +kmod-i2c-gpio-custom
+endef
+
+define Package/rpcd-mod-poe/description
+ Expose ubus procedures to query, enable and disable the per-port PoE power
+ on Ubiquity devices and similar platforms.
+endef
+
+define Build/Compile
+endef
+
+define Build/Configure
+endef
+
+define Package/rpcd-mod-poe/install
+ $(INSTALL_DIR) $(1)/usr/share/rpcd/acl.d/
+ $(INSTALL_BIN) ./files/poe.acl $(1)/usr/share/rpcd/acl.d/poe.json
+
+ $(INSTALL_DIR) $(1)/usr/libexec/rpcd/
+ $(INSTALL_BIN) ./files/poe.rpcd $(1)/usr/libexec/rpcd/poe
+endef
+
+$(eval $(call BuildPackage,rpcd-mod-poe))
--- /dev/null
+#!/bin/sh
+
+. /usr/share/libubox/jshn.sh
+
+print_active()
+{
+ json_init
+ json_add_string "active" "$(uci get system.poe_power_port${port}.value)"
+ json_dump
+}
+
+
+json_port()
+{
+ json_add_object "poe_power_port${1}"
+ json_add_string "name" "$(uci get system.poe_power_port${1}.name)"
+ json_add_int "gpio_pin" "$(uci get system.poe_power_port${1}.gpio_pin)"
+ json_add_int "active" "$(uci get system.poe_power_port${1}.value)"
+ json_close_object
+}
+
+case "$1" in
+list)
+ json_init
+ json_add_object "on"
+ json_add_int "port"
+ json_close_object
+ json_add_object "off"
+ json_add_int "port"
+ json_close_object
+ json_add_object "powercycle"
+ json_add_int "port"
+ json_close_object
+ json_add_object "status"
+ json_add_int "port"
+ json_close_object
+ json_add_object "list"
+ json_close_object
+ json_dump
+ ;;
+call)
+ read input
+ json_load "$input"
+ json_get_var port port
+
+ uci get system.poe_power_port${port}.value 2>/dev/null 1>/dev/null || {
+ json_init
+ json_add_string "error" "gpio $gpio not found"
+ json_dump
+ }
+
+ case "$2" in
+ on)
+ uci set system.poe_power_port${port}.value=1
+ uci commit system
+ /etc/init.d/gpio_switch restart
+ print_active
+ ;;
+ off)
+ uci set system.poe_power_port${port}.value=0
+ uci commit system
+ /etc/init.d/gpio_switch restart
+ print_active
+ ;;
+ powercycle)
+ uci set system.poe_power_port${port}.value=0
+ /etc/init.d/gpio_switch restart
+ sleep 1
+ uci set system.poe_power_port${port}.value=1
+ uci commit system
+ /etc/init.d/gpio_switch restart
+ print_active
+ ;;
+ status)
+ # in future version additional status information like voltage
+ # and current should follow
+ print_active
+ ;;
+ list)
+ json_init
+ port=0;
+ while uci show system.@gpio_switch[$port] 2>/dev/null 1>/dev/null; do
+ json_port $port
+ port=$((port+1))
+ done
+ json_dump
+ ;;
+ esac
+esac