mirror of
https://github.com/samba-team/samba.git
synced 2025-03-05 20:58:40 +03:00
smbstatus: add a sessions dictionary
Adds an empty json dictionary under the key "sessions" and adds foreach session a dictionary with information to the session dictionary. Uses the session_id as key. uid_str and gid_str are needed because both receive their own JSON field. Only print to stdout, if json_output is not set. Signed-off-by: Jule Anger <janger@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org>
This commit is contained in:
parent
1abae1c255
commit
836fd468c0
@ -584,11 +584,14 @@ static int traverse_sessionid_stdout(struct traverse_state *state,
|
|||||||
|
|
||||||
static int prepare_sessionid(struct traverse_state *state)
|
static int prepare_sessionid(struct traverse_state *state)
|
||||||
{
|
{
|
||||||
/* always print header line */
|
if (!state->json_output) {
|
||||||
d_printf("\nSamba version %s\n",samba_version_string());
|
/* always print header line */
|
||||||
d_printf("%-7s %-12s %-12s %-41s %-17s %-20s %-21s\n", "PID", "Username", "Group", "Machine", "Protocol Version", "Encryption", "Signing");
|
d_printf("\nSamba version %s\n",samba_version_string());
|
||||||
d_printf("----------------------------------------------------------------------------------------------------------------------------------------\n");
|
d_printf("%-7s %-12s %-12s %-41s %-17s %-20s %-21s\n", "PID", "Username", "Group", "Machine", "Protocol Version", "Encryption", "Signing");
|
||||||
|
d_printf("----------------------------------------------------------------------------------------------------------------------------------------\n");
|
||||||
|
} else {
|
||||||
|
add_section_to_json(state, "sessions");
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -597,6 +600,8 @@ static int traverse_sessionid(const char *key, struct sessionid *session,
|
|||||||
void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
fstring uid_gid_str;
|
fstring uid_gid_str;
|
||||||
|
fstring uid_str;
|
||||||
|
fstring gid_str;
|
||||||
struct server_id_buf tmp;
|
struct server_id_buf tmp;
|
||||||
char *machine_hostname = NULL;
|
char *machine_hostname = NULL;
|
||||||
int result = 0;
|
int result = 0;
|
||||||
@ -621,6 +626,8 @@ static int traverse_sessionid(const char *key, struct sessionid *session,
|
|||||||
Ucrit_addPid(session->pid);
|
Ucrit_addPid(session->pid);
|
||||||
|
|
||||||
if (numeric_only) {
|
if (numeric_only) {
|
||||||
|
fstr_sprintf(gid_str, "%u", (unsigned int)session->gid);
|
||||||
|
fstr_sprintf(uid_str, "%u", (unsigned int)session->uid);
|
||||||
fstr_sprintf(uid_gid_str, "%-12u %-12u",
|
fstr_sprintf(uid_gid_str, "%-12u %-12u",
|
||||||
(unsigned int)session->uid,
|
(unsigned int)session->uid,
|
||||||
(unsigned int)session->gid);
|
(unsigned int)session->gid);
|
||||||
@ -630,6 +637,8 @@ static int traverse_sessionid(const char *key, struct sessionid *session,
|
|||||||
* The session is not fully authenticated yet.
|
* The session is not fully authenticated yet.
|
||||||
*/
|
*/
|
||||||
fstrcpy(uid_gid_str, "(auth in progress)");
|
fstrcpy(uid_gid_str, "(auth in progress)");
|
||||||
|
fstrcpy(gid_str, "(auth in progress)");
|
||||||
|
fstrcpy(uid_str, "(auth in progress)");
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* In theory it should not happen that one of
|
* In theory it should not happen that one of
|
||||||
@ -654,6 +663,8 @@ static int traverse_sessionid(const char *key, struct sessionid *session,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fstr_sprintf(gid_str, "%s", gid_name);
|
||||||
|
fstr_sprintf(uid_str, "%s", uid_name);
|
||||||
fstr_sprintf(uid_gid_str, "%-12s %-12s",
|
fstr_sprintf(uid_gid_str, "%-12s %-12s",
|
||||||
uid_name, gid_name);
|
uid_name, gid_name);
|
||||||
}
|
}
|
||||||
@ -722,15 +733,23 @@ static int traverse_sessionid(const char *key, struct sessionid *session,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
traverse_sessionid_stdout(state,
|
if (!state->json_output) {
|
||||||
server_id_str_buf(session->pid, &tmp),
|
traverse_sessionid_stdout(state,
|
||||||
uid_gid_str,
|
server_id_str_buf(session->pid, &tmp),
|
||||||
machine_hostname,
|
uid_gid_str,
|
||||||
session_dialect_str(session->connection_dialect),
|
machine_hostname,
|
||||||
encryption,
|
session_dialect_str(session->connection_dialect),
|
||||||
encryption_degree,
|
encryption,
|
||||||
signing,
|
encryption_degree,
|
||||||
signing_degree);
|
signing,
|
||||||
|
signing_degree);
|
||||||
|
} else {
|
||||||
|
result = traverse_sessionid_json(state,
|
||||||
|
session,
|
||||||
|
uid_str,
|
||||||
|
gid_str,
|
||||||
|
session_dialect_str(session->connection_dialect));
|
||||||
|
}
|
||||||
|
|
||||||
TALLOC_FREE(machine_hostname);
|
TALLOC_FREE(machine_hostname);
|
||||||
TALLOC_FREE(tmp_ctx);
|
TALLOC_FREE(tmp_ctx);
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "smbprofile.h"
|
#include "smbprofile.h"
|
||||||
#include "lib/util/time_basic.h"
|
#include "lib/util/time_basic.h"
|
||||||
#include "conn_tdb.h"
|
#include "conn_tdb.h"
|
||||||
|
#include "session.h"
|
||||||
#include "status_json.h"
|
#include "status_json.h"
|
||||||
#include "../libcli/security/security.h"
|
#include "../libcli/security/security.h"
|
||||||
#include "status.h"
|
#include "status.h"
|
||||||
@ -262,3 +263,81 @@ failure:
|
|||||||
TALLOC_FREE(tmp_ctx);
|
TALLOC_FREE(tmp_ctx);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int traverse_sessionid_json(struct traverse_state *state,
|
||||||
|
struct sessionid *session,
|
||||||
|
char *uid_str,
|
||||||
|
char *gid_str,
|
||||||
|
const char *connection_dialect)
|
||||||
|
{
|
||||||
|
struct json_object sub_json;
|
||||||
|
struct json_object session_json;
|
||||||
|
int result = 0;
|
||||||
|
char *id_str = NULL;
|
||||||
|
|
||||||
|
TALLOC_CTX *tmp_ctx = talloc_stackframe();
|
||||||
|
if (tmp_ctx == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub_json = json_new_object();
|
||||||
|
if (json_is_invalid(&sub_json)) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
session_json = json_get_object(&state->root_json, "sessions");
|
||||||
|
if (json_is_invalid(&session_json)) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
id_str = talloc_asprintf(tmp_ctx, "%u", session->id_num);
|
||||||
|
result = json_add_string(&sub_json, "session_id", id_str);
|
||||||
|
if (result < 0) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
result = json_add_int(&sub_json, "uid", session->uid);
|
||||||
|
if (result < 0) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
result = json_add_int(&sub_json, "gid", session->gid);
|
||||||
|
if (result < 0) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
result = json_add_string(&sub_json, "username", uid_str);
|
||||||
|
if (result < 0) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
result = json_add_string(&sub_json, "groupname", gid_str);
|
||||||
|
if (result < 0) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
result = json_add_string(&sub_json, "remote_machine", session->remote_machine);
|
||||||
|
if (result < 0) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
result = json_add_string(&sub_json, "hostname", session->hostname);
|
||||||
|
if (result < 0) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
result = json_add_string(&sub_json, "session_dialect", connection_dialect);
|
||||||
|
if (result < 0) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = json_add_object(&session_json, id_str, &sub_json);
|
||||||
|
if (result < 0) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = json_update_object(&state->root_json, "sessions", &session_json);
|
||||||
|
if (result < 0) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
TALLOC_FREE(tmp_ctx);
|
||||||
|
return 0;
|
||||||
|
failure:
|
||||||
|
json_free(&sub_json);
|
||||||
|
TALLOC_FREE(tmp_ctx);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@ -34,4 +34,10 @@ int traverse_connections_json(struct traverse_state *state,
|
|||||||
const char *signing_cipher,
|
const char *signing_cipher,
|
||||||
enum crypto_degree signing_degree);
|
enum crypto_degree signing_degree);
|
||||||
|
|
||||||
|
int traverse_sessionid_json(struct traverse_state *state,
|
||||||
|
struct sessionid *session,
|
||||||
|
char *uid_str,
|
||||||
|
char *gid_str,
|
||||||
|
const char *connection_dialect);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -44,3 +44,12 @@ int traverse_connections_json(struct traverse_state *state,
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int traverse_sessionid_json(struct traverse_state *state,
|
||||||
|
struct sessionid *session,
|
||||||
|
char *uid_str,
|
||||||
|
char *gid_str,
|
||||||
|
const char *connection_dialect)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user