Skip to content

Commit da29771

Browse files
committed
confd: Refactor how sysrepo callbacks are handled
Sysrepo only care about model changes, but we want the system configuration. Therefore add a common callback for all modules and handle dependencies between the modules, if someone should be run before another for example.
1 parent 021e864 commit da29771

17 files changed

+600
-616
lines changed

src/confd/src/core.c

Lines changed: 191 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
/* SPDX-License-Identifier: BSD-3-Clause */
22

3+
#include <srx/srx_val.h>
34
#include <srx/common.h>
5+
#include <srx/lyx.h>
46
#include "core.h"
57

68
struct confd confd;
@@ -75,21 +77,116 @@ int core_post_hook(sr_session_ctx_t *session, uint32_t sub_id, const char *modul
7577
return SR_ERR_SYS;
7678
}
7779

78-
/* skip reload in bootstrap, implicit reload in runlevel change */
79-
if (systemf("runlevel >/dev/null 2>&1")) {
80-
/* trigger any tasks waiting for confd to have applied *-config */
81-
system("initctl -nbq cond set bootstrap");
80+
81+
return SR_ERR_OK;
82+
}
83+
84+
static int change_cb(sr_session_ctx_t *session, uint32_t sub_id, const char *module_name,
85+
const char *xpath, sr_event_t event, uint32_t request_id, void *_confd)
86+
{
87+
struct lyd_node *diff = NULL, *config = NULL;
88+
static uint32_t last_event = -1;
89+
struct confd *confd = _confd;
90+
static uint32_t last_id = 0;
91+
confd_dependency_t result;
92+
sr_data_t *cfg = NULL;
93+
int rc = SR_ERR_OK;
94+
95+
if (request_id == last_id && last_event == event)
8296
return SR_ERR_OK;
97+
last_id = request_id;
98+
last_event = event;
99+
100+
if (event == SR_EV_CHANGE || event == SR_EV_DONE) {
101+
rc = srx_get_diff(session, &diff);
102+
if (rc != SR_ERR_OK) {
103+
ERROR("Failed to get diff: %d", rc);
104+
return rc;
105+
}
106+
rc = sr_get_data(session, "//.", 0, 0, 0, &cfg);
107+
if (rc || !cfg)
108+
goto free_diff;
109+
110+
config = cfg->tree;
111+
#if 0
112+
/* Debug: print diff to file */
113+
FILE *f = fopen("/tmp/confd-diff.json", "w");
114+
if (f) {
115+
lyd_print_file(f, diff, LYD_JSON, LYD_PRINT_WITHSIBLINGS);
116+
fclose(f);
117+
}
118+
#endif
83119
}
84120

85-
if (systemf("initctl -b reload")) {
86-
EMERG("initctl reload: failed applying new configuration!");
87-
return SR_ERR_SYS;
88-
}
121+
/* ietf-interfaces */
122+
if ((rc = ietf_interfaces_change(session, config, diff, event, confd)))
123+
goto free_diff;
89124

90-
AUDIT("The new configuration has been applied.");
125+
/* infix-dhcp-client*/
126+
if ((rc = infix_dhcp_client_change(session, config, diff, event, confd)))
127+
goto free_diff;
91128

92-
return SR_ERR_OK;
129+
/* ietf-keystore */
130+
if ((rc = ietf_keystore_change(session, config, diff, event, confd)))
131+
goto free_diff;
132+
133+
/* infix-services */
134+
if ((rc = infix_services_change(session, config, diff, event, confd)))
135+
goto free_diff;
136+
137+
/* ietf-syslog*/
138+
if ((rc = ietf_syslog_change(session, config, diff, event, confd)))
139+
goto free_diff;
140+
141+
/* ietf-system */
142+
if ((rc = ietf_system_change(session, config, diff, event, confd)))
143+
goto free_diff;
144+
145+
/* infix-containers */
146+
if ((rc = infix_containers_change(session, config, diff, event, confd)))
147+
goto free_diff;
148+
149+
/* ietf-hardware */
150+
if ((rc = ietf_hardware_change(session, config, diff, event, confd)))
151+
goto free_diff;
152+
153+
/* ietf-routing */
154+
if ((rc = ietf_routing_change(session, config, diff, event, confd)))
155+
goto free_diff;
156+
157+
/* infix-dhcp-server */
158+
if ((rc = infix_dhcp_server_change(session, config, diff, event, confd)))
159+
goto free_diff;
160+
161+
/* infix-firewall */
162+
if ((rc = infix_firewall_change(session, config, diff, event, confd)))
163+
goto free_diff;
164+
165+
if (cfg)
166+
sr_release_data(cfg);
167+
168+
if (event == SR_EV_DONE) {
169+
/* skip reload in bootstrap, implicit reload in runlevel change */
170+
if (systemf("runlevel >/dev/null 2>&1")) {
171+
/* trigger any tasks waiting for confd to have applied *-config */
172+
system("initctl -nbq cond set bootstrap");
173+
return SR_ERR_OK;
174+
}
175+
176+
if (systemf("initctl -b reload")) {
177+
EMERG("initctl reload: failed applying new configuration!");
178+
return SR_ERR_SYS;
179+
}
180+
181+
AUDIT("The new configuration has been applied.");
182+
}
183+
free_diff:
184+
lyd_free_tree(diff);
185+
return rc;
186+
}
187+
188+
static int subscribe_module(char *model, struct confd *confd, int flags) {
189+
return sr_module_change_subscribe(confd->session, model, "//.", change_cb, confd, CB_PRIO_PRIMARY, SR_SUBSCR_CHANGE_ALL_MODULES | SR_SUBSCR_DEFAULT | flags, &confd->sub);
93190
}
94191

95192
int sr_plugin_init_cb(sr_session_ctx_t *session, void **priv)
@@ -136,56 +233,119 @@ int sr_plugin_init_cb(sr_session_ctx_t *session, void **priv)
136233
*/
137234
confd.ifquirks = json_load_file("/etc/product/interface-quirks.json", 0, NULL);
138235

139-
rc = ietf_interfaces_init(&confd);
140-
if (rc)
236+
rc = subscribe_module("ietf-interfaces", &confd, 0);
237+
if (rc) {
238+
ERROR("Failed to subscribe to ietf-interfaces");
141239
goto err;
142-
rc = ietf_keystore_init(&confd);
143-
if (rc)
240+
}
241+
rc = subscribe_module("ietf-netconf-acm", &confd, 0);
242+
if (rc) {
243+
ERROR("Failed to subscribe to ietf-netconf-acm");
144244
goto err;
145-
rc = ietf_syslog_init(&confd);
146-
if (rc)
245+
}
246+
rc = subscribe_module("infix-dhcp-client", &confd, 0);
247+
if (rc) {
248+
ERROR("Failed to subscribe to infix-dhcp-client");
147249
goto err;
148-
rc = ietf_system_init(&confd);
149-
if (rc)
250+
}
251+
rc = subscribe_module("ietf-keystore", &confd, SR_SUBSCR_UPDATE);
252+
if (rc) {
253+
ERROR("Failed to subscribe to ietf-keystore");
150254
goto err;
151-
rc = infix_containers_init(&confd);
152-
if (rc)
255+
}
256+
rc = subscribe_module("infix-services", &confd, 0);
257+
if (rc) {
258+
ERROR("Failed to subscribe to infix-services");
259+
goto err;
260+
}
261+
rc = subscribe_module("ietf-system", &confd, 0);
262+
if (rc) {
263+
ERROR("Failed to subscribe to ietf-system");
264+
goto err;
265+
}
266+
rc = subscribe_module("ieee802-dot1ab-lldp", &confd, 0);
267+
if (rc) {
268+
ERROR("Failed to subscribe to ieee802-dot1ab-lldp");
269+
goto err;
270+
}
271+
#ifdef CONTAINERS
272+
rc = subscribe_module("infix-containers", &confd, 0);
273+
if (rc) {
274+
ERROR("Failed to subscribe to infix-containers");
275+
goto err;
276+
}
277+
#endif
278+
rc = subscribe_module("infix-dhcp-server", &confd, 0);
279+
if (rc) {
280+
ERROR("Failed to subscribe to infix-dhcp-server");
281+
goto err;
282+
}
283+
rc = subscribe_module("ietf-routing", &confd, 0);
284+
if (rc) {
285+
ERROR("Failed to subscribe to ietf-routing");
286+
goto err;
287+
}
288+
rc = subscribe_module("ietf-hardware", &confd, 0);
289+
if (rc) {
290+
ERROR("Failed to subscribe to ietf-hardware");
291+
goto err;
292+
}
293+
rc = subscribe_module("infix-firewall", &confd, 0);
294+
if (rc) {
295+
ERROR("Failed to subscribe to infix-firewall");
296+
goto err;
297+
}
298+
rc = subscribe_module("infix-meta", &confd, SR_SUBSCR_UPDATE);
299+
if (rc) {
300+
ERROR("Failed to subscribe to infix-meta");
153301
goto err;
154-
rc = infix_dhcp_client_init(&confd);
302+
}
303+
304+
rc = ietf_system_rpc_init(&confd);
155305
if (rc)
156306
goto err;
157-
rc = infix_dhcp_server_init(&confd);
307+
rc = infix_containers_rpc_init(&confd);
158308
if (rc)
159309
goto err;
160-
rc = infix_factory_init(&confd);
310+
rc = infix_dhcp_server_rpc_init(&confd);
161311
if (rc)
162312
goto err;
163-
rc = ietf_factory_default_init(&confd);
313+
314+
rc = infix_factory_rpc_init(&confd);
164315
if (rc)
165316
goto err;
166-
rc = ietf_routing_init(&confd);
317+
318+
rc = ietf_factory_default_rpc_init(&confd);
167319
if (rc)
168320
goto err;
169-
rc = infix_meta_init(&confd);
321+
322+
rc = infix_firewall_rpc_init(&confd);
170323
if (rc)
171324
goto err;
172-
rc = infix_system_sw_init(&confd);
325+
326+
rc = infix_system_sw_rpc_init(&confd);
173327
if (rc)
174328
goto err;
175-
rc = infix_services_init(&confd);
329+
330+
/* Candidate infer configurations */
331+
rc = ietf_hardware_candidate_init(&confd);
176332
if (rc)
177333
goto err;
178-
rc = ietf_hardware_init(&confd);
334+
335+
rc = infix_firewall_candidate_init(&confd);
179336
if (rc)
180337
goto err;
181-
rc = infix_firewall_init(&confd);
338+
339+
rc = infix_dhcp_server_candidate_init(&confd);
182340
if (rc)
183341
goto err;
184342

343+
rc = infix_dhcp_client_candidate_init(&confd);
344+
if (rc)
345+
goto err;
185346
/* YOUR_INIT GOES HERE */
186347

187348
return SR_ERR_OK;
188-
189349
err:
190350
ERROR("init failed: %s", sr_strerror(rc));
191351
if (confd.root)

src/confd/src/core.h

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ uint32_t core_hook_prio (void);
133133
int core_pre_hook (sr_session_ctx_t *, uint32_t, const char *, const char *, sr_event_t, unsigned, void *);
134134
int core_post_hook (sr_session_ctx_t *, uint32_t, const char *, const char *, sr_event_t, unsigned, void *);
135135
int core_startup_save (sr_session_ctx_t *, uint32_t, const char *, const char *, sr_event_t, unsigned, void *);
136+
int core_wait_change (sr_session_ctx_t *, uint32_t, const char *, const char *, sr_event_t, unsigned, void *);
136137

137138
static inline int register_change(sr_session_ctx_t *session, const char *module, const char *xpath,
138139
int flags, sr_module_change_cb cb, void *arg, sr_subscription_ctx_t **sub)
@@ -206,57 +207,70 @@ static inline int register_rpc(sr_session_ctx_t *session, const char *xpath,
206207
return rc;
207208
}
208209

210+
209211
/* ietf-interfaces.c */
210-
int ietf_interfaces_init(struct confd *confd);
212+
int ietf_interfaces_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd);
213+
int ietf_interfaces_cand_init(struct confd *confd);
211214

212215
/* ietf-syslog.c */
213-
int ietf_syslog_init(struct confd *confd);
216+
int ietf_syslog_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd);
214217

215218
/* ietf-system.c */
216-
int ietf_system_init (struct confd *confd);
219+
int ietf_system_rpc_init (struct confd *confd);
217220
int hostnamefmt (struct confd *confd, const char *fmt, char *hostnm, size_t hostlen, char *domain, size_t domlen);
221+
int ietf_system_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd);
218222

219223
/* infix-containers.c */
220224
#ifdef CONTAINERS
221-
int infix_containers_init(struct confd *confd);
225+
int infix_containers_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd);
226+
int infix_containers_rpc_init(struct confd *confd);
222227
#else
223-
static inline int infix_containers_init(struct confd *confd) { return 0; }
228+
static inline int infix_containers_rpc_init(struct confd *confd) { return 0; }
229+
static inline int infix_containers_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd) { return 0; }
224230
#endif
225231

226232
/* infix-dhcp-common.c */
227233
int dhcp_option_lookup(const struct lyd_node *id);
228234

229235
/* infix-dhcp-client.c */
230-
int infix_dhcp_client_init(struct confd *confd);
236+
int infix_dhcp_client_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd);
237+
int infix_dhcp_client_candidate_init(struct confd *confd);
231238

232239
/* infix-dhcp-server.c */
233-
int infix_dhcp_server_init(struct confd *confd);
234-
235-
/* ietf-factory-default */
236-
int ietf_factory_default_init(struct confd *confd);
240+
int infix_dhcp_server_candidate_init(struct confd *confd);
241+
int infix_dhcp_server_rpc_init(struct confd *confd);
242+
int infix_dhcp_server_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd);
237243

238244
/* ietf-routing */
239-
int ietf_routing_init(struct confd *confd);
245+
int ietf_routing_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd);
240246

241247
/* infix-factory.c */
242-
int infix_factory_init(struct confd *confd);
248+
int infix_factory_rpc_init(struct confd *confd);
243249

244-
/* infix-factory.c */
245-
int infix_meta_init(struct confd *confd);
250+
/* ietf-factory-default */
251+
int ietf_factory_default_rpc_init(struct confd *confd);
252+
253+
/* infix-meta.c */
254+
int infix_meta_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd);
246255

247256
/* infix-system-software.c */
248-
int infix_system_sw_init(struct confd *confd);
257+
int infix_system_sw_rpc_init(struct confd *confd);
249258

250259
/* infix-services.c */
251-
int infix_services_init(struct confd *confd);
260+
int infix_services_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd);
252261

253262
/* ietf-hardware.c */
254-
int ietf_hardware_init(struct confd *confd);
263+
int ietf_hardware_candidate_init(struct confd *confd);
264+
int ietf_hardware_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd);
255265

256266
/* ietf-keystore.c */
257-
int ietf_keystore_init(struct confd *confd);
267+
#define SSH_HOSTKEYS "/etc/ssh/hostkeys"
268+
#define SSH_HOSTKEYS_NEXT SSH_HOSTKEYS"+"
269+
int ietf_keystore_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd);
258270

259271
/* infix-firewall.c */
260-
int infix_firewall_init(struct confd *confd);
272+
int infix_firewall_rpc_init(struct confd *confd);
273+
int infix_firewall_candidate_init(struct confd *confd);
274+
int infix_firewall_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd);
261275

262276
#endif /* CONFD_CORE_H_ */

src/confd/src/ietf-factory-default.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ static int factory_reset(sr_session_ctx_t *session, uint32_t sub_id, const char
1616
return 0;
1717
}
1818

19-
int ietf_factory_default_init(struct confd *confd)
19+
int ietf_factory_default_rpc_init(struct confd *confd)
2020
{
2121
int rc;
2222

0 commit comments

Comments
 (0)