Made fw_cleanup not remove rules from the expired rule set. Added code to read in any existing expired rules into the rule_map at startup.

git-svn-id: file:///home/mbr/svn/fwknop/trunk@286 510a4753-2344-4c79-9c09-4d669213fbeb
This commit is contained in:
Damien Stuart
2010-08-29 01:32:04 +00:00
parent ff9dad6fd9
commit 6bcebe565c
3 changed files with 72 additions and 4 deletions
+70 -3
View File
@@ -136,7 +136,9 @@ fw_config_init(fko_srv_options_t *opts)
void
fw_initialize(fko_srv_options_t *opts)
{
int res = 0;
int res = 0;
unsigned short curr_rule;
char *ndx;
/* For now, we just call fw_cleanup to start with clean slate.
*/
@@ -201,8 +203,67 @@ fw_initialize(fko_srv_options_t *opts)
fwc.expire_set_num);
else
log_msg(LOG_ERR, "Error %i from cmd:'%s': %s", res, cmd_buf, err_buf);
/* Now read the expire set in case there are existing
* rules to track.
*/
zero_cmd_buffers();
snprintf(cmd_buf, CMD_BUFSIZE-1, "%s " IPFW_LIST_EXP_SET_RULES_ARGS,
opts->fw_config->fw_command,
fwc.expire_set_num
);
res = run_extcmd(cmd_buf, cmd_out, STANDARD_CMD_OUT_BUFSIZE, 0);
if(!EXTCMD_IS_SUCCESS(res))
{
log_msg(LOG_ERR, "Error %i from cmd:'%s': %s", res, cmd_buf, cmd_out);
return;
}
if(opts->verbose > 2)
log_msg(LOG_INFO, "RES=%i, CMD_BUF: %s\nRULES LIST: %s", res, cmd_buf, cmd_out);
/* Find the first "# DISABLED" string (if any).
*/
ndx = strstr(cmd_out, "# DISABLED ");
/* Assume no disabled rules if we did not see the string.
*/
if(ndx == NULL)
return;
/* Otherwise we walk each line to pull the rule number and
* set the appropriate rule map entries.
*/
while(ndx != NULL)
{
/* Skip over the DISABLED string to the rule num.
*/
ndx += 11;
if(isdigit(*ndx))
{
curr_rule = atoi(ndx);
if(curr_rule >= fwc.start_rule_num
&& curr_rule < fwc.start_rule_num + fwc.max_rules)
{
fwc.rule_map[curr_rule - fwc.start_rule_num] = RULE_EXPIRED;
fwc.total_rules++;
}
}
else
log_msg(LOG_WARNING, "fw_initialize: No rule number found where expected.");
/* Find the next "# DISABLED" string (if any).
*/
ndx = strstr(ndx, "# DISABLED ");
}
}
int
fw_cleanup(void)
{
@@ -230,9 +291,13 @@ fw_cleanup(void)
}
}
/* --DSS Keep expired rule list so any existing established
are not lost */
#if 0
if(fwc.expire_set_num > 0)
{
/* Create the set delete command for active rules
/* Create the set delete command for expired rules
*/
snprintf(cmd_buf, CMD_BUFSIZE-1, "%s " IPFW_DEL_RULE_SET_ARGS,
fwc.fw_command,
@@ -249,10 +314,12 @@ fw_cleanup(void)
got_err++;
}
}
#endif
/* Free the rule map.
*/
free(fwc.rule_map);
if(fwc.rule_map != NULL)
free(fwc.rule_map);
return(got_err);
}
+1
View File
@@ -44,6 +44,7 @@ enum {
#define IPFW_DEL_RULE_SET_ARGS "delete set %u"
#define IPFW_LIST_RULES_ARGS "-d -S -T set %u list"
#define IPFW_LIST_SET_RULES_ARGS "set %u list"
#define IPFW_LIST_EXP_SET_RULES_ARGS "-S set %u list"
#define IPFW_LIST_SET_DYN_RULES_ARGS "-d set %u list"
void purge_expired_rules(fko_srv_options_t *opts);
+1 -1
View File
@@ -271,7 +271,7 @@ pcap_capture(fko_srv_options_t *opts)
/* Purge expired rules that no longer have any corresponding
* dynamic rules.
*/
if(opts->fw_config->total_rule > 0)
if(opts->fw_config->total_rules > 0)
{
time(&now);
if(opts->fw_config->last_purge < (now - opts->fw_config->purge_interval))