Skip to content

Commit

Permalink
cli: add -p argument to vcl.load_files
Browse files Browse the repository at this point in the history
This commit adds an optional -p argument to vcl.load_files cli command to
allow the user to specify a path that will be prepended to the VCL_PATH
parameter when loading the vcl files
  • Loading branch information
walid-git committed Apr 13, 2023
1 parent f6ad82e commit 58b0391
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 13 deletions.
4 changes: 3 additions & 1 deletion bin/varnishd/mgt/mgt.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,8 @@ enum mcf_which_e {
void MCF_ParamConf(enum mcf_which_e, const char *param, const char *, ...)
v_printflike_(3, 4);

struct parspec *MCF_FindPar(const char *name);

void MCF_ParamSet(struct cli *, const char *param, const char *val);
void MCF_ParamProtect(struct cli *, const char *arg);
void MCF_DumpRstParam(void);
Expand Down Expand Up @@ -225,7 +227,7 @@ void STV_Init(void);
/* mgt_vcc.c */
void mgt_DumpBuiltin(void);
char *mgt_VccCompile(struct cli *, struct vclprog *, const char *vclname,
const char *vclsrc, const char * const *vclsrcfiles, int C_flag);
const char *vclsrc, const char * const *vclsrcfiles, const char *vcl_path, int C_flag);

void mgt_vcl_init(void);
void mgt_vcl_startup(struct cli *, const char *vclsrc, const char *origin,
Expand Down
6 changes: 6 additions & 0 deletions bin/varnishd/mgt/mgt_param.c
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,12 @@ MCF_ParamProtect(struct cli *cli, const char *args)

/*--------------------------------------------------------------------*/

struct parspec *
MCF_FindPar(const char *name)
{
return mcf_findpar(name);
}

void
MCF_ParamSet(struct cli *cli, const char *param, const char *val)
{
Expand Down
17 changes: 14 additions & 3 deletions bin/varnishd/mgt/mgt_vcc.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ struct vcc_priv {
#define VCC_PRIV_MAGIC 0x70080cb8
const char *vclsrc;
const char * const *vclsrcfiles;
const char *vcl_path;
struct vsb *dir;
struct vsb *csrcfile;
struct vsb *libfile;
Expand Down Expand Up @@ -103,7 +104,7 @@ vcc_vext_iter_func(const char *filename, void *priv)
static void v_noreturn_ v_matchproto_(vsub_func_f)
run_vcc(void *priv)
{
struct vsb *sb = NULL;
struct vsb *sb = NULL, *vsb = NULL;
struct vclprog *vpg;
struct vcc_priv *vp;
struct vcc *vcc;
Expand All @@ -118,8 +119,17 @@ run_vcc(void *priv)
vcc = VCC_New();
AN(vcc);
VCC_Builtin_VCL(vcc, builtin_vcl);
VCC_VCL_path(vcc, mgt_vcl_path);
VCC_VMOD_path(vcc, mgt_vmod_path);
if (vp->vcl_path != NULL) {
vsb = VSB_new_auto();
AN(vsb);
VSB_printf(vsb, "%s:%s", vp->vcl_path, mgt_vcl_path);
AZ(VSB_finish(vsb));
VCC_VCL_path(vcc, VSB_data(vsb));
VSB_destroy(&vsb);
} else {
VCC_VCL_path(vcc, mgt_vcl_path);
}

#define VCC_FEATURE_BIT(U, l, d) \
VCC_Opt_ ## l(vcc, MGT_VCC_FEATURE(VCC_FEATURE_ ## U));
Expand Down Expand Up @@ -347,7 +357,7 @@ mgt_vcc_fini_vp(struct vcc_priv *vp, int leave_lib)

char *
mgt_VccCompile(struct cli *cli, struct vclprog *vcl, const char *vclname,
const char *vclsrc, const char * const *vclsrcfiles, int C_flag)
const char *vclsrc, const char * const *vclsrcfiles, const char *vcl_path, int C_flag)
{
struct vcc_priv vp[1];
struct vsb *sb;
Expand All @@ -362,6 +372,7 @@ mgt_VccCompile(struct cli *cli, struct vclprog *vcl, const char *vclname,
mgt_vcc_init_vp(vp);
vp->vclsrc = vclsrc;
vp->vclsrcfiles = vclsrcfiles;
vp->vcl_path = vcl_path;

/*
* The subdirectory must have a unique name to 100% certain evade
Expand Down
27 changes: 20 additions & 7 deletions bin/varnishd/mgt/mgt_vcl.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include "mgt/mgt_vcl.h"
#include "common/heritage.h"

#include "mgt_param.h"
#include "vcli_serve.h"
#include "vct.h"
#include "vev.h"
Expand Down Expand Up @@ -438,7 +439,7 @@ mgt_vcl_setstate(struct cli *cli, struct vclprog *vp, const struct vclstate *vs)

static struct vclprog *
mgt_new_vcl(struct cli *cli, const char *vclname, const char *vclsrc,
const char * const *vclsrcfiles, const char *state, int C_flag)
const char * const *vclsrcfiles, const char *state, const char *vcl_path, int C_flag)
{
unsigned status;
char *lib, *p;
Expand All @@ -464,7 +465,7 @@ mgt_new_vcl(struct cli *cli, const char *vclname, const char *vclsrc,
return (NULL);

vp = mgt_vcl_add(vclname, vs);
lib = mgt_VccCompile(cli, vp, vclname, vclsrc, vclsrcfiles, C_flag);
lib = mgt_VccCompile(cli, vp, vclname, vclsrc, vclsrcfiles, vcl_path, C_flag);
if (lib == NULL) {
mgt_vcl_del(vp);
return (NULL);
Expand Down Expand Up @@ -517,7 +518,7 @@ mgt_vcl_startup(struct cli *cli, const char *vclsrc, const char *vclname,
bprintf(buf, "boot%d", n++);
vclname = buf;
}
vp = mgt_new_vcl(cli, vclname, vclsrc, vcls, NULL, C_flag);
vp = mgt_new_vcl(cli, vclname, vclsrc, vcls, NULL, NULL, C_flag);
if (vp != NULL) {
/* Last startup VCL becomes the automatically selected
* active VCL. */
Expand Down Expand Up @@ -597,7 +598,7 @@ mcf_vcl_inline(struct cli *cli, const char * const *av, void *priv)
if (!mcf_find_no_vcl(cli, av[2]))
return;

vp = mgt_new_vcl(cli, av[2], av[3], vcls, av[4], 0);
vp = mgt_new_vcl(cli, av[2], av[3], vcls, av[4], NULL, 0);
if (vp != NULL && !MCH_Running())
VCLI_Out(cli, "VCL compiled.\n");
}
Expand All @@ -612,7 +613,7 @@ mcf_vcl_load(struct cli *cli, const char * const *av, void *priv)
if (!mcf_find_no_vcl(cli, av[2]))
return;

vp = mgt_new_vcl(cli, av[2], NULL, vcls, av[4], 0);
vp = mgt_new_vcl(cli, av[2], NULL, vcls, av[4], NULL, 0);
if (vp != NULL && !MCH_Running())
VCLI_Out(cli, "VCL compiled.\n");
}
Expand All @@ -621,30 +622,42 @@ static void v_matchproto_(cli_func_t)
mcf_vcl_load_files(struct cli *cli, const char * const *av, void *priv)
{
struct vclprog *vp;
const struct parspec *pp;
int i = 2;
const char *state = NULL;
const char *vcl_path = NULL;

while (av[i] != NULL) {
if (!strcmp(av[i], "-s")) {
FAIL_NO_ARG(av[i+1], "-s");
state = av[i+1];
i += 2;
} else if (!strcmp(av[i], "-p")) {
FAIL_NO_ARG(av[i+1], "-p");
pp = MCF_FindPar("vcl_path");
if (pp->flags & PROTECTED) {
VCLI_SetResult(cli, CLIS_AUTH);
VCLI_Out(cli, "parameter \"vcl_path\" is protected.\n");
return;
}
vcl_path = av[i+1];
i += 2;
} else {
break;
}
}

if (av[i] == NULL || av[i+1] == NULL) {
VCLI_SetResult(cli, CLIS_TOOFEW);
VCLI_Out(cli,"Too few arguments\n");
VCLI_Out(cli, "Too few arguments\n");
return;
}

(void)priv;
if (!mcf_find_no_vcl(cli, av[i]))
return;

vp = mgt_new_vcl(cli, av[i], NULL, &av[i+1], state, 0);
vp = mgt_new_vcl(cli, av[i], NULL, &av[i+1], state, vcl_path, 0);
if (vp != NULL && !MCH_Running())
VCLI_Out(cli, "VCL compiled.\n");
}
Expand Down
40 changes: 40 additions & 0 deletions bin/varnishtest/tests/c00123.vtc
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
varnishtest "Test vcl.load_files -p arg"

server s1 {
rxreq
txresp -status 202
} -start

varnish v1 -vcl+backend {} -start

shell {
(
echo 'vcl 4.0;'
echo 'backend default {'
echo ' .host="${s1_addr}";'
echo ' .port="${s1_port}";'
echo '}'
echo ''
echo 'include "inc.vcl";'
) > ${tmpdir}/c00123.vcl
}

shell {
(
echo 'sub vcl_deliver {'
echo ' set resp.http.test = "c00123";'
echo '}'
) > ${tmpdir}/inc.vcl
}

varnish v1 -cliexpect "No such file or directory" {vcl.load_files foo c00123.vcl}

varnish v1 -cliok {vcl.load_files -p ${tmpdir} foo c00123.vcl}
varnish v1 -cliok {vcl.use foo}

client c1 {
txreq
rxresp
expect resp.http.test == "c00123"
expect resp.status == 202
} -run
12 changes: 12 additions & 0 deletions doc/changes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,18 @@ Varnish Cache NEXT (2023-09-15)
* The newly introduced abstract socket support was incompatible with
other implementations, this has been fixed (3908_).

* A new ``vcl.load_files`` command has been added to cli. It has
the following syntax:

``vcl.load_file [-s auto|cold|warm] [-p vcl_path]
<configname> <filename1> [filename2, ...]``

It is similar to ``vcl.load`` command except that it turns the state argument
into ``[-s auto|cold|warm]``, it has an optional -p argument that is prepended
to ``vcl_path`` parameter when loading the vcls, and it allows to specify multiple
vcl files to load, they are parsed in the order they are provided, and treated
as if they were concatenated and merged into a single vcl file.

================================
Varnish Cache 7.3.0 (2023-03-15)
================================
Expand Down
6 changes: 4 additions & 2 deletions include/tbl/cli_cmds.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,13 @@ CLI_CMD(VCL_LOAD,

CLI_CMD(VCL_LOAD_FILES,
"vcl.load_files",
"vcl.load_files [-s auto|cold|warm] <configname> <filename1> [filename2, ...]",
"vcl.load_files [-s auto|cold|warm] [-p vcl_path] <configname> <filename1> [filename2, ...]",
"Compile and load multiple VCL files under the name provided.",
" When multiple files are specified, they are parsed in the order"
" they were provided and treated as if they were concatenated and merged into"
" a single vcl file.",
" a single vcl file."
" The optional ``-p`` argument specifies the path of the vcl files (and included files),"
" it is prepended to the ``VCL_PATH`` parameter.",
2, -1
)

Expand Down

0 comments on commit 58b0391

Please sign in to comment.