mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
Adding "time" rpcclient command which displays the remote time.
Also added special "now" time to the "at" command, e.g.:
at now /i cmd ; pops up a command prompt
(This used to be commit f456dcf08e
)
This commit is contained in:
parent
89d51caba5
commit
e3a888d5a9
@ -1914,6 +1914,8 @@ BOOL do_srv_net_srv_file_enum(struct cli_state *cli, uint16 fnum,
|
||||
ENUM_HND *hnd);
|
||||
BOOL do_srv_net_srv_get_info(struct cli_state *cli, uint16 fnum,
|
||||
char *server_name, uint32 switch_value, SRV_INFO_CTR *ctr);
|
||||
BOOL do_srv_net_remote_tod(struct cli_state *cli, uint16 fnum,
|
||||
char *server_name, TIME_OF_DAY_INFO *tod);
|
||||
|
||||
/*The following definitions come from rpc_client/cli_svcctl.c */
|
||||
|
||||
@ -2856,6 +2858,7 @@ void srv_io_q_net_srv_get_info(char *desc, SRV_Q_NET_SRV_GET_INFO *q_n, prs_str
|
||||
void make_srv_r_net_srv_get_info(SRV_R_NET_SRV_GET_INFO *srv,
|
||||
uint32 switch_value, SRV_INFO_CTR *ctr, uint32 status);
|
||||
void srv_io_r_net_srv_get_info(char *desc, SRV_R_NET_SRV_GET_INFO *r_n, prs_struct *ps, int depth);
|
||||
void make_srv_q_net_remote_tod(SRV_Q_NET_REMOTE_TOD *q_t, char *server_name);
|
||||
void srv_io_q_net_remote_tod(char *desc, SRV_Q_NET_REMOTE_TOD *q_n, prs_struct *ps, int depth);
|
||||
void make_time_of_day_info(TIME_OF_DAY_INFO *tod, uint32 elapsedt, uint32 msecs,
|
||||
uint32 hours, uint32 mins, uint32 secs, uint32 hunds,
|
||||
@ -3076,6 +3079,7 @@ void cmd_srv_enum_conn(struct client_info *info);
|
||||
void cmd_srv_enum_shares(struct client_info *info);
|
||||
void cmd_srv_enum_sess(struct client_info *info);
|
||||
void cmd_srv_enum_files(struct client_info *info);
|
||||
void cmd_time(struct client_info *info);
|
||||
|
||||
/*The following definitions come from rpcclient/cmd_svcctl.c */
|
||||
|
||||
|
@ -409,3 +409,59 @@ BOOL do_srv_net_srv_get_info(struct cli_state *cli, uint16 fnum,
|
||||
return valid_info;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
get server time
|
||||
****************************************************************************/
|
||||
BOOL do_srv_net_remote_tod(struct cli_state *cli, uint16 fnum,
|
||||
char *server_name, TIME_OF_DAY_INFO *tod)
|
||||
{
|
||||
prs_struct data;
|
||||
prs_struct rdata;
|
||||
SRV_Q_NET_REMOTE_TOD q_t;
|
||||
BOOL valid_info = False;
|
||||
|
||||
if (server_name == NULL || tod == NULL) return False;
|
||||
|
||||
prs_init(&data , 1024, 4, SAFETY_MARGIN, False);
|
||||
prs_init(&rdata, 0 , 4, SAFETY_MARGIN, True );
|
||||
|
||||
/* create and send a MSRPC command with api SRV_NET_REMOTE_TOD */
|
||||
|
||||
DEBUG(4,("SRV Remote TOD (%s)\n", server_name));
|
||||
|
||||
/* store the parameters */
|
||||
make_srv_q_net_remote_tod(&q_t, server_name);
|
||||
|
||||
/* turn parameters into data stream */
|
||||
srv_io_q_net_remote_tod("", &q_t, &data, 0);
|
||||
|
||||
/* send the data on \PIPE\ */
|
||||
if (rpc_api_pipe_req(cli, fnum, SRV_NET_REMOTE_TOD, &data, &rdata))
|
||||
{
|
||||
SRV_R_NET_REMOTE_TOD r_t;
|
||||
BOOL p;
|
||||
|
||||
r_t.tod = tod;
|
||||
|
||||
srv_io_r_net_remote_tod("", &r_t, &rdata, 0);
|
||||
p = rdata.offset != 0;
|
||||
p = rdata.offset != 0;
|
||||
|
||||
if (p && r_t.status != 0)
|
||||
{
|
||||
/* report error code */
|
||||
DEBUG(0,("SRV_R_NET_REMOTE_TOD: %s\n", get_nt_error_msg(r_t.status)));
|
||||
p = False;
|
||||
}
|
||||
|
||||
if (p)
|
||||
{
|
||||
valid_info = True;
|
||||
}
|
||||
}
|
||||
|
||||
prs_mem_free(&data );
|
||||
prs_mem_free(&rdata );
|
||||
|
||||
return valid_info;
|
||||
}
|
||||
|
@ -1459,6 +1459,17 @@ void srv_io_r_net_srv_get_info(char *desc, SRV_R_NET_SRV_GET_INFO *r_n, prs_str
|
||||
prs_uint32("status ", ps, depth, &(r_n->status ));
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
makes a SRV_Q_NET_REMOTE_TOD structure.
|
||||
********************************************************************/
|
||||
void make_srv_q_net_remote_tod(SRV_Q_NET_REMOTE_TOD *q_t, char *server_name)
|
||||
{
|
||||
if (q_t == NULL) return;
|
||||
|
||||
DEBUG(5,("make_srv_q_net_remote_tod\n"));
|
||||
|
||||
make_buf_unistr2(&(q_t->uni_srv_name), &(q_t->ptr_srv_name), server_name);
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
reads or writes a structure.
|
||||
|
@ -43,7 +43,6 @@ checks for a /OPTION:param style option
|
||||
static BOOL checkopt(char *input, char *optname, char **params)
|
||||
{
|
||||
char *inend;
|
||||
int i, len;
|
||||
|
||||
if (*input++ != '/')
|
||||
return False;
|
||||
@ -85,7 +84,7 @@ static BOOL at_parse_days(char *str, uint32 *monthdays, uint8 *weekdays)
|
||||
*nexttok++ = 0;
|
||||
}
|
||||
|
||||
if (isdigit(*tok))
|
||||
if (isdigit((int)*tok))
|
||||
{
|
||||
day = strtol(tok, NULL, 10);
|
||||
if (day == 0 || day > 31)
|
||||
@ -131,6 +130,38 @@ static BOOL at_parse_days(char *str, uint32 *monthdays, uint8 *weekdays)
|
||||
return True;
|
||||
}
|
||||
|
||||
#define SOON_OFFSET 2 /* seconds */
|
||||
|
||||
/****************************************************************************
|
||||
schedule the job 'soon'
|
||||
****************************************************************************/
|
||||
static BOOL at_soon(char *dest_srv, uint32 *hours, uint32 *minutes, uint32 *seconds)
|
||||
{
|
||||
uint16 nt_pipe_fnum;
|
||||
TIME_OF_DAY_INFO tod;
|
||||
BOOL res = True;
|
||||
|
||||
/* open srvsvc session. */
|
||||
res = res ? cli_nt_session_open(smb_cli, PIPE_SRVSVC, &nt_pipe_fnum) : False;
|
||||
|
||||
/* enumerate files on server */
|
||||
res = res ? do_srv_net_remote_tod(smb_cli, nt_pipe_fnum,
|
||||
dest_srv, &tod) : False;
|
||||
|
||||
/* Close the session */
|
||||
cli_nt_session_close(smb_cli, nt_pipe_fnum);
|
||||
|
||||
if (res)
|
||||
{
|
||||
*hours = (tod.hours - ((int)tod.zone/60)) % 24;
|
||||
*minutes = tod.mins;
|
||||
*seconds = (tod.secs + SOON_OFFSET) % 60;
|
||||
return True;
|
||||
}
|
||||
|
||||
return False;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
scheduler add job
|
||||
@ -168,28 +199,36 @@ void cmd_at(struct client_info *info)
|
||||
if (*p == 0) /* Entirely numeric field */
|
||||
continue;
|
||||
|
||||
if ((p == temp) || (sscanf(temp, "%d:%d:%d",
|
||||
&hours, &minutes, &seconds) < 2))
|
||||
if (!strcasecmp(temp, "NOW"))
|
||||
{
|
||||
printf("at { time [/INTERACTIVE] [{/EVERY|/NEXT}:5,Sun,...] command | [/DEL] [jobid] }\n\n");
|
||||
return;
|
||||
if (!at_soon(dest_wks, &hours, &minutes, &seconds))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
p = strchr(temp, 0);
|
||||
|
||||
if (!strcasecmp(p-2, "AM"))
|
||||
else if (sscanf(temp, "%d:%d:%d", &hours, &minutes, &seconds) > 2)
|
||||
{
|
||||
hours = (hours == 12) ? 0 : hours;
|
||||
}
|
||||
p = strchr(temp, 0);
|
||||
|
||||
if (!strcasecmp(p-2, "PM"))
|
||||
{
|
||||
hours = (hours == 12) ? 12 : hours + 12;
|
||||
}
|
||||
if (!strcasecmp(p-2, "AM"))
|
||||
{
|
||||
hours = (hours == 12) ? 0 : hours;
|
||||
}
|
||||
|
||||
if (hours > 23 || minutes > 59 || seconds > 59)
|
||||
if (!strcasecmp(p-2, "PM"))
|
||||
{
|
||||
hours = (hours == 12) ? 12 : hours + 12;
|
||||
}
|
||||
|
||||
if (hours > 23 || minutes > 59 || seconds > 59)
|
||||
{
|
||||
printf("\tInvalid time.\n\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\tInvalid time.\n\n");
|
||||
printf("at { {time | NOW} [/INTERACTIVE] [{/EVERY|/NEXT}:5,Sun,...] command\n\t| [/DEL] [jobid] }\n\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -331,3 +331,44 @@ void cmd_srv_enum_files(struct client_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
display remote time
|
||||
****************************************************************************/
|
||||
void cmd_time(struct client_info *info)
|
||||
{
|
||||
uint16 nt_pipe_fnum;
|
||||
fstring dest_srv;
|
||||
TIME_OF_DAY_INFO tod;
|
||||
BOOL res = True;
|
||||
|
||||
fstrcpy(dest_srv, "\\\\");
|
||||
fstrcat(dest_srv, info->dest_host);
|
||||
strupper(dest_srv);
|
||||
|
||||
DEBUG(4,("cmd_time: server:%s\n", dest_srv));
|
||||
|
||||
/* open srvsvc session. */
|
||||
res = res ? cli_nt_session_open(smb_cli, PIPE_SRVSVC, &nt_pipe_fnum) : False;
|
||||
|
||||
/* enumerate files on server */
|
||||
res = res ? do_srv_net_remote_tod(smb_cli, nt_pipe_fnum,
|
||||
dest_srv, &tod) : False;
|
||||
|
||||
if (res)
|
||||
{
|
||||
fprintf(out_hnd, "\tRemote Time:\t%s\n\n",
|
||||
http_timestring(tod.elapsedt));
|
||||
}
|
||||
|
||||
/* Close the session */
|
||||
cli_nt_session_close(smb_cli, nt_pipe_fnum);
|
||||
|
||||
if (res)
|
||||
{
|
||||
DEBUG(5,("cmd_srv_enum_files: query succeeded\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG(5,("cmd_srv_enum_files: query failed\n"));
|
||||
}
|
||||
}
|
||||
|
@ -1662,12 +1662,12 @@ void display_svc_info(FILE *out_hnd, enum action_type action, ENUM_SRVC_STATUS *
|
||||
}
|
||||
}
|
||||
|
||||
static char *get_at_time_str(uint32 time)
|
||||
static char *get_at_time_str(uint32 t)
|
||||
{
|
||||
static fstring timestr;
|
||||
unsigned int hours, minutes, seconds;
|
||||
|
||||
hours = time / 1000;
|
||||
hours = t / 1000;
|
||||
seconds = hours % 60;
|
||||
hours /= 60;
|
||||
minutes = hours % 60;
|
||||
|
@ -107,6 +107,7 @@ struct
|
||||
{
|
||||
{"svcenum", cmd_svc_enum, "[-i] Lists Services Manager"},
|
||||
{"at", cmd_at, "Scheduler control (at /? for syntax)"},
|
||||
{"time", cmd_time, "Display remote time"},
|
||||
{"regenum", cmd_reg_enum, "<keyname> Registry Enumeration (keys, values)"},
|
||||
{"regdeletekey",cmd_reg_delete_key, "<keyname> Registry Key Delete"},
|
||||
{"regcreatekey",cmd_reg_create_key, "<keyname> [keyclass] Registry Key Create"},
|
||||
|
Loading…
Reference in New Issue
Block a user