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 125
55
char *
56 500
mgt_HostName(void)
57
{
58 125
        char *p;
59 25
        char buf[1024];
60
61 500
        AZ(gethostname(buf, sizeof buf));
62 625
        p = strdup(buf);
63 500
        AN(p);
64 500
        return (p);
65
}
66 125
67
/*--------------------------------------------------------------------*/
68 25
69
void
70 45547
mgt_ProcTitle(const char *comp)
71
{
72 25
#ifdef HAVE_SETPROCTITLE
73 45422
        if (strcmp(heritage.identity, "varnishd"))
74 45547
                setproctitle("Varnish-%s -i %s", comp, heritage.identity);
75
        else
76 0
                setproctitle("Varnish-%s", comp);
77
#else
78 25
        (void)comp;
79
#endif
80 45422
}
81
82
/*--------------------------------------------------------------------*/
83
84
static void
85 2450
mgt_sltm(const char *tag, const char *sdesc, const char *ldesc)
86
{
87
        int i;
88
89 2325
        assert(sdesc != NULL && ldesc != NULL);
90 2325
        assert(*sdesc != '\0' || *ldesc != '\0');
91 2325
        printf("\n%s\n", tag);
92 2325
        i = strlen(tag);
93 2325
        printf("%*.*s\n\n", i, i, "------------------------------------");
94 2325
        if (*ldesc != '\0')
95 2200
                printf("%s\n", ldesc);
96 250
        else if (*sdesc != '\0')
97 125
                printf("%s\n", sdesc);
98 2325
}
99
100
/*lint -e{506} constant value boolean */
101
void
102 25
mgt_DumpRstVsl(void)
103
{
104
105 50
        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 25
}
112
113
/*--------------------------------------------------------------------*/
114
115
struct vsb *
116 24225
mgt_BuildVident(void)
117
{
118
        struct utsname uts;
119
        struct vsb *vsb;
120
121 24225
        vsb = VSB_new_auto();
122 24225
        AN(vsb);
123 24225
        if (!uname(&uts)) {
124 24225
                VSB_printf(vsb, ",%s", uts.sysname);
125 24225
                VSB_printf(vsb, ",%s", uts.release);
126 24225
                VSB_printf(vsb, ",%s", uts.machine);
127 24225
        }
128 24225
        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 25
#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 890126
MGT_Complain(const char *loud, const char *fmt, ...)
147
{
148
        va_list ap;
149
        struct vsb *vsb;
150
        int sf;
151
152 890151
        if (loud == C_CLI && !mgt_param.syslog_cli_traffic)
153 641650
                return;
154 248476
        vsb = VSB_new_auto();
155 248476
        AN(vsb);
156 248476
        va_start(ap, fmt);
157 248476
        VSB_vprintf(vsb, fmt, ap);
158 248476
        va_end(ap);
159 248476
        AZ(VSB_finish(vsb));
160
161 248476
        if (loud == C_ERR)
162 1826
                sf = LOG_ERR;
163 246650
        else if (loud == C_INFO)
164 130500
                sf = LOG_INFO;
165 116175
        else if (loud == C_DEBUG)
166 113725
                sf = LOG_DEBUG;
167 2450
        else if (loud == C_SECURITY)
168 25
                sf = LOG_WARNING | LOG_AUTHPRIV;
169 2450
        else if (loud == C_CLI)
170 2450
                sf = LOG_INFO;
171
        else
172 0
                WRONG("Wrong complaint loudness");
173
174 248476
        if (loud != C_CLI && (complain_to_stderr || loud != C_DEBUG))
175 245476
                fprintf(stderr, "%s %s\n", loud, VSB_data(vsb));
176
177 248476
        if (!MGT_DO_DEBUG(DBG_VTC_MODE))
178 4627
                syslog(sf, "%s", VSB_data(vsb));
179 248476
        VSB_destroy(&vsb);
180 890126
}
181
182
/*--------------------------------------------------------------------*/
183 25
184
const void *
185 23325
MGT_Pick(const struct choice *cp, const char *which, const char *kind)
186
{
187 25
188 92200
        for (; cp->name != NULL; cp++) {
189 92175
                if (!strcmp(cp->name, which))
190 23300
                        return (cp->ptr);
191 68900
        }
192 25
        ARGV_ERR("Unknown %s method \"%s\"\n", kind, which);
193
}
194
195
/*--------------------------------------------------------------------*/
196
197
char **
198 70600
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 70600
        ASSERT_MGT();
206 70600
        p = strchr(spec, '=');
207 70600
        q = strchr(spec, ',');
208 70600
        if (p == NULL || (q != NULL && q < p)) {
209 46500
                av = VAV_Parse(spec, NULL, ARGV_COMMA);
210 46500
                p = NULL;
211 70600
        } else if (VCT_invalid_name(spec, p) != NULL) {
212 25
                ARGV_ERR("invalid %s name \"%.*s\"=[...]\n",
213
                    what, (int)(p - spec), spec);
214 24075
        } else if (p[1] == '\0') {
215 25
                ARGV_ERR("Empty named %s argument \"%s\"\n", what, spec);
216 0
        } else {
217 24050
                av = VAV_Parse(p + 1, NULL, ARGV_COMMA);
218
        }
219 70550
        AN(av);
220
221 70550
        if (av[0] != NULL)
222 0
                ARGV_ERR("%s\n", av[0]);
223 70575
        if (p == NULL) {
224 46500
                *name = NULL;
225 46500
        } else {
226 24050
                l = p - spec;
227 24050
                r = malloc(1L + l);
228 24075
                AN(r);
229 24050
                memcpy(r, spec, l);
230 24050
                r[l] = '\0';
231 24050
                *name = r;
232
        }
233 70575
        return (av);
234
}