Skip to content

Commit

Permalink
appmodel: add app-transform() parser
Browse files Browse the repository at this point in the history
Signed-off-by: Balazs Scheidler <balazs.scheidler@axoflow.com>
  • Loading branch information
bazsi committed May 16, 2024
1 parent 7605180 commit 1b76a4b
Show file tree
Hide file tree
Showing 6 changed files with 172 additions and 2 deletions.
1 change: 1 addition & 0 deletions modules/appmodel/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ set (APPMODEL_SOURCES
appmodel-context.c
app-object-generator.c
app-parser-generator.c
app-transform-generator.c
application.c
)

Expand Down
2 changes: 2 additions & 0 deletions modules/appmodel/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ modules_appmodel_libappmodel_la_SOURCES = \
modules/appmodel/app-object-generator.h \
modules/appmodel/app-parser-generator.c \
modules/appmodel/app-parser-generator.h \
modules/appmodel/app-transform-generator.c \
modules/appmodel/app-transform-generator.h \
modules/appmodel/application.c \
modules/appmodel/application.h \
modules/appmodel/transformation.c \
Expand Down
4 changes: 2 additions & 2 deletions modules/appmodel/app-parser-generator.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
*
*/

#ifndef APPMODEL_APPPARSER_GENERATOR_H_INCLUDED
#define APPMODEL_APPPARSER_GENERATOR_H_INCLUDED
#ifndef APPMODEL_APP_PARSER_GENERATOR_H_INCLUDED
#define APPMODEL_APP_PARSER_GENERATOR_H_INCLUDED

#include "plugin.h"

Expand Down
122 changes: 122 additions & 0 deletions modules/appmodel/app-transform-generator.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
/*
* Copyright (c) 2024 Balazs Scheidler <balazs.scheidler@axoflow.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* As an additional exemption you are allowed to compile & link against the
* OpenSSL libraries as published by the OpenSSL project. See the file
* COPYING for details.
*
*/

#include "app-object-generator.h"
#include "appmodel.h"

/* app-transform() */

typedef struct _AppTransformGenerator
{
AppObjectGenerator super;
const gchar *flavour;
GString *block;
} AppTransformGenerator;

static gboolean
_parse_transforms_arg(AppTransformGenerator *self, CfgArgs *args, const gchar *reference)
{
self->flavour = cfg_args_get(args, "flavour");
if (!self->flavour)
self->flavour = "default";
return TRUE;
}

static gboolean
app_transform_generator_parse_arguments(AppObjectGenerator *s, CfgArgs *args, const gchar *reference)
{
AppTransformGenerator *self = (AppTransformGenerator *) s;
g_assert(args != NULL);

if (!_parse_transforms_arg(self, args, reference))
return FALSE;

if (!app_object_generator_parse_arguments_method(&self->super, args, reference))
return FALSE;

return TRUE;
}

static void
_generate_steps(AppTransformGenerator *self, GList *steps)
{
for (GList *l = steps; l; l = l->next)
{
TransformationStep *step = l->data;
g_string_append_printf(self->block, " # step: %s", step->name);
g_string_append_printf(self->block, " %s\n", step->expr);
}
}

static void
_generate_app_transform(Transformation *transformation, gpointer user_data)
{
AppTransformGenerator *self = (AppTransformGenerator *) user_data;

if (strcmp(transformation->super.instance, self->flavour) != 0)
return;

if (!app_object_generator_is_application_included(&self->super, transformation->super.name))
return;

if (app_object_generator_is_application_excluded(&self->super, transformation->super.name))
return;

g_string_append_printf(self->block, "\n#Start Application %s\n", transformation->super.name);
g_string_append_printf(self->block, " if (meta.app_name == '%s') {\n", transformation->super.name);
for (GList *l = transformation->blocks; l; l = l->next)
{
TransformationBlock *block = l->data;

_generate_steps(self, block->steps);
}
g_string_append(self->block, " };\n");
g_string_append_printf(self->block, "\n#End Application %s\n", transformation->super.name);
}


static void
app_transform_generate_config(AppObjectGenerator *s, GlobalConfig *cfg, GString *result)
{
AppTransformGenerator *self = (AppTransformGenerator *) s;

self->block = result;
g_string_append_printf(result, "## app-transform(flavour(%s))\n"
"channel {\n"
" filterx {\n", self->flavour);
appmodel_iter_transformations(cfg, _generate_app_transform, self);
g_string_append(result, " };\n"
"}");
self->block = NULL;
}

CfgBlockGenerator *
app_transform_generator_new(gint context, const gchar *name)
{
AppTransformGenerator *self = g_new0(AppTransformGenerator, 1);

app_object_generator_init_instance(&self->super, context, name);
self->super.parse_arguments = app_transform_generator_parse_arguments;
self->super.generate_config = app_transform_generate_config;
return &self->super.super;
}
32 changes: 32 additions & 0 deletions modules/appmodel/app-transform-generator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Copyright (c) 2017 Balabit
* Copyright (c) 2017 Balazs Scheidler <balazs.scheidler@balabit.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* As an additional exemption you are allowed to compile & link against the
* OpenSSL libraries as published by the OpenSSL project. See the file
* COPYING for details.
*
*/

#ifndef APPMODEL_APP_TRANSFORM_GENERATOR_H_INCLUDED
#define APPMODEL_APP_TRANSFORM_GENERATOR_H_INCLUDED

#include "plugin.h"

CfgBlockGenerator *app_transform_generator_new(gint context, const gchar *name);

#endif
13 changes: 13 additions & 0 deletions modules/appmodel/appmodel-plugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "cfg-parser.h"
#include "appmodel-parser.h"
#include "app-parser-generator.h"
#include "app-transform-generator.h"
#include "block-ref-parser.h"
#include "plugin.h"
#include "plugin-types.h"
Expand All @@ -36,6 +37,12 @@ app_parser_construct(Plugin *p)
return app_parser_generator_new(p->type, p->name);
}

static gpointer
app_transform_construct(Plugin *p)
{
return app_transform_generator_new(p->type, p->name);
}

static Plugin appmodel_plugins[] =
{
{
Expand All @@ -53,6 +60,12 @@ static Plugin appmodel_plugins[] =
.name = "app-parser",
.construct = app_parser_construct,
.parser = &block_ref_parser
},
{
.type = LL_CONTEXT_PARSER | LL_CONTEXT_FLAG_GENERATOR,
.name = "app-transform",
.construct = app_transform_construct,
.parser = &block_ref_parser
}
};

Expand Down

0 comments on commit 1b76a4b

Please sign in to comment.