forked from Mirror/frr
lib: add support for scripts directory
Specify default via --with-scriptdir at compile time, override default with --scriptdir at runtime. If unspecified, it's {sysconfdir}/scripts (usually /etc/frr/scripts) Signed-off-by: Quentin Young <qlyoung@nvidia.com>
This commit is contained in:
parent
fa22080d22
commit
e4e0229aba
11
configure.ac
11
configure.ac
|
@ -138,6 +138,12 @@ AC_ARG_WITH([moduledir], [AS_HELP_STRING([--with-moduledir=DIR], [module directo
|
||||||
])
|
])
|
||||||
AC_SUBST([moduledir], [$moduledir])
|
AC_SUBST([moduledir], [$moduledir])
|
||||||
|
|
||||||
|
AC_ARG_WITH([scriptdir], [AS_HELP_STRING([--with-scriptdir=DIR], [script directory (${libdir}/frr/scripts)])], [
|
||||||
|
scriptdir="$withval"
|
||||||
|
], [
|
||||||
|
scriptdir="\${sysconfdir}/scripts"
|
||||||
|
])
|
||||||
|
AC_SUBST([scriptdir], [$scriptdir])
|
||||||
|
|
||||||
AC_ARG_WITH([yangmodelsdir], [AS_HELP_STRING([--with-yangmodelsdir=DIR], [yang models directory (${datarootdir}/yang)])], [
|
AC_ARG_WITH([yangmodelsdir], [AS_HELP_STRING([--with-yangmodelsdir=DIR], [yang models directory (${datarootdir}/yang)])], [
|
||||||
yangmodelsdir="$withval"
|
yangmodelsdir="$withval"
|
||||||
|
@ -2423,19 +2429,23 @@ CFG_SBIN="$sbindir"
|
||||||
CFG_STATE="$frr_statedir"
|
CFG_STATE="$frr_statedir"
|
||||||
CFG_MODULE="$moduledir"
|
CFG_MODULE="$moduledir"
|
||||||
CFG_YANGMODELS="$yangmodelsdir"
|
CFG_YANGMODELS="$yangmodelsdir"
|
||||||
|
CFG_SCRIPT="$scriptdir"
|
||||||
for I in 1 2 3 4 5 6 7 8 9 10; do
|
for I in 1 2 3 4 5 6 7 8 9 10; do
|
||||||
eval CFG_SYSCONF="\"$CFG_SYSCONF\""
|
eval CFG_SYSCONF="\"$CFG_SYSCONF\""
|
||||||
eval CFG_SBIN="\"$CFG_SBIN\""
|
eval CFG_SBIN="\"$CFG_SBIN\""
|
||||||
eval CFG_STATE="\"$CFG_STATE\""
|
eval CFG_STATE="\"$CFG_STATE\""
|
||||||
eval CFG_MODULE="\"$CFG_MODULE\""
|
eval CFG_MODULE="\"$CFG_MODULE\""
|
||||||
eval CFG_YANGMODELS="\"$CFG_YANGMODELS\""
|
eval CFG_YANGMODELS="\"$CFG_YANGMODELS\""
|
||||||
|
eval CFG_SCRIPT="\"$CFG_SCRIPT\""
|
||||||
done
|
done
|
||||||
AC_SUBST([CFG_SYSCONF])
|
AC_SUBST([CFG_SYSCONF])
|
||||||
AC_SUBST([CFG_SBIN])
|
AC_SUBST([CFG_SBIN])
|
||||||
AC_SUBST([CFG_STATE])
|
AC_SUBST([CFG_STATE])
|
||||||
AC_SUBST([CFG_MODULE])
|
AC_SUBST([CFG_MODULE])
|
||||||
|
AC_SUBST([CFG_SCRIPT])
|
||||||
AC_SUBST([CFG_YANGMODELS])
|
AC_SUBST([CFG_YANGMODELS])
|
||||||
AC_DEFINE_UNQUOTED([MODULE_PATH], ["$CFG_MODULE"], [path to modules])
|
AC_DEFINE_UNQUOTED([MODULE_PATH], ["$CFG_MODULE"], [path to modules])
|
||||||
|
AC_DEFINE_UNQUOTED([SCRIPT_PATH], ["$CFG_SCRIPT"], [path to scripts])
|
||||||
AC_DEFINE_UNQUOTED([YANG_MODELS_PATH], ["$CFG_YANGMODELS"], [path to YANG data models])
|
AC_DEFINE_UNQUOTED([YANG_MODELS_PATH], ["$CFG_YANGMODELS"], [path to YANG data models])
|
||||||
AC_DEFINE_UNQUOTED([WATCHFRR_SH_PATH], ["${CFG_SBIN%/}/watchfrr.sh"], [path to watchfrr.sh])
|
AC_DEFINE_UNQUOTED([WATCHFRR_SH_PATH], ["${CFG_SBIN%/}/watchfrr.sh"], [path to watchfrr.sh])
|
||||||
|
|
||||||
|
@ -2546,6 +2556,7 @@ state file directory : ${frr_statedir}
|
||||||
config file directory : `eval echo \`echo ${sysconfdir}\``
|
config file directory : `eval echo \`echo ${sysconfdir}\``
|
||||||
example directory : `eval echo \`echo ${exampledir}\``
|
example directory : `eval echo \`echo ${exampledir}\``
|
||||||
module directory : ${CFG_MODULE}
|
module directory : ${CFG_MODULE}
|
||||||
|
script directory : ${CFG_SCRIPT}
|
||||||
user to run as : ${enable_user}
|
user to run as : ${enable_user}
|
||||||
group to run as : ${enable_group}
|
group to run as : ${enable_group}
|
||||||
group for vty sockets : ${enable_vty_group}
|
group for vty sockets : ${enable_vty_group}
|
||||||
|
|
|
@ -64,6 +64,7 @@ struct frrscript_codec frrscript_codecs_lib[] = {
|
||||||
/* Type codecs */
|
/* Type codecs */
|
||||||
|
|
||||||
struct hash *codec_hash;
|
struct hash *codec_hash;
|
||||||
|
char scriptdir[MAXPATHLEN];
|
||||||
|
|
||||||
static unsigned int codec_hash_key(const void *data)
|
static unsigned int codec_hash_key(const void *data)
|
||||||
{
|
{
|
||||||
|
@ -213,7 +214,7 @@ struct frrscript *frrscript_load(const char *name,
|
||||||
frrlua_export_logging(fs->L);
|
frrlua_export_logging(fs->L);
|
||||||
|
|
||||||
char fname[MAXPATHLEN];
|
char fname[MAXPATHLEN];
|
||||||
snprintf(fname, sizeof(fname), FRRSCRIPT_PATH "/%s.lua", fs->name);
|
snprintf(fname, sizeof(fname), "%s/%s.lua", scriptdir, fs->name);
|
||||||
|
|
||||||
int ret = luaL_loadfile(fs->L, fname);
|
int ret = luaL_loadfile(fs->L, fname);
|
||||||
|
|
||||||
|
@ -262,11 +263,13 @@ void frrscript_unload(struct frrscript *fs)
|
||||||
XFREE(MTYPE_SCRIPT, fs);
|
XFREE(MTYPE_SCRIPT, fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void frrscript_init()
|
void frrscript_init(const char *sd)
|
||||||
{
|
{
|
||||||
codec_hash = hash_create(codec_hash_key, codec_hash_cmp,
|
codec_hash = hash_create(codec_hash_key, codec_hash_cmp,
|
||||||
"Lua type encoders");
|
"Lua type encoders");
|
||||||
|
|
||||||
|
strlcpy(scriptdir, sd, sizeof(scriptdir));
|
||||||
|
|
||||||
/* Register core library types */
|
/* Register core library types */
|
||||||
frrscript_register_type_codecs(frrscript_codecs_lib);
|
frrscript_register_type_codecs(frrscript_codecs_lib);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,8 +30,6 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define FRRSCRIPT_PATH "/etc/frr/scripts"
|
|
||||||
|
|
||||||
typedef void (*encoder_func)(lua_State *, const void *);
|
typedef void (*encoder_func)(lua_State *, const void *);
|
||||||
typedef void *(*decoder_func)(lua_State *, int);
|
typedef void *(*decoder_func)(lua_State *, int);
|
||||||
|
|
||||||
|
@ -92,8 +90,11 @@ void frrscript_register_type_codecs(struct frrscript_codec *codecs);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize scripting subsystem. Call this before anything else.
|
* Initialize scripting subsystem. Call this before anything else.
|
||||||
|
*
|
||||||
|
* scriptdir
|
||||||
|
* Directory in which to look for scripts
|
||||||
*/
|
*/
|
||||||
void frrscript_init(void);
|
void frrscript_init(const char *scriptdir);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
14
lib/libfrr.c
14
lib/libfrr.c
|
@ -56,6 +56,7 @@ char frr_vtydir[256];
|
||||||
const char frr_dbdir[] = DAEMON_DB_DIR;
|
const char frr_dbdir[] = DAEMON_DB_DIR;
|
||||||
#endif
|
#endif
|
||||||
const char frr_moduledir[] = MODULE_PATH;
|
const char frr_moduledir[] = MODULE_PATH;
|
||||||
|
const char frr_scriptdir[] = SCRIPT_PATH;
|
||||||
|
|
||||||
char frr_protoname[256] = "NONE";
|
char frr_protoname[256] = "NONE";
|
||||||
char frr_protonameinst[256] = "NONE";
|
char frr_protonameinst[256] = "NONE";
|
||||||
|
@ -101,6 +102,7 @@ static void opt_extend(const struct optspec *os)
|
||||||
#define OPTION_DB_FILE 1006
|
#define OPTION_DB_FILE 1006
|
||||||
#define OPTION_LOGGING 1007
|
#define OPTION_LOGGING 1007
|
||||||
#define OPTION_LIMIT_FDS 1008
|
#define OPTION_LIMIT_FDS 1008
|
||||||
|
#define OPTION_SCRIPTDIR 1009
|
||||||
|
|
||||||
static const struct option lo_always[] = {
|
static const struct option lo_always[] = {
|
||||||
{"help", no_argument, NULL, 'h'},
|
{"help", no_argument, NULL, 'h'},
|
||||||
|
@ -111,6 +113,7 @@ static const struct option lo_always[] = {
|
||||||
{"pathspace", required_argument, NULL, 'N'},
|
{"pathspace", required_argument, NULL, 'N'},
|
||||||
{"vty_socket", required_argument, NULL, OPTION_VTYSOCK},
|
{"vty_socket", required_argument, NULL, OPTION_VTYSOCK},
|
||||||
{"moduledir", required_argument, NULL, OPTION_MODULEDIR},
|
{"moduledir", required_argument, NULL, OPTION_MODULEDIR},
|
||||||
|
{"scriptdir", required_argument, NULL, OPTION_SCRIPTDIR},
|
||||||
{"log", required_argument, NULL, OPTION_LOG},
|
{"log", required_argument, NULL, OPTION_LOG},
|
||||||
{"log-level", required_argument, NULL, OPTION_LOGLEVEL},
|
{"log-level", required_argument, NULL, OPTION_LOGLEVEL},
|
||||||
{"tcli", no_argument, NULL, OPTION_TCLI},
|
{"tcli", no_argument, NULL, OPTION_TCLI},
|
||||||
|
@ -127,6 +130,7 @@ static const struct optspec os_always = {
|
||||||
" -N, --pathspace Insert prefix into config & socket paths\n"
|
" -N, --pathspace Insert prefix into config & socket paths\n"
|
||||||
" --vty_socket Override vty socket path\n"
|
" --vty_socket Override vty socket path\n"
|
||||||
" --moduledir Override modules directory\n"
|
" --moduledir Override modules directory\n"
|
||||||
|
" --scriptdir Override scripts directory\n"
|
||||||
" --log Set Logging to stdout, syslog, or file:<name>\n"
|
" --log Set Logging to stdout, syslog, or file:<name>\n"
|
||||||
" --log-level Set Logging Level to use, debug, info, warn, etc\n"
|
" --log-level Set Logging Level to use, debug, info, warn, etc\n"
|
||||||
" --tcli Use transaction-based CLI\n"
|
" --tcli Use transaction-based CLI\n"
|
||||||
|
@ -534,6 +538,14 @@ static int frr_opt(int opt)
|
||||||
}
|
}
|
||||||
di->module_path = optarg;
|
di->module_path = optarg;
|
||||||
break;
|
break;
|
||||||
|
case OPTION_SCRIPTDIR:
|
||||||
|
if (di->script_path) {
|
||||||
|
fprintf(stderr, "--scriptdir option specified more than once!\n");
|
||||||
|
errors++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
di->script_path = optarg;
|
||||||
|
break;
|
||||||
case OPTION_TCLI:
|
case OPTION_TCLI:
|
||||||
di->cli_mode = FRR_CLI_TRANSACTIONAL;
|
di->cli_mode = FRR_CLI_TRANSACTIONAL;
|
||||||
break;
|
break;
|
||||||
|
@ -719,7 +731,7 @@ struct thread_master *frr_init(void)
|
||||||
|
|
||||||
frr_pthread_init();
|
frr_pthread_init();
|
||||||
#ifdef HAVE_SCRIPTING
|
#ifdef HAVE_SCRIPTING
|
||||||
frrscript_init();
|
frrscript_init(di->script_path ? di->script_path : frr_scriptdir);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
log_ref_init();
|
log_ref_init();
|
||||||
|
|
|
@ -81,6 +81,7 @@ struct frr_daemon_info {
|
||||||
#endif
|
#endif
|
||||||
const char *vty_path;
|
const char *vty_path;
|
||||||
const char *module_path;
|
const char *module_path;
|
||||||
|
const char *script_path;
|
||||||
|
|
||||||
const char *pathspace;
|
const char *pathspace;
|
||||||
bool zpathspace;
|
bool zpathspace;
|
||||||
|
@ -162,6 +163,7 @@ extern char frr_zclientpath[256];
|
||||||
extern const char frr_sysconfdir[];
|
extern const char frr_sysconfdir[];
|
||||||
extern char frr_vtydir[256];
|
extern char frr_vtydir[256];
|
||||||
extern const char frr_moduledir[];
|
extern const char frr_moduledir[];
|
||||||
|
extern const char frr_scriptdir[];
|
||||||
|
|
||||||
extern char frr_protoname[];
|
extern char frr_protoname[];
|
||||||
extern char frr_protonameinst[];
|
extern char frr_protonameinst[];
|
||||||
|
|
Loading…
Reference in a new issue