varnish-cache/bin/varnishd/cache/cache_cli.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
 * Caching process CLI handling.
31
 *
32
 * We only have one CLI source, the stdin/stdout pipes from the manager
33
 * process, but we complicate things by having undocumented commands that
34
 * we do not want to show in a plain help, and by having commands that the
35
 * manager has already shown in help before asking us.
36
 */
37
38
#include "config.h"
39
40
#include "cache_varnishd.h"
41
#include "common/heritage.h"
42
43
#include "vcli_serve.h"
44
45
pthread_t               cli_thread;
46
static struct lock      cli_mtx;
47
static int              add_check;
48
static struct VCLS      *cache_cls;
49
50
/*
51
 * The CLI commandlist is split in three:
52
 *  - Commands we get from/share with the manager, we don't show these
53
 *      in help, as the manager already did that.
54
 *  - Cache process commands, show in help
55
 *  - Undocumented debug commands, show in undocumented "help -d"
56
 */
57
58
/*--------------------------------------------------------------------
59
 * Add CLI functions to the appropriate command set
60
 */
61
62
void
63 403801
CLI_AddFuncs(struct cli_proto *p)
64
{
65
66 403801
        AZ(add_check);
67 403801
        Lck_Lock(&cli_mtx);
68 403801
        VCLS_AddFunc(cache_cls, 0, p);
69 403801
        Lck_Unlock(&cli_mtx);
70 403801
}
71
72
static void
73 298663
cli_cb_before(const struct cli *cli)
74
{
75
76 298663
        ASSERT_CLI();
77 298663
        VSL(SLT_CLI, NO_VXID, "Rd %s", VSB_data(cli->cmd));
78 298663
        Lck_Lock(&cli_mtx);
79 298663
        VCL_Poll();
80 298663
}
81
82
static void
83 298583
cli_cb_after(const struct cli *cli)
84
{
85
86 298583
        ASSERT_CLI();
87 298583
        Lck_Unlock(&cli_mtx);
88 597166
        VSL(SLT_CLI, NO_VXID, "Wr %03u %zd %s",
89 298583
            cli->result, VSB_len(cli->sb), VSB_data(cli->sb));
90 298583
}
91
92
void
93 36540
CLI_Run(void)
94
{
95
        int i;
96
        struct cli *cli;
97
98 36540
        add_check = 1;
99
100
        /* Tell waiting MGT that we are ready to speak CLI */
101 36540
        AZ(VCLI_WriteResult(heritage.cli_fd, CLIS_OK, "Ready"));
102
103 72960
        cli = VCLS_AddFd(cache_cls,
104 36480
            heritage.cli_fd, heritage.cli_fd, NULL, NULL);
105 36480
        AN(cli);
106 36480
        cli->auth = 255;        // Non-zero to disable paranoia in vcli_serve
107
108 36480
        do {
109 335063
                i = VCLS_Poll(cache_cls, cli, -1);
110 335063
        } while (i == 0);
111 36480
        VSL(SLT_CLI, NO_VXID, "EOF on CLI connection, worker stops");
112 36480
}
113
114
/*--------------------------------------------------------------------*/
115
116
static struct cli_proto cli_cmds[] = {
117
        { CLICMD_PING,  "i", VCLS_func_ping, VCLS_func_ping_json },
118
        { CLICMD_HELP,  "i", VCLS_func_help, VCLS_func_help_json },
119
        { NULL }
120
};
121
122
/*--------------------------------------------------------------------
123
 * Initialize the CLI subsystem
124
 */
125
126
void
127 36630
CLI_Init(void)
128
{
129
130 36630
        Lck_New(&cli_mtx, lck_cli);
131 36630
        cli_thread = pthread_self();
132
133 36630
        cache_cls = VCLS_New(heritage.cls);
134 36630
        AN(cache_cls);
135 36630
        VCLS_SetLimit(cache_cls, &cache_param->cli_limit);
136 36630
        VCLS_SetHooks(cache_cls, cli_cb_before, cli_cb_after);
137
138 36630
        CLI_AddFuncs(cli_cmds);
139 36630
}