swid-gen: Share SWID generator between sw-collector, imc-swima and imc-swid

This commit is contained in:
Andreas Steffen
2017-08-04 19:15:26 +02:00
parent 073c179a88
commit 88501a64ca
15 changed files with 567 additions and 451 deletions
+12 -3
View File
@@ -99,9 +99,18 @@ The following parameters can be configured in strongswan.conf:
uri = https://admin-user:[email protected]/api/
timeout = 120
}
tag_creator {
name = strongSwan Project
regid = strongswan.org
}
.P
The parameters of the swid_generator used with the \-\-generate command can
be changed in the libimcv section of strongswan.conf:
.P
libimcv {
swid_gen {
command = /usr/local/bin/swid_generator
tag_creator {
name = strongSwan Project
regid = strongswan.org
}
}
}
.
+9 -94
View File
@@ -30,13 +30,11 @@
#include "sw_collector_dpkg.h"
#
#include <library.h>
#include <bio/bio_writer.h>
#include <utils/debug.h>
#include <utils/lexparser.h>
#include <imv/imv_os_info.h>
#define SWID_GENERATOR "/usr/local/bin/swid_generator"
#include <swid_gen/swid_gen.h>
/**
* global debug output variables
@@ -470,105 +468,21 @@ static int unregistered_identifiers(sw_collector_db_t *db,
}
/**
* Generate a either a full or a minimalistic ISO 19770-2:2015 SWID tag
*/
static char* generate_tag(char *name, char *package, char *version,
char* entity, char *regid, char *product,
bool full_tag, char *generator)
{
char *tag = NULL;
if (full_tag)
{
size_t tag_buf_len = 8192;
char tag_buf[tag_buf_len], command[BUF_LEN];
bio_writer_t *writer;
chunk_t tag_chunk;
FILE *file;
/* Compose the SWID generator command */
snprintf(command, BUF_LEN, "%s swid --full --regid %s --entity-name "
"\"%s\" --package %s", generator, regid, entity, package);
\
/* Open a pipe stream for reading the SWID generator output */
file = popen(command, "r");
if (file)
{
writer = bio_writer_create(tag_buf_len);
while (TRUE)
{
if (!fgets(tag_buf, tag_buf_len, file))
{
break;
}
writer->write_data(writer,
chunk_create(tag_buf, strlen(tag_buf)));
}
pclose(file);
tag_chunk = writer->extract_buf(writer);
writer->destroy(writer);
if (tag_chunk.len > 1)
{
tag = tag_chunk.ptr;
tag[tag_chunk.len - 1] = '\0';
}
}
else
{
DBG1(DBG_IMC, "failed to run swid_generator command");
}
}
/* Generate minimalistic SWID tag */
if (!tag)
{
char *tag_id;
tag_id = strstr(name, "__");
if (!tag_id)
{
return NULL;
}
tag_id += 2;
if (asprintf(&tag, "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<SoftwareIdentity name=\"%s\" tagId=\"%s\" version=\"%s\" "
"versionScheme=\"alphanumeric\" "
"xmlns=\"http://standards.iso.org/iso/19770/-2/2015/schema.xsd\">"
"<Entity name=\"%s\" regid=\"%s\" role=\"tagCreator\"/>"
"<Meta product=\"%s\"/>"
"</SoftwareIdentity>",
package, tag_id, version, entity, regid, product) == -1)
{
tag = NULL;
}
}
return tag;
}
/**
* Generate a minimalistic ISO 19770-2:2015 SWID tag for
* all removed SW identifiers that are not registered centrally
* Generate ISO 19770-2:2015 SWID tags for [installed|removed|all]
* SW identifiers that are not registered centrally
*/
static int generate_tags(sw_collector_info_t *info, sw_collector_db_t *db,
bool full_tags, sw_collector_db_query_t type)
{
swid_gen_t * swid_gen;
sw_collector_rest_api_t *rest_api;
char *name, *package, *version, *entity, *regid, *product, *generator, *tag;
char *name, *package, *version, *tag;
enumerator_t *enumerator;
uint32_t sw_id;
bool installed;
int count = 0, installed_count = 0, status = EXIT_FAILURE;
entity = lib->settings->get_str(lib->settings, "%s.tag_creator.name",
"strongSwan Project", lib->ns);
regid = lib->settings->get_str(lib->settings, "%s.tag_creator.regid",
"strongswan.org", lib->ns);
generator = lib->settings->get_str(lib->settings, "%s.swid_generator",
SWID_GENERATOR, lib->ns);
info->get_os(info, &product);
swid_gen = swid_gen_create();
rest_api = sw_collector_rest_api_create(db);
if (!rest_api)
{
@@ -585,8 +499,8 @@ static int generate_tags(sw_collector_info_t *info, sw_collector_db_t *db,
sw_id = db->get_sw_id(db, name, &package, &version, NULL, &installed);
if (sw_id)
{
tag = generate_tag(name, package, version, entity, regid, product,
full_tags && installed, generator);
tag = swid_gen->generate_tag(swid_gen, name, package, version,
full_tags && installed, FALSE);
if (tag)
{
DBG2(DBG_IMC, " creating %s", name);
@@ -623,6 +537,7 @@ static int generate_tags(sw_collector_info_t *info, sw_collector_db_t *db,
}
end:
swid_gen->destroy(swid_gen);
DESTROY_IF(rest_api);
return status;