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
}