diff --git a/include/maxscale/listener.h b/include/maxscale/listener.h index 7b040117e..71ff7236c 100644 --- a/include/maxscale/listener.h +++ b/include/maxscale/listener.h @@ -121,4 +121,13 @@ SERV_LISTENER* listener_iterator_init(const struct service* service, LISTENER_IT */ SERV_LISTENER* listener_iterator_next(LISTENER_ITERATOR* iter); +/** + * Get listener state as a string + * + * @param listener Listener to inspect + * + * @return State of the listener as a string + */ +const char* listener_state_to_string(const SERV_LISTENER* listener); + MXS_END_DECLS diff --git a/maxctrl/lib/list.js b/maxctrl/lib/list.js index 7e85c914f..9d2347e7b 100644 --- a/maxctrl/lib/list.js +++ b/maxctrl/lib/list.js @@ -104,7 +104,8 @@ exports.builder = function(yargs) { return getSubCollection(host, 'services/' + argv.service, 'attributes.listeners', [ {'Name': 'id'}, {'Port': 'attributes.parameters.port'}, - {'Host': 'attributes.parameters.host'} + {'Host': 'attributes.parameters.host'}, + {'State': 'attributes.state'} ]) }) }) diff --git a/server/core/listener.cc b/server/core/listener.cc index 3f658478a..376f6d330 100644 --- a/server/core/listener.cc +++ b/server/core/listener.cc @@ -527,6 +527,7 @@ json_t* listener_to_json(const SERV_LISTENER* listener) } json_t* attr = json_object(); + json_object_set_new(attr, CN_STATE, json_string(listener_state_to_string(listener))); json_object_set_new(attr, CN_PARAMETERS, param); if (listener->listener->authfunc.diagnostic_json) @@ -540,9 +541,9 @@ json_t* listener_to_json(const SERV_LISTENER* listener) } json_t* rval = json_object(); - json_object_set_new(rval, CN_ATTRIBUTES, attr); json_object_set_new(rval, CN_ID, json_string(listener->name)); json_object_set_new(rval, CN_TYPE, json_string(CN_LISTENERS)); + json_object_set_new(rval, CN_ATTRIBUTES, attr); return rval; } @@ -580,3 +581,28 @@ SERV_LISTENER* listener_iterator_next(LISTENER_ITERATOR* iter) return iter->current; } + +const char* listener_state_to_string(const SERV_LISTENER* listener) +{ + ss_dassert(listener); + + if (listener->listener && listener->listener->session) + { + switch (listener->listener->session->state) + { + case SESSION_STATE_LISTENER_STOPPED: + return "Stopped"; + + case SESSION_STATE_LISTENER: + return "Running"; + + default: + ss_dassert(!true); + return "Unknown"; + } + } + else + { + return "Failed"; + } +} diff --git a/server/core/service.cc b/server/core/service.cc index 2a1bdc9ee..98ca5c0a9 100644 --- a/server/core/service.cc +++ b/server/core/service.cc @@ -1626,10 +1626,7 @@ dListListeners(DCB *dcb) listener->name, service->name, listener->protocol, (listener && listener->address) ? listener->address : "*", listener->port, - (!listener->listener || - !listener->listener->session || - listener->listener->session->state == SESSION_STATE_LISTENER_STOPPED) ? - "Stopped" : "Running"); + listener_state_to_string(listener)); } } service = service->next; @@ -2099,10 +2096,7 @@ serviceListenerRowCallback(RESULTSET *set, void *data) resultset_row_set(row, 2, (lptr && lptr->address) ? lptr->address : "*"); sprintf(buf, "%d", lptr->port); resultset_row_set(row, 3, buf); - resultset_row_set(row, 4, - (!lptr->listener || !lptr->listener->session || - lptr->listener->session->state == SESSION_STATE_LISTENER_STOPPED) ? - "Stopped" : "Running"); + resultset_row_set(row, 4, listener_state_to_string(lptr)); spinlock_release(&service_spin); return row; }