kill has been surfaced into the API (disabled by compile flag by default)

closes #13
This commit is contained in:
Jan-Piet Mens
2015-09-15 08:35:58 +02:00
parent f4d803a2c1
commit 181a108bf2
7 changed files with 97 additions and 1 deletions
+2
View File
@@ -1,4 +1,6 @@
- NEW: kill has been surfaced into the API (disabled by compile flag by default)
- FIX: kill now also deletes LAST file and its parent directories if empty
- NEW: ocat --load-ghash can load revgeo db
- NEW: ocat --dump-ghash dumps content of revgeo db
- FIX: main index now shows users/devices already in storage
+3
View File
@@ -19,6 +19,9 @@ CFLAGS += -DGHASHPREC=$(GHASHPREC)
ifeq ($(HAVE_PING),yes)
CFLAGS += -DHAVE_PING=1
endif
ifeq ($(HAVE_KILL),yes)
CFLAGS += -DHAVE_KILL=1
endif
ifeq ($(HAVE_LMDB),yes)
CFLAGS += -DHAVE_LMDB=1 -Imdb/
+27
View File
@@ -304,6 +304,33 @@ The _recorder_ has a built-in HTTP server with which it servers static files fro
The API basically serves the same data as _ocat_ is able to produce.
## API
The _recorder_'s API provides most of the function that are surfaced by _ocat_.
Both GET and POST requests are supported, and if a username and device are
needed, these can be passed in via `X-Limit-User` and `X-Limit-Device` headers.
From and To dates may also be specified as `X-Limit-From` and `X-Limit-To`
respectively.
#### `kill`
If support for this is compiled in, this endpoint allows a client to remove data from _storage_. (Note: *any* client can do this, as there is no authentication/authorization in the _recorder_!)
```
curl 'http://127.0.0.1:8085/api/0/kill?user=ngin&device=ojo'
{
"path": "s0/rec/ngin/ojo",
"status": "OK",
"last": "s0/last/ngin/ojo/ngin-ojo.json",
"killed": [
"2015-09.rec",
]
}
```
The response contains a list of removed `.rec` files, and file system operations are logged to syslog.
#### Environment
The following environment variables control _ocat_'s behaviour:
+3
View File
@@ -11,6 +11,9 @@ HAVE_LMDB ?= yes
# Do you want support for the `pingping' monitoring feature?
HAVE_PING ?= yes
# Do you want support for removing data via the API? (Dangerous)
HAVE_KILL ?= no
# Where should the recorder store its data? This directory must
# exist and be writeable by recorder (and readable by ocat)
STORAGEDEFAULT = "/var/spool/owntracks/recorder/store"
+22
View File
@@ -278,6 +278,28 @@ static int dispatch(struct mg_connection *conn, const char *uri)
time_from = field(conn, "from");
time_to = field(conn, "to");
#if HAVE_KILL
if (nparts == 1 && !strcmp(uparts[0], "kill")) {
JsonNode *deleted;
if (!u || !*u || !d || !*d) {
CLEANUP;
mg_send_status(conn, 416);
mg_printf_data(conn, "user and device are required\n");
return (MG_TRUE);
}
if ((deleted = kill_datastore(u, d)) == NULL) {
mg_send_status(conn, 416);
mg_printf_data(conn, "cannot kill data for %s/%s\n", u, d);
CLEANUP;
return (MG_TRUE);
}
CLEANUP;
return (json_response(conn, deleted));
}
#endif /* HAVE_KILL */
if (nparts == 1 && !strcmp(uparts[0], "last")) {
JsonNode *user_array;
+12 -1
View File
@@ -140,7 +140,9 @@ void usage(char *prog)
printf(" payload Like RAW but JSON payload only\n");
printf(" --fields tst,lat,lon,... Choose fields for CSV. (dflt: ALL)\n");
printf(" --last -L JSON object with last users\n");
#if HAVE_KILL
printf(" --killdata requires -u and -d\n");
#endif
printf(" --storage -S storage dir (%s)\n", STORAGEDEFAULT);
printf(" --norevgeo -G disable ghash to reverge-geo lookups\n");
printf(" --precision ghash precision (dflt: %d)\n", GHASHPREC);
@@ -182,7 +184,10 @@ int main(int argc, char **argv)
{
char *progname = *argv, *p;
int c;
int list = 0, killdata = 0, last = 0, limit = 0, dumpghash = FALSE, loadghash = FALSE;
int list = 0, last = 0, limit = 0, dumpghash = FALSE, loadghash = FALSE;
#if HAVE_KILL
int killdata = FALSE;
#endif
int revgeo = TRUE;
char *username = NULL, *device = NULL, *time_from = NULL, *time_to = NULL;
JsonNode *json, *obj, *locs;
@@ -231,7 +236,9 @@ int main(int argc, char **argv)
{ "precision", required_argument, 0, 2},
{ "dump-ghash", no_argument, 0, 3},
{ "load-ghash", no_argument, 0, 4},
#if HAVE_KILL
{ "killdata", no_argument, 0, 'K'},
#endif
{ "norevgeo", no_argument, 0, 'G'},
{0, 0, 0, 0}
};
@@ -302,9 +309,11 @@ int main(int argc, char **argv)
exit(2);
}
break;
#if HAVE_KILL
case 'K':
killdata = 1;
break;
#endif
case 'L':
last = 1;
break;
@@ -334,6 +343,7 @@ int main(int argc, char **argv)
exit(0);
}
#if HAVE_KILL
if (killdata) {
JsonNode *obj; //, *killed, *f;
@@ -358,6 +368,7 @@ int main(int argc, char **argv)
}
return (0);
}
#endif
if (last) {
JsonNode *user_array;
+28
View File
@@ -842,6 +842,8 @@ char *gpx_string(JsonNode *location_array)
return (utstring_body(xml));
}
#if HAVE_KILL
/*
* Remove all data for a user's device. Return a JSON object with a status
* and an array of deleted files.
@@ -893,6 +895,7 @@ JsonNode *kill_datastore(char *user, char *device)
p = utstring_body(fname);
if (remove(p) == 0) {
olog(LOG_NOTICE, "removed %s", p);
json_append_element(killed, json_mkstring(namelist[i]->d_name));
} else {
perror(p);
@@ -906,8 +909,33 @@ JsonNode *kill_datastore(char *user, char *device)
if (rmdir(utstring_body(path)) != 0) {
json_append_member(obj, "status", json_mkstring("ERROR"));
json_append_member(obj, "error", json_mkstring( strerror(errno)));
} else {
olog(LOG_NOTICE, "removed %s", utstring_body(path));
}
utstring_renew(path);
utstring_printf(path, "%s/last/%s/%s/%s-%s.json", STORAGEDIR, user, device, user, device);
if (remove(utstring_body(path)) == 0) {
olog(LOG_NOTICE, "removed %s", utstring_body(path));
json_append_member(obj, "last", json_mkstring(utstring_body(path)));
}
/* Attempt to remove containing directory */
utstring_renew(path);
utstring_printf(path, "%s/last/%s/%s", STORAGEDIR, user, device);
if (rmdir(utstring_body(path)) == 0) {
olog(LOG_NOTICE, "removed %s", utstring_body(path));
}
/* Attempt to remove it's parent directory */
utstring_renew(path);
utstring_printf(path, "%s/last/%s", STORAGEDIR, user);
if (rmdir(utstring_body(path)) == 0) {
olog(LOG_NOTICE, "removed %s", utstring_body(path));
}
json_append_member(obj, "killed", killed);
return (obj);
}
#endif /* HAVE_KILL */