auc: update to version 0.0.5
authorDaniel Golle <daniel@makrotopia.org>
Thu, 23 Nov 2017 17:56:58 +0000 (18:56 +0100)
committerDaniel Golle <daniel@makrotopia.org>
Thu, 23 Nov 2017 17:56:58 +0000 (18:56 +0100)
 * use HTTP headers to know ImageBuilder status and queue position
 * use pretty (ie. indented) JSON output for debugging

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
utils/auc/Makefile
utils/auc/src/auc.c

index df0ed02b9035aa7600c5e08a83cf7aaead7a8899..d6196f76bf6c92125bfe8c94fcdb74b2fe9f3bfb 100644 (file)
@@ -5,7 +5,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=auc
-PKG_VERSION:=0.0.4
+PKG_VERSION:=0.0.5
 PKG_RELEASE=1
 PKG_LICENSE:=GPL-3.0
 
index d4ec165d03cbde9033f6a14e9d4fe096621ec18a..0885db425dce2818de7b45501a76753e0514b1e4 100644 (file)
@@ -148,11 +148,9 @@ static const struct blobmsg_policy check_policy[__CHECK_MAX] = {
 
 /*
  * policy for upgrade-request response
- * it can be either only a queue position or the download information
- * for the ready image.
+ * parse download information for the ready image.
  */
 enum {
-       IMAGE_QUEUE,
        IMAGE_FILESIZE,
        IMAGE_URL,
        IMAGE_CHECKSUM,
@@ -162,7 +160,6 @@ enum {
 };
 
 static const struct blobmsg_policy image_policy[__IMAGE_MAX] = {
-       [IMAGE_QUEUE] = { .name = "queue", .type = BLOBMSG_TYPE_INT32 },
        [IMAGE_FILESIZE] = { .name = "filesize", .type = BLOBMSG_TYPE_INT32 },
        [IMAGE_URL] = { .name = "url", .type = BLOBMSG_TYPE_STRING },
        [IMAGE_CHECKSUM] = { .name = "checksum", .type = BLOBMSG_TYPE_STRING },
@@ -348,14 +345,20 @@ static void header_done_cb(struct uclient *cl)
        enum {
                H_RANGE,
                H_LEN,
+               H_IBSTATUS,
+               H_IBQUEUEPOS,
                __H_MAX
        };
        static const struct blobmsg_policy policy[__H_MAX] = {
                [H_RANGE] = { .name = "content-range", .type = BLOBMSG_TYPE_STRING },
                [H_LEN] = { .name = "content-length", .type = BLOBMSG_TYPE_STRING },
+               [H_IBSTATUS] = { .name = "x-imagebuilder-status", .type = BLOBMSG_TYPE_STRING },
+               [H_IBQUEUEPOS] = { .name = "x-build-queue-position", .type = BLOBMSG_TYPE_STRING },
        };
        struct blob_attr *tb[__H_MAX];
        uint64_t resume_offset = 0, resume_end, resume_size;
+       char *ibstatus;
+       unsigned int queuepos = 0;
 
        if (uclient_http_redirect(cl)) {
                fprintf(stderr, "Redirected to %s on %s\n", cl->url->location, cl->url->host);
@@ -370,6 +373,9 @@ static void header_done_cb(struct uclient *cl)
                return;
        }
 
+       if (debug)
+               fprintf(stderr, "headers:\n%s\n", blobmsg_format_json_indent(cl->meta, true, 0));
+
        blobmsg_parse(policy, __H_MAX, tb, blob_data(cl->meta), blob_len(cl->meta));
 
        switch (cl->status_code) {
@@ -419,14 +425,31 @@ static void header_done_cb(struct uclient *cl)
                        break;
                }
        case 202:
-               if (!imagebuilder) {
-                       fprintf(stderr, "server is dispatching build job\n");
-                       imagebuilder=1;
-               } else if (!building) {
-                       fprintf(stderr, "server is now building image...\n");
-                       building=1;
+               if (!tb[H_IBSTATUS])
+                       break;
+
+               ibstatus = blobmsg_get_string(tb[H_IBSTATUS]);
+
+               if (!strncmp(ibstatus, "queue", 6)) {
+                       if (!imagebuilder) {
+                               fprintf(stderr, "server is dispatching build job\n");
+                               imagebuilder=1;
+                       } else {
+                               if (tb[H_IBQUEUEPOS]) {
+                                       queuepos = atoi(blobmsg_get_string(tb[H_IBQUEUEPOS]));
+                                       fprintf(stderr, "build is in queue position %u.\n", queuepos);
+                               }
+                       }
+                       retry=1;
+               } else if (!strncmp(ibstatus, "building", 9)) {
+                       if (!building) {
+                               fprintf(stderr, "server is now building image...\n");
+                               building=1;
+                       }
+                       retry=1;
+               } else {
+                       fprintf(stderr, "unrecognized remote imagebuilder status '%s'\n", ibstatus);
                }
-               retry=1;
                // fall through
        case 200:
                if (cl->priv)
@@ -744,7 +767,7 @@ int main(int args, char *argv[]) {
        uptodate=0;
 
        if (debug)
-               fprintf(stderr, "requesting: %s\n", blobmsg_format_json(checkbuf.head, true));
+               fprintf(stderr, "requesting:\n%s\n", blobmsg_format_json_indent(checkbuf.head, true, 0));
 
        if (server_request(url, &checkbuf, &reqbuf)) {
                fprintf(stderr, "failed to connect to server\n");
@@ -753,7 +776,7 @@ int main(int args, char *argv[]) {
        };
 
        if (debug)
-               fprintf(stderr, "reply: %s\n", blobmsg_format_json(reqbuf.head, true));
+               fprintf(stderr, "reply:\n%s\n", blobmsg_format_json_indent(reqbuf.head, true, 0));
 
        blobmsg_parse(check_policy, __CHECK_MAX, tbc, blob_data(reqbuf.head), blob_len(reqbuf.head));
 
@@ -776,7 +799,7 @@ int main(int args, char *argv[]) {
 
        if (tbc[CHECK_UPGRADES]) {
                fprintf(stderr, "package updates found:\n%s\n",
-                       blobmsg_format_json(tbc[CHECK_UPGRADES], true));
+                       blobmsg_format_json_indent(tbc[CHECK_UPGRADES], true, 0));
        }
        rc = ask_user();
        if (rc)
@@ -788,21 +811,15 @@ int main(int args, char *argv[]) {
        building = 0;
 
        do {
-               queuepos = 0;
                retry = 0;
 
                if (debug)
-                       fprintf(stderr, "requesting: %s\n", blobmsg_format_json(reqbuf.head, true));
+                       fprintf(stderr, "requesting:\n%s\n", blobmsg_format_json_indent(reqbuf.head, true, 0));
 
                server_request(url, &reqbuf, &imgbuf);
                blobmsg_parse(image_policy, __IMAGE_MAX, tb, blob_data(imgbuf.head), blob_len(imgbuf.head));
 
-               if (tb[IMAGE_QUEUE]) {
-                       queuepos = blobmsg_get_u32(tb[IMAGE_QUEUE]);
-                       fprintf(stderr, "build is in queue position %u.\n", queuepos);
-               }
-
-               if (retry || queuepos) {
+               if (retry) {
                        blob_buf_free(&imgbuf);
                        blobmsg_buf_init(&imgbuf);
                        sleep(3);