Skip to content
Snippets Groups Projects
Commit 11cc5584 authored by Sjoerd Simons's avatar Sjoerd Simons
Browse files

First import

parents
No related branches found
No related tags found
No related merge requests found
project('apertis-hawkbit-agent',
'c',
version: '0.0.1')
prefixdir = get_option('prefix')
gnome = import('gnome')
glib = dependency('glib-2.0')
gobject = dependency('gobject-2.0')
gio = dependency('gio-2.0 gio-unix-2.0')
libsystemd = dependency('libsystemd')
systemd = dependency('systemd')
soup = dependency('libsoup-2.4')
jsonglib = dependency('json-glib-1.0')
datadir = get_option('datadir')
systemunitdir = systemd.get_pkgconfig_variable('systemdsystemunitdir')
pkgdatadir = join_paths(datadir, meson.project_name())
# Can't be found in packageconf, explicitly use the system directory
dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
sources = [ 'src/main.c',
'src/hawkbit-base.c',
'src/hawkbit-base.h',
'src/hawkbit-deployment-base.c',
'src/hawkbit-deployment-base.h',
'src/hawkbit-session.c',
'src/hawkbit-session.h' ]
executable('apertis-hawkbit-agent',
sources,
install: true,
install_dir: get_option('libexecdir'),
dependencies: [ glib, gobject, gio, soup, jsonglib ])
/* vim:set et sw=2 cin cino=t0,f0,(0,{s,>2s,n-s,^-s,e2s: */
/*
* Copyright © 2019 Collabora Ltd.
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#include "hawkbit-base.h"
#include "hawkbit-session.h"
#include <json-glib/json-glib.h>
struct _AhaHawkbitBase{
GObject parent;
AhaHawkbitSession *session;
JsonParser *parser;
};
enum
{
PROP_HAWKBIT_SESSION = 1,
NUM_PROPERTIES
};
static GParamSpec *props[NUM_PROPERTIES] = { NULL, };
G_DEFINE_TYPE (AhaHawkbitBase,
aha_hawkbit_base,
G_TYPE_OBJECT)
static void
aha_hawkbit_base_init (AhaHawkbitBase * self)
{
}
/*
static void
aha_hawkbit_base_constructed (GObject *object)
{
//AhaHawkbitBase *self = AHA_HAWKBIT_BASE (object);
}
*/
static void
aha_hawkbit_base_dispose (GObject * object)
{
AhaHawkbitBase *self = AHA_HAWKBIT_BASE (object);
g_clear_object (&self->session);
g_clear_object (&self->parser);
if (G_OBJECT_CLASS (aha_hawkbit_base_parent_class)->dispose)
G_OBJECT_CLASS (aha_hawkbit_base_parent_class)->dispose (object);
}
static void
aha_hawkbit_base_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
AhaHawkbitBase *self = AHA_HAWKBIT_BASE (object);
switch (prop_id)
{
case PROP_HAWKBIT_SESSION:
self->session = g_value_dup_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
aha_hawkbit_base_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
AhaHawkbitBase *self = AHA_HAWKBIT_BASE (object);
switch (prop_id)
{
case PROP_HAWKBIT_SESSION:
g_value_set_object (value, self->session);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
aha_hawkbit_base_class_init (AhaHawkbitBaseClass * cls)
{
GObjectClass *object_class = G_OBJECT_CLASS (cls);
props[PROP_HAWKBIT_SESSION] =
g_param_spec_object ("session",
"Hawkbit Session",
"Hawkbit Session Object",
AHA_TYPE_HAWKBIT_SESSION,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
object_class->dispose = aha_hawkbit_base_dispose;
object_class->get_property = aha_hawkbit_base_get_property;
object_class->set_property = aha_hawkbit_base_set_property;
//object_class->constructed = aha_hawkbit_base_constructed;
g_object_class_install_properties (object_class,
NUM_PROPERTIES,
props);
}
void
aha_hawkbit_base_update (AhaHawkbitBase *self)
{
g_autoptr (SoupMessage) msg;
guint status;
g_clear_object (&self->parser);
msg = aha_hawkbit_session_create_message (self->session,
SOUP_METHOD_GET,
"");
status = soup_session_send_message (
aha_hawkbit_session_get_soup_session (self->session),
msg);
g_print("=> %d\n", status);
g_print("=> %s\n", msg->response_body->data);
self->parser = json_parser_new();
json_parser_load_from_data (self->parser,
msg->response_body->data,
msg->response_body->length,
NULL);
}
gchar *
aha_hawkbit_base_get_deployment_base (AhaHawkbitBase *self)
{
JsonNode *root = NULL;
JsonNode *node = NULL;
JsonObject *obj = NULL;
if (self->parser == NULL)
return NULL;
root = json_parser_get_root (self->parser);
obj = json_node_get_object (root);
node = json_object_get_member (obj, "_links");
obj = json_node_get_object (node);
node = json_object_get_member (obj, "deploymentBase");
if (node == NULL)
return NULL;
obj = json_node_get_object (node);
node = json_object_get_member (obj, "href");
return json_node_dup_string (node);
}
/* vim:set et sw=2 cin cino=t0,f0,(0,{s,>2s,n-s,^-s,e2s: */
/*
* Copyright © 2019 Collabora Ltd.
*
* SPDX-License-Identifier: LGPL-2.1+
*/
/* inclusion guard */
#ifndef __AHA_HAWKBIT_BASE_H__
#define __AHA_HAWKBIT_BASE_H__
#include <glib-object.h>
#include <glib.h>
#include <libsoup/soup.h>
G_BEGIN_DECLS
/*
* Type declaration.
*/
#define AHA_TYPE_HAWKBIT_BASE aha_hawkbit_base_get_type ()
G_DECLARE_FINAL_TYPE (AhaHawkbitBase,
aha_hawkbit_base,
AHA,
HAWKBIT_BASE,
GObject)
void
aha_hawkbit_base_update (AhaHawkbitBase *self);
gchar *
aha_hawkbit_base_get_deployment_base (AhaHawkbitBase *self);
G_END_DECLS
#endif /* __AHA_HAWKBIT_BASE_H__ */
/* vim:set et sw=2 cin cino=t0,f0,(0,{s,>2s,n-s,^-s,e2s: */
/*
* Copyright © 2019 Collabora Ltd.
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#include "hawkbit-deployment-base.h"
#include "hawkbit-session.h"
#include <json-glib/json-glib.h>
struct _AhaHawkbitDeploymentBase{
GObject parent;
AhaHawkbitSession *session;
gchar *uri;
gchar *update_uri;
gchar *update_filename;
gchar *deployment_id;
JsonParser *parser;
};
enum
{
PROP_HAWKBIT_SESSION = 1,
PROP_URI,
NUM_PROPERTIES
};
static GParamSpec *props[NUM_PROPERTIES] = { NULL, };
G_DEFINE_TYPE (AhaHawkbitDeploymentBase,
aha_hawkbit_deployment_base,
G_TYPE_OBJECT)
static void
aha_hawkbit_deployment_base_init (AhaHawkbitDeploymentBase * self)
{
}
/*
static void
aha_hawkbit_deployment_base_constructed (GObject *object)
{
//AhaHawkbitDeploymentBase *self = AHA_HAWKBIT_DEPLOYMENT_BASE (object);
}
*/
static void
aha_hawkbit_deployment_base_dispose (GObject * object)
{
AhaHawkbitDeploymentBase *self = AHA_HAWKBIT_DEPLOYMENT_BASE (object);
g_clear_object (&self->session);
g_clear_object (&self->parser);
g_clear_pointer (&self->uri, g_free);
g_clear_pointer (&self->update_uri, g_free);
g_clear_pointer (&self->update_filename, g_free);
g_clear_pointer (&self->deployment_id, g_free);
if (G_OBJECT_CLASS (aha_hawkbit_deployment_base_parent_class)->dispose)
G_OBJECT_CLASS (aha_hawkbit_deployment_base_parent_class)->dispose (object);
}
static void
aha_hawkbit_deployment_base_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
AhaHawkbitDeploymentBase *self = AHA_HAWKBIT_DEPLOYMENT_BASE (object);
switch (prop_id)
{
case PROP_HAWKBIT_SESSION:
self->session = g_value_dup_object (value);
break;
case PROP_URI:
self->uri = g_value_dup_string (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
aha_hawkbit_deployment_base_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
AhaHawkbitDeploymentBase *self = AHA_HAWKBIT_DEPLOYMENT_BASE (object);
switch (prop_id)
{
case PROP_HAWKBIT_SESSION:
g_value_set_object (value, self->session);
break;
case PROP_URI:
g_value_set_string (value, self->uri);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
aha_hawkbit_deployment_base_class_init (AhaHawkbitDeploymentBaseClass * cls)
{
GObjectClass *object_class = G_OBJECT_CLASS (cls);
props[PROP_HAWKBIT_SESSION] =
g_param_spec_object ("session",
"Hawkbit Session",
"Hawkbit Session Object",
AHA_TYPE_HAWKBIT_SESSION,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
props[PROP_URI] =
g_param_spec_string ("uri",
"Hawkbit Deployment base uri",
"Hawkbit Deployment base uri",
"",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
object_class->dispose = aha_hawkbit_deployment_base_dispose;
object_class->get_property = aha_hawkbit_deployment_base_get_property;
object_class->set_property = aha_hawkbit_deployment_base_set_property;
//object_class->constructed = aha_hawkbit_deployment_base_constructed;
g_object_class_install_properties (object_class,
NUM_PROPERTIES,
props);
}
void
aha_hawkbit_deployment_base_update (AhaHawkbitDeploymentBase *self)
{
g_autoptr (SoupMessage) msg;
guint status;
JsonNode *root = NULL;
JsonNode *node = NULL;
JsonNode *anode = NULL;
JsonObject *obj = NULL;
JsonArray *array = NULL;
g_clear_object (&self->parser);
g_clear_pointer (&self->update_uri, g_free);
g_clear_pointer (&self->update_filename, g_free);
g_clear_pointer (&self->deployment_id, g_free);
msg = aha_hawkbit_session_create_message_for_uri (self->session,
SOUP_METHOD_GET,
self->uri);
status = soup_session_send_message (
aha_hawkbit_session_get_soup_session (self->session),
msg);
g_print("=> %d\n", status);
g_print("=> %s\n", msg->response_body->data);
self->parser = json_parser_new();
json_parser_load_from_data (self->parser,
msg->response_body->data,
msg->response_body->length,
NULL);
root = json_parser_get_root (self->parser);
/* retriee deployement id */
obj = json_node_get_object (root);
node = json_object_get_member (obj, "id");
self->deployment_id = json_node_dup_string (node);
/* retrieve update uri */
obj = json_node_get_object (root);
node = json_object_get_member (obj, "deployment");
obj = json_node_get_object (node);
node = json_object_get_member (obj, "chunks");
/* assume there is only one chunk with one artifact */
array = json_node_get_array (node);
node = json_array_get_element (array, 0);
obj = json_node_get_object (node);
node = json_object_get_member (obj, "artifacts");
array = json_node_get_array (node);
node = json_array_get_element (array, 0);
obj = json_node_get_object (node);
anode = json_object_get_member (obj, "filename");
self->update_filename = json_node_dup_string (anode);
node = json_object_get_member (obj, "_links");
obj = json_node_get_object (node);
node = json_object_get_member (obj, "download-http");
obj = json_node_get_object (node);
node = json_object_get_member (obj, "href");
self->update_uri = json_node_dup_string (node);
}
gchar *
aha_hawkbit_deployment_base_get_update_uri (AhaHawkbitDeploymentBase *self)
{
return g_strdup (self->update_uri);
}
gchar *
aha_hawkbit_deployment_base_get_update_filename (AhaHawkbitDeploymentBase *self)
{
return g_strdup (self->update_filename);
}
/* vim:set et sw=2 cin cino=t0,f0,(0,{s,>2s,n-s,^-s,e2s: */
/*
* Copyright © 2019 Collabora Ltd.
*
* SPDX-License-Identifier: LGPL-2.1+
*/
/* inclusion guard */
#ifndef __AHA_HAWKBIT_DEPLOYMENT_BASE_H__
#define __AHA_HAWKBIT_DEPLOYMENT_BASE_H__
#include <glib-object.h>
#include <glib.h>
#include <libsoup/soup.h>
G_BEGIN_DECLS
/*
* Type declaration.
*/
#define AHA_TYPE_HAWKBIT_DEPLOYMENT_BASE aha_hawkbit_deployment_base_get_type ()
G_DECLARE_FINAL_TYPE (AhaHawkbitDeploymentBase,
aha_hawkbit_deployment_base,
AHA,
HAWKBIT_DEPLOYMENT_BASE,
GObject)
void
aha_hawkbit_deployment_base_update (AhaHawkbitDeploymentBase *self);
gchar *
aha_hawkbit_deployment_base_get_update_uri (AhaHawkbitDeploymentBase *self);
gchar *
aha_hawkbit_deployment_base_get_update_filename (AhaHawkbitDeploymentBase *self);
G_END_DECLS
#endif /* __AHA_HAWKBIT_DEPLOYMENT_BASE_H__ */
/* vim:set et sw=2 cin cino=t0,f0,(0,{s,>2s,n-s,^-s,e2s: */
/*
* Copyright © 2019 Collabora Ltd.
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#include "hawkbit-session.h"
struct _AhaHawkbitSession{
GObject parent;
SoupSession *session;
gchar *base_uri;
gchar *tenant;
gchar *controller_id;
gchar *key_token;
};
enum
{
PROP_BASE_URI = 1,
PROP_TENANT,
PROP_CONTROLLER_ID,
PROP_KEY_TOKEN,
NUM_PROPERTIES
};
static GParamSpec *props[NUM_PROPERTIES] = { NULL, };
G_DEFINE_TYPE (AhaHawkbitSession,
aha_hawkbit_session,
G_TYPE_OBJECT)
static void
aha_hawkbit_session_init (AhaHawkbitSession * self)
{
self->session = soup_session_new_with_options (SOUP_SESSION_USER_AGENT,
"Apertis Hawkbit Agent",
NULL);
}
/*
static void
aha_hawkbit_session_constructed (GObject *object)
{
//AhaHawkbitSession *self = AHA_HAWKBIT_SESSION (object);
}
*/
static void
aha_hawkbit_session_dispose (GObject * object)
{
AhaHawkbitSession *self = AHA_HAWKBIT_SESSION (object);
g_clear_object (&self->session);
g_clear_pointer (&self->base_uri, g_free);
g_clear_pointer (&self->tenant, g_free);
g_clear_pointer (&self->controller_id, g_free);
g_clear_pointer (&self->key_token, g_free);
if (G_OBJECT_CLASS (aha_hawkbit_session_parent_class)->dispose)
G_OBJECT_CLASS (aha_hawkbit_session_parent_class)->dispose (object);
}
static void
aha_hawkbit_session_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
AhaHawkbitSession *self = AHA_HAWKBIT_SESSION (object);
switch (prop_id)
{
case PROP_BASE_URI:
self->base_uri = g_value_dup_string (value);
break;
case PROP_TENANT:
self->tenant = g_value_dup_string (value);
break;
case PROP_CONTROLLER_ID:
self->controller_id = g_value_dup_string (value);
break;
case PROP_KEY_TOKEN:
self->key_token = g_value_dup_string (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
aha_hawkbit_session_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
AhaHawkbitSession *self = AHA_HAWKBIT_SESSION (object);
switch (prop_id)
{
case PROP_BASE_URI:
g_value_set_string (value, self->base_uri);
break;
case PROP_TENANT:
g_value_set_string (value, self->tenant);
break;
case PROP_CONTROLLER_ID:
g_value_set_string (value, self->controller_id);
break;
case PROP_KEY_TOKEN:
g_value_set_string (value, self->key_token);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
aha_hawkbit_session_class_init (AhaHawkbitSessionClass * cls)
{
GObjectClass *object_class = G_OBJECT_CLASS (cls);
props[PROP_BASE_URI] =
g_param_spec_string ("base-uri",
"Base uri",
"Base uri of the hawkbit server",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
props[PROP_TENANT] =
g_param_spec_string ("tenant",
"Tenant",
"The tenant on the hawkbit server",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
props[PROP_CONTROLLER_ID] =
g_param_spec_string ("controller-id",
"Controller Identifier",
"The controller on the hawkbit server",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
props[PROP_KEY_TOKEN] =
g_param_spec_string ("key-token",
"Target Key Token",
"The key token of the target on the hawkbit server",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
object_class->dispose = aha_hawkbit_session_dispose;
object_class->get_property = aha_hawkbit_session_get_property;
object_class->set_property = aha_hawkbit_session_set_property;
//object_class->constructed = aha_hawkbit_session_constructed;
g_object_class_install_properties (object_class,
NUM_PROPERTIES,
props);
}
SoupMessage *
aha_hawkbit_session_create_message_for_uri (AhaHawkbitSession *self,
const gchar *method,
const gchar *uri)
{
SoupMessage *msg = soup_message_new (SOUP_METHOD_GET, uri);
g_autofree gchar *t = g_strdup_printf("TargetToken %s", self->key_token);
soup_message_headers_append (msg->request_headers, "Authorization", t);
return msg;
}
SoupMessage *
aha_hawkbit_session_create_message (AhaHawkbitSession *self,
const gchar *method,
const gchar *resource)
{
g_autofree gchar *u =
g_strdup_printf ("%s/%s/controller/v1/%s%s",
self->base_uri,
self->tenant,
self->controller_id,
resource);
return aha_hawkbit_session_create_message_for_uri (self, method, u);
}
SoupSession *
aha_hawkbit_session_get_soup_session (AhaHawkbitSession *self) {
return self->session;
}
/* vim:set et sw=2 cin cino=t0,f0,(0,{s,>2s,n-s,^-s,e2s: */
/*
* Copyright © 2019 Collabora Ltd.
*
* SPDX-License-Identifier: LGPL-2.1+
*/
/* inclusion guard */
#ifndef __AHA_HAWKBIT_SESSION_H__
#define __AHA_HAWKBIT_SESSION_H__
#include <glib-object.h>
#include <glib.h>
#include <libsoup/soup.h>
G_BEGIN_DECLS
/*
* Type declaration.
*/
#define AHA_TYPE_HAWKBIT_SESSION aha_hawkbit_session_get_type ()
G_DECLARE_FINAL_TYPE (AhaHawkbitSession,
aha_hawkbit_session,
AHA,
HAWKBIT_SESSION,
GObject)
SoupMessage *
aha_hawkbit_session_create_message_for_uri (AhaHawkbitSession *self,
const gchar *method,
const gchar *uri);
SoupMessage *
aha_hawkbit_session_create_message (AhaHawkbitSession *self,
const gchar *method,
const gchar *resource);
SoupSession *
aha_hawkbit_session_get_soup_session (AhaHawkbitSession *self);
G_END_DECLS
#endif /* __AHA_HAWKBIT_SESSION_H__ */
#include <stdio.h>
#include "hawkbit-session.h"
#include "hawkbit-base.h"
#include "hawkbit-deployment-base.h"
static void
download_got_chunk (SoupMessage *message,
SoupBuffer *buffer,
GOutputStream *out)
{
g_autoptr (GBytes) bytes = soup_buffer_get_as_bytes (buffer);
gsize size;
gconstpointer d = g_bytes_get_data (bytes, &size);
g_output_stream_write_all (out,
d, size,
NULL, NULL, NULL);
}
static void
download_uri (const char *uri, const gchar *filename)
{
guint status;
g_autoptr (SoupSession) session =
soup_session_new_with_options (SOUP_SESSION_USER_AGENT,
"Apertis Hawkbit Agent",
NULL);
g_autoptr (SoupMessage) msg = soup_message_new (SOUP_METHOD_GET, uri);
g_autoptr (GFile) f = g_file_new_for_path (filename);
g_autoptr (GFileIOStream) io = g_file_replace_readwrite (f, NULL,
FALSE,
G_FILE_CREATE_NONE,
NULL, NULL);
g_autoptr (GOutputStream) out = g_io_stream_get_output_stream (G_IO_STREAM (io));
g_message ("=> Downloading %s\n", filename);
soup_message_body_set_accumulate (msg->response_body, FALSE);
g_signal_connect (msg, "got-chunk",
G_CALLBACK (download_got_chunk),
out);
status = soup_session_send_message (session, msg);
g_output_stream_close (out, NULL, NULL);
}
int
main(int argc, char **argv) {
AhaHawkbitSession *hb_session;
AhaHawkbitBase *base;
AhaHawkbitDeploymentBase *d_base;
g_autofree gchar *d_uri = NULL;
g_autofree gchar *u_uri = NULL;
g_autofree gchar *u_filename = NULL;
hb_session = g_object_new (AHA_TYPE_HAWKBIT_SESSION,
"base-uri", "http://hawkbit-hawkbit-testbed.westeurope.cloudapp.azure.com:8080",
"tenant", "DEFAULT",
"controller-id", "Apertis",
"key-token", "76e0a379916f543e894b47b683ccdb68",
NULL);
base = g_object_new (AHA_TYPE_HAWKBIT_BASE,
"session", hb_session,
NULL);
aha_hawkbit_base_update (base);
d_uri = aha_hawkbit_base_get_deployment_base (base);
if (d_uri == NULL)
return 0;
d_base = g_object_new (AHA_TYPE_HAWKBIT_DEPLOYMENT_BASE,
"session", hb_session,
"uri", d_uri,
NULL);
aha_hawkbit_deployment_base_update (d_base);
u_uri = aha_hawkbit_deployment_base_get_update_uri (d_base);
u_filename = aha_hawkbit_deployment_base_get_update_filename (d_base);
if (u_uri == NULL)
return 0;
download_uri (u_uri, u_filename);
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment