Add support for reading configuration files from /etc/pkg.
For now only /etc/pkg/FreeBSD.conf is supported. Its style is: Repo: { URL: "...", MIRROR_TYPE: "...", ... } The configuration will be read from /usr/local/etc/pkg.conf if exists, otherwise /etc/pkg/FreeBSD.conf Approved by: bapt MFC after: 2 days
This commit is contained in:
parent
c20809e143
commit
bc5e9ac08d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=257145
@ -225,6 +225,9 @@ distribution:
|
||||
${_+_}cd ${.CURDIR}/devd; ${MAKE} install
|
||||
${_+_}cd ${.CURDIR}/gss; ${MAKE} install
|
||||
${_+_}cd ${.CURDIR}/periodic; ${MAKE} install
|
||||
.if ${MK_PKGBOOTSTRAP} != "no"
|
||||
${_+_}cd ${.CURDIR}/pkg; ${MAKE} install
|
||||
.endif
|
||||
${_+_}cd ${.CURDIR}/rc.d; ${MAKE} install
|
||||
${_+_}cd ${.CURDIR}/../gnu/usr.bin/send-pr; ${MAKE} etc-gnats-freefall
|
||||
${_+_}cd ${.CURDIR}/../share/termcap; ${MAKE} etc-termcap
|
||||
|
6
etc/pkg/FreeBSD.conf
Normal file
6
etc/pkg/FreeBSD.conf
Normal file
@ -0,0 +1,6 @@
|
||||
# $FreeBSD$
|
||||
FreeBSD: {
|
||||
url: "pkg+http://pkg.freebsd.org/${ABI}/latest",
|
||||
mirror_type: "srv",
|
||||
enabled: "yes"
|
||||
}
|
10
etc/pkg/Makefile
Normal file
10
etc/pkg/Makefile
Normal file
@ -0,0 +1,10 @@
|
||||
# $FreeBSD$
|
||||
|
||||
NO_OBJ=
|
||||
|
||||
FILES= FreeBSD.conf
|
||||
|
||||
FILESDIR= /etc/pkg
|
||||
FILESMODE= 644
|
||||
|
||||
.include <bsd.prog.mk>
|
@ -460,7 +460,7 @@ subst_packagesite(const char *abi)
|
||||
}
|
||||
|
||||
static void
|
||||
config_parse(yaml_document_t *doc, yaml_node_t *node)
|
||||
config_parse(yaml_document_t *doc, yaml_node_t *node, pkg_conf_file_t conftype)
|
||||
{
|
||||
yaml_node_pair_t *pair;
|
||||
yaml_node_t *key, *val;
|
||||
@ -495,15 +495,33 @@ config_parse(yaml_document_t *doc, yaml_node_t *node)
|
||||
}
|
||||
|
||||
sbuf_clear(buf);
|
||||
for (j = 0; j < strlen(key->data.scalar.value); ++j)
|
||||
sbuf_putc(buf, toupper(key->data.scalar.value[j]));
|
||||
|
||||
sbuf_finish(buf);
|
||||
if (conftype == CONFFILE_PKG) {
|
||||
for (j = 0; j < strlen(key->data.scalar.value); ++j)
|
||||
sbuf_putc(buf,
|
||||
toupper(key->data.scalar.value[j]));
|
||||
sbuf_finish(buf);
|
||||
} else if (conftype == CONFFILE_REPO) {
|
||||
/* The CONFFILE_REPO type is more restrictive. Only
|
||||
parse known elements. */
|
||||
if (strcasecmp(key->data.scalar.value, "url") == 0)
|
||||
sbuf_cpy(buf, "PACKAGESITE");
|
||||
else if (strcasecmp(key->data.scalar.value,
|
||||
"mirror_type") == 0)
|
||||
sbuf_cpy(buf, "MIRROR_TYPE");
|
||||
else { /* Skip unknown entries for future use. */
|
||||
++pair;
|
||||
continue;
|
||||
}
|
||||
sbuf_finish(buf);
|
||||
}
|
||||
|
||||
for (i = 0; i < CONFIG_SIZE; i++) {
|
||||
if (strcmp(sbuf_data(buf), c[i].key) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Silently skip unknown keys to be future compatible. */
|
||||
if (i == CONFIG_SIZE) {
|
||||
++pair;
|
||||
continue;
|
||||
@ -522,13 +540,80 @@ config_parse(yaml_document_t *doc, yaml_node_t *node)
|
||||
sbuf_delete(buf);
|
||||
}
|
||||
|
||||
int
|
||||
config_init(void)
|
||||
/*-
|
||||
* Parse new repo style configs in style:
|
||||
* Name:
|
||||
* URL:
|
||||
* MIRROR_TYPE:
|
||||
* etc...
|
||||
*/
|
||||
static void
|
||||
parse_repo_file(yaml_document_t *doc, yaml_node_t *node)
|
||||
{
|
||||
yaml_node_pair_t *pair;
|
||||
|
||||
pair = node->data.mapping.pairs.start;
|
||||
while (pair < node->data.mapping.pairs.top) {
|
||||
yaml_node_t *key = yaml_document_get_node(doc, pair->key);
|
||||
yaml_node_t *val = yaml_document_get_node(doc, pair->value);
|
||||
|
||||
if (key->data.scalar.length <= 0) {
|
||||
++pair;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (val->type != YAML_MAPPING_NODE) {
|
||||
++pair;
|
||||
continue;
|
||||
}
|
||||
|
||||
config_parse(doc, val, CONFFILE_REPO);
|
||||
++pair;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
read_conf_file(const char *confpath, pkg_conf_file_t conftype)
|
||||
{
|
||||
FILE *fp;
|
||||
yaml_parser_t parser;
|
||||
yaml_document_t doc;
|
||||
yaml_node_t *node;
|
||||
|
||||
if ((fp = fopen(confpath, "r")) == NULL) {
|
||||
if (errno != ENOENT)
|
||||
err(EXIT_FAILURE, "Unable to open configuration "
|
||||
"file %s", confpath);
|
||||
/* no configuration present */
|
||||
return (1);
|
||||
}
|
||||
|
||||
yaml_parser_initialize(&parser);
|
||||
yaml_parser_set_input_file(&parser, fp);
|
||||
yaml_parser_load(&parser, &doc);
|
||||
|
||||
node = yaml_document_get_root_node(&doc);
|
||||
|
||||
if (node == NULL || node->type != YAML_MAPPING_NODE)
|
||||
warnx("Invalid configuration format, ignoring the "
|
||||
"configuration file %s", confpath);
|
||||
else {
|
||||
if (conftype == CONFFILE_PKG)
|
||||
config_parse(&doc, node, conftype);
|
||||
else if (conftype == CONFFILE_REPO)
|
||||
parse_repo_file(&doc, node);
|
||||
}
|
||||
|
||||
yaml_document_delete(&doc);
|
||||
yaml_parser_delete(&parser);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
config_init(void)
|
||||
{
|
||||
const char *val;
|
||||
int i;
|
||||
const char *localbase;
|
||||
@ -544,35 +629,17 @@ config_init(void)
|
||||
}
|
||||
|
||||
localbase = getenv("LOCALBASE") ? getenv("LOCALBASE") : _LOCALBASE;
|
||||
snprintf(confpath, sizeof(confpath), "%s/etc/pkg.conf", localbase);
|
||||
snprintf(confpath, sizeof(confpath), "%s/etc/pkg.conf",
|
||||
localbase);
|
||||
|
||||
if ((fp = fopen(confpath, "r")) == NULL) {
|
||||
if (errno != ENOENT)
|
||||
err(EXIT_FAILURE, "Unable to open configuration "
|
||||
"file %s", confpath);
|
||||
/* no configuration present */
|
||||
if (access(confpath, F_OK) == 0 && read_conf_file(confpath,
|
||||
CONFFILE_PKG))
|
||||
goto finalize;
|
||||
}
|
||||
|
||||
yaml_parser_initialize(&parser);
|
||||
yaml_parser_set_input_file(&parser, fp);
|
||||
yaml_parser_load(&parser, &doc);
|
||||
|
||||
node = yaml_document_get_root_node(&doc);
|
||||
|
||||
if (node != NULL) {
|
||||
if (node->type != YAML_MAPPING_NODE)
|
||||
warnx("Invalid configuration format, ignoring the "
|
||||
"configuration file");
|
||||
else
|
||||
config_parse(&doc, node);
|
||||
} else {
|
||||
warnx("Invalid configuration format, ignoring the "
|
||||
"configuration file");
|
||||
}
|
||||
|
||||
yaml_document_delete(&doc);
|
||||
yaml_parser_delete(&parser);
|
||||
snprintf(confpath, sizeof(confpath), "/etc/pkg/FreeBSD.conf");
|
||||
if (access(confpath, F_OK) == 0 && read_conf_file(confpath,
|
||||
CONFFILE_REPO))
|
||||
goto finalize;
|
||||
|
||||
finalize:
|
||||
if (c[ABI].val == NULL && c[ABI].value == NULL) {
|
||||
|
@ -45,6 +45,11 @@ typedef enum {
|
||||
PKG_CONFIG_BOOL,
|
||||
} pkg_config_t;
|
||||
|
||||
typedef enum {
|
||||
CONFFILE_PKG=0,
|
||||
CONFFILE_REPO,
|
||||
} pkg_conf_file_t;
|
||||
|
||||
int config_init(void);
|
||||
void config_finish(void);
|
||||
int config_string(pkg_config_key, const char **);
|
||||
|
Loading…
Reference in New Issue
Block a user