How to use sendtohawkbit tool?

1,245 views
Skip to first unread message

Ho Tony

unread,
Jun 16, 2018, 7:16:20 AM6/16/18
to swupdate
Hi guys :
I am trying to send a update successful feedback using the sendtohawkbit tool in the postupdate cmd hook to avoid the restarting of the swudpate. 

At this moment, I can use the following 2 steps to let the swupdate do a update:
1. Run the following commands to do the polling from hawkbit server, and the swupdate would dowload and update the swu file:
swupdate -u ' -t default -u 192.168.3.101:8080 -i imx6ul-var-dart -c 2 ' -f  /etc/swupdate.cfg


When it updated, I would kill the swupdate to quit the polling
2. Run following commands to give a feedback to the hawkbit, and when it sent the feedback to hawkbit, I would kill the swupdate and restart it:
swupdate -u ' -t default -u 192.168.3.101:8080 -i imx6ul-var-dart -c 2 '
And it gives the following output/log without error:
# swupdate -f /etc/swupdate.cfg  -v -w '/www'  -u '-t default -u 192.168.3.101:8080 -i imx6ul-var-dart -c 2' | tee 7.log  &
[1] 21457
root@ModBusTCP_V1:~# Swupdate v2018.3.0

Licensed under GPLv2. See source distribution for detailed copyright notices.

[TRACE] : SWUPDATE running :  [start_swupdate_subprocess] : Started webserver with pid 21459 and fd 4
[TRACE] : SWUPDATE running :  [start_swupdate_subprocess] : Started suricatta with pid 21460 and fd 5
Running on mbtcp-mx6 Revision 1.0
Registered handlers:
        dummy
        archive
        tar
        raw
        rawfile
        lua
        shellscript
        preinstall
        postinstall
        remote
        u*   Trying 192.168.3.101...
* TCP_NODELAY set
* Connected to 192.168.3.101 (192.168.3.101) port 8080 (#0)
> GET /default/controller/v1/imx6ul-var-dart HTTP/1.1
User-Agent: libcurl-agent/1.0
Content-Type: application/json
Accept: application/json
charsets: utf-8
Authorization: TargetToken 6be90829bad53947294ae6bc18f3cc81

boot
        bootloader
[TRACE] : SWUPDATE running :  [suricatta_configdata_settings] : Identify for configData: versionSpC --> 1.0

[TRACE] : SWUPDATE running :  [listener_create] : creating socket at /tmp/swupdateprog
[TRACE] : SWUPDATE running :  [network_initializer] : Main loop Daemon
[TRACE] : SWUPDATE running :  [listener_create] : creating socket at /tmp/sockinstctrl
[TRACE] : SWUPDAT< HTTP/1.1 200 OK
< Date: Sat, 16 Jun 2018 08:26:53 GMT
< X-Application-Context: application:amqp
< Content-Type: application/json;charset=UTF-8
< ETag: "06755376a8f6363bcbeb768285fc40db7"
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Content-Length: 175
* Connection #0 to host 192.168.3.101 left intact
* Found bundle for host 192.168.3.101: 0x8bf978 [can pipeline]
* Re-using existing connection! (#0) with host 192.168.3.101
* Connected to 192.168.3.101 (192.168.3.101) port 8080 (#0)
> GET /default/controller/v1/imx6ul-var-dart/deploymentBase/3?c=413446921 HTTP/1.1
User-Agent: libcurl-agent/1.0
Content-Type: application/json
Accept: application/json
charsets: utf-8
Authorization: TargetToken 6be90829bad53947294ae6bc18f3cc81

E running :  [suricatta_configdata_settings] : Identify for configData: hwId --> ipse

[TRACE] : SWUPDATE running :  [suricatta_configdata_settings] : Identify for configData: hwVersion --> 333

[TRACE] : SWUPDATE running :  [suricatta_configdata_settings] : Identify for configData: serialNo --> 1234567890

[TRACE] : SWUPDATE running :  [suricatta_configdata_settings] : Identify for configData: swCompatibility --> unknown

[TRACE] : SWUPDATE running :  [server_handle_initial_state] : Got state=2 from command line.

[DEBUG] : SWUPDATE running :  [server_get_device_info] : Getting information for device 'imx6ul-var-dart'

[DEBUG] : SWUPDATE running :  [channel_set_options] : cURL's low download speed timeout is disabled, this is most probably not what you want. Adapted it to 300s instead.

[DEBUG] : SWUPDATE running :  [channel_get] : Trying to GET 192.168.3.101:8080/default/controller/v1/imx6ul-var-dart
[TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 175B of 175B"}
[TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 175B of 175B"}
[TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 175B of 175B"}
[TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 175B of 175B"}
[TRACE] : SWUPDATE running :  [channel_log_effective_url] : Channel's effective URL resolved to http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart

[TRACE] : SWUPDATE running :  [channel_get] : Channel operation returned HTTP status code 200.

[TRACE] : SWUPDATE< HTTP/1.1 200 OK
< Date: Sat, 16 Jun 2018 08:26:53 GMT
< X-Application-Context: application:amqp
< Content-Type: application/json;charset=UTF-8
< ETag: "02767263ca579d6bc2b498a1209498b91"
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Content-Length: 575
* Connection #0 to host 192.168.3.101 left intact
* Found bundle for host 192.168.3.101: 0x8bf978 [can pipeline]
* Re-using existing connection! (#0) with host 192.168.3.101
* Connected to 192.168.3.101 (192.168.3.101) port 8080 (#0)
> POST /default/controller/v1/imx6ul-var-dart/deploymentBase/3/feedback HTTP/1.1
User-Agent: libcurl-agent/1.0
Content-Type: application/json
Accept: application/json
charsets: utf-8
Authorization: TargetToken 6be90829bad53947294ae6bc18f3cc81
Content-Length: 186

* upload completely sent off: 186 out of 186 bytes
 running :  [channel_get] : Get JSON: {"config":{"polling":{"sleep":"00:01:00"}},"_links":{"deploymentBase":{"href":"http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/deploy
mentBase/3?c=413446921"}}}

[DEBUG] : SWUPDATE running :  [server_set_polling_interval] : Set polling interval to 60s as announced by server.

[TRACE] : SWUPDATE running :  [server_get_deployment_info] : Update action available at http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/deploymentBase/3?c=413446921

[DEBUG] : SWUPDATE running :  [channel_set_options] : cURL's low download speed timeout is disabled, this is most probably not what you want. Adapted it to 300s instead.

[DEBUG] : SWUPDATE running :  [channel_get] : Trying to GET http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/deploymentBa< HTTP/1.1 200 OK
< Date: Sat, 16 Jun 2018 08:26:53 GMT
< X-Application-Context: application:amqp
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Content-Length: 0
* Connection #0 to host 192.168.3.101 left intact
* Found bundle for host 192.168.3.101: 0x8bf978 [can pipeline]
* Re-using existing connection! (#0) with host 192.168.3.101
* Connected to 192.168.3.101 (192.168.3.101) port 8080 (#0)
> GET /default/controller/v1/imx6ul-var-dart HTTP/1.1
User-Agent: libcurl-agent/1.0
Content-Type: application/json
Accept: application/json
charsets: utf-8
Authorization: TargetToken 6be90829bad53947294ae6bc18f3cc81

< HTTP/1.1 200 OK
< Date: Sat, 16 Jun 2018 08:26:53 GMT
< X-Application-Context: application:amqp
< Content-Type: application/json;charset=UTF-8
< ETag: "0c4e213aa54b57890390f2301ded36f0d"
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Content-Length: 43
* Connection #0 to host 192.168.3.101 left intact
se/3?c=413446921
[TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received* Found bundle for host 192.168.3.101: 0x8bf978 [can pipeline]
* Re-using existing connection! (#0) with host 192.168.3.101
* Connected to 192.168.3.101 (192.168.3.101) port 8080 (#0)
> PUT /default/controller/v1/imx6ul-var-dart/configData HTTP/1.1
User-Agent: libcurl-agent/1.0
Content-Type: application/json
Accept: application/json
charsets: utf-8
Authorization: TargetToken 6be90829bad53947294ae6bc18f3cc81
Content-Length: 256
Expect: 100-continue

 575B of 575B"}
[TRACE] : EVENT [0] :  {"percent": 1< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< Date: Sat, 16 Jun 2018 08:26:53 GMT
< X-Application-Context: application:amqp
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Content-Length: 0
* Connection #0 to host 192.168.3.101 left intact
00, "msg":"Received 575B of 575B"}
[TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 575B of 575B"}
[TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 575B of 575B"}
[TRACE] : SWUPDATE running :  [channel_log_effective_url] : Channel's effective URL resolved to http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/deploymentBase/3?c=41344692
1

[TRACE] : SWUPDATE running :  [channel_get] : Channel operation returned HTTP status code 200.

[TRACE] : SWUPDATE running :  [channel_get] : Get JSON: {"id":"3","deployment":{"download":"forced","update":"forced","chunks":[{"part":"bApp","version":"1.0","name":"sw","artifacts":[{"f
ilename":"my-software_1.0.swu","hashes":{"sha1":"63a950048966e55068e62b66a26205a9fd2f99a1","md5":"e9354f9f74f84963af638d7a11aca4d4"},"size":1024,"_links":{"download-http":{"href":"http://
r-dart/softwaremodules/1/artifacts/my-software_1.0.swu.MD5SUM"}}}]}]}}

[TRACE] : SWUPDATE running :  [server_get_deployment_info] : Associated Action ID for Update Action is 3

[TRACE] : SWUPDATE running :  [server_create_details] : Detail 0 Update Installed.
[TRACE] : SWUPDATE running :  [server_create_details] : Final details: "Update Installed."

[TRACE] : SWUPDATE running :  [server_send_deployment_reply] : Reporting Installation progress for ID 3: success / closed / "Update Installed." 

[TRACE] : SWUPDATE running :  [server_send_deployment_reply] : PUTing to 192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/deploymentBase/3/feedback: { "id": 3, "time": "20180616T1
62653", "status": { "result": { "progress": { "cnt" : 0, "of" : 0 }, "finished": "success" }, "execution": "closed", "details" : [ "Update Installed." ] } }

[DEBUG] : SWUPDATE running :  [channel_set_options] : cURL's low download speed timeout is disabled, this is most probably not what you want. Adapted it to 300s instead.

[TRACE] : SWUPDATE running :  [channel_set_options] : Posted: { "id": 3, "time": "20180616T162653", "status": { "result": { "progress": { "cnt" : 0, "of" : 0 }, "finished": "success" }, "
execution": "closed", "details" : [ "Update Installed." ] } }

[TRACE] : SWUPDATE running :  [channel_log_effective_url] : Channel's effective URL resolved to http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/deploymentBase/3/feedback

[TRACE] : SWUPDATE running :  [channel_post_method] : Channel put operation returned HTTP status code 200.

[TRACE] : SWUPDATE running :  [start_suricatta] : Server initialized, entering suricatta main loop.

[DEBUG] : SWUPDATE running :  [server_get_device_info] : Getting information for device 'imx6ul-var-dart'

[DEBUG] : SWUPDATE running :  [channel_set_options] : cURL's low download speed timeout is disabled, this is most probably not what you want. Adapted it to 300s instead.

[DEBUG] : SWUPDATE running :  [channel_get] : Trying to GET 192.168.3.101:8080/default/controller/v1/imx6ul-var-dart
[TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 43B of 43B"}
[TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 43B of 43B"}
[TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 43B of 43B"}
[TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 43B of 43B"}
[TRACE] : SWUPDATE running :  [channel_log_effective_url] : Channel's effective URL resolved to http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart

[TRACE] : SWUPDATE running :  [channel_get] : Channel operation returned HTTP status code 200.

[TRACE] : SWUPDATE running :  [channel_get] : Get JSON: {"config":{"polling":{"sleep":"00:01:00"}}}

[DEBUG] : SWUPDATE running :  [server_set_polling_interval] : Set polling interval to 60s as announced by server.

[TRACE] : SWUPDATE running :  [server_get_deployment_info] : No pending action on server.

[TRACE] : SWUPDATE running :  [server_send_target_data] : KEYVALUE= "swCompatibility": "unknown" swCompatibility unknown
[TRACE] : SWUPDATE running :  [server_send_target_data] : KEYVALUE=,"serialNo": "1234567890" serialNo 1234567890
[TRACE] : SWUPDATE running :  [server_send_target_data] : KEYVALUE=,"hwVersion": "333" hwVersion 333
[TRACE] : SWUPDATE running :  [server_send_target_data] : KEYVALUE=,"hwId": "ipse" hwId ipse
[TRACE] : SWUPDATE running :  [server_send_target_data] : KEYVALUE=,"versionSpC": "1.0" versionSpC 1.0
[TRACE] : SWUPDATE running :  [server_send_target_data] : CONFIGDATA= "swCompatibility": "unknown","serialNo": "1234567890","hwVersion": "333","hwId": "ipse","versionSpC": "1.0"
[TRACE] : SWUPDATE running :  [server_send_target_data] : URL=192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/configData JSON={ "id": "", "time": "20180616T162653", "status": { "
result": { "finished": "success" }, "execution": "closed", "details" : [ "" ] }, "data" : {  "swCompatibility": "unknown","serialNo": "1234567890","hwVersion": "333","hwId": "ipse","versi
onSpC": "1.0" } }
[DEBUG] : SWUPDATE running :  [channel_set_options] : cURL's low download speed timeout is disabled, this is most probably not what you want. Adapted it to 300s instead.

[TRACE] : SWUPDATE running :  [channel_log_effective_url] : Channel's effective URL resolved to http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/configData

[TRACE] : SWUPDATE running :  [channel_put_method] : Channel put operation returned HTTP error code 200.

[DEBUG] : SWUPDATE running :  [suricatta_wait] : Sleeping for 60 seconds.





The problem is how to let the swupdate give the "update success" feedback to hawkbit server instead of manually specifying the '-c 2( the previous Step 2)'. 
So I try the following:
Running the swupdate at backgroud:
 swupdate -u ' -t default -u 192.168.3.101:8080 -i imx6ul-var-dart -c 2 ' -f  /etc/swupdate.cfg &


When it has done the update swu file from server, I try to use the following commands to let swupdate to send feedback to server:
 swupdate-sendtohawkbit  4 '"result": { "progress": { "cnt" : 0, "of" : 0 }}'    success       closed     'Update Installed.'



But it seems my parameter is not right:
 swupdate-sendtohawkbit  4 '"result": { "progress": { "cnt" : 0, "of" : 0 }}'    success       closed     'Update Installed.'
[TRACE] : SWUPDATE running :  [network_thread] : Rec[ERROR] : SWUPDATE failed [0] ERROR suricatta/server_hawkbit.c : server_tokenize_msg : 1749 : Error while parsing channel's returned JS
ON data: object value separator ',' expected

Sending: '{ "id" : "4", "status" : ""result": { "progress": { "cnt" : 0, "of" : 0 }}","finished" : "success","execution" : "closed","details" : [ "Update Installed."]}' returned 0
Server returns NACK
eived Message for suricatta
[TRACE] : SWUPDATE running :  [suricatta_wait] : Suricatta woke up for IPC at 46 seconds
[DEBUG] : SWUPDATE running :  [suricatta_wait] : Sleeping for 46 seconds.


Is there an example using of  'sendtohakwbit' ? 

Thanks.

Stefano Babic

unread,
Jun 18, 2018, 3:47:00 AM6/18/18
to Ho Tony, swupdate
Hi Ho,
Not sure about your concept. If SWUpdate does not reboot the device
after a successful update, it must store the current status to disable
the polling (STATE_INSTALLED). This is automatically done if

CONFIG_SURICATTA_STATE_CHOICE_BOOTLOADER

is set. The state is set to STATE_INSTALLED, SWUpdate polls the server
(to check connection), but there is no action.

Wehn it is in this state, you can send via IPC a confirmation.
sendtohawkbit is thought as example - generally, this code is integrated
into the main application of the device, because it decides if an update
can be activated or rejected.

>
>
> When it has done the update swu file from server, I try to use the
> following commands to let swupdate to send feedback to server:
> |
>  swupdate-sendtohawkbit  4'"result": { "progress": { "cnt" : 0, "of" : 0
> }}'   success       closed     'Update Installed.'
> |
>
>
>
> But it seems my parameter is not right:
> |
>  swupdate-sendtohawkbit  4 '"result": { "progress": { "cnt" : 0, "of" :
> 0 }}'    success       closed     'Update Installed.'
> [TRACE] : SWUPDATE running :  [network_thread] : Rec[ERROR] : SWUPDATE
> failed [0] ERROR suricatta/server_hawkbit.c : server_tokenize_msg : 1749
> : Error while parsing channel's returned JS
> ON data: object value separator ',' expected
>
> Sending: '{ "id" : "4", "status" : ""result": { "progress": { "cnt" : 0,
> "of" : 0 }}","finished" : "success","execution" : "closed","details" : [
> "Update Installed."]}' returned 0
> Server returns NACK
> eived Message for suricatta
> [TRACE] : SWUPDATE running :  [suricatta_wait] : Suricatta woke up for
> IPC at 46 seconds
> [DEBUG] : SWUPDATE running :  [suricatta_wait] : Sleeping for 46 seconds.
> |
>
>
> Is there an example using of  'sendtohakwbit' ? 
>

sendtohawkbit is just a "wrapper" for Hawkbit DDI interface. SWUpdate
forwards the parameters (if SWUpdate is in the correct state, that means
after an installation or at the start up after a reboot) to Hawkbit.

Best regards,
Stefano Babic


--
=====================================================================
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sba...@denx.de
=====================================================================

sravya...@gmail.com

unread,
Feb 19, 2020, 12:35:34 AM2/19/20
to swupdate
Hi,

I have a similar requirement of having to send success feedback to hawkbit update server without restarting swupdate through the postupdate cmd using sendtohawkbit.
Is there any example of how sendtohawkbit can be used to achieve this . Whatever I try seems to give me error. 

Thanks
Sravya K

Stefano Babic

unread,
Feb 19, 2020, 4:10:54 AM2/19/20
to sravya...@gmail.com, swupdate
Hi Sravya,

On 19/02/20 06:35, sravya...@gmail.com wrote:
> Hi,
>
> I have a similar requirement of having to send success feedback to
> hawkbit update server without restarting swupdate through the postupdate
> cmd using sendtohawkbit.
> Is there any example of how sendtohawkbit can be used to achieve this .
> Whatever I try seems to give me error. 

In fact, sendtohawkbit is more thought as example to be included in the
own application. It is just a wrapper to build a JSON message and send
it to SWUpdate.

The documentation for the fields is in the Hawkbit's documentation:

https://www.eclipse.org/hawkbit/apis/ddi_api/

SWUpdate just takes the argument and build the communication to Hawkbit.

swupdate-sendtohawkbit <action id> <status> <finished> <execution>
<detail 1> <detail 2>

The main issue is to get the <action id>. This is created by Hawkbit
during the update process. SWUpdate forwards this information via the
progress interface, and the own application should find a way to store
it in case of reboot. If you have the action id (mandatory), the other
parameters are straightforward:

<status> is the new state of the internal machine. It is defined in
include/state.h. To close an update, you use '0' (STATE_OK).

<finished> : one of "success", "failure", "none"
<execution> : one of "closed", "proceeding", "canceled","scheduled",
"rejected", "resumed"

<detail>: this is just a list of strings that can be added as comment to
the feedback answer. It is fully optional.

Best regards,
Stefano Babic

>
> Thanks
> Sravya K
>
> On Saturday, June 16, 2018 at 4:46:20 PM UTC+5:30, Ho Tony wrote:
>
> Hi guys :
> I am trying to send a update successful feedback using the
> sendtohawkbit tool in the postupdate cmd hook to avoid the
> restarting of the swudpate. 
>
> At this moment, I can use the following 2 steps to let the swupdate
> do a update:
> 1. Run the following commands to do the polling from hawkbit server,
> and the swupdate would dowload and update the swu file:
> |
> swupdate -u ' -t default -u 192.168.3.101:8080
> <http://192.168.3.101:8080> -i imx6ul-var-dart -c 2 '-f
>  /etc/swupdate.cfg
> |
>
>
> When it updated, I would kill the swupdate to quit the polling
> 2. Run following commands to give a feedback to the hawkbit, and
> when it sent the feedback to hawkbit, I would kill the swupdate and
> restart it:
> |
> swupdate -u ' -t default -u 192.168.3.101:8080
> <http://192.168.3.101:8080> -i imx6ul-var-dart -c 2 '
> |
> And it gives the following output/log without error:
> |
> # swupdate -f /etc/swupdate.cfg  -v -w '/www'  -u '-t default -u
> 192.168.3.101:8080 <http://192.168.3.101:8080> -i imx6ul-var-dart -c
> Host: 192.168.3.101:8080 <http://192.168.3.101:8080>
> * Found bundle for host 192.168.3.101 <http://192.168.3.101>:
> 0x8bf978 [can pipeline]
> * Re-using existing connection! (#0) with host 192.168.3.101
> * Connected to 192.168.3.101 (192.168.3.101) port 8080 (#0)
> > GET
> /default/controller/v1/imx6ul-var-dart/deploymentBase/3?c=413446921
> HTTP/1.1
> Host: 192.168.3.101:8080 <http://192.168.3.101:8080>
> User-Agent: libcurl-agent/1.0
> Content-Type: application/json
> Accept: application/json
> charsets: utf-8
> Authorization: TargetToken 6be90829bad53947294ae6bc18f3cc81
>
> E running :  [suricatta_configdata_settings] : Identify for
> configData: hwId --> ipse
>
> [TRACE] : SWUPDATE running :  [suricatta_configdata_settings] :
> Identify for configData: hwVersion --> 333
>
> [TRACE] : SWUPDATE running :  [suricatta_configdata_settings] :
> Identify for configData: serialNo --> 1234567890
>
> [TRACE] : SWUPDATE running :  [suricatta_configdata_settings] :
> Identify for configData: swCompatibility --> unknown
>
> [TRACE] : SWUPDATE running :  [server_handle_initial_state] : Got
> state=2 from command line.
>
> [DEBUG] : SWUPDATE running :  [server_get_device_info] : Getting
> information for device 'imx6ul-var-dart'
>
> [DEBUG] : SWUPDATE running :  [channel_set_options] : cURL's low
> download speed timeout is disabled, this is most probably not what
> you want. Adapted it to 300s instead.
>
> [DEBUG] : SWUPDATE running :  [channel_get] : Trying to GET
> 192.168.3.101:8080/default/controller/v1/imx6ul-var-dart
> <http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart>
> [TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 175B of 175B"}
> [TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 175B of 175B"}
> [TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 175B of 175B"}
> [TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received 175B of 175B"}
> [TRACE] : SWUPDATE running :  [channel_log_effective_url] :
> Channel's effective URL resolved to
> http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart
> <http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart>
>
> [TRACE] : SWUPDATE running :  [channel_get] : Channel operation
> returned HTTP status code 200.
>
> [TRACE] : SWUPDATE< HTTP/1.1 200 OK
> < Date: Sat, 16 Jun 2018 08:26:53 GMT
> < X-Application-Context: application:amqp
> < Content-Type: application/json;charset=UTF-8
> < ETag: "02767263ca579d6bc2b498a1209498b91"
> < X-Content-Type-Options: nosniff
> < X-XSS-Protection: 1; mode=block
> < Cache-Control: no-cache, no-store, max-age=0, must-revalidate
> < Pragma: no-cache
> < Expires: 0
> < X-Frame-Options: DENY
> < Content-Length: 575
> < 
> * Connection #0 to host 192.168.3.101 left intact
> * Found bundle for host 192.168.3.101 <http://192.168.3.101>:
> 0x8bf978 [can pipeline]
> * Re-using existing connection! (#0) with host 192.168.3.101
> * Connected to 192.168.3.101 (192.168.3.101) port 8080 (#0)
> > POST
> /default/controller/v1/imx6ul-var-dart/deploymentBase/3/feedback
> HTTP/1.1
> Host: 192.168.3.101:8080 <http://192.168.3.101:8080>
> * Found bundle for host 192.168.3.101 <http://192.168.3.101>:
> 0x8bf978 [can pipeline]
> * Re-using existing connection! (#0) with host 192.168.3.101
> * Connected to 192.168.3.101 (192.168.3.101) port 8080 (#0)
> > GET /default/controller/v1/imx6ul-var-dart HTTP/1.1
> Host: 192.168.3.101:8080 <http://192.168.3.101:8080>
> User-Agent: libcurl-agent/1.0
> Content-Type: application/json
> Accept: application/json
> charsets: utf-8
> Authorization: TargetToken 6be90829bad53947294ae6bc18f3cc81
>
> < HTTP/1.1 200 OK
> < Date: Sat, 16 Jun 2018 08:26:53 GMT
> < X-Application-Context: application:amqp
> < Content-Type: application/json;charset=UTF-8
> < ETag: "0c4e213aa54b57890390f2301ded36f0d"
> < X-Content-Type-Options: nosniff
> < X-XSS-Protection: 1; mode=block
> < Cache-Control: no-cache, no-store, max-age=0, must-revalidate
> < Pragma: no-cache
> < Expires: 0
> < X-Frame-Options: DENY
> < Content-Length: 43
> < 
> * Connection #0 to host 192.168.3.101 left intact
> se/3?c=413446921
> [TRACE] : EVENT [0] :  {"percent": 100, "msg":"Received* Found
> bundle for host 192.168.3.101 <http://192.168.3.101>: 0x8bf978 [can
> pipeline]
> * Re-using existing connection! (#0) with host 192.168.3.101
> * Connected to 192.168.3.101 (192.168.3.101) port 8080 (#0)
> > PUT /default/controller/v1/imx6ul-var-dart/configData HTTP/1.1
> Host: 192.168.3.101:8080 <http://192.168.3.101:8080>
> <http://192.168.3.101:8080/DEFAULT/controller/v1/imx6ul-var-dart/softwaremodules/1/artifacts/my-software_1.0.swu>"},"md5sum-http":{"href":"http://192.168.3.101:8080/DEFAULT/controller/v1/imx6ul-va
> <http://192.168.3.101:8080/DEFAULT/controller/v1/imx6ul-va>
> r-dart/softwaremodules/1/artifacts/my-software_1.0.swu.MD5SUM"}}}]}]}}
>
> [TRACE] : SWUPDATE running :  [server_get_deployment_info] :
> Associated Action ID for Update Action is 3
>
> [TRACE] : SWUPDATE running :  [server_create_details] : Detail 0
> Update Installed.
> [TRACE] : SWUPDATE running :  [server_create_details] : Final
> details: "Update Installed."
>
> [TRACE] : SWUPDATE running :  [server_send_deployment_reply] :
> Reporting Installation progress for ID 3: success / closed / "Update
> Installed." 
>
> [TRACE] : SWUPDATE running :  [server_send_deployment_reply] :
> PUTing to
> 192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/deploymentBase/3/feedback
> <http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/deploymentBase/3/feedback>:
> <http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart>
> <http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/configData>
> JSON={ "id": "", "time": "20180616T162653", "status": { "
> result": { "finished": "success" }, "execution": "closed", "details"
> : [ "" ] }, "data" : {  "swCompatibility": "unknown","serialNo":
> "1234567890","hwVersion": "333","hwId": "ipse","versi
> onSpC": "1.0" } }
> [DEBUG] : SWUPDATE running :  [channel_set_options] : cURL's low
> download speed timeout is disabled, this is most probably not what
> you want. Adapted it to 300s instead.
>
> [TRACE] : SWUPDATE running :  [channel_log_effective_url] :
> Channel's effective URL resolved to
> http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/configData
> <http://192.168.3.101:8080/default/controller/v1/imx6ul-var-dart/configData>
>
> [TRACE] : SWUPDATE running :  [channel_put_method] : Channel put
> operation returned HTTP error code 200.
>
> [DEBUG] : SWUPDATE running :  [suricatta_wait] : Sleeping for 60
> seconds.
>
> |
>
>
>
>
> The problem is how to let the swupdate give the "update success"
> feedback to hawkbit server instead of manually specifying the '-c 2(
> the previous Step 2)'. 
> So I try the following:
> Running the swupdate at backgroud:
> |
>  swupdate -u ' -t default -u 192.168.3.101:8080
> <http://192.168.3.101:8080> -i imx6ul-var-dart -c 2 '-f
>  /etc/swupdate.cfg &
> |
>
>
> When it has done the update swu file from server, I try to use the
> following commands to let swupdate to send feedback to server:
> |
>  swupdate-sendtohawkbit  4'"result": { "progress": { "cnt" : 0, "of"
> : 0 }}'   success       closed     'Update Installed.'
> |
>
>
>
> But it seems my parameter is not right:
> |
>  swupdate-sendtohawkbit  4 '"result": { "progress": { "cnt" : 0,
> "of" : 0 }}'    success       closed     'Update Installed.'
> [TRACE] : SWUPDATE running :  [network_thread] : Rec[ERROR] :
> SWUPDATE failed [0] ERROR suricatta/server_hawkbit.c :
> server_tokenize_msg : 1749 : Error while parsing channel's returned JS
> ON data: object value separator ',' expected
>
> Sending: '{ "id" : "4", "status" : ""result": { "progress": { "cnt"
> : 0, "of" : 0 }}","finished" : "success","execution" :
> "closed","details" : [ "Update Installed."]}' returned 0
> Server returns NACK
> eived Message for suricatta
> [TRACE] : SWUPDATE running :  [suricatta_wait] : Suricatta woke up
> for IPC at 46 seconds
> [DEBUG] : SWUPDATE running :  [suricatta_wait] : Sleeping for 46
> seconds.
> |
>
>
> Is there an example using of  'sendtohakwbit' ? 
>
> Thanks.
>
> --
> You received this message because you are subscribed to the Google
> Groups "swupdate" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to swupdate+u...@googlegroups.com
> <mailto:swupdate+u...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/swupdate/1f52fa9d-7222-402c-ae80-7f376f323aec%40googlegroups.com
> <https://groups.google.com/d/msgid/swupdate/1f52fa9d-7222-402c-ae80-7f376f323aec%40googlegroups.com?utm_medium=email&utm_source=footer>.

Sravya Kurada

unread,
Feb 25, 2020, 4:06:35 AM2/25/20
to Stefano Babic, swupdate
Hi Stefano ,

Thanks a lot for your response.I was sending the status field wrong earlier . It's now working with 0 (I want to close the update).

Right now , I tried by manually giving the action_id just to understand how sendtohawkbit works. 
But inorder to automate this - as you mentioned , getting the action_id is the challenge.
Is there anyway I can get the action_id programmatically so that I can store it somewhere and use it to close the update? 

Thanks
Sravya K

Stefano Babic

unread,
Feb 28, 2020, 3:50:57 AM2/28/20
to Sravya Kurada, Stefano Babic, swupdate
Hi Sravya,

On 25/02/20 10:06, Sravya Kurada wrote:
> Hi Stefano ,
>
> Thanks a lot for your response.I was sending the status field wrong
> earlier . It's now working with 0 (I want to close the update).
>
> Right now , I tried by manually giving the action_id just to understand
> how sendtohawkbit works. 
> But inorder to automate this - as you mentioned , getting the action_id
> is the challenge.
> Is there anyway I can get the action_id programmatically so that I can
> store it somewhere and use it to close the update? 
>

The current use case is that the action id is forwarded by the progress
interface. The action-id must be persistently stored and retrieved after
system reboots to be sent to the server.

However, it looks to me, too, that it is quite convoluted. I am thinking
about if this can be improved. The action id is available on the server,
and Hawkbit does not change it until the client (SWUpdate) has sent its
feedback. Then, SWUpdate can be changed so the action id is not sent by
"sendtohawkbit", but SWUpdate asks the Hawkbit server first to retrieve
the action id and then send a feedback. In this way, the action id
remains inside SWUpdate and it is not needed to know it outside.

Best regards,
Stefano Babic

> Thanks
> Sravya K
>
> On Wed, Feb 19, 2020 at 2:40 PM Stefano Babic <sba...@denx.de
> <mailto:sba...@denx.de>> wrote:
>
> Hi Sravya,
>
> On 19/02/20 06:35, sravya...@gmail.com
> <mailto:swupdate%2Bunsu...@googlegroups.com>
> > <mailto:swupdate+u...@googlegroups.com
> <mailto:swupdate%2Bunsu...@googlegroups.com>>.
> > To view this discussion on the web visit
> >
> https://groups.google.com/d/msgid/swupdate/1f52fa9d-7222-402c-ae80-7f376f323aec%40googlegroups.com
> >
> <https://groups.google.com/d/msgid/swupdate/1f52fa9d-7222-402c-ae80-7f376f323aec%40googlegroups.com?utm_medium=email&utm_source=footer>.
>
> --
> =====================================================================
> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email:
> sba...@denx.de <mailto:sba...@denx.de>
> =====================================================================
>
> --
> You received this message because you are subscribed to the Google
> Groups "swupdate" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to swupdate+u...@googlegroups.com
> <mailto:swupdate+u...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/swupdate/CA%2B-751yQVhxhdxRsemD8%2Bo5WS1JfGRd3C3cOQwgU5rzKyJ8mSw%40mail.gmail.com
> <https://groups.google.com/d/msgid/swupdate/CA%2B-751yQVhxhdxRsemD8%2Bo5WS1JfGRd3C3cOQwgU5rzKyJ8mSw%40mail.gmail.com?utm_medium=email&utm_source=footer>.

Tim Harvey

unread,
Mar 19, 2021, 11:57:27 AM3/19/21
to swupdate
On Friday, February 28, 2020 at 12:50:57 AM UTC-8 Stefano Babic wrote:
Hi Sravya,

On 25/02/20 10:06, Sravya Kurada wrote:
> Hi Stefano ,
>
> Thanks a lot for your response.I was sending the status field wrong
> earlier . It's now working with 0 (I want to close the update).
>
> Right now , I tried by manually giving the action_id just to understand
> how sendtohawkbit works. 
> But inorder to automate this - as you mentioned , getting the action_id
> is the challenge.
> Is there anyway I can get the action_id programmatically so that I can
> store it somewhere and use it to close the update? 
>

The current use case is that the action id is forwarded by the progress
interface. The action-id must be persistently stored and retrieved after
system reboots to be sent to the server.

However, it looks to me, too, that it is quite convoluted. I am thinking
about if this can be improved. The action id is available on the server,
and Hawkbit does not change it until the client (SWUpdate) has sent its
feedback. Then, SWUpdate can be changed so the action id is not sent by
"sendtohawkbit", but SWUpdate asks the Hawkbit server first to retrieve
the action id and then send a feedback. In this way, the action id
remains inside SWUpdate and it is not needed to know it outside.


Stefano,

I have run into this same issue as well. I'm not clear how anyone has been able to get the action id from hawkbit to work around this.

You mention the action id is forwarded by the progress interface... can you explain that in more detail? I'm not currently using the progress interface as I don't really need it.

How would you go about getting the action id from Hawkbit? It seems like this would be a handy thing for SWUpdate to store in the U-Boot env such as it does with the 'ustate' var. Have you made any changes towards making this easier or have any suggestions?

Best regards,

Tim

Stefano Babic

unread,
Mar 19, 2021, 1:28:05 PM3/19/21
to Tim Harvey, swupdate
Hi Tim,
SWUpdate sends via IPC (progress) some JSON formatted messages. When an
updated is started, a message with the update source (Webserver /
suricatta / ..) is sent. Listeners of the progress interface have access
to this information.

Note that this is required for a few cases: after an update from
Hawkbit, system restarts and evaluates if the new SW is running. The
result (ok / nok) is then passed to SWUpdate at the startup via the "-c
" parameter. So there are few cases where a sendtohawkbit is required,
for example if an end user / operator must acknowledge an update.

> I'm not currently using the progress
> interface as I don't really need it.

So you cannot get it, but it works if you pass the right parameter to
SWUpdate.

>
> How would you go about getting the action id from Hawkbit? It seems like
> this would be a handy thing for SWUpdate to store in the U-Boot env such
> as it does with the 'ustate' var. Have you made any changes towards
> making this easier or have any suggestions?

I have thought to drop the actionId and let SWUpdate to retrieve it
again. SWUpdate can ask again the server, and it receives the action id.
Anyway, this requires changes in SWUpdate.

Best regards,
Stefano

Tim Harvey

unread,
Mar 19, 2021, 2:57:45 PM3/19/21
to Stefano Babic, swupdate
Stefano,

Perhaps I'm not using swupdate with hawkbit properly as it looks like on startup following and update it should report the update status to hawkbit: https://sbabic.github.io/swupdate/suricatta.html

And it sounds like what your saying is that I should not need to even do an 'swupdate -c 2' to report success let alone use 'sendtohawkbit' which would be used for something perhaps non-standard.

Thanks,

Tim

Stefano Babic

unread,
Mar 20, 2021, 5:01:53 AM3/20/21
to Tim Harvey, Stefano Babic, swupdate
Hi Tim,
This is the usual case - at startup, the software (startup scripts,
application, ...) checks if everything is running ok and pass the result
to SWUpdate. A simple but frequent example is here:

https://github.com/sbabic/meta-swupdate-boards/blob/terminal-server/recipes-support/swupdate/swupdate/raspberrypi3/09-swupdate-args

Of course, you can create a more complicate state machine based on
ustate (for SWUpdate) and other U-Boot variables that you have set in
your project.

> let alone use 'sendtohawkbit' which
> would be used for something perhaps non-standard.

sendtohawkbit is thought as example to show how to send messages in
cases more complex. In sveral projects of mine, the decision what to
send is integrated in the customer's application. For example,
application decides if a database migration was ok, if it can runs, etc.
and then sends the message to SWUpdate.

Anyway, I agree that the handle of actio-id is clumsy, and it could be
completely hidden and managed inside SWUpdate.

Best regards,
Stefano

Tim Harvey

unread,
Mar 22, 2021, 2:37:49 PM3/22/21
to Stefano Babic, swupdate
Ok, thanks - I should have paid more attention to the yocto example. I
see now how the examples there use ustate env to argment the args to
swupdate to add a '-c 2' when the ustate var shows a successful
update.

> > let alone use 'sendtohawkbit' which
> > would be used for something perhaps non-standard.
>
> sendtohawkbit is thought as example to show how to send messages in
> cases more complex. In sveral projects of mine, the decision what to
> send is integrated in the customer's application. For example,
> application decides if a database migration was ok, if it can runs, etc.
> and then sends the message to SWUpdate.
>
> Anyway, I agree that the handle of actio-id is clumsy, and it could be
> completely hidden and managed inside SWUpdate.

Agreed but as you say it's more of a complex need and I won't need to
use it to resolve my issue.

Perhaps the Suricatta documentation
(https://sbabic.github.io/swupdate/suricatta.html) could use an
example showing running with '-c 2' on a successful update. I
purposely didn't look at the Yocto example because I wasn't using
Yocto and anyone not all that familiar with OpenEmbedded would surely
get lost trying to understand all the overlay files.

Best Regards,

Tim

Stefano Babic

unread,
Mar 23, 2021, 2:27:27 AM3/23/21
to Tim Harvey, Stefano Babic, swupdate
Hi Tim,
Sure - the standard use case is to start SWUpdate with "-c" parameter.

>
> Perhaps the Suricatta documentation
> (https://sbabic.github.io/swupdate/suricatta.html) could use an
> example showing running with '-c 2' on a successful update.

Agree - this should be improved, adding also the general concept with
the reboots of the device and the Hawkbit's state machine, that SWUpdate
implements.

> I
> purposely didn't look at the Yocto example because I wasn't using
> Yocto and anyone not all that familiar with OpenEmbedded would surely
> get lost trying to understand all the overlay files.
>

Best regards,
Stefano

> Best Regards,
>
> Tim

Artem Makhutov

unread,
Jul 5, 2021, 11:53:47 AM7/5/21
to swupdate
Hello,

I am also trying to figure out how to confirm an successfull install of the update to hawkbit without restarting swupdate and passing the "-c 2" parameter to it.
I am just executing a simple postinstall script without anything. There is no need to reboot the device...

Thanks, Artem

Vishal S

unread,
Sep 29, 2023, 4:38:36 AM9/29/23
to swupdate
Hi,

I am currently using v2023.5 version of swupdate.
The tool: swupdate-sendtohawkbit <action id> <status> <finished> <execution> <detail 1> <detail 2> is not available for v2023.5
Any suggestions for this ?

Vishal S

unread,
Sep 29, 2023, 4:38:47 AM9/29/23
to swupdate
Hi,

I am currently using v2023.5 version of swupdate.
The tool: swupdate-sendtohawkbit <action id> <status> <finished> <execution> <detail 1> <detail 2> is not available for v2023.5
Any suggestions for this ?


On Monday, 5 July 2021 at 21:23:47 UTC+5:30 Artem Makhutov wrote:

Stefano Babic

unread,
Oct 1, 2023, 9:21:34 AM10/1/23
to Vishal S, swupdate


On 29.09.23 10:38, Vishal S wrote:
> Hi,
>
> I am currently using v2023.5 version of swupdate.
> The tool: swupdate-sendtohawkbit <action id> <status> <finished>
> <execution> <detail 1> <detail 2> is not available for v2023.5
> Any suggestions for this ?

It was replaced by swupdate-ipc.

Best regards,
Stefano Babic
> https://github.com/sbabic/meta-swupdate-boards/blob/terminal-server/recipes-support/swupdate/swupdate/raspberrypi3/09-swupdate-args <https://github.com/sbabic/meta-swupdate-boards/blob/terminal-server/recipes-support/swupdate/swupdate/raspberrypi3/09-swupdate-args>
> <https://sbabic.github.io/swupdate/suricatta.html>) could use an
> > example showing running with '-c 2' on a successful update.
>
> Agree - this should be improved, adding also the general concept
> with
> the reboots of the device and the Hawkbit's state machine, that
> SWUpdate
> implements.
>
> > I
> > purposely didn't look at the Yocto example because I wasn't
> using
> > Yocto and anyone not all that familiar with OpenEmbedded
> would surely
> > get lost trying to understand all the overlay files.
> >
>
> Best regards,
> Stefano
>
> > Best Regards,
> >
> > Tim
> >
>
>
> --
> =====================================================================
> DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell,
> Germany
> Phone: +49-8142-66989-53 <tel:+49%208142%206698953> Fax:
> +49-8142-66989-80 <tel:+49%208142%206698980> Email: sba...@denx.de
> =====================================================================
>
> --
> You received this message because you are subscribed to the Google
> Groups "swupdate" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to swupdate+u...@googlegroups.com
> <mailto:swupdate+u...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/swupdate/ccc9cb46-a5e9-43e4-b950-772d6a91ce9cn%40googlegroups.com <https://groups.google.com/d/msgid/swupdate/ccc9cb46-a5e9-43e4-b950-772d6a91ce9cn%40googlegroups.com?utm_medium=email&utm_source=footer>.

Vishal S

unread,
Oct 3, 2023, 1:10:19 AM10/3/23
to swupdate
Hi,

Thanks I looked it up.

With the below command I received NACK from the hawkbit server:

swupdate-ipc sendtohawkbit <action id> <status> <finished> <execution> <detail 1> <detail 2>
Command Output:
# swupdate-ipc sendtohawkbit 12 0 success closed "123 done"
Sending: '{ "id" : "12", "status" : "0","finished" : "success","execution" : "closed","details" : [ "123 done"]}'Sending: '{ "id" : "12", "status" : "0","finished" : "success","execution" : "closed","details" : [ "123 done"]}' returned 0
Server returns NACK
Returned message: { "id" : "12", "status" : "0","finished" : "success","execution" : "closed","details" : [ "123 done"]}

The hawkbit server status still shows pending.
Can you provide some examples ?

Vishal S

unread,
Oct 6, 2023, 12:12:08 AM10/6/23
to swupdate
Hi All,

Any inputs in this regard ?

Stefano Babic

unread,
Oct 6, 2023, 6:54:08 AM10/6/23
to Vishal S, swupdate
On 06.10.23 06:12, Vishal S wrote:
> Hi All,
>
> Any inputs in this regard ?
>

I do not know, you should debug on your side - are you sure that the
action-id is correct ? If not, it is nacked by server.

Regards.
Stefano Babic


> On Tuesday, 3 October 2023 at 10:40:19 UTC+5:30 Vishal S wrote:
>
> Hi,
>
> Thanks I looked it up.
>
> With the below command I received NACK from the hawkbit server:
>
> /swupdate-ipc sendtohawkbit <action id> <status> <finished>
> <execution> <detail 1> <detail 2>
> /Command Output:
> https://github.com/sbabic/meta-swupdate-boards/blob/terminal-server/recipes-support/swupdate/swupdate/raspberrypi3/09-swupdate-args <https://github.com/sbabic/meta-swupdate-boards/blob/terminal-server/recipes-support/swupdate/swupdate/raspberrypi3/09-swupdate-args> <https://github.com/sbabic/meta-swupdate-boards/blob/terminal-server/recipes-support/swupdate/swupdate/raspberrypi3/09-swupdate-args <https://github.com/sbabic/meta-swupdate-boards/blob/terminal-server/recipes-support/swupdate/swupdate/raspberrypi3/09-swupdate-args>>
> https://groups.google.com/d/msgid/swupdate/ccc9cb46-a5e9-43e4-b950-772d6a91ce9cn%40googlegroups.com <https://groups.google.com/d/msgid/swupdate/ccc9cb46-a5e9-43e4-b950-772d6a91ce9cn%40googlegroups.com> <https://groups.google.com/d/msgid/swupdate/ccc9cb46-a5e9-43e4-b950-772d6a91ce9cn%40googlegroups.com?utm_medium=email&utm_source=footer <https://groups.google.com/d/msgid/swupdate/ccc9cb46-a5e9-43e4-b950-772d6a91ce9cn%40googlegroups.com?utm_medium=email&utm_source=footer>>.
>
> --
> You received this message because you are subscribed to the Google
> Groups "swupdate" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to swupdate+u...@googlegroups.com
> <mailto:swupdate+u...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/swupdate/257e0c21-3c12-4b7a-8149-491e68242715n%40googlegroups.com <https://groups.google.com/d/msgid/swupdate/257e0c21-3c12-4b7a-8149-491e68242715n%40googlegroups.com?utm_medium=email&utm_source=footer>.

Reply all
Reply to author
Forward
Message has been deleted
0 new messages