Introduce a new list option "entry" which can be used to specify entries
to add to the ipset, e.g.
config ipset
option name test
...
list entry 1.2.3.4,8080
list entry 5.6.7.8,8081
Also introduce a new option "loadfile" which refers to an external file
containing set entries to add, with one item per line.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
FW3_OPT("external", string, ipset, external),
FW3_OPT("external", string, ipset, external),
+ FW3_LIST("entry", setentry, ipset, entries),
+ FW3_OPT("loadfile", string, ipset, loadfile),
+
return NULL;
INIT_LIST_HEAD(&ipset->datatypes);
return NULL;
INIT_LIST_HEAD(&ipset->datatypes);
+ INIT_LIST_HEAD(&ipset->entries);
ipset->enabled = true;
ipset->family = FW3_FAMILY_V4;
ipset->enabled = true;
ipset->family = FW3_FAMILY_V4;
+load_file(struct fw3_ipset *ipset)
+{
+ FILE *f;
+ char line[128];
+
+ if (!ipset->loadfile)
+ return;
+
+ info(" * Loading file %s", ipset->loadfile);
+
+ f = fopen(ipset->loadfile, "r");
+
+ if (!f) {
+ info(" ! Skipping due to open error: %s", strerror(errno));
+ return;
+ }
+
+ while (fgets(line, sizeof(line), f))
+ fw3_pr("add %s %s", ipset->name, line);
+
+ fclose(f);
+}
+
+static void
create_ipset(struct fw3_ipset *ipset, struct fw3_state *state)
{
bool first = true;
create_ipset(struct fw3_ipset *ipset, struct fw3_state *state)
{
bool first = true;
+ struct fw3_setentry *entry;
struct fw3_ipset_datatype *type;
info(" * Creating ipset %s", ipset->name);
struct fw3_ipset_datatype *type;
info(" * Creating ipset %s", ipset->name);
fw3_pr(" hashsize %u", ipset->hashsize);
fw3_pr("\n");
fw3_pr(" hashsize %u", ipset->hashsize);
fw3_pr("\n");
+
+ list_for_each_entry(entry, &ipset->entries, list)
+ fw3_pr("add %s %s\n", ipset->name, entry->value);
+
+ load_file(ipset);
+bool
+fw3_parse_setentry(void *ptr, const char *val, bool is_list)
+{
+ struct fw3_setentry e = { };
+
+ e.value = val;
+ put_value(ptr, &e, sizeof(e), is_list);
+
+ return true;
+}
+
bool
fw3_parse_options(void *s, const struct fw3_option *opts,
bool
fw3_parse_options(void *s, const struct fw3_option *opts,
+ struct list_head entries;
+ const char *loadfile;
+
+struct fw3_setentry
+{
+ struct list_head list;
+ const char *value;
+};
+
struct fw3_state
{
struct uci_context *uci;
struct fw3_state
{
struct uci_context *uci;
bool fw3_parse_setmatch(void *ptr, const char *val, bool is_list);
bool fw3_parse_direction(void *ptr, const char *val, bool is_list);
bool fw3_parse_cthelper(void *ptr, const char *val, bool is_list);
bool fw3_parse_setmatch(void *ptr, const char *val, bool is_list);
bool fw3_parse_direction(void *ptr, const char *val, bool is_list);
bool fw3_parse_cthelper(void *ptr, const char *val, bool is_list);
+bool fw3_parse_setentry(void *ptr, const char *val, bool is_list);
bool fw3_parse_options(void *s, const struct fw3_option *opts,
struct uci_section *section);
bool fw3_parse_options(void *s, const struct fw3_option *opts,
struct uci_section *section);