示例#1
0
triggerconfig_t * add_trigger(rulepackage_t * rpkg, zmsg_t * request,zmsg_t * reply) {
    char * rule_id  = zmsg_popstr(request);
    zclock_log("new trigger!");
    
    if (remove_rule(rpkg->context, rpkg->triggers, rule_id)) {
        // already have a rule with that id! 
      zclock_log("Received duplicate rule %s - killing old trigger", rule_id);
    } 
      
    triggerconfig_t * tconf = malloc(sizeof(triggerconfig_t));
    tconf->base_config = rpkg->base_config;
    create_triggerconfig(tconf, request, rpkg->channel, rule_id);
      
    // when we create this trigger, what guarantee do we have that
    // the line listener is active? FIX
    // basically we have none. crap.
    char * created = create_trigger(rpkg->triggers, rule_id, rpkg->context, tconf);
    if(NULL == created) {
      // happy path, so add to db
      zmsg_pushstr(reply, "ok");

    } else {
      zclock_log("create_trigger failed: %s", created);
      free(tconf);
      tconf=NULL;
      zmsg_pushstr(reply, created);
    }
    free(created);
    return tconf;    
    
}
示例#2
0
widget_move::widget_move(QWidget *parent)
    : widget_src_dst(parent),
      __creator(0)
{
    connect(__add_action, SIGNAL(triggered()), this, SLOT(create_rule()));
    connect(__edit_action, SIGNAL(triggered()), this, SLOT(edit_rule()));
    connect(__remove_action, SIGNAL(triggered()), this, SLOT(remove_rule()));
}
示例#3
0
void
free_rules(struct cork_dllist *rules)
{
    struct cork_dllist_item *iter;
    while ((iter = cork_dllist_head(rules)) != NULL) {
        rule_t *rule = cork_container_of(iter, rule_t, entries);
        remove_rule(rule);
    }
}
示例#4
0
文件: IF.cpp 项目: tim099/AOCTDF
bool IF::get_remove_rule(){
	if(!selected_rule&&!selected_condition)return true;


	if(selected_rule){
		if(!selected_rule->get_remove_rule()){
			return false;
		}
		if(!remove_rule()){
			return false;
		}
		/*
		for(unsigned i=0;i<true_rules.size();i++){
			if(true_rules.at(i)==selected_rule){
				delete selected_rule;
				selected_rule=0;
				true_rules.at(i)=true_rules.back();
				true_rules.pop_back();
				return false;
			}
		}
		for(unsigned i=0;i<false_rules.size();i++){
			if(false_rules.at(i)==selected_rule){
				delete selected_rule;
				selected_rule=0;
				false_rules.at(i)=false_rules.back();
				false_rules.pop_back();
				return false;
			}
		}
		*/
	}
	if(selected_condition){
		if(!remove_condition()){
			return false;
		}
	}
	return false;
}
示例#5
0
static void
handle_request(void *ctx) {
  conn_t *conn = ctx;
  struct evbuffer *rsps = evbuffer_new();
  struct state *s = conn->state;

  if (strcmp(conn->method, "GET") == 0) {

    if (strcmp(conn->url, "/getproxies") == 0) 
      get_proxies(rsps);

    else if (strcmp(conn->url, "/getlists") == 0) 
      get_lists(rsps);

    else if (strncmp(conn->url, "/query?", 7) == 0)
      query(rsps, evhttp_decode_uri(conn->url + 7));

    else if (strcmp(conn->url, "/getlog") == 0) 
      get_log(rsps);

    else if (strcmp(conn->url, "/gettrylist") == 0) 
      get_trylist(rsps);

    else if (strcmp(conn->url, "/getversion") == 0) 
      evbuffer_add_printf(rsps, VERSION);

  }
  else if (strcmp(conn->method, "POST") == 0) {

    struct evkeyvalq kv;
    struct evhttp_uri *uri = evhttp_uri_parse_with_flags(conn->url, 0);

    evhttp_parse_query_str(evhttp_uri_get_query(uri), &kv);

    char *cont;
    if (s->length) 
      cont = s->body;

    const char *path = evhttp_uri_get_path(uri);

    if (strcmp(path, "/addrule") == 0 || strcmp(path, "/rmrule") == 0) {

      struct evkeyvalq kvc;
      evhttp_parse_query_str(cont, &kvc);

      char *list = evhttp_decode_uri(evhttp_find_header(&kvc, "list"));
      char *rule = evhttp_decode_uri(evhttp_find_header(&kvc, "rule"));

      if (get_domain(rule) == NULL) 
	evbuffer_add_printf(rsps, "Invalid rule.");
      
      else {
	if (strcmp(path, "/addrule") == 0)
	  update_rule(list, rule);
      
	else 
	  remove_rule(list, rule);

	evbuffer_add_printf(rsps, "OK");
      }
      free(list);
      free(rule);

      free(cont);
    }

    else if (strcmp(path, "/flush") == 0) {
      flush_list();
      evbuffer_add_printf(rsps, "OK");
    }
    else if (strcmp(path, "/rmlog") == 0) {
      rm_log(rsps);
    }
    else if (strcmp(path, "/purgetrylist") == 0) {
      purgetrylist(rsps);
    }

    evhttp_uri_free(uri);
  }
  ret(conn->be_client, rsps);
  evbuffer_free(rsps);

}
示例#6
0
void handle_command(zmsg_t * request, 
                    zmsg_t * reply,
                    rulepackage_t * rpkg,
                    channeldb_t * db ) {
  char * command = zmsg_popstr(request);
  zclock_log("%s worker servicing request %s", rpkg->servicename,command);

  if        (strcmp(command, "AddTrigger") == 0) {
    triggerconfig_t * tconf = add_trigger(rpkg, request, reply);
    if(tconf) db_store_trigger(db, tconf);
  } else if (strcmp(command, "AddAction") == 0) {
    zclock_log("actions not implemented yet"); //TODO

  } else if (strcmp(command,"RemoveRule") == 0) {
    char * rule_id  = zmsg_popstr(request);
    // we always evaluate both, hence | usage rather than ||
    int found = remove_rule(rpkg->context, rpkg->triggers, rule_id) | 
                remove_rule(rpkg->context, rpkg->actions, rule_id);
    if(found) {
      // must also delete from local db.
      db_delete_action(db, rule_id);
      db_delete_trigger(db, rule_id);
      zmsg_pushstr(reply, "200");
    } else {
      // not there!
      zclock_log("Received delete trigger request for nonexistent rule %s, ignoring", rule_id);
      zmsg_pushstr(reply, "404");
      zmsg_pushstr(reply, "rule not found");      
    }
  } else if (strcmp(command, "AddMonitor")==0) {
    add_monitor(rpkg, reply);
  } else if (strcmp(command, "Service") == 0) {
    assert(zmsg_size(request) == 1);
    // TODO this is incomplete
    // services also have names
    char * name = zmsg_popstr(request);
    // char * service_pipe;
      
    // we _could_ just throw the request out into the ether, but
    // really, we want this to be a reply-request sort of deal.
    // otherwise, we have to contend with the same problem we have
    // with monitors: that they need to stay active.
    // let's set up a hash of pipes, and just have a worker for each
    // possible service.
    
    // problems: this _is_ synchronous for the channel involved.
    // this means we can't subsume monitors into it. probably ok for
    // now.
    //service_function * service_func;
    
    //    if ((service_func=zhash_lookup(config->services, name))) {
      // found it, let's execute
      // problem here is that we don't particularly want to wait for
      // the next update, even though it's probably within the next
      // 60th of a second.
      
      // what are our options?
      // 1. listen to line000X, wait, return
      // 2. spin off a thread with a reference to the request, let
      // it reply on our behalf... i think this probably doesn't
      // work, majordomo expects a response before it gives you more
      // work.
      // 3. cache current value somewhere. this is fast, but pretty
      // sketchy in synchronisation terms. it migh tbe ok, given
      // that it's explicitly just sampling.
    // char * result = service_func(); 
    //zmsg_pushstr(reply, result);
        //    } else {
      zclock_log("bad service %s", name);
      zmsg_pushstr(reply, "no such service");
    
    
  } else {
    zclock_log("Can't handle command %s: ignoring", command);
      zmsg_pushstr(reply, "bad command");
  }
  zmsg_destroy(&request);
}
示例#7
0
static void parse_request(char* req, int len) {
	char *start, *end;
	char *interceptor_name = NULL, proto_s[4] = { 0 }, addr_s[16] = { 0 },
			port_s[6] = { 0 }, ruleid_s[20] = {0};
	uint8_t ipproto = 0, filter_by = 0;
	uint32_t ruleid;
	__be32 daddr = 0, saddr = 0;
	__be16 dport = 0, sport = 0;
	filter_specs* sp;

	switch (req[0]) {
	case 'R':
		for (start = end = req + 2; *end != ':' && *end != '\0'; end++)
			;

		if (start == end) {
			printk("Unable to parse interceptor name for proc registry.\n");
			return;
		}

		interceptor_name = kmalloc(end - start + 1, GFP_ATOMIC);
		if (!interceptor_name) {
			printk(
					"%s in %s:%d: kmalloc failed. Unnable to create name for interceptor.\n",
					__FILE__, __FUNCTION__, __LINE__);
			return;
		}
		memset(interceptor_name, 0, end - start + 1);
		memcpy(interceptor_name, start, end - start);

		//protocol
		for (start = end = end + 1; *end != ':' && *end != '\0'; end++)
			;

		if (start != end) {
			memcpy(proto_s, start, end - start);
			ipproto = simple_strtol(proto_s, NULL, 10);
			filter_by |= FILTER_BY_L4_PROTO;
		}

		//destination address
		for (start = end = end + 1; *end != ':' && *end != '\0'; end++)
			;

		if (start != end) {
			memcpy(addr_s, start, end - start);
			daddr = simple_strtol(addr_s, NULL, 10);
			memset(addr_s, 0, 16);
			filter_by |= FILTER_BY_DST_ADDR;
		}

		//source address
		for (start = end = end + 1; *end != ':' && *end != '\0'; end++)
			;

		if (start != end) {
			memcpy(addr_s, start, end - start);
			saddr = simple_strtol(addr_s, NULL, 10);
			filter_by |= FILTER_BY_SRC_ADDR;
		}

		//destination port
		for (start = end = end + 1; *end != ':' && *end != '\0'; end++)
			;

		if (start != end) {
			memcpy(port_s, start, end - start);
			dport = simple_strtol(port_s, NULL, 10);
			memset(port_s, 0, 7);
			filter_by |= FILTER_BY_DST_PORT;
		}

		//source port
		for (start = end = end + 1; *end != ':' && *end != '\0'; end++)
			;

		if (start != end) {
			memcpy(port_s, start, end - start);
			sport = simple_strtol(port_s, NULL, 10);
			filter_by |= FILTER_BY_SRC_PORT;
		}

		sp = create_filter_specs(filter_by, daddr, saddr, dport, sport, ipproto);

		if (!create_rule(interceptor_name, sp))
			printk("Proc registry could not create rule. Create rule failed.\n");
		break;
	case 'U':
		for (start = end = req + 2; *end != ':' && *end != '\0'; end++)
			;
		if(start == end){
			printk("Proc registry could not get rule id.\n");
			break;
		}

		memcpy(ruleid_s, start, end - start);
		ruleid = simple_strtol(ruleid_s, NULL, 10);

		remove_rule(ruleid);
		break;
	default:
		printk("Unknown request to proc registry.\n");
	}
	return;
}