From patchwork Thu Sep 16 15:32:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sava Jakovljev X-Patchwork-Id: 1528921 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.a=rsa-sha256 header.s=20210112 header.b=rz2HtzlA; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=googlegroups.com (client-ip=2a00:1450:4864:20::339; helo=mail-wm1-x339.google.com; envelope-from=swupdate+bncbaabbighrwfamgqebkaywzq@googlegroups.com; receiver=) Received: from mail-wm1-x339.google.com (mail-wm1-x339.google.com [IPv6:2a00:1450:4864:20::339]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4H9Lgs25yQz9t0p for ; Fri, 17 Sep 2021 01:32:55 +1000 (AEST) Received: by mail-wm1-x339.google.com with SMTP id 201-20020a1c04d2000000b0030b3e4fdcfbsf514101wme.0 for ; Thu, 16 Sep 2021 08:32:55 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1631806368; cv=pass; d=google.com; s=arc-20160816; b=oLxZEX6LfCxG9ghGtPncG2FUSdwD39sfuerS0b5g8eZa+mzgVzWAK1Q54tLINHJBb+ fWz5120PzxShlvOoZvdHv1M+jZ7xQqNYSwypV/hHv4ZTaBFzfqpFt1HufmzVLqJJMfgc Rl1pAaVoXX7+lyhYrp8JdF3AgU872z9CvJlOjgZ6TLw9HB62BK9WgBWdpQS7/Czj7fHX jIl6S2wk/fGiyiUuE2lGFn0idpY7TSSRKCakHfE2B7y0k1h7nx93/SznRb+o45AdgNaW AvfJ4N9WHDBM3aWfTGGQIU9CfTc1ODTWdZBeYBbJZHSQ4zl3cYvmS7fNMvDGgyFt9Wa8 C+vg== 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:mime-version:message-id:date :subject:cc:to:from:sender:dkim-signature; bh=gEdJFXKUcC8S/xCGRczALV/R/W94B9K1Te5798xvrXc=; b=R19xMeeamgWZ07Jko/V9U7742kpCW3A5qxnyhMJmowFQE4nygdcYBWPUXTf8SBsQYi 5hGxw773B7UkS9X4vL7RF2OaCyPQjkDp7vSpHlr5SgF+AAp2pYph67NVMMDS1Ctv+W17 m4MjCfIWS34QzqcXSH4+mKvI8oqZDflfmf2dJMxiBYeR8ngTWWpfpTejHirHn5qf4Q+p baAU4zupVvh1K7SjpgPmsdjqiVHvESCP/Jkj5FQHPJuhNTqdTbCALNFGGIM/fV6guVVm TPlXS00iTqvjx8D4qGn5pqjfklO7aH16QTRAD0UhwhGnRdyulIoAEGHNJWIN0BfEgVxy mBBw== ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@teufel.de header.s=hse1 header.b=JKiR0ZbS; spf=pass (google.com: domain of sava.jakovljev@teufel.de designates 94.100.133.254 as permitted sender) smtp.mailfrom=sava.jakovljev@teufel.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=teufel.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20210112; h=sender:from:to:cc:subject:date:message-id:mime-version :x-original-sender:x-original-authentication-results:precedence :mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=gEdJFXKUcC8S/xCGRczALV/R/W94B9K1Te5798xvrXc=; b=rz2HtzlA6S3zoXUFR5pl818VgcKIxZlctXQ2NqKhDMwimOrj5L4ySNNbgvstq1pcTu 7TyptFOs/FRO9oHcHF00wlTYZ79Z0TFVZn+57A+gx8PIdJQJdnu1nUtR80DPihWlcGGc VbW/u12yE+WtnXy49r8W1P9Gb+DGJl8pfEpgyf26PTNlDhW2+lcGVAsOIH90HF2xMXO4 xeiY7zgUlPqjM3Qaa53EO+wadwaydyvvCoF0pyXVKHrJVrQj9ujPaNpvdupPyhzXGNDs 0E3sZep3Ga2IVAvDZjnrWuCoDzcwMNn56RmYky97fr5nE4Mbpo2rjqt2g/2OISzLHHkm O+zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=sender:x-gm-message-state:from:to:cc:subject:date:message-id :mime-version:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:x-spam-checked-in-group:list-post :list-help:list-archive:list-subscribe:list-unsubscribe; bh=gEdJFXKUcC8S/xCGRczALV/R/W94B9K1Te5798xvrXc=; b=Q1+VDaHYHjJncWBhkIsc0U0Q7z8YZfsMr5BWg/AyT+qTSC1mAhpSSqXNjOBtrJQxsI p72gPc2vhqKBoozrHHMazwtUUMefHs7dVNGSqk0K9eGEt8tlTHHvf8BhTgVsNjqKmyXf 2Pp0xr044Esb6bCuT6z5mGl7/uuvZa0TgRvT2A1TS/juW9j36R2SR5rdVV3POgFX7bsi rgyDwXwPaWDfGrMCytx5Yq6mb+L+dnvq9XB8PaKYr526cxk7lzcJGln/6wKwRFmXMqFa KhpFLoXFHJ/EkC/YDbbqETLGx2w39gtS8zAGajC1WuIMau90RWsZDUC2JF2UeXBj02Rv bNMQ== Sender: swupdate@googlegroups.com X-Gm-Message-State: AOAM532SMZxBpCdGrdT2m9ef+drTRr/CB09IK5J9tljS2sauNhRNWmAu HqnVJSRqpdmVodw9/DuVbXU= X-Google-Smtp-Source: ABdhPJwkwwuaH6J7ZuarRXHWAUBmd+a1k9t4ltsnxNVAtPSnj8vCxijFEwTUgbXCndmgAinqI49aBA== X-Received: by 2002:adf:80eb:: with SMTP id 98mr6796295wrl.348.1631806368505; Thu, 16 Sep 2021 08:32:48 -0700 (PDT) X-BeenThere: swupdate@googlegroups.com Received: by 2002:adf:aacd:: with SMTP id i13ls2057680wrc.3.gmail; Thu, 16 Sep 2021 08:32:47 -0700 (PDT) X-Received: by 2002:a05:6000:236:: with SMTP id l22mr7023073wrz.386.1631806367798; Thu, 16 Sep 2021 08:32:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631806367; cv=none; d=google.com; s=arc-20160816; b=UeoMg2984LfdBeraE+bB/Mc1GzCH+Jo0nMdL2jHJy7yN+uKeiKY6ZjEr9Gn4tEExLW sTww0J3fWDVQDDe4a0XM+ZtkGnDWWLI7HArmz8dELmLAFME197azkRXvKUEWEtujFyhl 0wpRCDPSxvaeFzMKFO6NUhe0UNq4YJi0ML4f0Oq3rqOIpsN0S21BaapJAJA1Iwg4g2RB PcTedrGkuLClj8UbjSCquIwdqa7D3pVSgNhfVxcK+MPNnuZMz6ViUypmuXNb3jlCdOUT KUgDpJOPs4qEZS0HqUSDK8uEpGuylqT0aC+yOrQlnBk1dp0N1IDCDvYvuYdMs0pMjVUJ xvvA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=dkim-signature:content-transfer-encoding:mime-version:message-id :date:subject:cc:to:from; bh=zBmiQY9hgKRvrqgxF6w3CGjmWx9NZNNZ2wjyeuzt91A=; b=dtolqHsZnGK1QsnL5HS5XrBA7BlWWdvjJD+lNHejKfhyaDTjEnhyBAscfUa2t30EcK cTUiUYuStSWI672TvgGoLRz9DRbQoTvoYHJ5Q/FQiDk2Mk1ALU9Ub3y2VXjz5oe60lXs JJhImrnoMvSTOdLXU3tLxRSKWln9Q4e+hWm9b1bSmrvPBoxoWhDSq4L06xNr6W+4jPeI fNZ7ydoAjUQpMOxf3qqRmIz2VntnIG7AUFza6BU96XAo0HnIpc8xGfJu5LLPEWJYe3aM 1UVFBEVC+dUw40qz8vNCxt5nWYPrtwZnWW7yx3cK1SWIuCc2bEQLes4ZuPHwJUP1b4D0 hW7Q== ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@teufel.de header.s=hse1 header.b=JKiR0ZbS; spf=pass (google.com: domain of sava.jakovljev@teufel.de designates 94.100.133.254 as permitted sender) smtp.mailfrom=sava.jakovljev@teufel.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=teufel.de Received: from mx-relay88-hz1.antispameurope.com (mx-relay88-hz1.antispameurope.com. [94.100.133.254]) by gmr-mx.google.com with ESMTPS id g23si681138wme.2.2021.09.16.08.32.47 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 16 Sep 2021 08:32:47 -0700 (PDT) Received-SPF: pass (google.com: domain of sava.jakovljev@teufel.de designates 94.100.133.254 as permitted sender) client-ip=94.100.133.254; Received: from unknown ([212.91.255.190]) by mx-relay88-hz1.antispameurope.com; Thu, 16 Sep 2021 17:32:47 +0200 From: Sava Jakovljev To: CC: Sava Jakovljev Subject: [swupdate] [PATCH] channel_curl: Add maximum download speed limit Date: Thu, 16 Sep 2021 17:32:37 +0200 Message-ID: <20210916153237.17527-1-sava.jakovljev@teufel.de> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-Originating-IP: [10.10.6.26] X-ClientProxiedBy: DNS-EX-01.teufel.local (10.10.0.80) To DNS-EX-02.teufel.local (10.10.0.81) X-C2ProcessedOrg: b93e13a0-e8da-4ba4-97b8-f14375b21c41 X-cloud-security-sender: sava.jakovljev@teufel.de X-cloud-security-recipient: swupdate@googlegroups.com X-cloud-security-Virusscan: CLEAN X-cloud-security-disclaimer: This E-Mail was scanned by E-Mailservice on mx-relay88-hz1.antispameurope.com with 95CA0726B80 X-cloud-security-connect: unknown[212.91.255.190], TLS=1, IP=212.91.255.190 X-cloud-security-Digest: edeab2985b5aff050359fb067aacefa2 X-cloud-security: scantime:1.779 X-Original-Sender: sava.jakovljev@teufel.de X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@teufel.de header.s=hse1 header.b=JKiR0ZbS; spf=pass (google.com: domain of sava.jakovljev@teufel.de designates 94.100.133.254 as permitted sender) smtp.mailfrom=sava.jakovljev@teufel.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=teufel.de 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: , * Extend Suricatta and general server with options to set download speed limit. * Add 'n' short and 'max-download-speed' long command line option for setting download speed limit. * Add 'maximum-download-speed' option in configuration file. Signed-off-by: Sava Jakovljev --- corelib/channel_curl.c | 9 +++++++++ corelib/downloader.c | 3 ++- doc/source/swupdate.rst | 2 ++ include/channel_curl.h | 1 + suricatta/common.c | 3 +++ suricatta/server_general.c | 11 +++++++++-- suricatta/server_hawkbit.c | 13 ++++++++++--- 7 files changed, 36 insertions(+), 6 deletions(-) -- 2.31.1 diff --git a/corelib/channel_curl.c b/corelib/channel_curl.c index 0761811..4422a02 100644 --- a/corelib/channel_curl.c +++ b/corelib/channel_curl.c @@ -1104,6 +1104,15 @@ channel_op_res_t channel_get_file(channel_t *this, void *data) goto cleanup_header; } + if (channel_data->max_download_speed && + curl_easy_setopt(channel_curl->handle, + CURLOPT_MAX_RECV_SPEED_LARGE, + channel_data->max_download_speed * 1024) != CURLE_OK) { + ERROR("Set channel download speed limit failed."); + result = CHANNEL_EINIT; + goto cleanup_header; + } + download_callback_data_t download_data; if (channel_enable_download_progress_tracking(channel_curl, channel_data->url, diff --git a/corelib/downloader.c b/corelib/downloader.c index 3d0a0a5..8596694 100644 --- a/corelib/downloader.c +++ b/corelib/downloader.c @@ -105,7 +105,8 @@ static channel_data_t channel_options = { .debug = false, .retries = DL_DEFAULT_RETRIES, .low_speed_timeout = DL_LOWSPEED_TIME, - .headers_to_send = NULL + .headers_to_send = NULL, + .max_download_speed = 0 // Unlimited download speed is default. }; int start_download(const char *fname, int argc, char *argv[]) diff --git a/doc/source/swupdate.rst b/doc/source/swupdate.rst index 5af52f1..6704bab 100644 --- a/doc/source/swupdate.rst +++ b/doc/source/swupdate.rst @@ -665,6 +665,8 @@ Mandatory arguments are marked with '\*': | | | value to be sent with every HTTP request | | | | made. | +-------------------------+----------+--------------------------------------------+ +| -n | integer | Maximum download speed in kB/s. | ++-------------------------+----------+--------------------------------------------+ systemd Integration diff --git a/include/channel_curl.h b/include/channel_curl.h index 6dabae6..ade5f9b 100644 --- a/include/channel_curl.h +++ b/include/channel_curl.h @@ -74,4 +74,5 @@ typedef struct { sourcetype source; struct dict *headers_to_send; struct dict *received_headers; + unsigned int max_download_speed; // in kB/s } channel_data_t; diff --git a/suricatta/common.c b/suricatta/common.c index e5a3db2..b59c0a4 100644 --- a/suricatta/common.c +++ b/suricatta/common.c @@ -23,6 +23,9 @@ void suricatta_channel_settings(void *elem, channel_data_t *chan) get_field(LIBCFG_PARSER, elem, "retry", &chan->retries); + get_field(LIBCFG_PARSER, elem, "max-download-speed", + &chan->max_download_speed); + GET_FIELD_STRING_RESET(LIBCFG_PARSER, elem, "retrywait", tmp); if (strlen(tmp)) chan->retry_sleep = diff --git a/suricatta/server_general.c b/suricatta/server_general.c index d9ad50d..548cb1f 100644 --- a/suricatta/server_general.c +++ b/suricatta/server_general.c @@ -65,6 +65,7 @@ static struct option long_options[] = { {"retry", required_argument, NULL, 'r'}, {"retrywait", required_argument, NULL, 'w'}, {"cache", required_argument, NULL, '2'}, + {"max-download-speed", required_argument, NULL, 'n'}, {NULL, 0, NULL, 0}}; static unsigned short mandatory_argument_count = 0; @@ -525,7 +526,8 @@ void server_print_help(void) "\t -y, --proxy Use proxy. Either give proxy URL, else " "{http,all}_proxy env is tried.\n" "\t -a, --custom-http-header Set custom HTTP header, " - "appended to every HTTP request being sent.", + "appended to every HTTP request being sent." + "\t -n, --max-download-speed Set download speed limit in kB/s.", CHANNEL_DEFAULT_POLLING_INTERVAL, CHANNEL_DEFAULT_RESUME_TRIES, CHANNEL_DEFAULT_RESUME_DELAY); } @@ -630,7 +632,7 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) /* reset to optind=1 to parse suricatta's argument vector */ optind = 1; opterr = 0; - while ((choice = getopt_long(argc, argv, "u:l:r:w:p:2:a:", + while ((choice = getopt_long(argc, argv, "u:l:r:w:p:2:a:n", long_options, NULL)) != -1) { switch (choice) { case 'u': @@ -665,6 +667,11 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) return SERVER_EINIT; break; + case 'n': + channel_data_defaults.max_download_speed = + (unsigned int)strtoul(optarg, NULL, 10); + break; + case '?': /* Ignore not recognized options, they can be already parsed by the caller */ default: diff --git a/suricatta/server_hawkbit.c b/suricatta/server_hawkbit.c index 9a338d8..2ece79e 100644 --- a/suricatta/server_hawkbit.c +++ b/suricatta/server_hawkbit.c @@ -53,6 +53,7 @@ static struct option long_options[] = { {"initial-report-resend-period", required_argument, NULL, 'm'}, {"connection-timeout", required_argument, NULL, 's'}, {"custom-http-header", required_argument, NULL, 'a'}, + {"max-download-speed", required_argument, NULL, 'n'}, {NULL, 0, NULL, 0}}; static unsigned short mandatory_argument_count = 0; @@ -135,7 +136,8 @@ static channel_data_t channel_data_defaults = {.debug = false, .strictssl = true, .connection_timeout = 0, .headers_to_send = NULL, - .received_headers = NULL + .received_headers = NULL, + .max_download_speed = 0 // No download speed limit is default. }; static struct timeval server_time; @@ -1611,7 +1613,8 @@ void server_print_help(void) "sending initial state with '-c' option (default: %ds).\n" "\t -s, --connection-timeout Set the server connection timeout (default: 300s).\n" "\t -a, --custom-http-header Set custom HTTP header, " - "appended to every HTTP request being sent.", + "appended to every HTTP request being sent." + "\t -n, --max-download-speed Set download speed limit in kB/s.", CHANNEL_DEFAULT_POLLING_INTERVAL, CHANNEL_DEFAULT_RESUME_TRIES, CHANNEL_DEFAULT_RESUME_DELAY, INITIAL_STATUS_REPORT_WAIT_DELAY); @@ -1702,7 +1705,7 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) /* reset to optind=1 to parse suricatta's argument vector */ optind = 1; opterr = 0; - while ((choice = getopt_long(argc, argv, "t:i:c:u:p:xr:y::w:k:g:f:2:m:s:a:", + while ((choice = getopt_long(argc, argv, "t:i:c:u:p:xr:y::w:k:g:f:2:m:s:a:n:", long_options, NULL)) != -1) { switch (choice) { case 't': @@ -1805,6 +1808,10 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) return SERVER_EINIT; break; + case 'n': + channel_data_defaults.max_download_speed = + (unsigned int)strtoul(optarg, NULL, 10); + break; /* Ignore not recognized options, they can be already parsed by the caller */ case '?': break;