1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * Scheduler control program for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2007-2019 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2006-2007 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker * information.
9*5e7646d2SAndroid Build Coastguard Worker */
10*5e7646d2SAndroid Build Coastguard Worker
11*5e7646d2SAndroid Build Coastguard Worker /*
12*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker */
14*5e7646d2SAndroid Build Coastguard Worker
15*5e7646d2SAndroid Build Coastguard Worker #include <cups/cups-private.h>
16*5e7646d2SAndroid Build Coastguard Worker #include <cups/adminutil.h>
17*5e7646d2SAndroid Build Coastguard Worker
18*5e7646d2SAndroid Build Coastguard Worker
19*5e7646d2SAndroid Build Coastguard Worker /*
20*5e7646d2SAndroid Build Coastguard Worker * Local functions...
21*5e7646d2SAndroid Build Coastguard Worker */
22*5e7646d2SAndroid Build Coastguard Worker
23*5e7646d2SAndroid Build Coastguard Worker static void usage(const char *opt) _CUPS_NORETURN;
24*5e7646d2SAndroid Build Coastguard Worker
25*5e7646d2SAndroid Build Coastguard Worker
26*5e7646d2SAndroid Build Coastguard Worker /*
27*5e7646d2SAndroid Build Coastguard Worker * 'main()' - Get/set server settings.
28*5e7646d2SAndroid Build Coastguard Worker */
29*5e7646d2SAndroid Build Coastguard Worker
30*5e7646d2SAndroid Build Coastguard Worker int /* O - Exit status */
main(int argc,char * argv[])31*5e7646d2SAndroid Build Coastguard Worker main(int argc, /* I - Number of command-line args */
32*5e7646d2SAndroid Build Coastguard Worker char *argv[]) /* I - Command-line arguments */
33*5e7646d2SAndroid Build Coastguard Worker {
34*5e7646d2SAndroid Build Coastguard Worker int i, j, /* Looping vars */
35*5e7646d2SAndroid Build Coastguard Worker num_settings; /* Number of settings */
36*5e7646d2SAndroid Build Coastguard Worker cups_option_t *settings, /* Settings */
37*5e7646d2SAndroid Build Coastguard Worker *setting; /* Current setting */
38*5e7646d2SAndroid Build Coastguard Worker const char *opt; /* Current option character */
39*5e7646d2SAndroid Build Coastguard Worker http_t *http; /* Connection to server */
40*5e7646d2SAndroid Build Coastguard Worker static const char * const disallowed[] =
41*5e7646d2SAndroid Build Coastguard Worker { /* List of disallowed directives for cupsd.conf */
42*5e7646d2SAndroid Build Coastguard Worker "AccessLog",
43*5e7646d2SAndroid Build Coastguard Worker "CacheDir",
44*5e7646d2SAndroid Build Coastguard Worker "ConfigFilePerm",
45*5e7646d2SAndroid Build Coastguard Worker "DataDir",
46*5e7646d2SAndroid Build Coastguard Worker "DocumentRoot",
47*5e7646d2SAndroid Build Coastguard Worker "ErrorLog",
48*5e7646d2SAndroid Build Coastguard Worker "FatalErrors",
49*5e7646d2SAndroid Build Coastguard Worker "FileDevice",
50*5e7646d2SAndroid Build Coastguard Worker "FontPath",
51*5e7646d2SAndroid Build Coastguard Worker "Group",
52*5e7646d2SAndroid Build Coastguard Worker "Listen",
53*5e7646d2SAndroid Build Coastguard Worker "LogFilePerm",
54*5e7646d2SAndroid Build Coastguard Worker "LPDConfigFile",
55*5e7646d2SAndroid Build Coastguard Worker "PageLog",
56*5e7646d2SAndroid Build Coastguard Worker "PassEnv",
57*5e7646d2SAndroid Build Coastguard Worker "Port",
58*5e7646d2SAndroid Build Coastguard Worker "Printcap",
59*5e7646d2SAndroid Build Coastguard Worker "PrintcapFormat",
60*5e7646d2SAndroid Build Coastguard Worker "RemoteRoot",
61*5e7646d2SAndroid Build Coastguard Worker "RequestRoot",
62*5e7646d2SAndroid Build Coastguard Worker "ServerBin",
63*5e7646d2SAndroid Build Coastguard Worker "ServerCertificate",
64*5e7646d2SAndroid Build Coastguard Worker "ServerKey",
65*5e7646d2SAndroid Build Coastguard Worker "ServerKeychain",
66*5e7646d2SAndroid Build Coastguard Worker "ServerRoot",
67*5e7646d2SAndroid Build Coastguard Worker "SetEnv",
68*5e7646d2SAndroid Build Coastguard Worker "SMBConfigFile",
69*5e7646d2SAndroid Build Coastguard Worker "StateDir",
70*5e7646d2SAndroid Build Coastguard Worker "SystemGroup",
71*5e7646d2SAndroid Build Coastguard Worker "SystemGroupAuthKey",
72*5e7646d2SAndroid Build Coastguard Worker "TempDir",
73*5e7646d2SAndroid Build Coastguard Worker "User"
74*5e7646d2SAndroid Build Coastguard Worker };
75*5e7646d2SAndroid Build Coastguard Worker
76*5e7646d2SAndroid Build Coastguard Worker
77*5e7646d2SAndroid Build Coastguard Worker /*
78*5e7646d2SAndroid Build Coastguard Worker * Process the command-line...
79*5e7646d2SAndroid Build Coastguard Worker */
80*5e7646d2SAndroid Build Coastguard Worker
81*5e7646d2SAndroid Build Coastguard Worker _cupsSetLocale(argv);
82*5e7646d2SAndroid Build Coastguard Worker
83*5e7646d2SAndroid Build Coastguard Worker num_settings = 0;
84*5e7646d2SAndroid Build Coastguard Worker settings = NULL;
85*5e7646d2SAndroid Build Coastguard Worker
86*5e7646d2SAndroid Build Coastguard Worker for (i = 1; i < argc; i ++)
87*5e7646d2SAndroid Build Coastguard Worker {
88*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(argv[i], "--help"))
89*5e7646d2SAndroid Build Coastguard Worker usage(NULL);
90*5e7646d2SAndroid Build Coastguard Worker else if (argv[i][0] == '-')
91*5e7646d2SAndroid Build Coastguard Worker {
92*5e7646d2SAndroid Build Coastguard Worker if (argv[i][1] == '-')
93*5e7646d2SAndroid Build Coastguard Worker {
94*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(argv[i], "--debug-logging"))
95*5e7646d2SAndroid Build Coastguard Worker num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, "1",
96*5e7646d2SAndroid Build Coastguard Worker num_settings, &settings);
97*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[i], "--no-debug-logging"))
98*5e7646d2SAndroid Build Coastguard Worker num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, "0",
99*5e7646d2SAndroid Build Coastguard Worker num_settings, &settings);
100*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[i], "--remote-admin"))
101*5e7646d2SAndroid Build Coastguard Worker num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, "1",
102*5e7646d2SAndroid Build Coastguard Worker num_settings, &settings);
103*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[i], "--no-remote-admin"))
104*5e7646d2SAndroid Build Coastguard Worker num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, "0",
105*5e7646d2SAndroid Build Coastguard Worker num_settings, &settings);
106*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[i], "--remote-any"))
107*5e7646d2SAndroid Build Coastguard Worker num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, "1",
108*5e7646d2SAndroid Build Coastguard Worker num_settings, &settings);
109*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[i], "--no-remote-any"))
110*5e7646d2SAndroid Build Coastguard Worker num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, "0",
111*5e7646d2SAndroid Build Coastguard Worker num_settings, &settings);
112*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[i], "--share-printers"))
113*5e7646d2SAndroid Build Coastguard Worker num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, "1",
114*5e7646d2SAndroid Build Coastguard Worker num_settings, &settings);
115*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[i], "--no-share-printers"))
116*5e7646d2SAndroid Build Coastguard Worker num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, "0",
117*5e7646d2SAndroid Build Coastguard Worker num_settings, &settings);
118*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[i], "--user-cancel-any"))
119*5e7646d2SAndroid Build Coastguard Worker num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, "1",
120*5e7646d2SAndroid Build Coastguard Worker num_settings, &settings);
121*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[i], "--no-user-cancel-any"))
122*5e7646d2SAndroid Build Coastguard Worker num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, "0",
123*5e7646d2SAndroid Build Coastguard Worker num_settings, &settings);
124*5e7646d2SAndroid Build Coastguard Worker else
125*5e7646d2SAndroid Build Coastguard Worker usage(argv[i]);
126*5e7646d2SAndroid Build Coastguard Worker }
127*5e7646d2SAndroid Build Coastguard Worker else
128*5e7646d2SAndroid Build Coastguard Worker {
129*5e7646d2SAndroid Build Coastguard Worker for (opt = argv[i] + 1; *opt; opt ++)
130*5e7646d2SAndroid Build Coastguard Worker switch (*opt)
131*5e7646d2SAndroid Build Coastguard Worker {
132*5e7646d2SAndroid Build Coastguard Worker case 'E' :
133*5e7646d2SAndroid Build Coastguard Worker cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
134*5e7646d2SAndroid Build Coastguard Worker break;
135*5e7646d2SAndroid Build Coastguard Worker
136*5e7646d2SAndroid Build Coastguard Worker case 'U' :
137*5e7646d2SAndroid Build Coastguard Worker i ++;
138*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
139*5e7646d2SAndroid Build Coastguard Worker usage(NULL);
140*5e7646d2SAndroid Build Coastguard Worker
141*5e7646d2SAndroid Build Coastguard Worker cupsSetUser(argv[i]);
142*5e7646d2SAndroid Build Coastguard Worker break;
143*5e7646d2SAndroid Build Coastguard Worker
144*5e7646d2SAndroid Build Coastguard Worker case 'h' :
145*5e7646d2SAndroid Build Coastguard Worker i ++;
146*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
147*5e7646d2SAndroid Build Coastguard Worker usage(NULL);
148*5e7646d2SAndroid Build Coastguard Worker
149*5e7646d2SAndroid Build Coastguard Worker cupsSetServer(argv[i]);
150*5e7646d2SAndroid Build Coastguard Worker break;
151*5e7646d2SAndroid Build Coastguard Worker
152*5e7646d2SAndroid Build Coastguard Worker default :
153*5e7646d2SAndroid Build Coastguard Worker usage(opt);
154*5e7646d2SAndroid Build Coastguard Worker break;
155*5e7646d2SAndroid Build Coastguard Worker }
156*5e7646d2SAndroid Build Coastguard Worker }
157*5e7646d2SAndroid Build Coastguard Worker }
158*5e7646d2SAndroid Build Coastguard Worker else if (strchr(argv[i], '='))
159*5e7646d2SAndroid Build Coastguard Worker num_settings = cupsParseOptions(argv[i], num_settings, &settings);
160*5e7646d2SAndroid Build Coastguard Worker else
161*5e7646d2SAndroid Build Coastguard Worker usage(argv[i]);
162*5e7646d2SAndroid Build Coastguard Worker }
163*5e7646d2SAndroid Build Coastguard Worker
164*5e7646d2SAndroid Build Coastguard Worker for (i = num_settings, setting = settings; i > 0; i --, setting ++)
165*5e7646d2SAndroid Build Coastguard Worker {
166*5e7646d2SAndroid Build Coastguard Worker for (j = 0; j < (int)(sizeof(disallowed) / sizeof(disallowed[0])); j ++)
167*5e7646d2SAndroid Build Coastguard Worker {
168*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(setting->name, disallowed[j]))
169*5e7646d2SAndroid Build Coastguard Worker {
170*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("cupsctl: Cannot set %s directly."), disallowed[j]);
171*5e7646d2SAndroid Build Coastguard Worker return (1);
172*5e7646d2SAndroid Build Coastguard Worker }
173*5e7646d2SAndroid Build Coastguard Worker }
174*5e7646d2SAndroid Build Coastguard Worker }
175*5e7646d2SAndroid Build Coastguard Worker
176*5e7646d2SAndroid Build Coastguard Worker /*
177*5e7646d2SAndroid Build Coastguard Worker * Connect to the server using the defaults...
178*5e7646d2SAndroid Build Coastguard Worker */
179*5e7646d2SAndroid Build Coastguard Worker
180*5e7646d2SAndroid Build Coastguard Worker if ((http = httpConnectEncrypt(cupsServer(), ippPort(),
181*5e7646d2SAndroid Build Coastguard Worker cupsEncryption())) == NULL)
182*5e7646d2SAndroid Build Coastguard Worker {
183*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("cupsctl: Unable to connect to server: %s"),
184*5e7646d2SAndroid Build Coastguard Worker strerror(errno));
185*5e7646d2SAndroid Build Coastguard Worker return (1);
186*5e7646d2SAndroid Build Coastguard Worker }
187*5e7646d2SAndroid Build Coastguard Worker
188*5e7646d2SAndroid Build Coastguard Worker /*
189*5e7646d2SAndroid Build Coastguard Worker * Set the current configuration if we have anything on the command-line...
190*5e7646d2SAndroid Build Coastguard Worker */
191*5e7646d2SAndroid Build Coastguard Worker
192*5e7646d2SAndroid Build Coastguard Worker if (num_settings > 0)
193*5e7646d2SAndroid Build Coastguard Worker {
194*5e7646d2SAndroid Build Coastguard Worker if (!cupsAdminSetServerSettings(http, num_settings, settings))
195*5e7646d2SAndroid Build Coastguard Worker {
196*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, "cupsctl: %s", cupsLastErrorString());
197*5e7646d2SAndroid Build Coastguard Worker return (1);
198*5e7646d2SAndroid Build Coastguard Worker }
199*5e7646d2SAndroid Build Coastguard Worker }
200*5e7646d2SAndroid Build Coastguard Worker else if (!cupsAdminGetServerSettings(http, &num_settings, &settings))
201*5e7646d2SAndroid Build Coastguard Worker {
202*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, "cupsctl: %s", cupsLastErrorString());
203*5e7646d2SAndroid Build Coastguard Worker return (1);
204*5e7646d2SAndroid Build Coastguard Worker }
205*5e7646d2SAndroid Build Coastguard Worker else
206*5e7646d2SAndroid Build Coastguard Worker {
207*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < num_settings; i ++)
208*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, "%s=%s", settings[i].name, settings[i].value);
209*5e7646d2SAndroid Build Coastguard Worker }
210*5e7646d2SAndroid Build Coastguard Worker
211*5e7646d2SAndroid Build Coastguard Worker cupsFreeOptions(num_settings, settings);
212*5e7646d2SAndroid Build Coastguard Worker return (0);
213*5e7646d2SAndroid Build Coastguard Worker }
214*5e7646d2SAndroid Build Coastguard Worker
215*5e7646d2SAndroid Build Coastguard Worker
216*5e7646d2SAndroid Build Coastguard Worker /*
217*5e7646d2SAndroid Build Coastguard Worker * 'usage()' - Show program usage.
218*5e7646d2SAndroid Build Coastguard Worker */
219*5e7646d2SAndroid Build Coastguard Worker
220*5e7646d2SAndroid Build Coastguard Worker static void
usage(const char * opt)221*5e7646d2SAndroid Build Coastguard Worker usage(const char *opt) /* I - Option character/string */
222*5e7646d2SAndroid Build Coastguard Worker {
223*5e7646d2SAndroid Build Coastguard Worker if (opt)
224*5e7646d2SAndroid Build Coastguard Worker {
225*5e7646d2SAndroid Build Coastguard Worker if (*opt == '-')
226*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("cupsctl: Unknown option \"%s\""), opt);
227*5e7646d2SAndroid Build Coastguard Worker else
228*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("cupsctl: Unknown option \"-%c\""), *opt);
229*5e7646d2SAndroid Build Coastguard Worker }
230*5e7646d2SAndroid Build Coastguard Worker
231*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("Usage: cupsctl [options] [param=value ... paramN=valueN]"));
232*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("Options:"));
233*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-E Encrypt the connection to the server"));
234*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-h server[:port] Connect to the named server and port"));
235*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-U username Specify username to use for authentication"));
236*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("--[no-]debug-logging Turn debug logging on/off"));
237*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("--[no-]remote-admin Turn remote administration on/off"));
238*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("--[no-]remote-any Allow/prevent access from the Internet"));
239*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("--[no-]share-printers Turn printer sharing on/off"));
240*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("--[no-]user-cancel-any Allow/prevent users to cancel any job"));
241*5e7646d2SAndroid Build Coastguard Worker
242*5e7646d2SAndroid Build Coastguard Worker exit(1);
243*5e7646d2SAndroid Build Coastguard Worker }
244