diff options
Diffstat (limited to 'cli/src')
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 35 | ||||
| -rw-r--r-- | cli/src/cli-xml-output.c | 114 | ||||
| -rw-r--r-- | cli/src/cli.h | 4 | 
3 files changed, 148 insertions, 5 deletions
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index a1a243b7332..a7de5bb59b1 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -306,6 +306,7 @@ gf_cli_list_friends_cbk (struct rpc_req *req, struct iovec *iov,          int32_t                    port = 0;          int32_t                    connected = 0;          char                       *connected_str = NULL; +        char                       msg[1024] = {0,};          if (-1 == req->rpc_status) {                  goto out; @@ -327,7 +328,21 @@ gf_cli_list_friends_cbk (struct rpc_req *req, struct iovec *iov,          if (!rsp.op_ret) {                  if (!rsp.friends.friends_len) { -                        cli_err ("peer status: No peers present"); +                        snprintf (msg, sizeof (msg), +                                  "peer status: No peers present"); +#if (HAVE_LIB_XML) +                        if (global_state->mode & GLUSTER_MODE_XML) { +                                ret = cli_xml_output_peer_status (dict, +                                                                  rsp.op_ret, +                                                                  rsp.op_errno, +                                                                  msg); +                                if (ret) +                                        gf_log ("cli", GF_LOG_ERROR, +                                                "Error outputting to xml"); +                                goto out; +                        } +#endif +                        cli_err ("%s", msg);                          ret = 0;                          goto out;                  } @@ -351,9 +366,8 @@ gf_cli_list_friends_cbk (struct rpc_req *req, struct iovec *iov,  #if (HAVE_LIB_XML)                  if (global_state->mode & GLUSTER_MODE_XML) { -                        ret = cli_xml_output_dict ("peerStatus", dict, -                                                   rsp.op_ret, rsp.op_errno, -                                                   NULL); +                        ret = cli_xml_output_peer_status (dict, rsp.op_ret, +                                                          rsp.op_errno, msg);                          if (ret)                                  gf_log ("cli", GF_LOG_ERROR,                                          "Error outputting to xml"); @@ -411,7 +425,18 @@ gf_cli_list_friends_cbk (struct rpc_req *req, struct iovec *iov,                          i++;                  }          } else { -                ret = -1; +#if (HAVE_LIB_XML) +                if (global_state->mode & GLUSTER_MODE_XML) { +                        ret = cli_xml_output_peer_status (dict, rsp.op_ret, +                                                          rsp.op_errno, NULL); +                        if (ret) +                                gf_log ("cli", GF_LOG_ERROR, +                                        "Error outputting to xml"); +                } else +#endif +                { +                        ret = -1; +                }                  goto out;          } diff --git a/cli/src/cli-xml-output.c b/cli/src/cli-xml-output.c index 419cae20a16..6969553d857 100644 --- a/cli/src/cli-xml-output.c +++ b/cli/src/cli-xml-output.c @@ -2498,4 +2498,118 @@ out:          return ret;  } +int +cli_xml_output_peer_status (dict_t *dict, int op_ret, int op_errno, +                            char *op_errstr) +{ +        int                     ret = -1; +        xmlTextWriterPtr        writer = NULL; +        xmlBufferPtr            buf = NULL; +        int                     count = 0; +        char                    *uuid = NULL; +        char                    *hostname = NULL; +        int                     connected = 0; +        char                    *state = NULL; +        int                     port = 0; +        int                     i = 1; +        char                    key[1024] = {0,}; + +        ret = cli_begin_xml_output (&writer, &buf); +        if (ret) +                goto out; + +        ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); +        if (ret) +                goto out; + +        /* <peerStatus> */ +        ret = xmlTextWriterStartElement (writer, (xmlChar *)"peerStatus"); +        XML_RET_CHECK_AND_GOTO (ret, out); + +        if (!dict) +                goto cont; + +        ret = dict_get_int32 (dict, "count", &count); +        if (ret) +                goto out; + +        while (i <= count) { +                /* <peer> */ +                ret = xmlTextWriterStartElement (writer, (xmlChar *)"peer"); +                XML_RET_CHECK_AND_GOTO (ret, out); + +                memset (key, 0, sizeof (key)); +                snprintf (key, sizeof (key), "friend%d.uuid", i); +                ret = dict_get_str (dict, key, &uuid); +                if (ret) +                        goto out; + +                ret = xmlTextWriterWriteFormatElement (writer, +                                                       (xmlChar *)"uuid", +                                                       "%s", uuid); +                XML_RET_CHECK_AND_GOTO (ret, out); + +                memset (key, 0, sizeof (key)); +                snprintf (key, sizeof (key), "friend%d.hostname", i); +                ret = dict_get_str (dict, key, &hostname); +                if (ret) +                        goto out; + +                ret = xmlTextWriterWriteFormatElement (writer, +                                                       (xmlChar *)"hostname", +                                                       "%s", hostname); +                XML_RET_CHECK_AND_GOTO (ret, out); + +                memset (key, 0, sizeof (key)); +                snprintf (key, sizeof (key), "friend%d.connected", i); +                ret = dict_get_int32 (dict, key, &connected); +                if (ret) +                        goto out; + +                ret = xmlTextWriterWriteFormatElement (writer, +                                                       (xmlChar *)"connected", +                                                       "%d", connected); +                XML_RET_CHECK_AND_GOTO (ret, out); + +                memset (key, 0, sizeof (key)); +                snprintf (key, sizeof (key), "friend%d.state", i); +                ret = dict_get_str (dict, key, &state); +                if (ret) +                        goto out; + +                ret = xmlTextWriterWriteFormatElement (writer, +                                                       (xmlChar *)"state", +                                                       "%s", state); +                XML_RET_CHECK_AND_GOTO (ret, out); + +                memset (key, 0, sizeof (key)); +                snprintf (key, sizeof (key), "friend%d.port", i); +                ret = dict_get_int32 (dict, key, &port); +                if (port != 0) { +                        ret = xmlTextWriterWriteFormatElement +                                (writer, (xmlChar *)"port", "%d", port); +                        XML_RET_CHECK_AND_GOTO (ret, out); + +                        port = 0; +                } + +                /* </peer> */ +                ret = xmlTextWriterEndElement (writer); +                XML_RET_CHECK_AND_GOTO (ret, out); + +                i++; +        } + +cont: +        /* </peerStatus> */ +        ret = xmlTextWriterEndElement (writer); +        XML_RET_CHECK_AND_GOTO (ret, out); + +        ret = cli_end_xml_output (writer, buf); + +out: +        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); +        return ret; +} +  #endif diff --git a/cli/src/cli.h b/cli/src/cli.h index 76b92e91d47..fe5e6d75043 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -332,6 +332,10 @@ int  cli_xml_output_vol_quota_limit_list (char *volname, char *limit_list,                                        int op_ret, int op_errno,                                        char *op_errstr); + +int +cli_xml_output_peer_status (dict_t *dict, int op_ret, int op_errno, +                            char *op_errstr);  #endif  #endif /* __CLI_H__ */  | 
