.. SPDX-FileCopyrightText: 2013-2021 Stefano Babic <stefano.babic@swupdate.org>
.. SPDX-License-Identifier: GPL-2.0-only

Getting information on running update
=====================================

It is often required to inform the operator about the status of the running
update and not just to return if the update was successful or not.
For example, if the target has a display or a remote interface,
it can be forwarded which is reached percentage of the update
to let estimate how much the update will still run.
SWUpdate has an interface for this ("progress API"). An external
process can register itself with SWUpdate, and it will receive
notifications when something in the update was changed. This is
different from the IPC API, because the last one is mainly used to transfer
the SWU image, and it is only possible to poll the interface to know
if the update is still running.


API Description
---------------

An external process registers itself to SWUpdate with a connect()
request to the domain socket "/tmp/swupdateprog" as per default
configuration of SWUpdate. There is no information to send, and
SWUpdate simply inserts the new connection into the list of processes
to be informed. SWUpdate will send a frame back after any change in
the update process with the following data (see include/progress_ipc.h):

::

        struct progress_msg {
        	unsigned int	magic;		/* Magic Number */
        	unsigned int	status;		/* Update Status (Running, Failure) */
        	unsigned int	dwl_percent;	/* % downloaded data */
        	unsigned long long dwl_bytes;   /* total of bytes to be downloaded */
        	unsigned int	nsteps;		/* No. total of steps */
        	unsigned int	cur_step;	/* Current step index */
        	unsigned int	cur_percent;	/* % in current step */
        	char		cur_image[256];	/* Name of image to be installed */
        	char		hnd_name[64];	/* Name of running handler */
        	sourcetype	source;		/* Interface that triggered the update */
        	unsigned int 	infolen;    	/* Len of data valid in info */
        	char		info[2048];   	/* additional information about install */
        };

The single fields have the following meaning:

        - *magic* is not yet used, it could be added for simply verification of the frame.
        - *status* is one of the values in swupdate_status.h (START, RUN, SUCCESS, FAILURE, DOWNLOAD, DONE).
        - *dwl_percent* is the percentage of downloaded data when status = DOWNLOAD.
        - *dwl_bytes* is the total number of bytes that are to be downloaded.
        - *nsteps* is the total number of installers (handlers) to be run.
        - *cur_step* is the index of the running handler. cur_step is in the range 1..nsteps
        - *cur_percent* is the percentage of work done inside the current handler. This is useful
          when updating a slow interface, such as a slow flash, and signals which is the percentage
          of image already copied into the destination.
        - *cur_image* is the name of the image in sw-description that is currently being installed.
        - *hnd_name* reports the name of the running handler.
        - *source* is the interface that triggered the update.
        - *infolen* length of data in the following info field.
        - *info* additional information about installation.


As an example for a progress client, ``tools/swupdate-progress.c`` prints the status
on the console and drives "psplash" to draw a progress bar on a display.

