Bladeren bron

Merge pull request #1399 from tverlaan/dispatcher_update_state_all

Dispatcher set_state "all"
Daniel-Constantin Mierla 7 jaren geleden
bovenliggende
commit
9c6436bd52

+ 33 - 0
src/modules/dispatcher/dispatch.c

@@ -2605,6 +2605,39 @@ int ds_reinit_state(int group, str *address, int state)
 	return -1;
 }
 
+/**
+ *
+ */
+int ds_reinit_state_all(int group, int state)
+{
+	int i = 0;
+	ds_set_t *idx = NULL;
+
+	if(_ds_list == NULL || _ds_list_nr <= 0) {
+		LM_ERR("the list is null\n");
+		return -1;
+	}
+
+	/* get the index of the set */
+	if(ds_get_index(group, *crt_idx, &idx) != 0) {
+		LM_ERR("destination set [%d] not found\n", group);
+		return -1;
+	}
+
+	for(i = 0; i < idx->nr; i++) {
+		int old_state = idx->dlist[i].flags;
+		/* reset the bits used for states */
+		idx->dlist[i].flags &= ~(DS_STATES_ALL);
+		/* set the new states */
+		idx->dlist[i].flags |= state;
+		if(idx->dlist[i].attrs.rweight > 0) {
+			ds_reinit_rweight_on_state_change(
+					old_state, idx->dlist[i].flags, idx);
+		}
+	}
+	return 0;
+}
+
 /**
  *
  */

+ 1 - 0
src/modules/dispatcher/dispatch.h

@@ -115,6 +115,7 @@ int ds_select_dst(struct sip_msg *msg, int set, int alg, int mode);
 int ds_next_dst(struct sip_msg *msg, int mode);
 int ds_update_state(sip_msg_t *msg, int group, str *address, int state);
 int ds_reinit_state(int group, str *address, int state);
+int ds_reinit_state_all(int group, int state);
 int ds_mark_dst(struct sip_msg *msg, int mode);
 int ds_print_list(FILE *fout);
 int ds_log_sets(void);

+ 7 - 3
src/modules/dispatcher/dispatcher.c

@@ -1360,9 +1360,13 @@ static void dispatcher_rpc_set_state(rpc_t *rpc, void *ctx)
 		return;
 	}
 
-	if(ds_reinit_state(group, &dest, stval) < 0) {
-		rpc->fault(ctx, 500, "State Update Failed");
-		return;
+	if(strcmp(dest.s, "all") == 0) {
+		ds_reinit_state_all(group, stval);
+	} else {
+		if(ds_reinit_state(group, &dest, stval) < 0) {
+			rpc->fault(ctx, 500, "State Update Failed");
+			return;
+		}
 	}
 
 	return;

+ 3 - 1
src/modules/dispatcher/doc/dispatcher_admin.xml

@@ -1511,7 +1511,8 @@ onreply_route {
 
 			<listitem><para>_group_: destination group id</para></listitem>
 
-			<listitem><para>_address_: address of the destination in the _group_</para></listitem>
+			<listitem><para>_address_: address of the destination in the _group_
+					or 'all' to update all destinations in the group</para></listitem>
 		</itemizedlist>
 		<para>
 		Example:
@@ -1520,6 +1521,7 @@ onreply_route {
 ...
 # prototype: &sercmd; dispatcher.set_state _state_ _group_ _address_
 &sercmd; dispatcher.set_state ip 2 sip:127.0.0.1:5080
+&sercmd; dispatcher.set_state ip 3 all
 ...
 </programlisting>
     </section>