add rebind by ubus call + add reload to initd
This commit is contained in:
parent
cef614a321
commit
4b57580f8e
|
@ -14,9 +14,14 @@ start_service () {
|
||||||
procd_set_param stderr 1
|
procd_set_param stderr 1
|
||||||
procd_set_param respawn ${respawn_threshold:-3660} ${respawn_timeout:-5} ${respawn_retry:-0}
|
procd_set_param respawn ${respawn_threshold:-3660} ${respawn_timeout:-5} ${respawn_retry:-0}
|
||||||
procd_set_param command "$PROG"
|
procd_set_param command "$PROG"
|
||||||
|
procd_set_param watch network.wireless
|
||||||
procd_close_instance
|
procd_close_instance
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reload_service () {
|
||||||
|
ubus call wifictld rebind > /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
service_triggers() {
|
service_triggers() {
|
||||||
local script=$(readlink "$initscript")
|
local script=$(readlink "$initscript")
|
||||||
local name=$(basename "${script:-$initscript}")
|
local name=$(basename "${script:-$initscript}")
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <libubus.h>
|
#include <libubus.h>
|
||||||
#include <libubox/avl.h>
|
#include <libubox/avl.h>
|
||||||
|
#include <libubox/avl-cmp.h>
|
||||||
#include <libubox/uloop.h>
|
#include <libubox/uloop.h>
|
||||||
#include <libubox/blobmsg.h>
|
#include <libubox/blobmsg.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
|
|
|
@ -48,6 +48,7 @@ int wifictld_ubus_init()
|
||||||
// close ubus connection
|
// close ubus connection
|
||||||
void wifictld_ubus_close()
|
void wifictld_ubus_close()
|
||||||
{
|
{
|
||||||
|
wifictld_ubus_unbind_events(ctx);
|
||||||
ubus_free(ctx);
|
ubus_free(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,10 @@
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "wifi_clients.h"
|
#include "wifi_clients.h"
|
||||||
|
|
||||||
|
#include "ubus_events.h"
|
||||||
|
|
||||||
|
struct avl_tree ubus_hostapd_binds = {};
|
||||||
|
|
||||||
// bind on every hostapd by receive all ubus registered services
|
// bind on every hostapd by receive all ubus registered services
|
||||||
static void recieve_interfaces(struct ubus_context *ctx, struct ubus_object_data *obj, void *priv);
|
static void recieve_interfaces(struct ubus_context *ctx, struct ubus_object_data *obj, void *priv);
|
||||||
|
|
||||||
|
@ -23,6 +27,8 @@ struct ubus_subscriber sub = {
|
||||||
*/
|
*/
|
||||||
int wifictld_ubus_bind_events(struct ubus_context *ctx)
|
int wifictld_ubus_bind_events(struct ubus_context *ctx)
|
||||||
{
|
{
|
||||||
|
avl_init(&ubus_hostapd_binds, avl_blobcmp, false, NULL);
|
||||||
|
|
||||||
// register subscriber on ubus
|
// register subscriber on ubus
|
||||||
int ret = ubus_register_subscriber(ctx, &sub);
|
int ret = ubus_register_subscriber(ctx, &sub);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -36,6 +42,15 @@ int wifictld_ubus_bind_events(struct ubus_context *ctx)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int wifictld_ubus_unbind_events(struct ubus_context *ctx)
|
||||||
|
{
|
||||||
|
struct ubus_hostapd_bind *el, *ptr;
|
||||||
|
avl_remove_all_elements(&ubus_hostapd_binds, el, avl, ptr) {
|
||||||
|
ubus_unsubscribe(ctx, &sub, el->id);
|
||||||
|
log_info("unsubscribe %s\n", el->path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void recieve_interfaces(struct ubus_context *ctx, struct ubus_object_data *obj, void *priv)
|
static void recieve_interfaces(struct ubus_context *ctx, struct ubus_object_data *obj, void *priv)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -77,6 +92,15 @@ static void recieve_interfaces(struct ubus_context *ctx, struct ubus_object_data
|
||||||
log_error("Error while register subscribe for event '%s': %s\n", path, ubus_strerror(ret));
|
log_error("Error while register subscribe for event '%s': %s\n", path, ubus_strerror(ret));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// store binding for unsubscribe (reload)
|
||||||
|
struct ubus_hostapd_bind *bind;
|
||||||
|
bind = malloc(sizeof(*bind));
|
||||||
|
bind->path = path;
|
||||||
|
bind->id = id;
|
||||||
|
bind->avl.key = &bind->id;
|
||||||
|
|
||||||
|
avl_insert(&ubus_hostapd_binds, &bind->avl);
|
||||||
|
|
||||||
log_info("subscribe %s\n", path);
|
log_info("subscribe %s\n", path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,16 @@
|
||||||
|
|
||||||
#include "include.h"
|
#include "include.h"
|
||||||
|
|
||||||
|
extern struct avl_tree ubus_hostapd_binds;
|
||||||
|
|
||||||
|
|
||||||
|
struct ubus_hostapd_bind {
|
||||||
|
struct avl_node avl;
|
||||||
|
int id;
|
||||||
|
char *path;
|
||||||
|
};
|
||||||
|
|
||||||
int wifictld_ubus_bind_events(struct ubus_context *ctx);
|
int wifictld_ubus_bind_events(struct ubus_context *ctx);
|
||||||
|
int wifictld_ubus_unbind_events(struct ubus_context *ctx);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
#include "data.h"
|
#include "data.h"
|
||||||
#include "wifi_clients.h"
|
#include "wifi_clients.h"
|
||||||
|
|
||||||
|
#include "ubus_events.h"
|
||||||
|
|
||||||
static struct blob_buf b = {};
|
static struct blob_buf b = {};
|
||||||
|
|
||||||
static int ubus_get_clients(struct ubus_context *ctx, struct ubus_object *obj,
|
static int ubus_get_clients(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
|
@ -164,6 +166,59 @@ static int ubus_set_config(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int ubus_bind(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
|
struct ubus_request_data *req, const char *method, struct blob_attr *msg)
|
||||||
|
{
|
||||||
|
void *array;
|
||||||
|
struct ubus_hostapd_bind *el;
|
||||||
|
|
||||||
|
blob_buf_init(&b, 0);
|
||||||
|
|
||||||
|
array = blobmsg_open_array(&b, "current");
|
||||||
|
avl_for_each_element(&ubus_hostapd_binds, el, avl) {
|
||||||
|
blobmsg_add_string(&b, el->path , el->path);
|
||||||
|
}
|
||||||
|
blobmsg_close_array(&b, array);
|
||||||
|
|
||||||
|
// end
|
||||||
|
ubus_send_reply(ctx, req, b.head);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ubus_rebind(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
|
struct ubus_request_data *req, const char *method, struct blob_attr *msg)
|
||||||
|
{
|
||||||
|
void *array;
|
||||||
|
struct ubus_hostapd_bind *el;
|
||||||
|
|
||||||
|
blob_buf_init(&b, 0);
|
||||||
|
|
||||||
|
// list state before
|
||||||
|
array = blobmsg_open_array(&b, "before");
|
||||||
|
avl_for_each_element(&ubus_hostapd_binds, el, avl) {
|
||||||
|
blobmsg_add_string(&b, el->path , el->path);
|
||||||
|
}
|
||||||
|
blobmsg_close_array(&b, array);
|
||||||
|
|
||||||
|
// remove bind
|
||||||
|
wifictld_ubus_unbind_events(ctx);
|
||||||
|
|
||||||
|
// new bind
|
||||||
|
wifictld_ubus_bind_events(ctx);
|
||||||
|
|
||||||
|
// list state after
|
||||||
|
array = blobmsg_open_array(&b, "current");
|
||||||
|
avl_for_each_element(&ubus_hostapd_binds, el, avl) {
|
||||||
|
blobmsg_add_string(&b, el->path , el->path);
|
||||||
|
}
|
||||||
|
blobmsg_close_array(&b, array);
|
||||||
|
// end
|
||||||
|
|
||||||
|
ubus_send_reply(ctx, req, b.head);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static const struct ubus_method wifictld_ubus_methods[] = {
|
static const struct ubus_method wifictld_ubus_methods[] = {
|
||||||
|
@ -174,6 +229,9 @@ static const struct ubus_method wifictld_ubus_methods[] = {
|
||||||
// config threasholds
|
// config threasholds
|
||||||
UBUS_METHOD_NOARG("get_config", ubus_get_config),
|
UBUS_METHOD_NOARG("get_config", ubus_get_config),
|
||||||
UBUS_METHOD("set_config", ubus_set_config, ubus_set_config_policy),
|
UBUS_METHOD("set_config", ubus_set_config, ubus_set_config_policy),
|
||||||
|
|
||||||
|
UBUS_METHOD_NOARG("bind", ubus_bind),
|
||||||
|
UBUS_METHOD_NOARG("rebind", ubus_rebind),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct ubus_object_type bss_object_type =
|
static struct ubus_object_type bss_object_type =
|
||||||
|
|
Loading…
Reference in New Issue