#include "libmsrpc.h"
#include "test_util.h"
int main(int argc, char **argv) {
CacServerHandle *hnd = NULL;
TALLOC_CTX *mem_ctx = NULL;
struct SvcOpenScm sos;
struct SvcEnumServices es;
struct SvcOpenService os;
struct SvcGetStatus gs;
struct SvcStartService start;
struct SvcStopService stop;
struct SvcPauseService pause;
struct SvcContinueService res;
struct SvcGetDisplayName gdn;
struct SvcGetServiceConfig sgc;
POLICY_HND *svc_hnd = NULL;
fstring tmp;
fstring input;
int i;
mem_ctx = talloc_init("cac_samgroup");
hnd = cac_NewServerHandle(True);
cac_SetAuthDataFn(hnd, cactest_GetAuthDataFn);
cac_parse_cmd_line(argc, argv, hnd);
if(!cac_Connect(hnd, NULL)) {
fprintf(stderr, "Could not connect to server %s. Error: %s\n", hnd->server, nt_errstr(hnd->status));
exit(-1);
}
ZERO_STRUCT(sos);
sos.in.access = SC_MANAGER_ALL_ACCESS;
if(!cac_SvcOpenScm(hnd, mem_ctx, &sos)) {
fprintf(stderr, "Could not open SCM. Error: %s\n", nt_errstr(hnd->status));
goto done;
}
printf("Opened SCM\n");
tmp[0] = 0x00;
while(tmp[0] != 'q') {
printf("\n");
printf("[e] Enum Services\n");
printf("[o] Open Service\n");
printf("[x] Close Service\n");
printf("[g] Get service status\n");
printf("[s] Start service\n");
printf("[t] Stop service\n");
printf("[p] Pause service\n");
printf("[r] Resume service\n");
printf("[c] Get service config\n");
printf("[d] Get display name\n");
printf("[q]uit\n\n");
printf("Enter option: ");
cactest_readline(stdin, tmp);
printf("\n");
switch(tmp[0]) {
case 'e':
ZERO_STRUCT(es);
es.in.scm_hnd = sos.out.scm_hnd;
if(!cac_SvcEnumServices(hnd, mem_ctx, &es)) {
printf("Could not enumerate services. Error: %s\n", nt_errstr(hnd->status));
break;
}
for(i = 0; i < es.out.num_services; i++) {
print_cac_service(es.out.services[i]);
}
printf("Enumerated %d services:\n", es.out.num_services);
break;
case 'o':
ZERO_STRUCT(os);
printf("Enter service name: ");
cactest_readline(stdin, tmp);
os.in.name = talloc_strdup(mem_ctx, tmp);
os.in.scm_hnd = sos.out.scm_hnd;
os.in.access = SERVICE_ALL_ACCESS;
if(!cac_SvcOpenService(hnd, mem_ctx, &os)) {
printf("Could not open service. Error: %s\n", nt_errstr(hnd->status));
break;
}
printf("Opened service.\n");
svc_hnd = os.out.svc_hnd;
break;
case 'x':
if(!svc_hnd) {
printf("Must open service first!\n");
break;
}
cac_SvcClose(hnd, mem_ctx, svc_hnd);
svc_hnd = NULL;
break;
case 'g':
if(!svc_hnd) {
printf("Must open service first!\n");
break;
}
ZERO_STRUCT(gs);
gs.in.svc_hnd = svc_hnd;
if(!cac_SvcGetStatus(hnd, mem_ctx, &gs)) {
printf("Could not get status. Error: %s\n", nt_errstr(hnd->status));
break;
}
print_service_status(gs.out.status);
break;
case 's':
if(!svc_hnd) {
printf("Must open service first!\n");
break;
}
ZERO_STRUCT(start);
start.in.svc_hnd = svc_hnd;
printf("Enter number of parameters: ");
scanf("%d", &start.in.num_parms);
start.in.parms = talloc_array(mem_ctx, char *, start.in.num_parms);
for(i = 0; i < start.in.num_parms; i++) {
printf("Parm %d: ", i);
cactest_readline(stdin, tmp);
start.in.parms[i] = talloc_strdup(mem_ctx, tmp);
}
printf("Timeout (seconds): ");
scanf("%d", &start.in.timeout);
if(!cac_SvcStartService(hnd, mem_ctx, &start)) {
printf("Could not start service. Error: %s\n", nt_errstr(hnd->status));
}
else {
printf("Started service.\n");
}
break;
case 't':
if(!svc_hnd) {
printf("Must open service first!\n");
break;
}
ZERO_STRUCT(stop);
stop.in.svc_hnd = svc_hnd;
printf("Timeout (seconds): ");
scanf("%d", &stop.in.timeout);
if(!cac_SvcStopService(hnd, mem_ctx, &stop)) {
if(CAC_OP_FAILED(hnd->status)) {
printf("Error occured: %s\n", nt_errstr(hnd->status));
}
else {
printf("Service was not stopped within %d seconds.\n", stop.in.timeout);
print_service_status(stop.out.status);
}
}
else {
printf("Done.\n");
print_service_status(stop.out.status);
}
break;
case 'd':
if(!svc_hnd) {
printf("Must open service first!\n");
break;
}
ZERO_STRUCT(gdn);
gdn.in.svc_hnd = svc_hnd;
if(!cac_SvcGetDisplayName(hnd, mem_ctx, &gdn)) {
printf("Could not get display name. Error: %s\n", nt_errstr(hnd->status));
}
else {
printf("\tDisplay Name: %s\n", gdn.out.display_name);
}
break;
case 'p':
if(!svc_hnd) {
printf("Must open service first!\n");
break;
}
ZERO_STRUCT(pause);
pause.in.svc_hnd = svc_hnd;
printf("Timeout (seconds): ");
scanf("%d", &pause.in.timeout);
if(!cac_SvcPauseService(hnd, mem_ctx, &pause)) {
if(CAC_OP_FAILED(hnd->status)) {
printf("Error occured: %s\n", nt_errstr(hnd->status));
}
else {
printf("Service was not paused within %d seconds.\n", pause.in.timeout);
print_service_status(pause.out.status);
}
}
else {
printf("Done.\n");
print_service_status(pause.out.status);
}
break;
case 'r':
if(!svc_hnd) {
printf("Must open service first!\n");
break;
}
ZERO_STRUCT(res);
res.in.svc_hnd = svc_hnd;
printf("Timeout (seconds): ");
scanf("%d", &res.in.timeout);
if(!cac_SvcContinueService(hnd, mem_ctx, &res)) {
if(CAC_OP_FAILED(hnd->status)) {
printf("Error occured: %s\n", nt_errstr(hnd->status));
}
else {
printf("Service was not resumed within %d seconds.\n", res.in.timeout);
print_service_status(res.out.status);
}
}
else {
printf("Done.\n");
print_service_status(res.out.status);
}
break;
case 'c':
if(!svc_hnd) {
printf("Must open service first!\n");
break;
}
ZERO_STRUCT(sgc);
sgc.in.svc_hnd = svc_hnd;
if(!cac_SvcGetServiceConfig(hnd, mem_ctx, &sgc)) {
printf("Could not get service config. Error: %s\n", nt_errstr(hnd->status));
}
else {
print_service_config(&sgc.out.config);
}
break;
case 'q':
break;
default:
printf("Invalid command\n");
}
}
cac_SvcClose(hnd, mem_ctx, sos.out.scm_hnd);
done:
cac_FreeHandle(hnd);
talloc_destroy(mem_ctx);
return 0;
}