From patchwork Sat Mar 9 15:11:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Babic X-Patchwork-Id: 1909979 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.a=rsa-sha256 header.s=20230601 header.b=w7YzKHQF; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=googlegroups.com (client-ip=2a00:1450:4864:20::440; helo=mail-wr1-x440.google.com; envelope-from=swupdate+bncbaabbr7ywgxqmgqesp3tvji@googlegroups.com; receiver=patchwork.ozlabs.org) Received: from mail-wr1-x440.google.com (mail-wr1-x440.google.com [IPv6:2a00:1450:4864:20::440]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TsRNF1nPqz1yX8 for ; Sun, 10 Mar 2024 02:12:12 +1100 (AEDT) Received: by mail-wr1-x440.google.com with SMTP id ffacd0b85a97d-33e7ffdf5c1sf511070f8f.3 for ; Sat, 09 Mar 2024 07:12:12 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709997129; cv=pass; d=google.com; s=arc-20160816; b=Y+0a+9uaDW9u+jN6+F8KDC6uXTPnTMCLcmPpZr0zmeov/3C5kip+jlZKahFYRz6F+F xmSzRzWzAyZvyc0v9IHRmUSyGOvea6+5E9eET78jaTSFoQU/AgqHvY96LRzlW3SZMb2o id5a53Fi6AwI8DoJMWL5zwwlXJBadhl7oPavUK06/KiEWcnOArfW6HgXP0YtblVodoeD 13fe0pvyiby/341oOsJvRvWtheOxNtId5YoQEK6VFveScDax1zaFrAU5bn5Cq88UYdcE TA16maZZEMC3PRYE8FKf+QpAIllvKiwnMZvipFI+6pENcqd0s48HS6PFCZRtqO8RvGFC uqDw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:ui-outboundreport:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from:sender :dkim-signature; bh=3d30IhqySL6c0x9RUNnj4fACUTWcM5AWoNS0D3OfSTI=; fh=2L4pW+j31QCh5V2ZvJpt9vFBYWC8YGcwyhsE9qFoL3s=; b=0LdoajdW7t9F9V95YQCwSmn4yRVZynfAheTRuhQg4LWl4JNdXwNjzX2LNHJqqtUmpX S6vzNHmejWpxOFz25U4vPhel4Wu6MlzkxSPWF8HvkJXU/KO49Casgyyjy9uqNZJqgnRZ d9xm3phdiyIqbCyEz4qDN3ItEitE7s7up0ZPeIIxtVkbUwtF8drLjovISTbTkIAa+4e2 e5Bh17B4D/f25dX0A/3d+dsUi7se9EezwaSFWPWDkSjGwEcTw5dWNzOH2YOqZi6DEvOl UFUVS7EO0QAKkGLq1ZMZ4tjy/9uytX/uYa2mcU0iNht5j5IqrzOvfHE/HfXRKxtOcCED JQyQ==; darn=patchwork.ozlabs.org ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b="s/4YiFPp"; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 217.72.192.74 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20230601; t=1709997129; x=1710601929; darn=patchwork.ozlabs.org; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:x-original-authentication-results :x-original-sender:ui-outboundreport:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:sender:from:to:cc :subject:date:message-id:reply-to; bh=3d30IhqySL6c0x9RUNnj4fACUTWcM5AWoNS0D3OfSTI=; b=w7YzKHQFjYJEqnPmrAw13l06otT/xnQwfklilBrlRGmxt7s1LfS7Dbi+kiECp1DC0Y hlzfXCnPVKp49Wsclu4g07EnjID+Jf1FaloQqvnyvFXHRrJhhxHD0coiC6fiaI7piT/9 ArU10zJUxiVx6i8xmHjzx5HvF4D9w0RwwQQo2Df25RtHJIac1a+D35TYevqs9FqC5F7A o33XDA3/tLmKQfmBR6RJBS8o2yFbTSsd+NpCiKzhurO89+DMaXl4HfHnvXdxfFozLDQl riEuxCrcixuXXZTCM2RTjByZ/MF6iW8hsjCHU1qshhl+/5c5EiV8qhoY6E2ZGlgrVE9n lstw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709997129; x=1710601929; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence :x-original-authentication-results:x-original-sender :ui-outboundreport:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:x-beenthere:x-gm-message-state:sender:from :to:cc:subject:date:message-id:reply-to; bh=3d30IhqySL6c0x9RUNnj4fACUTWcM5AWoNS0D3OfSTI=; b=UnCtztLZ332QAgT7zzJgUIFhn7O7tOa1XhTaJg9JVhmq5lZw0Ad48SvCaOPC7YP47L J5dCJq2hte+I55mVlBwI+4+XWhtFBM4wklpQhfPkq5SAaA4JThMhQqXjFNDuXAisi+xM VeS6THDHli87CbWvKAAaFat/A9TNYRAUPQqM42lr5sM+oqel/7w7opyDe1idfiWk2ArA ucIsbu/aktRIn+ObmNu8H8ygnlbfHz9Wb7Ps5JEnRUes93DHnisGR9u/LoMXdB8DPs10 sUOGczKfjdThUKzvkquK2Y8eaYMV1Hg43Fa9gts41bIjSQu9u2UYkiMk/zWLqVRzOJiQ T44Q== Sender: swupdate@googlegroups.com X-Forwarded-Encrypted: i=2; AJvYcCV5pRaOy2tmQ+FfqmjyNdlN4oEbkFtqENTKMBkaq3Y5EqAhZ5/gsQxwHU1Rb7X+9j24ZwgkVmL4CTo/WaGPBZpeANI2B0IFZ46olI4dBg== X-Gm-Message-State: AOJu0Yyo0I0U1sOV9lPgKTDFdhJ5QGq6eQLXkF7ZuAlryIsbhcJvmDA8 HjIPieVcvWWr+sdSxpqEwuvBpC2JC+4NsjGfl1VFBloyuqPeJcZk X-Google-Smtp-Source: AGHT+IFgvAe1gqzJke46TYqiFEb5lbxch9SDb0uR0a3MuZlRGYHl536LJB/4vqh/B2vi30yAXUwukg== X-Received: by 2002:adf:ed85:0:b0:33e:47d3:a6cd with SMTP id c5-20020adfed85000000b0033e47d3a6cdmr1526074wro.68.1709997127657; Sat, 09 Mar 2024 07:12:07 -0800 (PST) X-BeenThere: swupdate@googlegroups.com Received: by 2002:adf:f50a:0:b0:33e:4c3f:9f8c with SMTP id q10-20020adff50a000000b0033e4c3f9f8cls1098311wro.0.-pod-prod-04-eu; Sat, 09 Mar 2024 07:12:06 -0800 (PST) X-Received: by 2002:a5d:55cf:0:b0:33d:c3e6:109d with SMTP id i15-20020a5d55cf000000b0033dc3e6109dmr1580010wrw.61.1709997125617; Sat, 09 Mar 2024 07:12:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1709997125; cv=none; d=google.com; s=arc-20160816; b=wsrqSvNMCD87aFcGGbieBADXvG4COiUl+WwE3DPNEC8lc37YL3B7832+nqd0CsjySD B1vaAi7ljhLMmu0Xv/P8ac0TJYmdNsEmZ/IOyi9u5a8ZgVFHb137bCqJEgvbQMePj0dH 8GfnjUdC50Jy8uBxXfDuLvz/QMmxQ9yTgVVVmc80gVu0U22GbDQHDI8nVCufGCqy6G7e g5eD2pzbnLnoLJCCQDi4oB7OtXT6jssr4m/SA6pHdALDBSJ8bybNnHoYGEyB1yv4um8F MMfEwm+fTVVDBeRE8NRObRuP3WK4hkGJVmxnwKCjpijX9QHTjvBsQKgmhc2k3u2fQQxa USnw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=ui-outboundreport:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature; bh=+D8C72s/kVOlj8mUzh61RSEWgdRF8Q8NZlNdtZgrki0=; fh=TiEWcqMcKpHk5s7uErzpntoONrNfOXwKpI5P8bIlggk=; b=Q7LlER6xEv/MMO21fvahKtHaor5zOCsCDw2EmMJePzsiUDqJngK7eDVufOK/Xro9vO vC4Ar0hzOAIOgdiEVTLplyJuhR7DIFQlnRD1XW3dREAYWe8u5KSJZR6KV+Kb+/c172Ew 9kE6ST2+Qq3FVWmUBS55dBq+RgzlwgL5Xg8AWXW788n3OAFog2wCjx20PFn63aZqhDY+ 13t/yubCb/cp2fH0DWGa2qQpqrwDFpUk3WrsdOK3CKcOG4/CRhBcUIkl9EhHJYfBfrEz Prbcu751JYyANfOe52Lvb/XoWUGpcWIIBrG1N8ln7Dfx+67BOY0W67pXKDCnDXFCWxJ4 NjMQ==; dara=google.com ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b="s/4YiFPp"; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 217.72.192.74 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org Received: from mout.kundenserver.de (mout.kundenserver.de. [217.72.192.74]) by gmr-mx.google.com with ESMTPS id fx12-20020a0560002d0c00b0033e7e5930b9si85292wrb.8.2024.03.09.07.12.05 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 Mar 2024 07:12:05 -0800 (PST) Received-SPF: pass (google.com: domain of stefano.babic@swupdate.org designates 217.72.192.74 as permitted sender) client-ip=217.72.192.74; X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from paperino.fritz.box ([88.217.136.221]) by mrelayeu.kundenserver.de (mreue109 [213.165.67.113]) with ESMTPSA (Nemesis) id 1Mgek6-1rAz050k3g-00h3af; Sat, 09 Mar 2024 16:12:05 +0100 From: Stefano Babic To: swupdate@googlegroups.com Cc: Stefano Babic Subject: [swupdate] [PATCH 4/5] swuforward: add generic uploader Date: Sat, 9 Mar 2024 16:11:58 +0100 Message-Id: <20240309151159.8426-5-stefano.babic@swupdate.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240309151159.8426-1-stefano.babic@swupdate.org> References: <20240309151159.8426-1-stefano.babic@swupdate.org> MIME-Version: 1.0 X-Provags-ID: V03:K1:QPOY0L4OpHcuXQ3TDWU6uDz5d1+nwyYnf6wiarFV/XYBMQooKu/ wQ0gJAe+hGaL7KK0REpRBYPZ6rZ03eGD3u+0y+LtSs5BmzI5HqMhKX4yli25rWpA/Nlay3p xwbp0OPRKbAJ9y2aPArs7mhBU/VbCeyLYBupOXuwCt1lbFrdvGqskUUYgBJltPI0fl6H7JE PrsZkFk/uphGo0GDK26oA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:rB0VCCtdycs=;bwPDRpyEvasdwpHg2dB0LnskjDI C9iWaoLy6jglzR/QrXXXzA5Ow7eaBWMqdMwZL1k/tepE8zpRR7a3Jd0gXkoc84OEHhnaRcA9P 7yIC4wQTVG2ftjXRoE+NeknA4TW/BNWUT8jvLRRO5mlS6z9XZSTRQpxYZfjiDm9kOgbwyL4/Z LDJT0Dq7VvMfRzcLuex1G//ld5UoHp2sV5zToxcJqmQlIIZ+LDnkNw2+vfapup08z7lPg9wjo sPIicLrJLs5p8ANMGd9X6Cc3EZNO7IGgwSRxFyDdGOMs98hOAnUsV5o+HPGDF1aJAv3HKw5r9 kanvS0N1/2lK+hCrj+Cp+Tzu+2PobG3A17y5ZeXqVEAHYFa1NPSkYyMyWcRJLB60I0ReWqoHX IKj/k3Xyl7LYr+76MPk6rioWckEsmCMLAb/B7Nv1sHR+sS7v3whmIKBYZakuQMZsgM64QbKVy yFt1mwg2X2oRG9IDxH76xDKFqBJtI/F6EQaCNIbPUtMaVcgRJvWAw0gTT7SE+HVwWWI0pIxdb iQ8UxIe80yIHVnBmeAf5J6T2bqzDsgUgpQo8vm0gXnOeWBaZToGU5KXGZRkgRRW5/KUqPGv+3 qH1ueO8rqJOTjtB+nt0HajxHw47YXwNGDsSxmN0jBDNUW4Mlkf1UffhK3W/HhbL72XwcPwdJx SQbm9WkcQhU7V4uWkNMsyIp1PNF8nhYQTLM4AVITjGzmxqHxrC5b9dvDJX5bMfqp2MfRcK97k VAFB8sPfe5v4gb5ubun199ezmP/g5aqxUGzaLXhXSpwGiO12zVNkw4= X-Original-Sender: stefano.babic@swupdate.org X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b="s/4YiFPp"; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 217.72.192.74 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org Precedence: list Mailing-list: list swupdate@googlegroups.com; contact swupdate+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: swupdate@googlegroups.com X-Google-Group-Id: 605343134186 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , The handler is used to push a SWU to other systems running SWUpdate. This patch introduce the concept of generic uploader, and the handler can upload an artifact (not only a SWU) to a URL. The handler will still connect via Websocket to the webserver, and it will parse the answer. To make it generic, the answer can be parsed by a custom Lua function, that should be loaded previously via embedded-script or via a script, or even via swupdate_handlers.lua at the startup. Signed-off-by: Stefano Babic --- corelib/lua_interface.c | 4 +- handlers/swuforward-ws.c | 97 +++++++++++++++++++++++++---------- handlers/swuforward_handler.c | 17 ++++++ handlers/swuforward_handler.h | 3 ++ 4 files changed, 92 insertions(+), 29 deletions(-) -- 2.34.1 diff --git a/corelib/lua_interface.c b/corelib/lua_interface.c index fbdb7d05..90aba6eb 100644 --- a/corelib/lua_interface.c +++ b/corelib/lua_interface.c @@ -1608,7 +1608,6 @@ int lua_handler_fn(lua_State *L, const char *fcn, const char *parms) TRACE("Script : no %s in script, exiting", fcn); return -1; } - TRACE("Prepared to run %s", fcn); /* * passing arguments @@ -1629,7 +1628,8 @@ int lua_handler_fn(lua_State *L, const char *fcn, const char *parms) lua_pop(L, 1); /* clear stack */ - TRACE("Script returns %d", ret); + if (loglevel >= DEBUGLEVEL) + TRACE("Script returns %d", ret); return ret; } diff --git a/handlers/swuforward-ws.c b/handlers/swuforward-ws.c index 2cd98002..ed881fad 100644 --- a/handlers/swuforward-ws.c +++ b/handlers/swuforward-ws.c @@ -35,16 +35,47 @@ struct wsconn { #define TEXTRANGE_TO_STR(f) (f.first == NULL ? NULL : substring(f.first, 0, f.afterLast - f.first)) -static int callback_ws_swupdate(struct lws *wsi, enum lws_callback_reasons reason, - void *user, void *in, size_t len) +static void swupdate_web_answer(struct wsconn *ws, void *in, size_t len) { - struct wsconn *ws = (struct wsconn *)user; struct json_tokener *json_tokenizer; enum json_tokener_error json_res; struct json_object *json_root; - switch (reason) { + json_tokenizer = json_tokener_new(); + + do { + json_root = json_tokener_parse_ex( + json_tokenizer, in, len); + } while ((json_res = json_tokener_get_error(json_tokenizer)) == + json_tokener_continue); + if (json_res != json_tokener_success) { + ERROR("Error while parsing answer from %s returned JSON data: %s", + ws ? ws->conn->url : "", json_tokener_error_desc(json_res)); + } else { + const char *reply_result = json_get_value(json_root, "type"); + if (reply_result && !strcmp(reply_result, "status")) { + const char *status = json_get_value(json_root, "status"); + if (!strcmp(status, "SUCCESS")) + ws->conn->SWUpdateStatus = SUCCESS; + if (!strcmp(status, "FAILURE")) + ws->conn->SWUpdateStatus = FAILURE; + TRACE("Change status on %s : %s", ws->conn->url, + status); + } + if (reply_result && !strcmp(reply_result, "message")) { + const char *text = json_get_value(json_root, "text"); + TRACE("%s : %s", ws->conn->url, text); + } + } + json_tokener_free(json_tokenizer); +} + +static int callback_ws_swupdate(struct lws *wsi, enum lws_callback_reasons reason, + void *user, void *in, size_t len) +{ + struct wsconn *ws = (struct wsconn *)user; + switch (reason) { /* because we are protocols[0] ... */ case LWS_CALLBACK_CLIENT_CONNECTION_ERROR: ERROR("WS Client Connection Error to : %s", ws->conn->url); @@ -58,33 +89,45 @@ static int callback_ws_swupdate(struct lws *wsi, enum lws_callback_reasons reaso break; case LWS_CALLBACK_CLIENT_RECEIVE: - json_tokenizer = json_tokener_new(); - - do { - json_root = json_tokener_parse_ex( - json_tokenizer, in, len); - } while ((json_res = json_tokener_get_error(json_tokenizer)) == - json_tokener_continue); - if (json_res != json_tokener_success) { - ERROR("Error while parsing answer from %s returned JSON data: %s", - ws ? ws->conn->url : "", json_tokener_error_desc(json_res)); - } else { - const char *reply_result = json_get_value(json_root, "type"); - if (reply_result && !strcmp(reply_result, "status")) { - const char *status = json_get_value(json_root, "status"); - if (!strcmp(status, "SUCCESS")) + /* + * If it is not connected to SWUpdate's Webserver + * call a custom Lua function that should be loaded + * in advance + */ + if (ws->conn->fnparser && strlen(ws->conn->fnparser)) { + /* + * First convert the incoming data + * to a "data" stucture (string) + * that is passed to the script. + * Raw / Binary data aren't supported + */ + char *data = (char *) calloc(1, len + 1); + if (!data) { + ERROR("OOM when allocating buffer for Lua Custom Script"); + ws->conn->SWUpdateStatus = FAILURE; + } else { + int ret; + memcpy(data, in, len); + ret = lua_handler_fn(ws->conn->L, ws->conn->fnparser, data); + switch (ret) { + case RUN: + break; + case FAILURE: + ws->conn->SWUpdateStatus = FAILURE; + break; + case SUCCESS: ws->conn->SWUpdateStatus = SUCCESS; - if (!strcmp(status, "FAILURE")) + break; + default: + WARN("Error parsing answer from Webserver, %d", ret); ws->conn->SWUpdateStatus = FAILURE; - TRACE("Change status on %s : %s", ws->conn->url, - status); - } - if (reply_result && !strcmp(reply_result, "message")) { - const char *text = json_get_value(json_root, "text"); - TRACE("%s : %s", ws->conn->url, text); + break; + } + free(data); } + } else { + swupdate_web_answer(ws, in, len); } - json_tokener_free(json_tokenizer); break; case LWS_CALLBACK_CLIENT_CLOSED: diff --git a/handlers/swuforward_handler.c b/handlers/swuforward_handler.c index a4517430..4d346bfa 100644 --- a/handlers/swuforward_handler.c +++ b/handlers/swuforward_handler.c @@ -293,6 +293,7 @@ static int install_remote_swu(struct img_type *img, struct dict_list_elem *url; struct dict_list *urls; int index = 0; + const char *fn_parse_answer = NULL; pthread_attr_t attr; int thread_ret = -1; @@ -317,6 +318,17 @@ static int install_remote_swu(struct img_type *img, return -EINVAL; } + /* + * Check if a custom function is set to parse the + * answer form the Webserver + */ + fn_parse_answer = dict_get_value(&img->properties, "parser-function"); + if (fn_parse_answer && !img->L) { + ERROR("Custom parser requires to enable Lua, exiting.."); + ret = FAILURE; + goto handler_exit; + } + /* Reset list of connections */ LIST_INIT(&priv.conns); @@ -344,9 +356,14 @@ static int install_remote_swu(struct img_type *img, goto handler_exit; } + /* + * Set parameters to each connection structure + */ conn->url = url->value; conn->total_bytes = img->size; conn->SWUpdateStatus = IDLE; + conn->L = img->L; + conn->fnparser = fn_parse_answer; LIST_INSERT_HEAD(&priv.conns, conn, next); diff --git a/handlers/swuforward_handler.h b/handlers/swuforward_handler.h index 78d30731..0c32a173 100644 --- a/handlers/swuforward_handler.h +++ b/handlers/swuforward_handler.h @@ -12,6 +12,7 @@ #include "bsdqueue.h" #include "channel_curl.h" #include "channel.h" +#include "lua_util.h" /* * The Webserver in SWUpdate expets a custom header @@ -52,6 +53,8 @@ struct curlconn { size_t total_bytes; /* size of SWU image */ int fifo[2]; /* Pipe for IPC */ char *url; /* URL for forwarding */ + const char *fnparser; /* Parser for the answer via ws */ + lua_State *L; /* Required if fnparser is set */ bool gotMsg; /* set if the remote board has sent a new msg */ RECOVERY_STATUS SWUpdateStatus; /* final status of update */ channel_op_res_t response;