| | varnish-cache/bin/varnishd/mgt/mgt_util.c |
0 |
|
/*- |
1 |
|
* Copyright (c) 2006 Verdens Gang AS |
2 |
|
* Copyright (c) 2006-2011 Varnish Software AS |
3 |
|
* All rights reserved. |
4 |
|
* |
5 |
|
* Author: Poul-Henning Kamp <phk@phk.freebsd.dk> |
6 |
|
* |
7 |
|
* SPDX-License-Identifier: BSD-2-Clause |
8 |
|
* |
9 |
|
* Redistribution and use in source and binary forms, with or without |
10 |
|
* modification, are permitted provided that the following conditions |
11 |
|
* are met: |
12 |
|
* 1. Redistributions of source code must retain the above copyright |
13 |
|
* notice, this list of conditions and the following disclaimer. |
14 |
|
* 2. Redistributions in binary form must reproduce the above copyright |
15 |
|
* notice, this list of conditions and the following disclaimer in the |
16 |
|
* documentation and/or other materials provided with the distribution. |
17 |
|
* |
18 |
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
19 |
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
20 |
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
21 |
|
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE |
22 |
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
23 |
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
24 |
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
25 |
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
26 |
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
27 |
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
28 |
|
* SUCH DAMAGE. |
29 |
|
* |
30 |
|
* The management process, various utility functions |
31 |
|
*/ |
32 |
|
|
33 |
|
#include "config.h" |
34 |
|
|
35 |
|
#include <sys/utsname.h> |
36 |
|
|
37 |
|
#include <stdarg.h> |
38 |
|
#include <stdio.h> |
39 |
|
#include <stdlib.h> |
40 |
|
#include <string.h> |
41 |
|
#include <syslog.h> |
42 |
|
#include <unistd.h> |
43 |
|
|
44 |
|
#include "mgt/mgt.h" |
45 |
|
|
46 |
|
#include "common/heritage.h" |
47 |
|
|
48 |
|
#include "vav.h" |
49 |
|
#include "vct.h" |
50 |
|
|
51 |
|
int complain_to_stderr; |
52 |
|
|
53 |
|
/*--------------------------------------------------------------------*/ |
54 |
|
|
55 |
|
char * |
56 |
880 |
mgt_HostName(void) |
57 |
|
{ |
58 |
|
char *p; |
59 |
|
char buf[1024]; |
60 |
|
|
61 |
880 |
AZ(gethostname(buf, sizeof buf)); |
62 |
880 |
p = strdup(buf); |
63 |
880 |
AN(p); |
64 |
880 |
return (p); |
65 |
|
} |
66 |
|
|
67 |
|
/*--------------------------------------------------------------------*/ |
68 |
|
|
69 |
|
void |
70 |
75753 |
mgt_ProcTitle(const char *comp) |
71 |
|
{ |
72 |
|
#ifdef HAVE_SETPROCTITLE |
73 |
75753 |
if (strcmp(heritage.identity, "varnishd")) |
74 |
75753 |
setproctitle("Varnish-%s -i %s", comp, heritage.identity); |
75 |
|
else |
76 |
0 |
setproctitle("Varnish-%s", comp); |
77 |
|
#else |
78 |
|
(void)comp; |
79 |
|
#endif |
80 |
75753 |
} |
81 |
|
|
82 |
|
/*--------------------------------------------------------------------*/ |
83 |
|
|
84 |
|
static void |
85 |
3720 |
mgt_sltm(const char *tag, const char *sdesc, const char *ldesc) |
86 |
|
{ |
87 |
|
int i; |
88 |
|
|
89 |
3720 |
assert(sdesc != NULL && ldesc != NULL); |
90 |
3720 |
assert(*sdesc != '\0' || *ldesc != '\0'); |
91 |
3720 |
printf("\n%s\n", tag); |
92 |
3720 |
i = strlen(tag); |
93 |
3720 |
printf("%*.*s\n\n", i, i, "------------------------------------"); |
94 |
3720 |
if (*ldesc != '\0') |
95 |
3520 |
printf("%s\n", ldesc); |
96 |
200 |
else if (*sdesc != '\0') |
97 |
200 |
printf("%s\n", sdesc); |
98 |
3720 |
} |
99 |
|
|
100 |
|
/*lint -e{506} constant value boolean */ |
101 |
|
void |
102 |
40 |
mgt_DumpRstVsl(void) |
103 |
|
{ |
104 |
|
|
105 |
40 |
printf( |
106 |
|
"\n.. The following is autogenerated output from " |
107 |
|
"varnishd -x vsl\n\n"); |
108 |
|
|
109 |
|
#define SLTM(tag, flags, sdesc, ldesc) mgt_sltm(#tag, sdesc, ldesc); |
110 |
|
#include "tbl/vsl_tags.h" |
111 |
|
} |
112 |
|
|
113 |
|
/*--------------------------------------------------------------------*/ |
114 |
|
|
115 |
|
struct vsb * |
116 |
40200 |
mgt_BuildVident(void) |
117 |
|
{ |
118 |
|
struct utsname uts; |
119 |
|
struct vsb *vsb; |
120 |
|
|
121 |
40200 |
vsb = VSB_new_auto(); |
122 |
40200 |
AN(vsb); |
123 |
40200 |
if (!uname(&uts)) { |
124 |
40200 |
VSB_printf(vsb, ",%s", uts.sysname); |
125 |
40200 |
VSB_printf(vsb, ",%s", uts.release); |
126 |
40200 |
VSB_printf(vsb, ",%s", uts.machine); |
127 |
40200 |
} |
128 |
40200 |
return (vsb); |
129 |
|
} |
130 |
|
|
131 |
|
/*-------------------------------------------------------------------- |
132 |
|
* 'Ello, I wish to register a complaint... |
133 |
|
*/ |
134 |
|
|
135 |
|
#ifndef LOG_AUTHPRIV |
136 |
|
# define LOG_AUTHPRIV 0 |
137 |
|
#endif |
138 |
|
|
139 |
|
const char C_ERR[] = "Error:"; |
140 |
|
const char C_INFO[] = "Info:"; |
141 |
|
const char C_DEBUG[] = "Debug:"; |
142 |
|
const char C_SECURITY[] = "Security:"; |
143 |
|
const char C_CLI[] = "Cli:"; |
144 |
|
|
145 |
|
void |
146 |
1563243 |
MGT_ComplainVSB(const char *loud, struct vsb *vsb) |
147 |
|
{ |
148 |
|
int sf; |
149 |
|
|
150 |
1563243 |
AZ(VSB_finish(vsb)); |
151 |
|
|
152 |
2640523 |
if (VSB_len(vsb) == 0 || |
153 |
1486363 |
(loud == C_CLI && !mgt_param.syslog_cli_traffic)) |
154 |
1150000 |
return; |
155 |
|
|
156 |
413243 |
if (loud == C_ERR) |
157 |
3043 |
sf = LOG_ERR; |
158 |
410200 |
else if (loud == C_INFO) |
159 |
216400 |
sf = LOG_INFO; |
160 |
193800 |
else if (loud == C_DEBUG) |
161 |
189640 |
sf = LOG_DEBUG; |
162 |
4160 |
else if (loud == C_SECURITY) |
163 |
0 |
sf = LOG_WARNING | LOG_AUTHPRIV; |
164 |
4160 |
else if (loud == C_CLI) |
165 |
4160 |
sf = LOG_INFO; |
166 |
|
else |
167 |
0 |
WRONG("Wrong complaint loudness"); |
168 |
|
|
169 |
413243 |
if (loud != C_CLI && (complain_to_stderr || loud != C_DEBUG)) |
170 |
408203 |
fprintf(stderr, "%s %s\n", loud, VSB_data(vsb)); |
171 |
|
|
172 |
413243 |
if (!MGT_DO_DEBUG(DBG_VTC_MODE)) |
173 |
7847 |
syslog(sf, "%s", VSB_data(vsb)); |
174 |
1563243 |
} |
175 |
|
|
176 |
|
void |
177 |
1447769 |
MGT_Complain(const char *loud, const char *fmt, ...) |
178 |
|
{ |
179 |
|
va_list ap; |
180 |
|
struct vsb *vsb; |
181 |
|
|
182 |
1447769 |
vsb = VSB_new_auto(); |
183 |
1447769 |
AN(vsb); |
184 |
1447769 |
va_start(ap, fmt); |
185 |
1447769 |
VSB_vprintf(vsb, fmt, ap); |
186 |
1447769 |
va_end(ap); |
187 |
1447769 |
MGT_ComplainVSB(loud, vsb); |
188 |
1447769 |
VSB_destroy(&vsb); |
189 |
1447769 |
} |
190 |
|
|
191 |
|
/*--------------------------------------------------------------------*/ |
192 |
|
|
193 |
|
const void * |
194 |
38720 |
MGT_Pick(const struct choice *cp, const char *which, const char *kind) |
195 |
|
{ |
196 |
|
|
197 |
153120 |
for (; cp->name != NULL; cp++) { |
198 |
153080 |
if (!strcmp(cp->name, which)) |
199 |
38680 |
return (cp->ptr); |
200 |
114400 |
} |
201 |
40 |
ARGV_ERR("Unknown %s method \"%s\"\n", kind, which); |
202 |
38680 |
} |
203 |
|
|
204 |
|
/*--------------------------------------------------------------------*/ |
205 |
|
|
206 |
|
char ** |
207 |
117280 |
MGT_NamedArg(const char *spec, const char **name, const char *what) |
208 |
|
{ |
209 |
|
const char *p, *q; |
210 |
|
char *r; |
211 |
|
char **av; |
212 |
|
int l; |
213 |
|
|
214 |
117280 |
ASSERT_MGT(); |
215 |
117280 |
p = strchr(spec, '='); |
216 |
117280 |
q = strchr(spec, ','); |
217 |
117280 |
if (p == NULL || (q != NULL && q < p)) { |
218 |
77280 |
av = VAV_Parse(spec, NULL, ARGV_COMMA); |
219 |
77280 |
p = NULL; |
220 |
117280 |
} else if (VCT_invalid_name(spec, p) != NULL) { |
221 |
40 |
ARGV_ERR("invalid %s name \"%.*s\"=[...]\n", |
222 |
|
what, (int)(p - spec), spec); |
223 |
39960 |
} else if (p[1] == '\0') { |
224 |
40 |
ARGV_ERR("Empty named %s argument \"%s\"\n", what, spec); |
225 |
0 |
} else { |
226 |
39920 |
av = VAV_Parse(p + 1, NULL, ARGV_COMMA); |
227 |
|
} |
228 |
117200 |
AN(av); |
229 |
|
|
230 |
117200 |
if (av[0] != NULL) |
231 |
0 |
ARGV_ERR("%s\n", av[0]); |
232 |
117200 |
if (p == NULL) { |
233 |
77280 |
*name = NULL; |
234 |
77280 |
} else { |
235 |
39920 |
l = p - spec; |
236 |
39920 |
r = malloc(1L + l); |
237 |
39920 |
AN(r); |
238 |
39920 |
memcpy(r, spec, l); |
239 |
39920 |
r[l] = '\0'; |
240 |
39920 |
*name = r; |
241 |
|
} |
242 |
117200 |
return (av); |
243 |
|
} |