| | 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 |
74916 |
mgt_ProcTitle(const char *comp) |
71 |
|
{ |
72 |
|
#ifdef HAVE_SETPROCTITLE |
73 |
74916 |
if (strcmp(heritage.identity, "varnishd")) |
74 |
74916 |
setproctitle("Varnish-%s -i %s", comp, heritage.identity); |
75 |
|
else |
76 |
0 |
setproctitle("Varnish-%s", comp); |
77 |
|
#else |
78 |
|
(void)comp; |
79 |
|
#endif |
80 |
74916 |
} |
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 |
39840 |
mgt_BuildVident(void) |
117 |
|
{ |
118 |
|
struct utsname uts; |
119 |
|
struct vsb *vsb; |
120 |
|
|
121 |
39840 |
vsb = VSB_new_auto(); |
122 |
39840 |
AN(vsb); |
123 |
39840 |
if (!uname(&uts)) { |
124 |
39840 |
VSB_printf(vsb, ",%s", uts.sysname); |
125 |
39840 |
VSB_printf(vsb, ",%s", uts.release); |
126 |
39840 |
VSB_printf(vsb, ",%s", uts.machine); |
127 |
39840 |
} |
128 |
39840 |
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 |
1470038 |
MGT_Complain(const char *loud, const char *fmt, ...) |
147 |
|
{ |
148 |
|
va_list ap; |
149 |
|
struct vsb *vsb; |
150 |
|
int sf; |
151 |
|
|
152 |
1470038 |
if (loud == C_CLI && !mgt_param.syslog_cli_traffic) |
153 |
1061120 |
return; |
154 |
408918 |
vsb = VSB_new_auto(); |
155 |
408918 |
AN(vsb); |
156 |
408918 |
va_start(ap, fmt); |
157 |
408918 |
VSB_vprintf(vsb, fmt, ap); |
158 |
408918 |
va_end(ap); |
159 |
408918 |
AZ(VSB_finish(vsb)); |
160 |
|
|
161 |
408918 |
if (loud == C_ERR) |
162 |
3038 |
sf = LOG_ERR; |
163 |
405880 |
else if (loud == C_INFO) |
164 |
214240 |
sf = LOG_INFO; |
165 |
191640 |
else if (loud == C_DEBUG) |
166 |
187480 |
sf = LOG_DEBUG; |
167 |
4160 |
else if (loud == C_SECURITY) |
168 |
0 |
sf = LOG_WARNING | LOG_AUTHPRIV; |
169 |
4160 |
else if (loud == C_CLI) |
170 |
4160 |
sf = LOG_INFO; |
171 |
|
else |
172 |
0 |
WRONG("Wrong complaint loudness"); |
173 |
|
|
174 |
408918 |
if (loud != C_CLI && (complain_to_stderr || loud != C_DEBUG)) |
175 |
403878 |
fprintf(stderr, "%s %s\n", loud, VSB_data(vsb)); |
176 |
|
|
177 |
408918 |
if (!MGT_DO_DEBUG(DBG_VTC_MODE)) |
178 |
7844 |
syslog(sf, "%s", VSB_data(vsb)); |
179 |
408918 |
VSB_destroy(&vsb); |
180 |
1470038 |
} |
181 |
|
|
182 |
|
/*--------------------------------------------------------------------*/ |
183 |
|
|
184 |
|
const void * |
185 |
38360 |
MGT_Pick(const struct choice *cp, const char *which, const char *kind) |
186 |
|
{ |
187 |
|
|
188 |
151680 |
for (; cp->name != NULL; cp++) { |
189 |
151640 |
if (!strcmp(cp->name, which)) |
190 |
38320 |
return (cp->ptr); |
191 |
113320 |
} |
192 |
40 |
ARGV_ERR("Unknown %s method \"%s\"\n", kind, which); |
193 |
|
} |
194 |
|
|
195 |
|
/*--------------------------------------------------------------------*/ |
196 |
|
|
197 |
|
char ** |
198 |
116200 |
MGT_NamedArg(const char *spec, const char **name, const char *what) |
199 |
|
{ |
200 |
|
const char *p, *q; |
201 |
|
char *r; |
202 |
|
char **av; |
203 |
|
int l; |
204 |
|
|
205 |
116200 |
ASSERT_MGT(); |
206 |
116200 |
p = strchr(spec, '='); |
207 |
116200 |
q = strchr(spec, ','); |
208 |
116200 |
if (p == NULL || (q != NULL && q < p)) { |
209 |
76560 |
av = VAV_Parse(spec, NULL, ARGV_COMMA); |
210 |
76560 |
p = NULL; |
211 |
116200 |
} else if (VCT_invalid_name(spec, p) != NULL) { |
212 |
40 |
ARGV_ERR("invalid %s name \"%.*s\"=[...]\n", |
213 |
|
what, (int)(p - spec), spec); |
214 |
39600 |
} else if (p[1] == '\0') { |
215 |
40 |
ARGV_ERR("Empty named %s argument \"%s\"\n", what, spec); |
216 |
0 |
} else { |
217 |
39560 |
av = VAV_Parse(p + 1, NULL, ARGV_COMMA); |
218 |
|
} |
219 |
116120 |
AN(av); |
220 |
|
|
221 |
116120 |
if (av[0] != NULL) |
222 |
0 |
ARGV_ERR("%s\n", av[0]); |
223 |
116120 |
if (p == NULL) { |
224 |
76560 |
*name = NULL; |
225 |
76560 |
} else { |
226 |
39560 |
l = p - spec; |
227 |
39560 |
r = malloc(1L + l); |
228 |
39560 |
AN(r); |
229 |
39560 |
memcpy(r, spec, l); |
230 |
39560 |
r[l] = '\0'; |
231 |
39560 |
*name = r; |
232 |
|
} |
233 |
116120 |
return (av); |
234 |
|
} |