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 Mar 23, 2023
1 parent 2c30e74 commit e160358
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 12 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
25 changes: 19 additions & 6 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,14 +622,26 @@ 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;
}
Expand All @@ -644,7 +657,7 @@ mcf_vcl_load_files(struct cli *cli, const char * const *av, 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
13 changes: 13 additions & 0 deletions doc/changes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,19 @@ 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 adds an optional -p argument that is prepended
to ``vcl_path`` parameter when loading the vcls, and it adds a way 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 e160358

Please sign in to comment.