Playing with Kore JSON API
Frederic Cambus September 07, 2020 [C]Kore 4.0.0 has been released a few days ago, and features a brand new JSON API allowing to easily parse and serialize JSON objects.
During the last couple of years, I have been using Kore for various projects, including exposing hardware sensor values over the network via very simple APIs. In this article, I would like to present a generalization of this concept and show how easy it is to expose system information with Kore.
This small API example allows identifying hosts over the network and has been tested on Linux, OpenBSD, NetBSD, and macOS (thanks Joris!).
After creating a new project:
kodev create identify
Populate src/identify.c
with the following code snippet:
#include <sys/utsname.h>
#include <kore/kore.h>
#include <kore/http.h>
#if defined(__linux__)
#include <kore/seccomp.h>
KORE_SECCOMP_FILTER("json",
KORE_SYSCALL_ALLOW(uname)
);
#endif
int page(struct http_request *);
int
page(struct http_request *req)
{
char *answer;
struct utsname u;
struct kore_buf buf;
struct kore_json_item *json;
if (uname(&u) == -1) {
http_response(req, HTTP_STATUS_INTERNAL_ERROR, NULL, 0);
return (KORE_RESULT_OK);
}
kore_buf_init(&buf, 1024);
json = kore_json_create_object(NULL, NULL);
kore_json_create_string(json, "system", u.sysname);
kore_json_create_string(json, "hostname", u.nodename);
kore_json_create_string(json, "release", u.release);
kore_json_create_string(json, "version", u.version);
kore_json_create_string(json, "machine", u.machine);
kore_json_item_tobuf(json, &buf);
answer = kore_buf_stringify(&buf, NULL);
http_response(req, 200, answer, strlen(answer));
kore_buf_cleanup(&buf);
kore_json_item_free(json);
return (KORE_RESULT_OK);
}
And finally launch the project:
kodev run
The kodev tool will build and run the project, and we can now query the API to identify hosts:
{
"system": "OpenBSD",
"hostname": "foo.my.domain",
"release": "6.8",
"version": "GENERIC.MP#56",
"machine": "amd64"
}