X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/a662d5b130a558956875dbe259c551b632abb0f4..a27a0f0fe52cf674b810e01f9e888067fd8bad87:/package/swconfig/src/cli.c diff --git a/package/swconfig/src/cli.c b/package/swconfig/src/cli.c index c6035e585..76593ba14 100644 --- a/package/swconfig/src/cli.c +++ b/package/swconfig/src/cli.c @@ -2,6 +2,7 @@ * swconfig.c: Switch configuration utility * * Copyright (C) 2008 Felix Fietkau + * Copyright (C) 2010 Martin Mares * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -22,6 +23,7 @@ #include #include #include +#include #include #include @@ -32,10 +34,17 @@ #include #include "swlib.h" -#define GET 1 -#define SET 2 +enum { + CMD_NONE, + CMD_GET, + CMD_SET, + CMD_LOAD, + CMD_HELP, + CMD_SHOW, +}; -void print_attrs(struct switch_attr *attr) +static void +print_attrs(const struct switch_attr *attr) { int i = 0; while (attr) { @@ -62,7 +71,8 @@ void print_attrs(struct switch_attr *attr) } } -void list_attributes(struct switch_dev *dev) +static void +list_attributes(struct switch_dev *dev) { printf("Switch %d: %s(%s), ports: %d, vlans: %d\n", dev->id, dev->dev_name, dev->name, dev->ports, dev->vlans); printf(" --switch\n"); @@ -73,10 +83,108 @@ void list_attributes(struct switch_dev *dev) print_attrs(dev->port_ops); } -void print_usage(void) +static void +print_attr_val(const struct switch_attr *attr, const struct switch_val *val) { - printf("swconfig dev [port |vlan ] (help|set |get )\n"); - exit(0); + int i; + + switch (attr->type) { + case SWITCH_TYPE_INT: + printf("%d", val->value.i); + break; + case SWITCH_TYPE_STRING: + printf("%s", val->value.s); + break; + case SWITCH_TYPE_PORTS: + for(i = 0; i < val->len; i++) { + printf("%d%s ", + val->value.ports[i].id, + (val->value.ports[i].flags & + SWLIB_PORT_FLAG_TAGGED) ? "t" : ""); + } + break; + default: + printf("?unknown-type?"); + } +} + +static void +show_attrs(struct switch_dev *dev, struct switch_attr *attr, struct switch_val *val) +{ + while (attr) { + if (attr->type != SWITCH_TYPE_NOVAL) { + printf("\t%s: ", attr->name); + if (swlib_get_attr(dev, attr, val) < 0) + printf("???"); + else + print_attr_val(attr, val); + putchar('\n'); + } + attr = attr->next; + } +} + +static void +show_global(struct switch_dev *dev) +{ + struct switch_val val; + + printf("Global attributes:\n"); + show_attrs(dev, dev->ops, &val); +} + +static void +show_port(struct switch_dev *dev, int port) +{ + struct switch_val val; + + printf("Port %d:\n", port); + val.port_vlan = port; + show_attrs(dev, dev->port_ops, &val); +} + +static void +show_vlan(struct switch_dev *dev, int vlan) +{ + struct switch_val val; + + printf("VLAN %d:\n", vlan); + val.port_vlan = vlan; + show_attrs(dev, dev->vlan_ops, &val); +} + +static void +print_usage(void) +{ + printf("swconfig dev [port |vlan ] (help|set |get |load |show)\n"); + exit(1); +} + +static void +swconfig_load_uci(struct switch_dev *dev, const char *name) +{ + struct uci_context *ctx; + struct uci_package *p = NULL; + struct uci_element *e; + int ret = -1; + + ctx = uci_alloc_context(); + if (!ctx) + return; + + uci_load(ctx, name, &p); + if (!p) { + uci_perror(ctx, "Failed to load config file: "); + goto out; + } + + ret = swlib_apply_from_uci(dev, p); + if (ret < 0) + fprintf(stderr, "Failed to apply configuration for switch '%s'\n", dev->dev_name); + +out: + uci_free_context(ctx); + exit(ret); } int main(int argc, char **argv) @@ -88,15 +196,12 @@ int main(int argc, char **argv) int err; int i; - struct switch_port *ports; - - int cmd = 0; + int cmd = CMD_NONE; char *cdev = NULL; int cport = -1; int cvlan = -1; char *ckey = NULL; char *cvalue = NULL; - int chelp = 0; if(argc < 4) print_usage(); @@ -108,43 +213,38 @@ int main(int argc, char **argv) for(i = 3; i < argc; i++) { - int p; - if(!strcmp(argv[i], "help")) - { - chelp = 1; - continue; - } - if(i + 1 >= argc) + char *arg = argv[i]; + if (cmd != CMD_NONE) { print_usage(); - p = atoi(argv[i + 1]); - if(!strcmp(argv[i], "port")) - { - cport = p; - } else if(!strcmp(argv[i], "vlan")) - { - cvlan = p; - } else if(!strcmp(argv[i], "set")) - { - if(argc <= i + 1) + } else if (!strcmp(arg, "port") && i+1 < argc) { + cport = atoi(argv[++i]); + } else if (!strcmp(arg, "vlan") && i+1 < argc) { + cvlan = atoi(argv[++i]); + } else if (!strcmp(arg, "help")) { + cmd = CMD_HELP; + } else if (!strcmp(arg, "set") && i+1 < argc) { + cmd = CMD_SET; + ckey = argv[++i]; + if (i+1 < argc) + cvalue = argv[++i]; + } else if (!strcmp(arg, "get") && i+1 < argc) { + cmd = CMD_GET; + ckey = argv[++i]; + } else if (!strcmp(arg, "load") && i+1 < argc) { + if ((cport >= 0) || (cvlan >= 0)) print_usage(); - cmd = SET; - ckey = argv[i + 1]; - if (argc > i + 2) - cvalue = argv[i + 2]; - else - cvalue = NULL; - i++; - } else if(!strcmp(argv[i], "get")) - { - cmd = GET; - ckey = argv[i + 1]; - } else{ + cmd = CMD_LOAD; + ckey = argv[++i]; + } else if (!strcmp(arg, "show")) { + cmd = CMD_SHOW; + } else { print_usage(); } - i++; } - if(cport > -1 && cvlan > -1) + if (cmd == CMD_NONE) + print_usage(); + if (cport > -1 && cvlan > -1) print_usage(); dev = swlib_connect(cdev); @@ -153,75 +253,41 @@ int main(int argc, char **argv) return 1; } - ports = malloc(sizeof(struct switch_port) * dev->ports); - memset(ports, 0, sizeof(struct switch_port) * dev->ports); swlib_scan(dev); - if(chelp) - { - list_attributes(dev); - goto out; - } - - if(cport > -1) - a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_PORT, ckey); - else if(cvlan > -1) - a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_VLAN, ckey); - else - a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_GLOBAL, ckey); + if (cmd == CMD_GET || cmd == CMD_SET) { + if(cport > -1) + a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_PORT, ckey); + else if(cvlan > -1) + a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_VLAN, ckey); + else + a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_GLOBAL, ckey); - if(!a) - { - fprintf(stderr, "Unknown attribute \"%s\"\n", ckey); - goto out; + if(!a) + { + fprintf(stderr, "Unknown attribute \"%s\"\n", ckey); + goto out; + } } switch(cmd) { - case SET: + case CMD_SET: if ((a->type != SWITCH_TYPE_NOVAL) && (cvalue == NULL)) print_usage(); - switch(a->type) { - case SWITCH_TYPE_INT: - val.value.i = atoi(cvalue); - break; - case SWITCH_TYPE_STRING: - val.value.s = cvalue; - break; - case SWITCH_TYPE_PORTS: - val.len = 0; - while(cvalue && *cvalue) - { - ports[val.len].flags = 0; - ports[val.len].id = strtol(cvalue, &cvalue, 10); - while(*cvalue && !isspace(*cvalue)) { - if (*cvalue == 't') - ports[val.len].flags |= SWLIB_PORT_FLAG_TAGGED; - cvalue++; - } - if (*cvalue) - cvalue++; - val.len++; - } - val.value.ports = ports; - break; - default: - break; - } if(cvlan > -1) - val.port_vlan = cvlan; - if(cport > -1) - val.port_vlan = cport; - if(swlib_set_attr(dev, a, &val) < 0) + cport = cvlan; + + if(swlib_set_attr_string(dev, a, cport, cvalue) < 0) { fprintf(stderr, "failed\n"); retval = -1; goto out; } break; - case GET: + case CMD_GET: if(cvlan > -1) val.port_vlan = cvlan; if(cport > -1) @@ -232,24 +298,32 @@ int main(int argc, char **argv) retval = -1; goto out; } - switch(a->type) { - case SWITCH_TYPE_INT: - printf("%d\n", val.value.i); - break; - case SWITCH_TYPE_STRING: - printf("%s\n", val.value.s); - break; - case SWITCH_TYPE_PORTS: - for(i = 0; i < val.len; i++) - printf("%d ", val.value.ports[i]); - printf("\n"); - break; + print_attr_val(a, &val); + putchar('\n'); + break; + case CMD_LOAD: + swconfig_load_uci(dev, ckey); + break; + case CMD_HELP: + list_attributes(dev); + break; + case CMD_SHOW: + if (cport >= 0 || cvlan >= 0) { + if (cport >= 0) + show_port(dev, cport); + else + show_vlan(dev, cvlan); + } else { + show_global(dev); + for (i=0; i < dev->ports; i++) + show_port(dev, i); + for (i=0; i < dev->vlans; i++) + show_vlan(dev, i); } + break; } out: swlib_free_all(dev); - free(ports); - return 0; }