1 /*Tests all of the svcctl calls (at least at time of writing)*/
6 int main(int argc
, char **argv
) {
7 CacServerHandle
*hnd
= NULL
;
8 TALLOC_CTX
*mem_ctx
= NULL
;
11 struct SvcOpenScm sos
;
12 struct SvcEnumServices es
;
13 struct SvcOpenService os
;
14 struct SvcGetStatus gs
;
15 struct SvcStartService start
;
16 struct SvcStopService stop
;
17 struct SvcPauseService pause
;
18 struct SvcContinueService res
;
19 struct SvcGetDisplayName gdn
;
20 struct SvcGetServiceConfig sgc
;
22 POLICY_HND
*svc_hnd
= NULL
;
29 mem_ctx
= talloc_init("cac_samgroup");
31 hnd
= cac_NewServerHandle(True
);
33 cac_SetAuthDataFn(hnd
, cactest_GetAuthDataFn
);
35 cac_parse_cmd_line(argc
, argv
, hnd
);
37 if(!cac_Connect(hnd
, NULL
)) {
38 fprintf(stderr
, "Could not connect to server %s. Error: %s\n", hnd
->server
, nt_errstr(hnd
->status
));
42 /*open a handle to the scm*/
45 sos
.in
.access
= SC_MANAGER_ALL_ACCESS
;
47 if(!cac_SvcOpenScm(hnd
, mem_ctx
, &sos
)) {
48 fprintf(stderr
, "Could not open SCM. Error: %s\n", nt_errstr(hnd
->status
));
52 printf("Opened SCM\n");
55 while(tmp
[0] != 'q') {
57 printf("[e] Enum Services\n");
58 printf("[o] Open Service\n");
59 printf("[x] Close Service\n");
60 printf("[g] Get service status\n");
61 printf("[s] Start service\n");
62 printf("[t] Stop service\n");
63 printf("[p] Pause service\n");
64 printf("[r] Resume service\n");
65 printf("[c] Get service config\n");
67 printf("[d] Get display name\n");
70 printf("Enter option: ");
71 cactest_readline(stdin
, tmp
);
76 case 'e': /*enum services*/
78 es
.in
.scm_hnd
= sos
.out
.scm_hnd
;
80 if(!cac_SvcEnumServices(hnd
, mem_ctx
, &es
)) {
81 printf("Could not enumerate services. Error: %s\n", nt_errstr(hnd
->status
));
85 for(i
= 0; i
< es
.out
.num_services
; i
++) {
86 print_cac_service(es
.out
.services
[i
]);
88 printf("Enumerated %d services:\n", es
.out
.num_services
);
92 case 'o': /*Open service*/
95 printf("Enter service name: ");
96 cactest_readline(stdin
, tmp
);
98 os
.in
.name
= talloc_strdup(mem_ctx
, tmp
);
99 os
.in
.scm_hnd
= sos
.out
.scm_hnd
;
100 os
.in
.access
= SERVICE_ALL_ACCESS
;
102 if(!cac_SvcOpenService(hnd
, mem_ctx
, &os
)) {
103 printf("Could not open service. Error: %s\n", nt_errstr(hnd
->status
));
107 printf("Opened service.\n");
108 svc_hnd
= os
.out
.svc_hnd
;
111 case 'x': /*close service*/
113 printf("Must open service first!\n");
117 cac_SvcClose(hnd
, mem_ctx
, svc_hnd
);
120 case 'g': /*get svc status*/
123 printf("Must open service first!\n");
129 gs
.in
.svc_hnd
= svc_hnd
;
131 if(!cac_SvcGetStatus(hnd
, mem_ctx
, &gs
)) {
132 printf("Could not get status. Error: %s\n", nt_errstr(hnd
->status
));
136 print_service_status(gs
.out
.status
);
138 case 's': /*start service*/
140 printf("Must open service first!\n");
146 start
.in
.svc_hnd
= svc_hnd
;
148 printf("Enter number of parameters: ");
149 scanf("%d", &start
.in
.num_parms
);
151 start
.in
.parms
= talloc_array(mem_ctx
, char *, start
.in
.num_parms
);
153 for(i
= 0; i
< start
.in
.num_parms
; i
++) {
154 printf("Parm %d: ", i
);
155 cactest_readline(stdin
, tmp
);
156 start
.in
.parms
[i
] = talloc_strdup(mem_ctx
, tmp
);
159 printf("Timeout (seconds): ");
160 scanf("%d", &start
.in
.timeout
);
162 if(!cac_SvcStartService(hnd
, mem_ctx
, &start
)) {
163 printf("Could not start service. Error: %s\n", nt_errstr(hnd
->status
));
166 printf("Started service.\n");
170 case 't': /*stop service*/
172 printf("Must open service first!\n");
177 stop
.in
.svc_hnd
= svc_hnd
;
179 printf("Timeout (seconds): ");
180 scanf("%d", &stop
.in
.timeout
);
182 if(!cac_SvcStopService(hnd
, mem_ctx
, &stop
)) {
183 if(CAC_OP_FAILED(hnd
->status
)) {
184 printf("Error occured: %s\n", nt_errstr(hnd
->status
));
187 printf("Service was not stopped within %d seconds.\n", stop
.in
.timeout
);
188 print_service_status(stop
.out
.status
);
193 print_service_status(stop
.out
.status
);
196 case 'd': /*get display name*/
198 printf("Must open service first!\n");
203 gdn
.in
.svc_hnd
= svc_hnd
;
205 if(!cac_SvcGetDisplayName(hnd
, mem_ctx
, &gdn
)) {
206 printf("Could not get display name. Error: %s\n", nt_errstr(hnd
->status
));
209 printf("\tDisplay Name: %s\n", gdn
.out
.display_name
);
213 case 'p': /*pause service*/
215 printf("Must open service first!\n");
220 pause
.in
.svc_hnd
= svc_hnd
;
222 printf("Timeout (seconds): ");
223 scanf("%d", &pause
.in
.timeout
);
225 if(!cac_SvcPauseService(hnd
, mem_ctx
, &pause
)) {
226 if(CAC_OP_FAILED(hnd
->status
)) {
227 printf("Error occured: %s\n", nt_errstr(hnd
->status
));
230 printf("Service was not paused within %d seconds.\n", pause
.in
.timeout
);
231 print_service_status(pause
.out
.status
);
236 print_service_status(pause
.out
.status
);
241 case 'r': /*resume service*/
243 printf("Must open service first!\n");
248 res
.in
.svc_hnd
= svc_hnd
;
250 printf("Timeout (seconds): ");
251 scanf("%d", &res
.in
.timeout
);
253 if(!cac_SvcContinueService(hnd
, mem_ctx
, &res
)) {
254 if(CAC_OP_FAILED(hnd
->status
)) {
255 printf("Error occured: %s\n", nt_errstr(hnd
->status
));
258 printf("Service was not resumed within %d seconds.\n", res
.in
.timeout
);
259 print_service_status(res
.out
.status
);
264 print_service_status(res
.out
.status
);
269 case 'c': /*get service config*/
271 printf("Must open service first!\n");
277 sgc
.in
.svc_hnd
= svc_hnd
;
279 if(!cac_SvcGetServiceConfig(hnd
, mem_ctx
, &sgc
)) {
280 printf("Could not get service config. Error: %s\n", nt_errstr(hnd
->status
));
283 print_service_config(&sgc
.out
.config
);
290 printf("Invalid command\n");
294 cac_SvcClose(hnd
, mem_ctx
, sos
.out
.scm_hnd
);
299 talloc_destroy(mem_ctx
);