src/confd: draft ietf-interfaces prototype to set static IP address

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg
2023-04-17 14:09:24 +02:00
parent ce5ff75c9c
commit eaedae4ccb
+64
View File
@@ -2,6 +2,7 @@
#include "core.h"
#include "sr_ext.h"
#include "srx_val.h"
const struct srx_module_requirement ietf_if_reqs[] = {
{ .dir = YANG_PATH_, .name = "ietf-interfaces", .rev = "2018-02-20" },
@@ -11,6 +12,67 @@ const struct srx_module_requirement ietf_if_reqs[] = {
{ NULL }
};
static int ifchange(sr_session_ctx_t *session, uint32_t sub_id, const char *module,
const char *xpath, sr_event_t event, unsigned request_id, void *priv)
{
sr_val_t *val;
size_t cnt;
int rc;
if (event != SR_EV_DONE)
return SR_ERR_OK;
rc = sr_get_items(session, "/ietf-interfaces:interfaces/interface", 0, 0, &val, &cnt);
if (rc)
goto fail;
for (size_t i = 0; i < cnt; i++) {
const char *xpath = val[i].xpath;
char path[strlen(xpath) + 64];
sr_val_t *addr;
size_t addrcnt;
char *ifname;
char *ptr;
int ena;
ifname = srx_get_str(session, "%s/name", xpath);
ptr = srx_get_str(session, "%s/description", xpath);
if (ptr) {
FILE *fp;
fp = fopenf("w", "/sys/class/net/%s/ifalias", ifname);
if (fp) {
fprintf(fp, "%s\n", ptr);
fclose(fp);
}
free(ptr);
}
systemf("ip addr flush dev %s", ifname);
snprintf(path, sizeof(path), "%s/ietf-ip:ipv4/address", xpath);
rc = sr_get_items(session, path, 0, 0, &addr, &addrcnt);
for (size_t j = 0; j < addrcnt; j++) {
char *address;
char *plen;
address = srx_get_str(session, "%s/ip", addr[j].xpath);
plen = srx_get_str(session, "%s/prefix-length", addr[j].xpath);
systemf("ip addr add %s/%s dev %s", address, plen, ifname);
free(address);
free(plen);
}
ena = srx_get_bool(session, "%s/enabled", xpath);
systemf("ip link set %s %s", ifname, ena <= 0 ? "down" : "up");
}
sr_free_values(val, cnt);
rc = SR_ERR_OK;
fail:
return rc;
}
int ietf_interfaces_init(struct confd *confd)
{
int rc;
@@ -19,6 +81,8 @@ int ietf_interfaces_init(struct confd *confd)
if (rc)
goto err;
REGISTER_CHANGE(confd->session, "ietf-interfaces", "/ietf-interfaces:interfaces", 0, ifchange, confd, &confd->sub);
return SR_ERR_OK;
err:
ERROR("init failed: %s", sr_strerror(rc));