auc: update to version 0.0.4
authorDaniel Golle <redacted>
Tue, 21 Nov 2017 16:17:25 +0000 (17:17 +0100)
committerDaniel Golle <redacted>
Thu, 23 Nov 2017 17:01:13 +0000 (18:01 +0100)
 * implement '-d' cmdline option to output json requests
 * switch to new server API
 * implement upgrade_packages

Read upgrade_packages UCI option and ask for either only release
upgrades or also builds based on updated packages depending on whether
upgrade_packages is '0' or '1'.

Signed-off-by: Daniel Golle <redacted>
utils/auc/Makefile
utils/auc/src/auc.c

index 4142ac208c639e3515365742ca7909471df50707..df0ed02b9035aa7600c5e08a83cf7aaead7a8899 100644 (file)
@@ -5,7 +5,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=auc
-PKG_VERSION:=0.0.3
+PKG_VERSION:=0.0.4
 PKG_RELEASE=1
 PKG_LICENSE:=GPL-3.0
 
index b8d97742df1097104c6002585598973c234924f3..d4ec165d03cbde9033f6a14e9d4fe096621ec18a 100644 (file)
@@ -41,6 +41,7 @@
 
 static char user_agent[80];
 static char *serverurl;
+static int upgrade_packages;
 static struct ustream_ssl_ctx *ssl_ctx;
 static const struct ustream_ssl_ops *ssl_ops;
 static off_t out_bytes;
@@ -54,6 +55,7 @@ static char *target = NULL, *subtarget = NULL;
 static char *distribution = NULL, *version = NULL, *revision = NULL;
 static int uptodate;
 static char *filename = NULL;
+static int debug = 0;
 
 /*
  * policy for ubus call system board
@@ -135,11 +137,13 @@ static const struct blobmsg_policy upgtest_policy[__UPGTEST_MAX] = {
  */
 enum {
        CHECK_VERSION,
+       CHECK_UPGRADES,
        __CHECK_MAX,
 };
 
 static const struct blobmsg_policy check_policy[__CHECK_MAX] = {
        [CHECK_VERSION] = { .name = "version", .type = BLOBMSG_TYPE_STRING },
+       [CHECK_UPGRADES] = { .name = "upgrades", .type = BLOBMSG_TYPE_TABLE },
 };
 
 /*
@@ -173,7 +177,7 @@ static const struct blobmsg_policy image_policy[__IMAGE_MAX] = {
 static int load_config() {
        static struct uci_context *uci_ctx;
        static struct uci_package *uci_attendedsysupgrade;
-       struct uci_section *uci_server;
+       struct uci_section *uci_s;
 
        uci_ctx = uci_alloc_context();
        if (!uci_ctx)
@@ -186,12 +190,21 @@ static int load_config() {
                fprintf(stderr, "Failed to load attendedsysupgrade config\n");
                return -1;
        }
-       uci_server = uci_lookup_section(uci_ctx, uci_attendedsysupgrade, "server");
-       if (!uci_server) {
+
+       uci_s = uci_lookup_section(uci_ctx, uci_attendedsysupgrade, "server");
+       if (!uci_s) {
                fprintf(stderr, "Failed to read server url from config\n");
                return -1;
        }
-       serverurl = strdup(uci_lookup_option_string(uci_ctx, uci_server, "url"));
+       serverurl = strdup(uci_lookup_option_string(uci_ctx, uci_s, "url"));
+
+       uci_s = uci_lookup_section(uci_ctx, uci_attendedsysupgrade, "client");
+       if (!uci_s) {
+               fprintf(stderr, "Failed to read client config\n");
+               return -1;
+       }
+       upgrade_packages = atoi(uci_lookup_option_string(uci_ctx, uci_s, "upgrade_packages"));
+
        uci_free_context(uci_ctx);
 
        return 0;
@@ -343,12 +356,10 @@ static void header_done_cb(struct uclient *cl)
        };
        struct blob_attr *tb[__H_MAX];
        uint64_t resume_offset = 0, resume_end, resume_size;
-       static int retries;
 
-       if (retries < 10 && uclient_http_redirect(cl)) {
+       if (uclient_http_redirect(cl)) {
                fprintf(stderr, "Redirected to %s on %s\n", cl->url->location, cl->url->host);
 
-               retries++;
                return;
        }
 
@@ -365,6 +376,14 @@ static void header_done_cb(struct uclient *cl)
        case 400:
                request_done(cl);
                break;
+       case 412:
+               fprintf(stderr, "target not found.\n");
+               request_done(cl);
+               break;
+       case 413:
+               fprintf(stderr, "image too big.\n");
+               request_done(cl);
+               break;
        case 416:
                fprintf(stderr, "File download already fully retrieved; nothing to do.\n");
                request_done(cl);
@@ -373,12 +392,9 @@ static void header_done_cb(struct uclient *cl)
                fprintf(stderr, "unknown package requested.\n");
                request_done(cl);
                break;
-       case 201:
-               if (!imagebuilder) {
-                       fprintf(stderr, "server is dispatching build job\n");
-                       imagebuilder=1;
-               }
-               retry=1;
+       case 501:
+               fprintf(stderr, "ImageBuilder didn't produce sysupgrade file.\n");
+               request_done(cl);
                break;
        case 204:
                fprintf(stderr, "system is up to date.\n");
@@ -386,11 +402,7 @@ static void header_done_cb(struct uclient *cl)
                break;
        case 206:
                if (!cur_resume) {
-                       if (!building) {
-                               fprintf(stderr, "server is now building image...\n");
-                               building=1;
-                       }
-                       retry=1;
+                       fprintf(stderr, "Error: Partial content received, full content requested\n");
                        request_done(cl);
                        break;
                }
@@ -406,6 +418,16 @@ static void header_done_cb(struct uclient *cl)
                        fprintf(stderr, "Content-Range header is invalid\n");
                        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;
+               }
+               retry=1;
+               // fall through
        case 200:
                if (cl->priv)
                        break;
@@ -652,6 +674,9 @@ int main(int args, char *argv[]) {
        char *checksum = NULL;
        struct stat imgstat;
 
+       if (args>1 && !strncmp(argv[1], "-d", 3))
+               debug = 1;
+
        if (!ctx) {
                fprintf(stderr, "failed to connect to ubus.\n");
                return -1;
@@ -702,10 +727,13 @@ int main(int args, char *argv[]) {
                goto freeboard;
        }
 
-       fprintf(stderr, "running %s %s %s on %s/%s (%s)\n", distribution, version,
-               revision, target, subtarget, board_name);
+       blobmsg_add_u32(&checkbuf, "upgrade_packages", upgrade_packages);
+
+       fprintf(stderr, "running %s %s %s on %s/%s (%s)\n", distribution,
+               version, revision, target, subtarget, board_name);
 
-       fprintf(stderr, "checking %s for sysupgrade\n", serverurl);
+       fprintf(stderr, "checking %s for release upgrade%s\n", serverurl,
+               upgrade_packages?" or updated packages":"");
 
        blobmsg_add_string(&reqbuf, "distro", distribution);
        blobmsg_add_string(&reqbuf, "target", target);
@@ -714,13 +742,22 @@ int main(int args, char *argv[]) {
 
        snprintf(url, sizeof(url), "%s/%s", serverurl, APIOBJ_CHECK);
        uptodate=0;
+
+       if (debug)
+               fprintf(stderr, "requesting: %s\n", blobmsg_format_json(checkbuf.head, true));
+
        if (server_request(url, &checkbuf, &reqbuf)) {
                fprintf(stderr, "failed to connect to server\n");
                rc=-1;
                goto freeboard;
        };
+
+       if (debug)
+               fprintf(stderr, "reply: %s\n", blobmsg_format_json(reqbuf.head, true));
+
        blobmsg_parse(check_policy, __CHECK_MAX, tbc, blob_data(reqbuf.head), blob_len(reqbuf.head));
-       if (!tbc[CHECK_VERSION]) {
+
+       if (!tbc[CHECK_VERSION] && !tbc[CHECK_UPGRADES]) {
                if (!uptodate) {
                        fprintf(stderr, "server reply invalid.\n");
                        rc=-1;
@@ -729,9 +766,18 @@ int main(int args, char *argv[]) {
                rc=0;
                goto freeboard;
        }
-       newversion = blobmsg_get_string(tbc[CHECK_VERSION]);
-       fprintf(stderr, "new release %s found.\n", newversion);
+       if (tbc[CHECK_VERSION]) {
+               newversion = blobmsg_get_string(tbc[CHECK_VERSION]);
+               fprintf(stderr, "new %s release %s found.\n", distribution, newversion);
+       } else {
+               fprintf(stderr, "staying on %s release version %s\n", distribution, version);
+               blobmsg_add_string(&reqbuf, "version", version);
+       };
 
+       if (tbc[CHECK_UPGRADES]) {
+               fprintf(stderr, "package updates found:\n%s\n",
+                       blobmsg_format_json(tbc[CHECK_UPGRADES], true));
+       }
        rc = ask_user();
        if (rc)
                goto freeboard;
@@ -744,6 +790,10 @@ int main(int args, char *argv[]) {
        do {
                queuepos = 0;
                retry = 0;
+
+               if (debug)
+                       fprintf(stderr, "requesting: %s\n", blobmsg_format_json(reqbuf.head, true));
+
                server_request(url, &reqbuf, &imgbuf);
                blobmsg_parse(image_policy, __IMAGE_MAX, tb, blob_data(imgbuf.head), blob_len(imgbuf.head));
 
git clone https://git.99rst.org/PROJECT