From 8b6d1076af444a0b2683a76a4923e55b9a2b9b54 Mon Sep 17 00:00:00 2001 From: Gagan Deep Date: Tue, 20 Feb 2024 22:09:22 +0530 Subject: [PATCH 01/18] [docs] Restructed README --- README.rst | 1213 ----------------- docs/developer/developer-docs.rst | 12 + docs/developer/extending.rst | 329 +++++ docs/developer/installation.rst | 88 ++ docs/overview.rst | 40 + .../automatic-device-firmware-detection.rst | 31 + docs/user/custom-firmware-upgrader.rst | 29 + docs/user/quickstart.rst | 122 ++ docs/user/rest-api.rst | 344 +++++ docs/user/settings.rst | 203 +++ 10 files changed, 1198 insertions(+), 1213 deletions(-) create mode 100644 docs/developer/developer-docs.rst create mode 100644 docs/developer/extending.rst create mode 100644 docs/developer/installation.rst create mode 100644 docs/overview.rst create mode 100644 docs/user/automatic-device-firmware-detection.rst create mode 100644 docs/user/custom-firmware-upgrader.rst create mode 100644 docs/user/quickstart.rst create mode 100644 docs/user/rest-api.rst create mode 100644 docs/user/settings.rst diff --git a/README.rst b/README.rst index 7a4db13..72ecdd2 100644 --- a/README.rst +++ b/README.rst @@ -68,1219 +68,6 @@ see the ------------ -Installation instructions -------------------------- - -Requirements -~~~~~~~~~~~~ - -- Python >= 3.8 -- openwisp-controller (and its dependencies) >= 1.0.0 - -Install Dependencies -~~~~~~~~~~~~~~~~~~~~ - -Install spatialite and sqlite: - -.. code-block:: shell - - sudo apt-get install sqlite3 libsqlite3-dev openssl libssl-dev - sudo apt-get install gdal-bin libproj-dev libgeos-dev libspatialite-dev - -Setup (integrate in an existing Django project) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Follow the `setup instructions of openwisp-controller -`_, then add the settings described below. - -.. code-block:: python - - INSTALLED_APPS = [ - # django apps - # all-auth - 'django.contrib.sites', - 'openwisp_users.accounts', - 'allauth', - 'allauth.account', - 'django_extensions', - 'private_storage', - # openwisp2 modules - 'openwisp_controller.pki', - 'openwisp_controller.config', - 'openwisp_controller.connection', - 'openwisp_controller.geo', - 'openwisp_firmware_upgrader', - 'openwisp_users', - 'openwisp_notifications', - 'openwisp_ipam', - # openwisp2 admin theme (must be loaded here) - 'openwisp_utils.admin_theme', - # admin - 'django.contrib.admin', - 'django.forms', - # other dependencies - 'sortedm2m', - 'reversion', - 'leaflet', - 'flat_json_widget', - # rest framework - 'rest_framework', - 'rest_framework.authtoken', - 'rest_framework_gis', - 'django_filters', - 'drf_yasg', - # channels - 'channels', - ] - - MEDIA_ROOT = os.path.join(BASE_DIR, 'media') - PRIVATE_STORAGE_ROOT = os.path.join(MEDIA_ROOT, 'firmware') - -The root URLconf (``urls.py``) should look like the following example: - -.. code-block:: python - - from django.conf import settings - from django.contrib import admin - from django.conf.urls import include, url - from django.contrib.staticfiles.urls import staticfiles_urlpatterns - - urlpatterns = [ - path('admin/', admin.site.urls), - path('', include('openwisp_controller.urls')), - path('', redirect_view, name='index'), - path('', include('openwisp_firmware_upgrader.urls')), - path('api/v1/', include((get_api_urls(), 'users'), namespace='users')), - path('api/v1/', include('openwisp_utils.api.urls')), - ] - - urlpatterns += staticfiles_urlpatterns() - -Installing for development -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Install your forked repo: - -.. code-block:: shell - - git clone git://github.com//openwisp-firmware-upgrader - cd openwisp-firmware-upgrader/ - python setup.py develop - -Install test requirements: - -.. code-block:: shell - - pip install -r requirements-test.txt - -Create database: - -.. code-block:: shell - - cd tests/ - ./manage.py migrate - ./manage.py createsuperuser - -Launch development server: - -.. code-block:: shell - - ./manage.py runserver 0.0.0.0:8000 - -You can access the admin interface at http://127.0.0.1:8000/admin/. - -Run celery and celery-beat with the following commands -(separate terminal windows are needed): - -.. code-block:: shell - - # (cd tests) - celery -A openwisp2 worker -l info - celery -A openwisp2 beat -l info - -Run tests with: - -.. code-block:: shell - - # run qa checks - ./run-qa-checks - - # standard tests - ./runtests.py - - # tests for the sample app - SAMPLE_APP=1 ./runtests.py --keepdb --failfast - -When running the last line of the previous example, the environment variable -``SAMPLE_APP`` activates the app in ``/tests/openwisp2/sample_firmware_upgrader/`` -which is a simple django app that extends ``openwisp-firmware-upgrader`` with -the sole purpose of testing its extensibility, for more information regarding -this concept, read the following section. - -Quickstart Guide ----------------- - -Requirements: - -- Devices running at least OpenWRT 12.09 Attitude Adjustment, older versions - of OpenWRT have not worked at all in our tests -- Devices must have enough free RAM to be able to upload the - new image to ``/tmp`` - -1. Create a category -~~~~~~~~~~~~~~~~~~~~ - -Create a category for your firmware images -by going to *Firmware management > Firmware categories > Add firmware category*, -if you use only one firmware type in your network, you could simply -name the category "default" or "standard". - -.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-category.gif - -If you use multiple firmware images with different features, create one category -for each firmware type, eg: - -- WiFi -- SDN router -- LoRa Gateway - -This is necessary in order to perform mass upgrades only on specific -firmware categories when, for example, a new *LoRa Gateway* firmware becomes available. - -2. Create the build object -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Create a build a build object by going to -*Firmware management > Firmware builds > Add firmware build*, -the build object is related to a firmware category and is the collection of the -different firmware images which have been compiled for the different hardware models -supported by the system. - -The version field indicates the firmware version, the change log field is optional but -we recommend filling it to help operators know the differences between each version. - -.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-build.gif - -An important but optional field of the build model is **OS identifier**, this field -should match the value of the **Operating System** field which gets automatically filled -during device registration, eg: ``OpenWrt 19.07-SNAPSHOT r11061-6ffd4d8a4d``. -It is used by the firmware-upgrader module to automatically -create ``DeviceFirmware`` objects for existing devices or when new devices register. -A ``DeviceFirmware`` object represent the relationship between a device and a firmware image, -it basically tells us which firmware image is installed on the device. - -To find out the exact value to use, you should either do a -test flash on a device and register it to the system or you should inspect the firmware image -by decompressing it and find the generated value in the firmware image. - -If you're not sure about what **OS identifier** to use, just leave it empty, you can fill -it later on when you find out. - -Now save the build object to create it. - -3. Upload images to the build -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Now is time to add images to the build, we suggest adding one image at time. -Alternatively the `REST API <#rest-api>`__ can be used to automate this step. - -.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-firmwareimage.gif - -If you use a hardware model which is not listed in the image types, if the -hardware model is officially supported by OpenWRT, you can send us a pull-request to add it, -otherwise you can use `the setting OPENWISP_CUSTOM_OPENWRT_IMAGES <#openwisp_custom_openwrt_images>`__ -to add it. - -4. Perform a firmware upgrade to a specific device -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-devicefirmware.gif - -Once a new build is ready, has been created in the system and its image have been uploaded, -it will be the time to finally upgrade our devices. - -To perform the upgrade of a single device, navigate to the device details, -then go to the "Firmware" tab. - -If you correctly filled **OS identifier** in step 2, you should have a situation -similar to the one above: in this example, the device is using version ``1.0`` -and we want to upgrade it to version ``2.0``, once the new firmware image -is selected we just have to hit save, then a new tab will appear in the device page -which allows us to see what's going on during the upgrade. - -Right now, the update of the upgrade information is not asynchronous yet, so you will -have to reload the page periodically to find new information. This will be addressed -in a future release. - -5. Performing mass upgrades -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -First of all, please ensure the following preconditions are met: - -- the system is configured correctly -- the new firmware images are working as expected -- you already tried the upgrade of single devices several times. - -At this stage you can try a mass upgrade by doing the following: - -- go to the build list page -- select the build which contains the latest firmware images you - want the devices to be upgraded with -- click on "Mass-upgrade devices related to the selected build". - -.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-batch-upgrade.gif - -At this point you should see a summary page which will inform you of which devices -are going to be upgraded, you can either confirm the operation or cancel. - -Once the operation is confirmed you will be redirected to a page in which you -can monitor the progress of the upgrade operations. - -Right now, the update of the upgrade information is not asynchronous yet, so you will -have to reload the page periodically to find new information. This will be addressed -in a future release. - -Automatic device firmware detection ------------------------------------ - -*OpenWISP Firmware Upgrader* maintains a data structure for mapping -the firmware image files to board names called ``OPENWRT_FIRMWARE_IMAGE_MAP``. - -Here is an example firmware image item from ``OPENWRT_FIRMWARE_IMAGE_MAP`` - -.. code-block:: python - - { - # Firmware image file name. - 'ar71xx-generic-cf-e320n-v2-squashfs-sysupgrade.bin': { - # Human readable name of the model which is displayed on - # the UI - 'label': 'COMFAST CF-E320N v2 (OpenWRT 19.07 and earlier)', - # Tupe of board names with which the different versions - # of the hardware are identified on OpenWrt - 'boards': ('COMFAST CF-E320N v2',), - } - } - -When a device registers on OpenWISP, the `openwisp-config agent -`_ -read the device board name from `/tmp/sysinfo/model` and sends it to OpenWISP. -This value is then saved in the ``Device.model`` field. -*OpenWISP Firmware Upgrader* uses this field to automatically detect -the correct firmware image for the device. - -Use the `OPENWISP_CUSTOM_OPENWRT_IMAGES <#openwisp_custom_openwrt_images>`_ -setting to add additional firmware image in your project. - -Writing Custom Firmware Upgrader Classes ----------------------------------------- - -You can write custom upgraders for other firmware OSes or for -custom OpenWrt based firmwares. - -Here is an example custom OpenWrt firmware upgrader class: - -.. code-block:: python - - from openwisp_firmware_upgrader.upgraders.openwrt import OpenWrt - - class CustomOpenWrtBasedFirmware(OpenWrt): - # this firmware uses a custom upgrade command - UPGRADE_COMMAND = 'upgrade_firmware.sh --keep-config' - # it takes somewhat more time to boot so it needs more time - RECONNECT_DELAY = 150 - RECONNECT_RETRY_DELAY = 5 - RECONNECT_MAX_RETRIES = 20 - - def get_remote_path(self, image): - return '/tmp/firmware.img' - - def get_upgrade_command(self, path): - return self.UPGRADE_COMMAND - -You will need to place your custom upgrader class on the python path -of your application and then add this path to the `OPENWISP_FIRMWARE_UPGRADERS_MAP -<#openwisp_firmware_upgraders_map>`_ setting. - -REST API --------- - -To enable the API the setting -`OPENWISP_FIRMWARE_UPGRADER_API <#openwisp-firmware-upgrader-api>`_ -must be set to ``True``. - -Live documentation -~~~~~~~~~~~~~~~~~~ - -.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/api-docs.png - -A general live API documentation (following the OpenAPI specification) at ``/api/v1/docs/``. - -Browsable web interface -~~~~~~~~~~~~~~~~~~~~~~~ - -.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/api-ui.png - -Additionally, opening any of the endpoints `listed below <#list-of-endpoints>`_ -directly in the browser will show the `browsable API interface of Django-REST-Framework -`_, -which makes it even easier to find out the details of each endpoint. - -Authentication -~~~~~~~~~~~~~~ - -See openwisp-users: `authenticating with the user token -`_. - -When browsing the API via the `Live documentation <#live-documentation>`_ -or the `Browsable web page <#browsable-web-interface>`_, you can also use -the session authentication by logging in the django admin. - -Pagination -~~~~~~~~~~ - -All *list* endpoints support the ``page_size`` parameter that allows paginating -the results in conjunction with the ``page`` parameter. - -.. code-block:: text - - GET /api/v1/firmware-upgrader/build/?page_size=10 - GET /api/v1/firmware-upgrader/build/?page_size=10&page=2 - -Filtering by organization slug -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Most endpoints allow to filter by organization slug, eg: - -.. code-block:: text - - GET /api/v1/firmware-upgrader/build/?organization=org-slug - -List of endpoints -~~~~~~~~~~~~~~~~~ - -Since the detailed explanation is contained in the `Live documentation <#live-documentation>`_ -and in the `Browsable web page <#browsable-web-interface>`_ of each point, -here we'll provide just a list of the available endpoints, -for further information please open the URL of the endpoint in your browser. - -List mass upgrade operations -############################ - -.. code-block:: text - - GET /api/v1/firmware-upgrader/batch-upgrade-operation/ - -**Available filters** - -The list of batch upgrade operations provides the following filters: - -- ``build`` (Firmware build ID) -- ``status`` (One of: idle, in-progress, success, failed) - -Here's a few examples: - -.. code-block:: text - - GET /api/v1/firmware-upgrader/batch-upgrade-operation/?build={build_id} - GET /api/v1/firmware-upgrader/batch-upgrade-operation/?status={status} - -Get mass upgrade operation detail -################################# - -.. code-block:: text - - GET /api/v1/firmware-upgrader/batch-upgrade-operation/{id}/ - -List firmware builds -#################### - -.. code-block:: text - - GET /api/v1/firmware-upgrader/build/ - -**Available filters** - -The list of firmware builds provides the following filters: - -- ``category`` (Firmware category ID) -- ``version`` (Firmware build version) -- ``os`` (Firmware build os identifier) - -Here's a few examples: - -.. code-block:: text - - GET /api/v1/firmware-upgrader/build/?category={category_id} - GET /api/v1/firmware-upgrader/build/?version={version} - GET /api/v1/firmware-upgrader/build/?os={os} - -Create firmware build -##################### - -.. code-block:: text - - POST /api/v1/firmware-upgrader/build/ - -Get firmware build details -########################## - -.. code-block:: text - - GET /api/v1/firmware-upgrader/build/{id}/ - -Change details of firmware build -################################ - -.. code-block:: text - - PUT /api/v1/firmware-upgrader/build/{id}/ - -Patch details of firmware build -############################### - -.. code-block:: text - - PATCH /api/v1/firmware-upgrader/build/{id}/ - -Delete firmware build -##################### - -.. code-block:: text - - DELETE /api/v1/firmware-upgrader/build/{id}/ - -Get list of images of a firmware build -###################################### - -.. code-block:: text - - GET /api/v1/firmware-upgrader/build/{id}/image/ - -**Available filters** - -The list of images of a firmware build can be filtered by using -``type`` (any one of the available firmware image types). - -.. code-block:: text - - GET /api/v1/firmware-upgrader/build/{id}/image/?type={type} - -Upload new firmware image to the build -###################################### - -.. code-block:: text - - POST /api/v1/firmware-upgrader/build/{id}/image/ - -Get firmware image details -########################## - -.. code-block:: text - - GET /api/v1/firmware-upgrader/build/{build_id}/image/{id}/ - -Delete firmware image -##################### - -.. code-block:: text - - DELETE /api/v1/firmware-upgrader/build/{build_id}/image/{id}/ - -Download firmware image -####################### - -.. code-block:: text - - GET /api/v1/firmware-upgrader/build/{build_id}/image/{id}/download/ - -Perform batch upgrade -##################### - -Upgrades all the devices related to the specified build ID. - -.. code-block:: text - - POST /api/v1/firmware-upgrader/build/{id}/upgrade/ - -Dry-run batch upgrade -##################### - -Returns a list representing the ``DeviceFirmware`` and ``Device`` -instances that would be upgraded if POST is used. - -``Device`` objects are indicated only when no ``DeviceFirmware`` -object exists for a device which would be upgraded. - -.. code-block:: text - - GET /api/v1/firmware-upgrader/build/{id}/upgrade/ - -List firmware categories -######################## - -.. code-block:: text - - GET /api/v1/firmware-upgrader/category/ - -Create new firmware category -############################ - -.. code-block:: text - - POST /api/v1/firmware-upgrader/category/ - -Get firmware category details -############################# - -.. code-block:: text - - GET /api/v1/firmware-upgrader/category/{id}/ - -Change the details of a firmware category -######################################### - -.. code-block:: text - - PUT /api/v1/firmware-upgrader/category/{id}/ - -Patch the details of a firmware category -######################################## - -.. code-block:: text - - PATCH /api/v1/firmware-upgrader/category/{id}/ - -Delete a firmware category -########################## - -.. code-block:: text - - DELETE /api/v1/firmware-upgrader/category/{id}/ - -List upgrade operations -####################### - -.. code-block:: text - - GET /api/v1/firmware-upgrader/upgrade-operation/ - -**Available filters** - -The list of upgrade operations provides the following filters: - -- ``device__organization`` (Organization ID of the device) -- ``device__organization_slug`` (Organization slug of the device) -- ``device`` (Device ID) -- ``image`` (Firmware image ID) -- ``status`` (One of: in-progress, success, failed, aborted) - - -Here's a few examples: - -.. code-block:: text - - GET /api/v1/firmware-upgrader/upgrade-operation/?device__organization={organization_id} - GET /api/v1/firmware-upgrader/upgrade-operation/?device__organization__slug={organization_slug} - GET /api/v1/firmware-upgrader/upgrade-operation/?device={device_id} - GET /api/v1/firmware-upgrader/upgrade-operation/?image={image_id} - GET /api/v1/firmware-upgrader/upgrade-operation/?status={status} - -Get upgrade operation details -############################# - -.. code-block:: text - - GET /api/v1/firmware-upgrader/upgrade-operation/{id} - -List device upgrade operations -############################## - -.. code-block:: text - - GET /api/v1/firmware-upgrader/device/{device_id}/upgrade-operation/ - -**Available filters** - -The list of device upgrade operations can be filtered by -``status`` (one of: in-progress, success, failed, aborted). - -.. code-block:: text - - GET /api/v1/firmware-upgrader/device/{device_id}/upgrade-operation/?status={status} - -Create device firmware -###################### - -Sending a PUT request to the endpoint below will -create a new device firmware if it does not already exist. - -.. code-block:: text - - PUT /api/v1/firmware-upgrader/device/{device_id}/firmware/ - -Get device firmware details -########################### - -.. code-block:: text - - GET /api/v1/firmware-upgrader/device/{device_id}/firmware/ - -Change details of device firmware -################################# - -.. code-block:: text - - PUT /api/v1/firmware-upgrader/device/{device_id}/firmware/ - -Patch details of device firmware -################################# - -.. code-block:: text - - PATCH /api/v1/firmware-upgrader/device/{device_id}/firmware/ - -Delete device firmware -###################### - -.. code-block:: text - - DELETE /api/v1/firmware-upgrader/device/{device_pk}/firmware/ - -Settings --------- - -``OPENWISP_FIRMWARE_UPGRADER_RETRY_OPTIONS`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+--------------+--------------+ -| **type**: | ``dict`` | -+--------------+--------------+ -| **default**: | see below | -+--------------+--------------+ - -.. code-block:: python - - # default value of OPENWISP_FIRMWARE_UPGRADER_RETRY_OPTIONS: - - dict( - max_retries=4, - retry_backoff=60, - retry_backoff_max=600, - retry_jitter=True, - ) - -Retry settings for recoverable failures during firmware upgrades. - -By default if an upgrade operation fails before the firmware is flashed -(eg: because of a network issue during the upload of the image), -the upgrade operation will be retried 4 more times with an exponential -random backoff and a maximum delay of 10 minutes. - -For more information regarding these settings, consult the `celery documentation -regarding automatic retries for known errors -`_. - -``OPENWISP_FIRMWARE_UPGRADER_TASK_TIMEOUT`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+--------------+--------------+ -| **type**: | ``int`` | -+--------------+--------------+ -| **default**: | ``600`` | -+--------------+--------------+ - -Timeout for the background tasks which perform firmware upgrades. - -If for some unexpected reason an upgrade remains stuck for more than 10 minutes, -the upgrade operation will be flagged as failed and the task will be killed. - -This should not happen, but a global task time out is a best practice when -using background tasks because it prevents the situation in which an unexpected -bug causes a specific task to hang, which will quickly fill all the available -slots in a background queue and prevent other tasks from being executed, which -will end up affecting negatively the rest of the application. - -``OPENWISP_CUSTOM_OPENWRT_IMAGES`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+--------------+-------------+ -| **type**: | ``tuple`` | -+--------------+-------------+ -| **default**: | ``None`` | -+--------------+-------------+ - -This setting can be used to extend the list of firmware image types -included in *OpenWISP Firmware Upgrader*. This setting is suited to -add support for custom OpenWrt images. - -.. code-block:: python - - OPENWISP_CUSTOM_OPENWRT_IMAGES = ( - ( - # Firmware image file name. - 'customimage-squashfs-sysupgrade.bin', { - # Human readable name of the model which is displayed on - # the UI - 'label': 'Custom WAP-1200', - # Tuple of board names with which the different versions of - # the hardware are identified on OpenWrt - 'boards': ('CWAP1200',) - } - ), - ) - -Kindly read `"Automatic detection of firmware of device" -<#automatic-device-firmware-detection>`_ -section of this documentation to know how *OpenWISP Firmware Upgrader* -uses this setting in upgrades. - -``OPENWISP_FIRMWARE_UPGRADER_MAX_FILE_SIZE`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+--------------+------------------------------+ -| **type**: | ``int`` | -+--------------+------------------------------+ -| **default**: | ``30 * 1024 * 1024`` (30 MB) | -+--------------+------------------------------+ - -This setting can be used to set the maximum size limit for firmware images, eg: - -.. code-block:: python - - OPENWISP_FIRMWARE_UPGRADER_MAX_FILE_SIZE = 40 * 1024 * 1024 # 40MB - -**Notes**: - -- Value must be specified in bytes. ``None`` means unlimited. - -``OPENWISP_FIRMWARE_UPGRADER_API`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+--------------+-----------+ -| **type**: | ``bool`` | -+--------------+-----------+ -| **default**: | ``True`` | -+--------------+-----------+ - -Indicates whether the API for Firmware Upgrader is enabled or not. - -``OPENWISP_FIRMWARE_UPGRADER_OPENWRT_SETTINGS`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+--------------+-----------+ -| **type**: | ``dict`` | -+--------------+-----------+ -| **default**: | ``{}`` | -+--------------+-----------+ - -Allows changing the default OpenWRT upgrader settings, eg: - -.. code-block:: python - - OPENWISP_FIRMWARE_UPGRADER_OPENWRT_SETTINGS = { - 'reconnect_delay': 120, - 'reconnect_retry_delay': 20, - 'reconnect_max_retries': 15, - 'upgrade_timeout': 90, - } - -- ``reconnect_delay``: amount of seconds to wait before trying to connect - again to the device after the upgrade command has been launched; - the re-connection step is necessary to verify the upgrade has completed successfully; - defaults to ``120`` seconds -- ``reconnect_retry_delay``: amount of seconds to wait after a - re-connection attempt has failed; - defaults to ``20`` seconds -- ``reconnect_max_retries``: maximum re-connection attempts - defaults to ``15`` attempts -- ``upgrade_timeout``: amount of seconds before the shell session - is closed after the upgrade command is launched on the device, - useful in case the upgrade command hangs (it happens on older OpenWRT versions); - defaults to ``90`` seconds - -``OPENWISP_FIRMWARE_API_BASEURL`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+--------------+-----------------------------------+ -| **type**: | ``dict`` | -+--------------+-----------------------------------+ -| **default**: | ``/`` (points to same server) | -+--------------+-----------------------------------+ - -If you have a seperate instance of openwisp-firmware-upgrader API on a -different domain, you can use this option to change the base of the image -download url, this will enable you to point to your API server's domain, -example value: ``https://myfirmware.myapp.com``. - -``OPENWISP_FIRMWARE_UPGRADERS_MAP`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+--------------+-------------------------------------------------------------------------------------------------------------------------------+ -| **type**: | ``dict`` | -+--------------+-------------------------------------------------------------------------------------------------------------------------------+ -| **default**: | .. code-block:: python | -| | | -| | { | -| | 'openwisp_controller.connection.connectors.openwrt.ssh.OpenWrt': 'openwisp_firmware_upgrader.upgraders.openwrt.OpenWrt', | -| | } | -+--------------+-------------------------------------------------------------------------------------------------------------------------------+ - -A dictionary that maps update strategies to upgraders. - -If you want to use a custom update strategy you will need to use this setting -to provide an entry with the class path of your update strategy as the key. - -If you need to use a `custom upgrader class <#writing-custom-firmware-upgrader-classes>`_ -you will need to use this setting to provide an entry with the class path of your upgrader -as the value. - -``OPENWISP_FIRMWARE_PRIVATE_STORAGE_INSTANCE`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+--------------+-------------------------------------------------------------------------------------+ -| **type**: | ``str`` | -+--------------+-------------------------------------------------------------------------------------+ -| **default**: | ``openwisp_firmware_upgrader.private_storage.storage.file_system_private_storage`` | -+--------------+-------------------------------------------------------------------------------------+ - -Dotted path to an instance of any one of the storage classes in -`private_storage `_. -This instance is used to store firmware image files. - -By default, an instance of ``private_storage.storage.files.PrivateFileSystemStorage`` -is used. - -Extending openwisp-firmware-upgrader ------------------------------------- - -One of the core values of the OpenWISP project is `Software Reusability `_, -for this reason *OpenWISP Firmware Upgrader* provides a set of base classes -which can be imported, extended and reused to create derivative apps. - -In order to implement your custom version of *OpenWISP Firmware Upgrader*, -you need to perform the steps described in this section. - -When in doubt, the code in the `test project `_ -and the `sample app `_ -will serve you as source of truth: -just replicate and adapt that code to get a basic derivative of -*OpenWISP Firmware Upgrader* working. - -**Premise**: if you plan on using a customized version of this module, -we suggest to start with it since the beginning, because migrating your data -from the default module to your extended version may be time consuming. - -1. Initialize your custom module -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The first thing you need to do is to create a new django app which will -contain your custom version of *OpenWISP Firmware Upgrader*. - -A django app is nothing more than a -`python package `_ -(a directory of python scripts), in the following examples we'll call this django app -``myupgrader``, but you can name it how you want:: - - django-admin startapp myupgrader - -Keep in mind that the command mentioned above must be called from a directory -which is available in your `PYTHON_PATH `_ -so that you can then import the result into your project. - -Now you need to add ``myupgrader`` to ``INSTALLED_APPS`` in your ``settings.py``, -ensuring also that ``openwisp_firmware_upgrader`` has been removed: - -.. code-block:: python - - INSTALLED_APPS = [ - # ... other apps ... - - # 'openwisp_firmware_upgrader' <-- comment out or delete this line - 'myupgrader' - ] - -For more information about how to work with django projects and django apps, -please refer to the `django documentation `_. - -2. Install ``openwisp-firmware-upgrader`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Install (and add to the requirement of your project) ``openwisp-firmware-upgrader``:: - - pip install openwisp-firmware-upgrader - -3. Add ``EXTENDED_APPS`` -~~~~~~~~~~~~~~~~~~~~~~~~ - -Add the following to your ``settings.py``: - -.. code-block:: python - - EXTENDED_APPS = ['openwisp_firmware_upgrader'] - -4. Add ``openwisp_utils.staticfiles.DependencyFinder`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Add ``openwisp_utils.staticfiles.DependencyFinder`` to -``STATICFILES_FINDERS`` in your ``settings.py``: - -.. code-block:: python - - STATICFILES_FINDERS = [ - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', - 'openwisp_utils.staticfiles.DependencyFinder', - ] - -5. Add ``openwisp_utils.loaders.DependencyLoader`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Add ``openwisp_utils.loaders.DependencyLoader`` to ``TEMPLATES`` in your ``settings.py``: - -.. code-block:: python - - TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'OPTIONS': { - 'loaders': [ - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', - 'openwisp_utils.loaders.DependencyLoader', - ], - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - } - ] - -6. Inherit the AppConfig class -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Please refer to the following files in the sample app of the test project: - -- `sample_firmware_upgrader/__init__.py `_. -- `sample_firmware_upgrader/apps.py `_. - -You have to replicate and adapt that code in your project. - -For more information regarding the concept of ``AppConfig`` please refer to -the `"Applications" section in the django documentation `_. - -7. Create your custom models -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -For the purpose of showing an example, we added a simple "details" field to the -`models of the sample app in the test project `_. - -You can add fields in a similar way in your ``models.py`` file. - -**Note**: for doubts regarding how to use, extend or develop models please refer to -the `"Models" section in the django documentation `_. - -8. Add swapper configurations -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Once you have created the models, add the following to your ``settings.py``: - -.. code-block:: python - - # Setting models for swapper module - FIRMWARE_UPGRADER_CATEGORY_MODEL = 'myupgrader.Category' - FIRMWARE_UPGRADER_BUILD_MODEL = 'myupgrader.Build' - FIRMWARE_UPGRADER_FIRMWAREIMAGE_MODEL = 'myupgrader.FirmwareImage' - FIRMWARE_UPGRADER_DEVICEFIRMWARE_MODEL = 'myupgrader.DeviceFirmware' - FIRMWARE_UPGRADER_BATCHUPGRADEOPERATION_MODEL = 'myupgrader.BatchUpgradeOperation' - FIRMWARE_UPGRADER_UPGRADEOPERATION_MODEL = 'myupgrader.UpgradeOperation' - -Substitute ``myupgrader`` with the name you chose in step 1. - -9. Create database migrations -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Create and apply database migrations:: - - ./manage.py makemigrations - ./manage.py migrate - -For more information, refer to the -`"Migrations" section in the django documentation `_. - -10. Create the admin -~~~~~~~~~~~~~~~~~~~~ - -Refer to the `admin.py file of the sample app `_. - -To introduce changes to the admin, you can do it in two main ways which are described below. - -**Note**: for more information regarding how the django admin works, or how it can be customized, -please refer to `"The django admin site" section in the django documentation `_. - -1. Monkey patching -################## - -If the changes you need to add are relatively small, you can resort to monkey patching. - -For example: - -.. code-block:: python - - from openwisp_firmware_upgrader.admin import ( # noqa - BatchUpgradeOperationAdmin, - BuildAdmin, - CategoryAdmin, - ) - - BuildAdmin.list_display.insert(1, 'my_custom_field') - BuildAdmin.ordering = ['-my_custom_field'] - -2. Inheriting admin classes -########################### - -If you need to introduce significant changes and/or you don't want to resort to -monkey patching, you can proceed as follows: - -.. code-block:: python - - from django.contrib import admin - from openwisp_firmware_upgrader.admin import ( - BatchUpgradeOperationAdmin as BaseBatchUpgradeOperationAdmin, - BuildAdmin as BaseBuildAdmin, - CategoryAdmin as BaseCategoryAdmin, - ) - from openwisp_firmware_upgrader.swapper import load_model - - BatchUpgradeOperation = load_model('BatchUpgradeOperation') - Build = load_model('Build') - Category = load_model('Category') - DeviceFirmware = load_model('DeviceFirmware') - FirmwareImage = load_model('FirmwareImage') - UpgradeOperation = load_model('UpgradeOperation') - - admin.site.unregister(BatchUpgradeOperation) - admin.site.unregister(Build) - admin.site.unregister(Category) - - class BatchUpgradeOperationAdmin(BaseBatchUpgradeOperationAdmin): - # add your changes here - - class BuildAdmin(BaseBuildAdmin): - # add your changes here - - class CategoryAdmin(BaseCategoryAdmin): - # add your changes here - -11. Create root URL configuration -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Please refer to the `urls.py `_ -file in the test project. - -For more information about URL configuration in django, please refer to the -`"URL dispatcher" section in the django documentation `_. - -12. Create celery.py -~~~~~~~~~~~~~~~~~~~~ - -Please refer to the `celery.py `_ -file in the test project. - -For more information about the usage of celery in django, please refer to the -`"First steps with Django" section in the celery documentation `_. - -13. Import the automated tests -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When developing a custom application based on this module, it's a good -idea to import and run the base tests too, so that you can be sure the changes -you're introducing are not breaking some of the existing features of *OpenWISP Firmware Upgrader*. - -In case you need to add breaking changes, you can overwrite the tests defined -in the base classes to test your own behavior. - -See the `tests of the sample app `_ -to find out how to do this. - -You can then run tests with:: - - # the --parallel flag is optional - ./manage.py test --parallel myupgrader - -Substitute ``myupgrader`` with the name you chose in step 1. - -For more information about automated tests in django, please refer to -`"Testing in Django" `_. - -Other base classes that can be inherited and extended -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The following steps are not required and are intended for more advanced customization. - -``FirmwareImageDownloadView`` -############################# - -This view controls how the firmware images are stored and who has permission to download them. - -The full python path is: ``openwisp_firmware_upgrader.private_storage.FirmwareImageDownloadView``. - -If you want to extend this view, you will have to perform the additional steps below. - -Step 1. import and extend view: - -.. code-block:: python - - # myupgrader/views.py - from openwisp_firmware_upgrader.private_storage import ( - FirmwareImageDownloadView as BaseFirmwareImageDownloadView - ) - - class FirmwareImageDownloadView(BaseFirmwareImageDownloadView): - # add your customizations here ... - pass - -Step 2: remove the following line from your root ``urls.py`` file: - -.. code-block:: python - - path('firmware/', include('openwisp_firmware_upgrader.private_storage.urls')), - -Step 3: add an URL route pointing to your custom view in ``urls.py`` file: - -.. code-block:: python - - # urls.py - from myupgrader.views import FirmwareImageDownloadView - - urlpatterns = [ - # ... other URLs - path('', FirmwareImageDownloadView.as_view(), name='serve_private_file',), - ] - -For more information regarding django views, please refer to the -`"Class based views" section in the django documentation `_. - -API views -~~~~~~~~~ - -If you need to customize the behavior of the API views, the procedure to follow -is similar to the one described in -`FirmwareImageDownloadView <#firmwareimagedownloadview>`_, -with the difference that you may also want to create your own -`serializers `_ -if needed. - -The API code is stored in -`openwisp_firmware_upgrader.api `_ -and is built using `django-rest-framework `_ - -For more information regarding Django REST Framework API views, please refer to the -`"Generic views" section in the Django REST Framework documentation `_. - Contributing ------------ diff --git a/docs/developer/developer-docs.rst b/docs/developer/developer-docs.rst new file mode 100644 index 0000000..678758b --- /dev/null +++ b/docs/developer/developer-docs.rst @@ -0,0 +1,12 @@ +Developers Documentation +------------------------ + +.. include:: /paritals/developers-docs-warning.rst + +.. toctree:: + :maxdepth: 1 + + ./installation.rst + ./extending.rst + + diff --git a/docs/developer/extending.rst b/docs/developer/extending.rst new file mode 100644 index 0000000..785bb41 --- /dev/null +++ b/docs/developer/extending.rst @@ -0,0 +1,329 @@ +Extending openwisp-firmware-upgrader +------------------------------------ + +One of the core values of the OpenWISP project is `Software Reusability `_, +for this reason *OpenWISP Firmware Upgrader* provides a set of base classes +which can be imported, extended and reused to create derivative apps. + +In order to implement your custom version of *OpenWISP Firmware Upgrader*, +you need to perform the steps described in this section. + +When in doubt, the code in the `test project `_ +and the `sample app `_ +will serve you as source of truth: +just replicate and adapt that code to get a basic derivative of +*OpenWISP Firmware Upgrader* working. + +**Premise**: if you plan on using a customized version of this module, +we suggest to start with it since the beginning, because migrating your data +from the default module to your extended version may be time consuming. + +1. Initialize your custom module +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The first thing you need to do is to create a new django app which will +contain your custom version of *OpenWISP Firmware Upgrader*. + +A django app is nothing more than a +`python package `_ +(a directory of python scripts), in the following examples we'll call this django app +``myupgrader``, but you can name it how you want:: + + django-admin startapp myupgrader + +Keep in mind that the command mentioned above must be called from a directory +which is available in your `PYTHON_PATH `_ +so that you can then import the result into your project. + +Now you need to add ``myupgrader`` to ``INSTALLED_APPS`` in your ``settings.py``, +ensuring also that ``openwisp_firmware_upgrader`` has been removed: + +.. code-block:: python + + INSTALLED_APPS = [ + # ... other apps ... + + # 'openwisp_firmware_upgrader' <-- comment out or delete this line + 'myupgrader' + ] + +For more information about how to work with django projects and django apps, +please refer to the `django documentation `_. + +2. Install ``openwisp-firmware-upgrader`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Install (and add to the requirement of your project) ``openwisp-firmware-upgrader``:: + + pip install openwisp-firmware-upgrader + +3. Add ``EXTENDED_APPS`` +~~~~~~~~~~~~~~~~~~~~~~~~ + +Add the following to your ``settings.py``: + +.. code-block:: python + + EXTENDED_APPS = ['openwisp_firmware_upgrader'] + +4. Add ``openwisp_utils.staticfiles.DependencyFinder`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Add ``openwisp_utils.staticfiles.DependencyFinder`` to +``STATICFILES_FINDERS`` in your ``settings.py``: + +.. code-block:: python + + STATICFILES_FINDERS = [ + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + 'openwisp_utils.staticfiles.DependencyFinder', + ] + +5. Add ``openwisp_utils.loaders.DependencyLoader`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Add ``openwisp_utils.loaders.DependencyLoader`` to ``TEMPLATES`` in your ``settings.py``: + +.. code-block:: python + + TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'OPTIONS': { + 'loaders': [ + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + 'openwisp_utils.loaders.DependencyLoader', + ], + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + } + ] + +6. Inherit the AppConfig class +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Please refer to the following files in the sample app of the test project: + +- `sample_firmware_upgrader/__init__.py `_. +- `sample_firmware_upgrader/apps.py `_. + +You have to replicate and adapt that code in your project. + +For more information regarding the concept of ``AppConfig`` please refer to +the `"Applications" section in the django documentation `_. + +7. Create your custom models +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For the purpose of showing an example, we added a simple "details" field to the +`models of the sample app in the test project `_. + +You can add fields in a similar way in your ``models.py`` file. + +**Note**: for doubts regarding how to use, extend or develop models please refer to +the `"Models" section in the django documentation `_. + +8. Add swapper configurations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Once you have created the models, add the following to your ``settings.py``: + +.. code-block:: python + + # Setting models for swapper module + FIRMWARE_UPGRADER_CATEGORY_MODEL = 'myupgrader.Category' + FIRMWARE_UPGRADER_BUILD_MODEL = 'myupgrader.Build' + FIRMWARE_UPGRADER_FIRMWAREIMAGE_MODEL = 'myupgrader.FirmwareImage' + FIRMWARE_UPGRADER_DEVICEFIRMWARE_MODEL = 'myupgrader.DeviceFirmware' + FIRMWARE_UPGRADER_BATCHUPGRADEOPERATION_MODEL = 'myupgrader.BatchUpgradeOperation' + FIRMWARE_UPGRADER_UPGRADEOPERATION_MODEL = 'myupgrader.UpgradeOperation' + +Substitute ``myupgrader`` with the name you chose in step 1. + +9. Create database migrations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Create and apply database migrations:: + + ./manage.py makemigrations + ./manage.py migrate + +For more information, refer to the +`"Migrations" section in the django documentation `_. + +10. Create the admin +~~~~~~~~~~~~~~~~~~~~ + +Refer to the `admin.py file of the sample app `_. + +To introduce changes to the admin, you can do it in two main ways which are described below. + +**Note**: for more information regarding how the django admin works, or how it can be customized, +please refer to `"The django admin site" section in the django documentation `_. + +1. Monkey patching +################## + +If the changes you need to add are relatively small, you can resort to monkey patching. + +For example: + +.. code-block:: python + + from openwisp_firmware_upgrader.admin import ( # noqa + BatchUpgradeOperationAdmin, + BuildAdmin, + CategoryAdmin, + ) + + BuildAdmin.list_display.insert(1, 'my_custom_field') + BuildAdmin.ordering = ['-my_custom_field'] + +2. Inheriting admin classes +########################### + +If you need to introduce significant changes and/or you don't want to resort to +monkey patching, you can proceed as follows: + +.. code-block:: python + + from django.contrib import admin + from openwisp_firmware_upgrader.admin import ( + BatchUpgradeOperationAdmin as BaseBatchUpgradeOperationAdmin, + BuildAdmin as BaseBuildAdmin, + CategoryAdmin as BaseCategoryAdmin, + ) + from openwisp_firmware_upgrader.swapper import load_model + + BatchUpgradeOperation = load_model('BatchUpgradeOperation') + Build = load_model('Build') + Category = load_model('Category') + DeviceFirmware = load_model('DeviceFirmware') + FirmwareImage = load_model('FirmwareImage') + UpgradeOperation = load_model('UpgradeOperation') + + admin.site.unregister(BatchUpgradeOperation) + admin.site.unregister(Build) + admin.site.unregister(Category) + + class BatchUpgradeOperationAdmin(BaseBatchUpgradeOperationAdmin): + # add your changes here + + class BuildAdmin(BaseBuildAdmin): + # add your changes here + + class CategoryAdmin(BaseCategoryAdmin): + # add your changes here + +11. Create root URL configuration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Please refer to the `urls.py `_ +file in the test project. + +For more information about URL configuration in django, please refer to the +`"URL dispatcher" section in the django documentation `_. + +12. Create celery.py +~~~~~~~~~~~~~~~~~~~~ + +Please refer to the `celery.py `_ +file in the test project. + +For more information about the usage of celery in django, please refer to the +`"First steps with Django" section in the celery documentation `_. + +13. Import the automated tests +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When developing a custom application based on this module, it's a good +idea to import and run the base tests too, so that you can be sure the changes +you're introducing are not breaking some of the existing features of *OpenWISP Firmware Upgrader*. + +In case you need to add breaking changes, you can overwrite the tests defined +in the base classes to test your own behavior. + +See the `tests of the sample app `_ +to find out how to do this. + +You can then run tests with:: + + # the --parallel flag is optional + ./manage.py test --parallel myupgrader + +Substitute ``myupgrader`` with the name you chose in step 1. + +For more information about automated tests in django, please refer to +`"Testing in Django" `_. + +Other base classes that can be inherited and extended +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The following steps are not required and are intended for more advanced customization. + +``FirmwareImageDownloadView`` +############################# + +This view controls how the firmware images are stored and who has permission to download them. + +The full python path is: ``openwisp_firmware_upgrader.private_storage.FirmwareImageDownloadView``. + +If you want to extend this view, you will have to perform the additional steps below. + +Step 1. import and extend view: + +.. code-block:: python + + # myupgrader/views.py + from openwisp_firmware_upgrader.private_storage import ( + FirmwareImageDownloadView as BaseFirmwareImageDownloadView + ) + + class FirmwareImageDownloadView(BaseFirmwareImageDownloadView): + # add your customizations here ... + pass + +Step 2: remove the following line from your root ``urls.py`` file: + +.. code-block:: python + + path('firmware/', include('openwisp_firmware_upgrader.private_storage.urls')), + +Step 3: add an URL route pointing to your custom view in ``urls.py`` file: + +.. code-block:: python + + # urls.py + from myupgrader.views import FirmwareImageDownloadView + + urlpatterns = [ + # ... other URLs + path('', FirmwareImageDownloadView.as_view(), name='serve_private_file',), + ] + +For more information regarding django views, please refer to the +`"Class based views" section in the django documentation `_. + +API views +~~~~~~~~~ + +If you need to customize the behavior of the API views, the procedure to follow +is similar to the one described in +`FirmwareImageDownloadView <#firmwareimagedownloadview>`_, +with the difference that you may also want to create your own +`serializers `_ +if needed. + +The API code is stored in +`openwisp_firmware_upgrader.api `_ +and is built using `django-rest-framework `_ + +For more information regarding Django REST Framework API views, please refer to the +`"Generic views" section in the Django REST Framework documentation `_. diff --git a/docs/developer/installation.rst b/docs/developer/installation.rst new file mode 100644 index 0000000..2e0d266 --- /dev/null +++ b/docs/developer/installation.rst @@ -0,0 +1,88 @@ +Developer installation instructions +----------------------------------- + +.. include:: /paritals/developers-docs-warning.rst + +Requirements +~~~~~~~~~~~~ + +- Python >= 3.8 +- openwisp-controller (and its dependencies) >= 1.0.0 + +Install Dependencies +~~~~~~~~~~~~~~~~~~~~ + +Install spatialite and sqlite: + +.. code-block:: shell + + sudo apt-get install sqlite3 libsqlite3-dev openssl libssl-dev + sudo apt-get install gdal-bin libproj-dev libgeos-dev libspatialite-dev + +.. important:: + + If you want to add ``openwisp-firmware-upgrader`` in an existing Django + project, then you can take reference from the + `test project in openwisp-firmware-upgrader repository + `_ + +Installing for development +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Install your forked repo: + +.. code-block:: shell + + git clone git://github.com//openwisp-firmware-upgrader + cd openwisp-firmware-upgrader/ + python setup.py develop + +Install test requirements: + +.. code-block:: shell + + pip install -r requirements-test.txt + +Create database: + +.. code-block:: shell + + cd tests/ + ./manage.py migrate + ./manage.py createsuperuser + +Launch development server: + +.. code-block:: shell + + ./manage.py runserver 0.0.0.0:8000 + +You can access the admin interface at http://127.0.0.1:8000/admin/. + +Run celery and celery-beat with the following commands +(separate terminal windows are needed): + +.. code-block:: shell + + # (cd tests) + celery -A openwisp2 worker -l info + celery -A openwisp2 beat -l info + +Run tests with: + +.. code-block:: shell + + # run qa checks + ./run-qa-checks + + # standard tests + ./runtests.py + + # tests for the sample app + SAMPLE_APP=1 ./runtests.py --keepdb --failfast + +When running the last line of the previous example, the environment variable +``SAMPLE_APP`` activates the app in ``/tests/openwisp2/sample_firmware_upgrader/`` +which is a simple django app that extends ``openwisp-firmware-upgrader`` with +the sole purpose of testing its extensibility, for more information regarding +this concept, read the following section. diff --git a/docs/overview.rst b/docs/overview.rst new file mode 100644 index 0000000..4ab6869 --- /dev/null +++ b/docs/overview.rst @@ -0,0 +1,40 @@ +OpenWISP Firmware Upgrader +========================== + +.. warning:: + + This is the latest version + + +Firmware upgrade module of OpenWISP. + +.. rubric:: Features + +- Stores information of each upgrade operation which can be seen from the device page +- Automatic retries for recoverable failures + (eg: firmware image upload issues because of intermittent internet connection) +- Performs a final check to find out if the upgrade completed successfully or not +- Prevents accidental multiple upgrades using the same firmware image +- Single device upgrade +- Mass upgrades +- Possibility to divide firmware images in categories +- `REST API <#rest-api>`__ +- `Possibility of writing custom upgraders <#writing-custom-firmware-upgrader-classes>`_ for other + firmware OSes or for custom OpenWRT based firmwares +- Configurable timeouts +- `Extensible <#extending-openwisp-firmware-upgrader>`_ + +.. image:: https://raw.githubusercontent.com/openwisp/openwisp2-docs/master/assets/design/openwisp-logo-black.svg + :target: http://openwisp.org + +.. toctree:: + :maxdepth: 1 + + + user/Quickstart.rst + user/automatic-device-firmware-detection.rst + user/custom-firmware-upgrader.rst + user/rest-api.rst + user/settings.rst + developer/developer-docs.rst + diff --git a/docs/user/automatic-device-firmware-detection.rst b/docs/user/automatic-device-firmware-detection.rst new file mode 100644 index 0000000..03c6ffa --- /dev/null +++ b/docs/user/automatic-device-firmware-detection.rst @@ -0,0 +1,31 @@ +Automatic device firmware detection +----------------------------------- + +*OpenWISP Firmware Upgrader* maintains a data structure for mapping +the firmware image files to board names called ``OPENWRT_FIRMWARE_IMAGE_MAP``. + +Here is an example firmware image item from ``OPENWRT_FIRMWARE_IMAGE_MAP`` + +.. code-block:: python + + { + # Firmware image file name. + 'ar71xx-generic-cf-e320n-v2-squashfs-sysupgrade.bin': { + # Human readable name of the model which is displayed on + # the UI + 'label': 'COMFAST CF-E320N v2 (OpenWRT 19.07 and earlier)', + # Tupe of board names with which the different versions + # of the hardware are identified on OpenWrt + 'boards': ('COMFAST CF-E320N v2',), + } + } + +When a device registers on OpenWISP, the `openwisp-config agent +`_ +read the device board name from `/tmp/sysinfo/model` and sends it to OpenWISP. +This value is then saved in the ``Device.model`` field. +*OpenWISP Firmware Upgrader* uses this field to automatically detect +the correct firmware image for the device. + +Use the `OPENWISP_CUSTOM_OPENWRT_IMAGES <#openwisp_custom_openwrt_images>`_ +setting to add additional firmware image in your project. diff --git a/docs/user/custom-firmware-upgrader.rst b/docs/user/custom-firmware-upgrader.rst new file mode 100644 index 0000000..67d645e --- /dev/null +++ b/docs/user/custom-firmware-upgrader.rst @@ -0,0 +1,29 @@ +Writing Custom Firmware Upgrader Classes +---------------------------------------- + +You can write custom upgraders for other firmware OSes or for +custom OpenWrt based firmwares. + +Here is an example custom OpenWrt firmware upgrader class: + +.. code-block:: python + + from openwisp_firmware_upgrader.upgraders.openwrt import OpenWrt + + class CustomOpenWrtBasedFirmware(OpenWrt): + # this firmware uses a custom upgrade command + UPGRADE_COMMAND = 'upgrade_firmware.sh --keep-config' + # it takes somewhat more time to boot so it needs more time + RECONNECT_DELAY = 150 + RECONNECT_RETRY_DELAY = 5 + RECONNECT_MAX_RETRIES = 20 + + def get_remote_path(self, image): + return '/tmp/firmware.img' + + def get_upgrade_command(self, path): + return self.UPGRADE_COMMAND + +You will need to place your custom upgrader class on the python path +of your application and then add this path to the `OPENWISP_FIRMWARE_UPGRADERS_MAP +<#openwisp_firmware_upgraders_map>`_ setting. diff --git a/docs/user/quickstart.rst b/docs/user/quickstart.rst new file mode 100644 index 0000000..400d409 --- /dev/null +++ b/docs/user/quickstart.rst @@ -0,0 +1,122 @@ +Quickstart Guide +---------------- + +Requirements: + +- Devices running at least OpenWRT 12.09 Attitude Adjustment, older versions + of OpenWRT have not worked at all in our tests +- Devices must have enough free RAM to be able to upload the + new image to ``/tmp`` + +1. Create a category +~~~~~~~~~~~~~~~~~~~~ + +Create a category for your firmware images +by going to *Firmware management > Firmware categories > Add firmware category*, +if you use only one firmware type in your network, you could simply +name the category "default" or "standard". + +.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-category.gif + +If you use multiple firmware images with different features, create one category +for each firmware type, eg: + +- WiFi +- SDN router +- LoRa Gateway + +This is necessary in order to perform mass upgrades only on specific +firmware categories when, for example, a new *LoRa Gateway* firmware becomes available. + +2. Create the build object +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Create a build a build object by going to +*Firmware management > Firmware builds > Add firmware build*, +the build object is related to a firmware category and is the collection of the +different firmware images which have been compiled for the different hardware models +supported by the system. + +The version field indicates the firmware version, the change log field is optional but +we recommend filling it to help operators know the differences between each version. + +.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-build.gif + +An important but optional field of the build model is **OS identifier**, this field +should match the value of the **Operating System** field which gets automatically filled +during device registration, eg: ``OpenWrt 19.07-SNAPSHOT r11061-6ffd4d8a4d``. +It is used by the firmware-upgrader module to automatically +create ``DeviceFirmware`` objects for existing devices or when new devices register. +A ``DeviceFirmware`` object represent the relationship between a device and a firmware image, +it basically tells us which firmware image is installed on the device. + +To find out the exact value to use, you should either do a +test flash on a device and register it to the system or you should inspect the firmware image +by decompressing it and find the generated value in the firmware image. + +If you're not sure about what **OS identifier** to use, just leave it empty, you can fill +it later on when you find out. + +Now save the build object to create it. + +3. Upload images to the build +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Now is time to add images to the build, we suggest adding one image at time. +Alternatively the `REST API <#rest-api>`__ can be used to automate this step. + +.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-firmwareimage.gif + +If you use a hardware model which is not listed in the image types, if the +hardware model is officially supported by OpenWRT, you can send us a pull-request to add it, +otherwise you can use `the setting OPENWISP_CUSTOM_OPENWRT_IMAGES <#openwisp_custom_openwrt_images>`__ +to add it. + +4. Perform a firmware upgrade to a specific device +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-devicefirmware.gif + +Once a new build is ready, has been created in the system and its image have been uploaded, +it will be the time to finally upgrade our devices. + +To perform the upgrade of a single device, navigate to the device details, +then go to the "Firmware" tab. + +If you correctly filled **OS identifier** in step 2, you should have a situation +similar to the one above: in this example, the device is using version ``1.0`` +and we want to upgrade it to version ``2.0``, once the new firmware image +is selected we just have to hit save, then a new tab will appear in the device page +which allows us to see what's going on during the upgrade. + +Right now, the update of the upgrade information is not asynchronous yet, so you will +have to reload the page periodically to find new information. This will be addressed +in a future release. + +5. Performing mass upgrades +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +First of all, please ensure the following preconditions are met: + +- the system is configured correctly +- the new firmware images are working as expected +- you already tried the upgrade of single devices several times. + +At this stage you can try a mass upgrade by doing the following: + +- go to the build list page +- select the build which contains the latest firmware images you + want the devices to be upgraded with +- click on "Mass-upgrade devices related to the selected build". + +.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-batch-upgrade.gif + +At this point you should see a summary page which will inform you of which devices +are going to be upgraded, you can either confirm the operation or cancel. + +Once the operation is confirmed you will be redirected to a page in which you +can monitor the progress of the upgrade operations. + +Right now, the update of the upgrade information is not asynchronous yet, so you will +have to reload the page periodically to find new information. This will be addressed +in a future release. diff --git a/docs/user/rest-api.rst b/docs/user/rest-api.rst new file mode 100644 index 0000000..942755d --- /dev/null +++ b/docs/user/rest-api.rst @@ -0,0 +1,344 @@ +REST API +-------- + +To enable the API the setting +`OPENWISP_FIRMWARE_UPGRADER_API <#openwisp-firmware-upgrader-api>`_ +must be set to ``True``. + +Live documentation +~~~~~~~~~~~~~~~~~~ + +.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/api-docs.png + +A general live API documentation (following the OpenAPI specification) at ``/api/v1/docs/``. + +Browsable web interface +~~~~~~~~~~~~~~~~~~~~~~~ + +.. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/api-ui.png + +Additionally, opening any of the endpoints `listed below <#list-of-endpoints>`_ +directly in the browser will show the `browsable API interface of Django-REST-Framework +`_, +which makes it even easier to find out the details of each endpoint. + +Authentication +~~~~~~~~~~~~~~ + +See openwisp-users: `authenticating with the user token +`_. + +When browsing the API via the `Live documentation <#live-documentation>`_ +or the `Browsable web page <#browsable-web-interface>`_, you can also use +the session authentication by logging in the django admin. + +Pagination +~~~~~~~~~~ + +All *list* endpoints support the ``page_size`` parameter that allows paginating +the results in conjunction with the ``page`` parameter. + +.. code-block:: text + + GET /api/v1/firmware-upgrader/build/?page_size=10 + GET /api/v1/firmware-upgrader/build/?page_size=10&page=2 + +Filtering by organization slug +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Most endpoints allow to filter by organization slug, eg: + +.. code-block:: text + + GET /api/v1/firmware-upgrader/build/?organization=org-slug + +List of endpoints +~~~~~~~~~~~~~~~~~ + +Since the detailed explanation is contained in the `Live documentation <#live-documentation>`_ +and in the `Browsable web page <#browsable-web-interface>`_ of each point, +here we'll provide just a list of the available endpoints, +for further information please open the URL of the endpoint in your browser. + +List mass upgrade operations +############################ + +.. code-block:: text + + GET /api/v1/firmware-upgrader/batch-upgrade-operation/ + +**Available filters** + +The list of batch upgrade operations provides the following filters: + +- ``build`` (Firmware build ID) +- ``status`` (One of: idle, in-progress, success, failed) + +Here's a few examples: + +.. code-block:: text + + GET /api/v1/firmware-upgrader/batch-upgrade-operation/?build={build_id} + GET /api/v1/firmware-upgrader/batch-upgrade-operation/?status={status} + +Get mass upgrade operation detail +################################# + +.. code-block:: text + + GET /api/v1/firmware-upgrader/batch-upgrade-operation/{id}/ + +List firmware builds +#################### + +.. code-block:: text + + GET /api/v1/firmware-upgrader/build/ + +**Available filters** + +The list of firmware builds provides the following filters: + +- ``category`` (Firmware category ID) +- ``version`` (Firmware build version) +- ``os`` (Firmware build os identifier) + +Here's a few examples: + +.. code-block:: text + + GET /api/v1/firmware-upgrader/build/?category={category_id} + GET /api/v1/firmware-upgrader/build/?version={version} + GET /api/v1/firmware-upgrader/build/?os={os} + +Create firmware build +##################### + +.. code-block:: text + + POST /api/v1/firmware-upgrader/build/ + +Get firmware build details +########################## + +.. code-block:: text + + GET /api/v1/firmware-upgrader/build/{id}/ + +Change details of firmware build +################################ + +.. code-block:: text + + PUT /api/v1/firmware-upgrader/build/{id}/ + +Patch details of firmware build +############################### + +.. code-block:: text + + PATCH /api/v1/firmware-upgrader/build/{id}/ + +Delete firmware build +##################### + +.. code-block:: text + + DELETE /api/v1/firmware-upgrader/build/{id}/ + +Get list of images of a firmware build +###################################### + +.. code-block:: text + + GET /api/v1/firmware-upgrader/build/{id}/image/ + +**Available filters** + +The list of images of a firmware build can be filtered by using +``type`` (any one of the available firmware image types). + +.. code-block:: text + + GET /api/v1/firmware-upgrader/build/{id}/image/?type={type} + +Upload new firmware image to the build +###################################### + +.. code-block:: text + + POST /api/v1/firmware-upgrader/build/{id}/image/ + +Get firmware image details +########################## + +.. code-block:: text + + GET /api/v1/firmware-upgrader/build/{build_id}/image/{id}/ + +Delete firmware image +##################### + +.. code-block:: text + + DELETE /api/v1/firmware-upgrader/build/{build_id}/image/{id}/ + +Download firmware image +####################### + +.. code-block:: text + + GET /api/v1/firmware-upgrader/build/{build_id}/image/{id}/download/ + +Perform batch upgrade +##################### + +Upgrades all the devices related to the specified build ID. + +.. code-block:: text + + POST /api/v1/firmware-upgrader/build/{id}/upgrade/ + +Dry-run batch upgrade +##################### + +Returns a list representing the ``DeviceFirmware`` and ``Device`` +instances that would be upgraded if POST is used. + +``Device`` objects are indicated only when no ``DeviceFirmware`` +object exists for a device which would be upgraded. + +.. code-block:: text + + GET /api/v1/firmware-upgrader/build/{id}/upgrade/ + +List firmware categories +######################## + +.. code-block:: text + + GET /api/v1/firmware-upgrader/category/ + +Create new firmware category +############################ + +.. code-block:: text + + POST /api/v1/firmware-upgrader/category/ + +Get firmware category details +############################# + +.. code-block:: text + + GET /api/v1/firmware-upgrader/category/{id}/ + +Change the details of a firmware category +######################################### + +.. code-block:: text + + PUT /api/v1/firmware-upgrader/category/{id}/ + +Patch the details of a firmware category +######################################## + +.. code-block:: text + + PATCH /api/v1/firmware-upgrader/category/{id}/ + +Delete a firmware category +########################## + +.. code-block:: text + + DELETE /api/v1/firmware-upgrader/category/{id}/ + +List upgrade operations +####################### + +.. code-block:: text + + GET /api/v1/firmware-upgrader/upgrade-operation/ + +**Available filters** + +The list of upgrade operations provides the following filters: + +- ``device__organization`` (Organization ID of the device) +- ``device__organization_slug`` (Organization slug of the device) +- ``device`` (Device ID) +- ``image`` (Firmware image ID) +- ``status`` (One of: in-progress, success, failed, aborted) + + +Here's a few examples: + +.. code-block:: text + + GET /api/v1/firmware-upgrader/upgrade-operation/?device__organization={organization_id} + GET /api/v1/firmware-upgrader/upgrade-operation/?device__organization__slug={organization_slug} + GET /api/v1/firmware-upgrader/upgrade-operation/?device={device_id} + GET /api/v1/firmware-upgrader/upgrade-operation/?image={image_id} + GET /api/v1/firmware-upgrader/upgrade-operation/?status={status} + +Get upgrade operation details +############################# + +.. code-block:: text + + GET /api/v1/firmware-upgrader/upgrade-operation/{id} + +List device upgrade operations +############################## + +.. code-block:: text + + GET /api/v1/firmware-upgrader/device/{device_id}/upgrade-operation/ + +**Available filters** + +The list of device upgrade operations can be filtered by +``status`` (one of: in-progress, success, failed, aborted). + +.. code-block:: text + + GET /api/v1/firmware-upgrader/device/{device_id}/upgrade-operation/?status={status} + +Create device firmware +###################### + +Sending a PUT request to the endpoint below will +create a new device firmware if it does not already exist. + +.. code-block:: text + + PUT /api/v1/firmware-upgrader/device/{device_id}/firmware/ + +Get device firmware details +########################### + +.. code-block:: text + + GET /api/v1/firmware-upgrader/device/{device_id}/firmware/ + +Change details of device firmware +################################# + +.. code-block:: text + + PUT /api/v1/firmware-upgrader/device/{device_id}/firmware/ + +Patch details of device firmware +################################# + +.. code-block:: text + + PATCH /api/v1/firmware-upgrader/device/{device_id}/firmware/ + +Delete device firmware +###################### + +.. code-block:: text + + DELETE /api/v1/firmware-upgrader/device/{device_pk}/firmware/ diff --git a/docs/user/settings.rst b/docs/user/settings.rst new file mode 100644 index 0000000..b32522c --- /dev/null +++ b/docs/user/settings.rst @@ -0,0 +1,203 @@ +Settings +-------- + +``OPENWISP_FIRMWARE_UPGRADER_RETRY_OPTIONS`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++--------------+--------------+ +| **type**: | ``dict`` | ++--------------+--------------+ +| **default**: | see below | ++--------------+--------------+ + +.. code-block:: python + + # default value of OPENWISP_FIRMWARE_UPGRADER_RETRY_OPTIONS: + + dict( + max_retries=4, + retry_backoff=60, + retry_backoff_max=600, + retry_jitter=True, + ) + +Retry settings for recoverable failures during firmware upgrades. + +By default if an upgrade operation fails before the firmware is flashed +(eg: because of a network issue during the upload of the image), +the upgrade operation will be retried 4 more times with an exponential +random backoff and a maximum delay of 10 minutes. + +For more information regarding these settings, consult the `celery documentation +regarding automatic retries for known errors +`_. + +``OPENWISP_FIRMWARE_UPGRADER_TASK_TIMEOUT`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++--------------+--------------+ +| **type**: | ``int`` | ++--------------+--------------+ +| **default**: | ``600`` | ++--------------+--------------+ + +Timeout for the background tasks which perform firmware upgrades. + +If for some unexpected reason an upgrade remains stuck for more than 10 minutes, +the upgrade operation will be flagged as failed and the task will be killed. + +This should not happen, but a global task time out is a best practice when +using background tasks because it prevents the situation in which an unexpected +bug causes a specific task to hang, which will quickly fill all the available +slots in a background queue and prevent other tasks from being executed, which +will end up affecting negatively the rest of the application. + +``OPENWISP_CUSTOM_OPENWRT_IMAGES`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++--------------+-------------+ +| **type**: | ``tuple`` | ++--------------+-------------+ +| **default**: | ``None`` | ++--------------+-------------+ + +This setting can be used to extend the list of firmware image types +included in *OpenWISP Firmware Upgrader*. This setting is suited to +add support for custom OpenWrt images. + +.. code-block:: python + + OPENWISP_CUSTOM_OPENWRT_IMAGES = ( + ( + # Firmware image file name. + 'customimage-squashfs-sysupgrade.bin', { + # Human readable name of the model which is displayed on + # the UI + 'label': 'Custom WAP-1200', + # Tuple of board names with which the different versions of + # the hardware are identified on OpenWrt + 'boards': ('CWAP1200',) + } + ), + ) + +Kindly read `"Automatic detection of firmware of device" +<#automatic-device-firmware-detection>`_ +section of this documentation to know how *OpenWISP Firmware Upgrader* +uses this setting in upgrades. + +``OPENWISP_FIRMWARE_UPGRADER_MAX_FILE_SIZE`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++--------------+------------------------------+ +| **type**: | ``int`` | ++--------------+------------------------------+ +| **default**: | ``30 * 1024 * 1024`` (30 MB) | ++--------------+------------------------------+ + +This setting can be used to set the maximum size limit for firmware images, eg: + +.. code-block:: python + + OPENWISP_FIRMWARE_UPGRADER_MAX_FILE_SIZE = 40 * 1024 * 1024 # 40MB + +**Notes**: + +- Value must be specified in bytes. ``None`` means unlimited. + +``OPENWISP_FIRMWARE_UPGRADER_API`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++--------------+-----------+ +| **type**: | ``bool`` | ++--------------+-----------+ +| **default**: | ``True`` | ++--------------+-----------+ + +Indicates whether the API for Firmware Upgrader is enabled or not. + +``OPENWISP_FIRMWARE_UPGRADER_OPENWRT_SETTINGS`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++--------------+-----------+ +| **type**: | ``dict`` | ++--------------+-----------+ +| **default**: | ``{}`` | ++--------------+-----------+ + +Allows changing the default OpenWRT upgrader settings, eg: + +.. code-block:: python + + OPENWISP_FIRMWARE_UPGRADER_OPENWRT_SETTINGS = { + 'reconnect_delay': 120, + 'reconnect_retry_delay': 20, + 'reconnect_max_retries': 15, + 'upgrade_timeout': 90, + } + +- ``reconnect_delay``: amount of seconds to wait before trying to connect + again to the device after the upgrade command has been launched; + the re-connection step is necessary to verify the upgrade has completed successfully; + defaults to ``120`` seconds +- ``reconnect_retry_delay``: amount of seconds to wait after a + re-connection attempt has failed; + defaults to ``20`` seconds +- ``reconnect_max_retries``: maximum re-connection attempts + defaults to ``15`` attempts +- ``upgrade_timeout``: amount of seconds before the shell session + is closed after the upgrade command is launched on the device, + useful in case the upgrade command hangs (it happens on older OpenWRT versions); + defaults to ``90`` seconds + +``OPENWISP_FIRMWARE_API_BASEURL`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++--------------+-----------------------------------+ +| **type**: | ``dict`` | ++--------------+-----------------------------------+ +| **default**: | ``/`` (points to same server) | ++--------------+-----------------------------------+ + +If you have a seperate instance of openwisp-firmware-upgrader API on a +different domain, you can use this option to change the base of the image +download url, this will enable you to point to your API server's domain, +example value: ``https://myfirmware.myapp.com``. + +``OPENWISP_FIRMWARE_UPGRADERS_MAP`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++--------------+-------------------------------------------------------------------------------------------------------------------------------+ +| **type**: | ``dict`` | ++--------------+-------------------------------------------------------------------------------------------------------------------------------+ +| **default**: | .. code-block:: python | +| | | +| | { | +| | 'openwisp_controller.connection.connectors.openwrt.ssh.OpenWrt': 'openwisp_firmware_upgrader.upgraders.openwrt.OpenWrt', | +| | } | ++--------------+-------------------------------------------------------------------------------------------------------------------------------+ + +A dictionary that maps update strategies to upgraders. + +If you want to use a custom update strategy you will need to use this setting +to provide an entry with the class path of your update strategy as the key. + +If you need to use a `custom upgrader class <#writing-custom-firmware-upgrader-classes>`_ +you will need to use this setting to provide an entry with the class path of your upgrader +as the value. + +``OPENWISP_FIRMWARE_PRIVATE_STORAGE_INSTANCE`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++--------------+-------------------------------------------------------------------------------------+ +| **type**: | ``str`` | ++--------------+-------------------------------------------------------------------------------------+ +| **default**: | ``openwisp_firmware_upgrader.private_storage.storage.file_system_private_storage`` | ++--------------+-------------------------------------------------------------------------------------+ + +Dotted path to an instance of any one of the storage classes in +`private_storage `_. +This instance is used to store firmware image files. + +By default, an instance of ``private_storage.storage.files.PrivateFileSystemStorage`` +is used. From d9d40d351fbcd845498e38de79fdb658091842a6 Mon Sep 17 00:00:00 2001 From: Gagan Deep Date: Thu, 25 Apr 2024 01:19:03 +0530 Subject: [PATCH 02/18] [chores] Fixed URL references --- docs/user/automatic-device-firmware-detection.rst | 2 +- docs/user/custom-firmware-upgrader.rst | 2 +- docs/user/quickstart.rst | 2 +- docs/user/settings.rst | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/user/automatic-device-firmware-detection.rst b/docs/user/automatic-device-firmware-detection.rst index 03c6ffa..42907b7 100644 --- a/docs/user/automatic-device-firmware-detection.rst +++ b/docs/user/automatic-device-firmware-detection.rst @@ -27,5 +27,5 @@ This value is then saved in the ``Device.model`` field. *OpenWISP Firmware Upgrader* uses this field to automatically detect the correct firmware image for the device. -Use the `OPENWISP_CUSTOM_OPENWRT_IMAGES <#openwisp_custom_openwrt_images>`_ +Use the :ref:`OPENWISP_CUSTOM_OPENWRT_IMAGES <#openwisp_custom_openwrt_images>`_ setting to add additional firmware image in your project. diff --git a/docs/user/custom-firmware-upgrader.rst b/docs/user/custom-firmware-upgrader.rst index 67d645e..7eeb683 100644 --- a/docs/user/custom-firmware-upgrader.rst +++ b/docs/user/custom-firmware-upgrader.rst @@ -25,5 +25,5 @@ Here is an example custom OpenWrt firmware upgrader class: return self.UPGRADE_COMMAND You will need to place your custom upgrader class on the python path -of your application and then add this path to the `OPENWISP_FIRMWARE_UPGRADERS_MAP +of your application and then add this path to the :ref:`OPENWISP_FIRMWARE_UPGRADERS_MAP <#openwisp_firmware_upgraders_map>`_ setting. diff --git a/docs/user/quickstart.rst b/docs/user/quickstart.rst index 400d409..f36e437 100644 --- a/docs/user/quickstart.rst +++ b/docs/user/quickstart.rst @@ -69,7 +69,7 @@ Alternatively the `REST API <#rest-api>`__ can be used to automate this step. If you use a hardware model which is not listed in the image types, if the hardware model is officially supported by OpenWRT, you can send us a pull-request to add it, -otherwise you can use `the setting OPENWISP_CUSTOM_OPENWRT_IMAGES <#openwisp_custom_openwrt_images>`__ +otherwise you can use :ref:`the setting OPENWISP_CUSTOM_OPENWRT_IMAGES <#openwisp_custom_openwrt_images>`__ to add it. 4. Perform a firmware upgrade to a specific device diff --git a/docs/user/settings.rst b/docs/user/settings.rst index b32522c..18a5188 100644 --- a/docs/user/settings.rst +++ b/docs/user/settings.rst @@ -52,6 +52,8 @@ bug causes a specific task to hang, which will quickly fill all the available slots in a background queue and prevent other tasks from being executed, which will end up affecting negatively the rest of the application. +.. _openwisp_custom_openwrt_images: + ``OPENWISP_CUSTOM_OPENWRT_IMAGES`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -164,6 +166,8 @@ different domain, you can use this option to change the base of the image download url, this will enable you to point to your API server's domain, example value: ``https://myfirmware.myapp.com``. +.. _openwisp_firmware_upgraders_map: + ``OPENWISP_FIRMWARE_UPGRADERS_MAP`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 38e55bed68486052940cf4cf4fc2a9c8181dee93 Mon Sep 17 00:00:00 2001 From: Gagan Deep Date: Fri, 26 Apr 2024 17:25:51 +0530 Subject: [PATCH 03/18] [chores] Added developer docs warning to all pages --- docs/developer/developer-docs.rst | 2 +- docs/developer/extending.rst | 2 ++ docs/developer/installation.rst | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/developer/developer-docs.rst b/docs/developer/developer-docs.rst index 678758b..ebe4c0b 100644 --- a/docs/developer/developer-docs.rst +++ b/docs/developer/developer-docs.rst @@ -1,7 +1,7 @@ Developers Documentation ------------------------ -.. include:: /paritals/developers-docs-warning.rst +.. include:: /partials/developers-docs-warning.rst .. toctree:: :maxdepth: 1 diff --git a/docs/developer/extending.rst b/docs/developer/extending.rst index 785bb41..9191e47 100644 --- a/docs/developer/extending.rst +++ b/docs/developer/extending.rst @@ -1,6 +1,8 @@ Extending openwisp-firmware-upgrader ------------------------------------ +.. include:: /partials/developers-docs-warning.rst + One of the core values of the OpenWISP project is `Software Reusability `_, for this reason *OpenWISP Firmware Upgrader* provides a set of base classes which can be imported, extended and reused to create derivative apps. diff --git a/docs/developer/installation.rst b/docs/developer/installation.rst index 2e0d266..f07ed92 100644 --- a/docs/developer/installation.rst +++ b/docs/developer/installation.rst @@ -1,7 +1,7 @@ Developer installation instructions ----------------------------------- -.. include:: /paritals/developers-docs-warning.rst +.. include:: /partials/developers-docs-warning.rst Requirements ~~~~~~~~~~~~ From d4f4ef663f2fb71ee2d976d9f6a3711bb78855e3 Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Wed, 15 May 2024 21:03:33 -0400 Subject: [PATCH 04/18] [docs] Renamed overview to index --- docs/{overview.rst => index.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{overview.rst => index.rst} (100%) diff --git a/docs/overview.rst b/docs/index.rst similarity index 100% rename from docs/overview.rst rename to docs/index.rst From 457b42b344d1fb2f3cbebdc2c103946ba44906af Mon Sep 17 00:00:00 2001 From: Gagan Deep Date: Tue, 11 Jun 2024 23:36:53 +0530 Subject: [PATCH 05/18] [docs] Improved docs --- README.rst | 78 ++-- docs/developer/developer-docs.rst | 12 - docs/developer/extending.rst | 348 ++++++++++-------- docs/developer/index.rst | 15 + docs/developer/installation.rst | 85 +++-- docs/index.rst | 52 +-- docs/partials/developer-docs.rst | 12 + .../automatic-device-firmware-detection.rst | 30 +- docs/user/custom-firmware-upgrader.rst | 18 +- docs/user/intro.rst | 18 + docs/user/quickstart.rst | 147 ++++---- docs/user/rest-api.rst | 209 ++++++----- docs/user/settings.rst | 213 ++++++----- 13 files changed, 681 insertions(+), 556 deletions(-) delete mode 100644 docs/developer/developer-docs.rst create mode 100644 docs/developer/index.rst create mode 100644 docs/partials/developer-docs.rst create mode 100644 docs/user/intro.rst diff --git a/README.rst b/README.rst index 72ecdd2..27d48f6 100644 --- a/README.rst +++ b/README.rst @@ -2,76 +2,56 @@ openwisp-firmware-upgrader ========================== .. image:: https://github.com/openwisp/openwisp-firmware-upgrader/workflows/OpenWISP%20Firmware%20Upgrader%20CI%20Build/badge.svg?branch=master - :target: https://github.com/openwisp/openwisp-firmware-upgrader/actions?query=OpenWISP+Firmware+Upgrader+CI+Build + :target: https://github.com/openwisp/openwisp-firmware-upgrader/actions?query=OpenWISP+Firmware+Upgrader+CI+Build .. image:: https://coveralls.io/repos/openwisp/openwisp-firmware-upgrader/badge.svg - :target: https://coveralls.io/r/openwisp/openwisp-firmware-upgrader + :target: https://coveralls.io/r/openwisp/openwisp-firmware-upgrader .. image:: https://img.shields.io/librariesio/release/github/openwisp/openwisp-firmware-upgrader - :target: https://libraries.io/github/openwisp/openwisp-firmware-upgrader#repository_dependencies - :alt: Dependency monitoring + :target: https://libraries.io/github/openwisp/openwisp-firmware-upgrader#repository_dependencies + :alt: Dependency monitoring .. image:: https://img.shields.io/gitter/room/nwjs/nw.js.svg?style=flat-square - :target: https://gitter.im/openwisp/general - :alt: support chat + :target: https://gitter.im/openwisp/general + :alt: support chat .. image:: https://badge.fury.io/py/openwisp-firmware-upgrader.svg - :target: http://badge.fury.io/py/openwisp-firmware-upgrader - :alt: Pypi Version + :target: http://badge.fury.io/py/openwisp-firmware-upgrader + :alt: Pypi Version .. image:: https://pepy.tech/badge/openwisp-firmware-upgrader - :target: https://pepy.tech/project/openwisp-firmware-upgrader - :alt: Downloads + :target: https://pepy.tech/project/openwisp-firmware-upgrader + :alt: Downloads .. image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://pypi.org/project/black/ - :alt: code style: black + :target: https://pypi.org/project/black/ + :alt: code style: black ------------- - -**Need a quick overview?** `Try the OpenWISP Demo `_. - -Firmware upgrade module of OpenWISP. - -**Features**: - -- Stores information of each upgrade operation which can be seen from the device page -- Automatic retries for recoverable failures - (eg: firmware image upload issues because of intermittent internet connection) -- Performs a final check to find out if the upgrade completed successfully or not -- Prevents accidental multiple upgrades using the same firmware image -- Single device upgrade -- Mass upgrades -- Possibility to divide firmware images in categories -- `REST API <#rest-api>`__ -- `Possibility of writing custom upgraders <#writing-custom-firmware-upgrader-classes>`_ for other - firmware OSes or for custom OpenWRT based firmwares -- Configurable timeouts -- `Extensible <#extending-openwisp-firmware-upgrader>`_ +---- -.. image:: https://raw.githubusercontent.com/openwisp/openwisp2-docs/master/assets/design/openwisp-logo-black.svg - :target: http://openwisp.org - -**For a more complete overview of the OpenWISP modules and architecture**, -see the -`OpenWISP Architecture Overview -`_. +**Need a quick overview?** `Try the OpenWISP Demo +`_. **Want to help OpenWISP?** `Find out how to help us grow here `_. ------------- +---- -.. contents:: **Table of Contents**: - :backlinks: none - :depth: 3 +Firmware upgrader module of OpenWISP. ------------- +Documentation +------------- + +- `Developer documentation + `_ +- `User documentation + `_ Contributing ------------ -Please refer to the `OpenWISP contributing guidelines `_. +Please refer to the `OpenWISP contributing guidelines +`_. Support ------- @@ -81,9 +61,11 @@ See `OpenWISP Support Channels `_. Changelog --------- -See `CHANGES `_. +See `CHANGES +`_. License ------- -See `LICENSE `_. +See `LICENSE +`_. diff --git a/docs/developer/developer-docs.rst b/docs/developer/developer-docs.rst deleted file mode 100644 index ebe4c0b..0000000 --- a/docs/developer/developer-docs.rst +++ /dev/null @@ -1,12 +0,0 @@ -Developers Documentation ------------------------- - -.. include:: /partials/developers-docs-warning.rst - -.. toctree:: - :maxdepth: 1 - - ./installation.rst - ./extending.rst - - diff --git a/docs/developer/extending.rst b/docs/developer/extending.rst index 9191e47..104bc1d 100644 --- a/docs/developer/extending.rst +++ b/docs/developer/extending.rst @@ -1,75 +1,85 @@ -Extending openwisp-firmware-upgrader ------------------------------------- +Extending OpenWISP Firmware Upgrader +==================================== .. include:: /partials/developers-docs-warning.rst -One of the core values of the OpenWISP project is `Software Reusability `_, -for this reason *OpenWISP Firmware Upgrader* provides a set of base classes -which can be imported, extended and reused to create derivative apps. +One of the core values of the OpenWISP project is `Software Reusability +`_, +for this reason *OpenWISP Firmware Upgrader* provides a set of base +classes which can be imported, extended and reused to create derivative +apps. In order to implement your custom version of *OpenWISP Firmware Upgrader*, you need to perform the steps described in this section. -When in doubt, the code in the `test project `_ -and the `sample app `_ -will serve you as source of truth: -just replicate and adapt that code to get a basic derivative of -*OpenWISP Firmware Upgrader* working. +When in doubt, the code in the `test project +`_ +and the `sample app +`_ +will serve you as source of truth: just replicate and adapt that code to +get a basic derivative of *OpenWISP Firmware Upgrader* working. -**Premise**: if you plan on using a customized version of this module, -we suggest to start with it since the beginning, because migrating your data +**Premise**: if you plan on using a customized version of this module, we +suggest to start with it since the beginning, because migrating your data from the default module to your extended version may be time consuming. -1. Initialize your custom module -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +1. Initialize your Custom Module +-------------------------------- The first thing you need to do is to create a new django app which will contain your custom version of *OpenWISP Firmware Upgrader*. -A django app is nothing more than a -`python package `_ -(a directory of python scripts), in the following examples we'll call this django app -``myupgrader``, but you can name it how you want:: +A django app is nothing more than a `python package +`_ (a directory +of python scripts), in the following examples we'll call this django app +``myupgrader``, but you can name it how you want: + +.. code-block:: django-admin startapp myupgrader -Keep in mind that the command mentioned above must be called from a directory -which is available in your `PYTHON_PATH `_ -so that you can then import the result into your project. +Keep in mind that the command mentioned above must be called from a +directory which is available in your `PYTHON_PATH +`_ so that +you can then import the result into your project. -Now you need to add ``myupgrader`` to ``INSTALLED_APPS`` in your ``settings.py``, -ensuring also that ``openwisp_firmware_upgrader`` has been removed: +Now you need to add ``myupgrader`` to ``INSTALLED_APPS`` in your +``settings.py``, ensuring also that ``openwisp_firmware_upgrader`` has +been removed: .. code-block:: python INSTALLED_APPS = [ # ... other apps ... - # 'openwisp_firmware_upgrader' <-- comment out or delete this line - 'myupgrader' + "myupgrader" ] -For more information about how to work with django projects and django apps, -please refer to the `django documentation `_. +For more information about how to work with django projects and django +apps, please refer to the `django documentation +`_. 2. Install ``openwisp-firmware-upgrader`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +----------------------------------------- + +Install (and add to the requirement of your project) +``openwisp-firmware-upgrader``: -Install (and add to the requirement of your project) ``openwisp-firmware-upgrader``:: +.. code-block:: pip install openwisp-firmware-upgrader 3. Add ``EXTENDED_APPS`` -~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------ Add the following to your ``settings.py``: .. code-block:: python - EXTENDED_APPS = ['openwisp_firmware_upgrader'] + EXTENDED_APPS = ["openwisp_firmware_upgrader"] 4. Add ``openwisp_utils.staticfiles.DependencyFinder`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------------ Add ``openwisp_utils.staticfiles.DependencyFinder`` to ``STATICFILES_FINDERS`` in your ``settings.py``: @@ -77,122 +87,139 @@ Add ``openwisp_utils.staticfiles.DependencyFinder`` to .. code-block:: python STATICFILES_FINDERS = [ - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', - 'openwisp_utils.staticfiles.DependencyFinder', + "django.contrib.staticfiles.finders.FileSystemFinder", + "django.contrib.staticfiles.finders.AppDirectoriesFinder", + "openwisp_utils.staticfiles.DependencyFinder", ] 5. Add ``openwisp_utils.loaders.DependencyLoader`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------------------------------------- -Add ``openwisp_utils.loaders.DependencyLoader`` to ``TEMPLATES`` in your ``settings.py``: +Add ``openwisp_utils.loaders.DependencyLoader`` to ``TEMPLATES`` in your +``settings.py``: .. code-block:: python TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'OPTIONS': { - 'loaders': [ - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', - 'openwisp_utils.loaders.DependencyLoader', + "BACKEND": "django.template.backends.django.DjangoTemplates", + "OPTIONS": { + "loaders": [ + "django.template.loaders.filesystem.Loader", + "django.template.loaders.app_directories.Loader", + "openwisp_utils.loaders.DependencyLoader", ], - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", ], }, } ] -6. Inherit the AppConfig class -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +6. Inherit the AppConfig Class +------------------------------ Please refer to the following files in the sample app of the test project: -- `sample_firmware_upgrader/__init__.py `_. -- `sample_firmware_upgrader/apps.py `_. +- `sample_firmware_upgrader/__init__.py + `_. +- `sample_firmware_upgrader/apps.py + `_. You have to replicate and adapt that code in your project. -For more information regarding the concept of ``AppConfig`` please refer to -the `"Applications" section in the django documentation `_. +For more information regarding the concept of ``AppConfig`` please refer +to the `"Applications" section in the django documentation +`_. -7. Create your custom models -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +7. Create your Custom Models +---------------------------- -For the purpose of showing an example, we added a simple "details" field to the -`models of the sample app in the test project `_. +For the purpose of showing an example, we added a simple "details" field +to the `models of the sample app in the test project +`_. You can add fields in a similar way in your ``models.py`` file. -**Note**: for doubts regarding how to use, extend or develop models please refer to -the `"Models" section in the django documentation `_. +**Note**: for doubts regarding how to use, extend or develop models please +refer to the `"Models" section in the django documentation +`_. -8. Add swapper configurations -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +8. Add Swapper Configurations +----------------------------- -Once you have created the models, add the following to your ``settings.py``: +Once you have created the models, add the following to your +``settings.py``: .. code-block:: python # Setting models for swapper module - FIRMWARE_UPGRADER_CATEGORY_MODEL = 'myupgrader.Category' - FIRMWARE_UPGRADER_BUILD_MODEL = 'myupgrader.Build' - FIRMWARE_UPGRADER_FIRMWAREIMAGE_MODEL = 'myupgrader.FirmwareImage' - FIRMWARE_UPGRADER_DEVICEFIRMWARE_MODEL = 'myupgrader.DeviceFirmware' - FIRMWARE_UPGRADER_BATCHUPGRADEOPERATION_MODEL = 'myupgrader.BatchUpgradeOperation' - FIRMWARE_UPGRADER_UPGRADEOPERATION_MODEL = 'myupgrader.UpgradeOperation' + FIRMWARE_UPGRADER_CATEGORY_MODEL = "myupgrader.Category" + FIRMWARE_UPGRADER_BUILD_MODEL = "myupgrader.Build" + FIRMWARE_UPGRADER_FIRMWAREIMAGE_MODEL = "myupgrader.FirmwareImage" + FIRMWARE_UPGRADER_DEVICEFIRMWARE_MODEL = "myupgrader.DeviceFirmware" + FIRMWARE_UPGRADER_BATCHUPGRADEOPERATION_MODEL = ( + "myupgrader.BatchUpgradeOperation" + ) + FIRMWARE_UPGRADER_UPGRADEOPERATION_MODEL = "myupgrader.UpgradeOperation" Substitute ``myupgrader`` with the name you chose in step 1. -9. Create database migrations -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +9. Create Database Migrations +----------------------------- -Create and apply database migrations:: +Create and apply database migrations: + +.. code-block:: shell ./manage.py makemigrations ./manage.py migrate -For more information, refer to the -`"Migrations" section in the django documentation `_. +For more information, refer to the `"Migrations" section in the django +documentation +`_. -10. Create the admin -~~~~~~~~~~~~~~~~~~~~ +10. Create the Admin +-------------------- -Refer to the `admin.py file of the sample app `_. +Refer to the `admin.py file of the sample app +`_. -To introduce changes to the admin, you can do it in two main ways which are described below. +To introduce changes to the admin, you can do it in two main ways which +are described below. -**Note**: for more information regarding how the django admin works, or how it can be customized, -please refer to `"The django admin site" section in the django documentation `_. +For more information regarding how the django admin works, or how it can +be customized, please refer to `"The django admin site" section in the +django documentation +`_. -1. Monkey patching -################## +1. Monkey Patching +~~~~~~~~~~~~~~~~~~ -If the changes you need to add are relatively small, you can resort to monkey patching. +If the changes you need to add are relatively small, you can resort to +monkey patching. For example: .. code-block:: python - from openwisp_firmware_upgrader.admin import ( # noqa + from openwisp_firmware_upgrader.admin import ( BatchUpgradeOperationAdmin, BuildAdmin, CategoryAdmin, ) - BuildAdmin.list_display.insert(1, 'my_custom_field') - BuildAdmin.ordering = ['-my_custom_field'] + BuildAdmin.list_display.insert(1, "my_custom_field") + BuildAdmin.ordering = ["-my_custom_field"] -2. Inheriting admin classes -########################### +2. Inheriting Admin Classes +~~~~~~~~~~~~~~~~~~~~~~~~~~~ -If you need to introduce significant changes and/or you don't want to resort to -monkey patching, you can proceed as follows: +If you need to introduce significant changes and/or you don't want to +resort to monkey patching, you can proceed as follows: .. code-block:: python @@ -204,58 +231,72 @@ monkey patching, you can proceed as follows: ) from openwisp_firmware_upgrader.swapper import load_model - BatchUpgradeOperation = load_model('BatchUpgradeOperation') - Build = load_model('Build') - Category = load_model('Category') - DeviceFirmware = load_model('DeviceFirmware') - FirmwareImage = load_model('FirmwareImage') - UpgradeOperation = load_model('UpgradeOperation') + BatchUpgradeOperation = load_model("BatchUpgradeOperation") + Build = load_model("Build") + Category = load_model("Category") + DeviceFirmware = load_model("DeviceFirmware") + FirmwareImage = load_model("FirmwareImage") + UpgradeOperation = load_model("UpgradeOperation") admin.site.unregister(BatchUpgradeOperation) admin.site.unregister(Build) admin.site.unregister(Category) + class BatchUpgradeOperationAdmin(BaseBatchUpgradeOperationAdmin): # add your changes here + pass + class BuildAdmin(BaseBuildAdmin): # add your changes here + pass + class CategoryAdmin(BaseCategoryAdmin): # add your changes here + pass -11. Create root URL configuration -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +11. Create Root URL Configuration +--------------------------------- -Please refer to the `urls.py `_ +Please refer to the `urls.py +`_ file in the test project. -For more information about URL configuration in django, please refer to the -`"URL dispatcher" section in the django documentation `_. +For more information about URL configuration in django, please refer to +the `"URL dispatcher" section in the django documentation +`_. -12. Create celery.py -~~~~~~~~~~~~~~~~~~~~ +12. Create Celery.py +-------------------- -Please refer to the `celery.py `_ +Please refer to the `celery.py +`_ file in the test project. -For more information about the usage of celery in django, please refer to the -`"First steps with Django" section in the celery documentation `_. +For more information about the usage of celery in django, please refer to +the `"First steps with Django" section in the celery documentation +`_. -13. Import the automated tests -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +13. Import the Automated Tests +------------------------------ When developing a custom application based on this module, it's a good -idea to import and run the base tests too, so that you can be sure the changes -you're introducing are not breaking some of the existing features of *OpenWISP Firmware Upgrader*. +idea to import and run the base tests too, so that you can be sure the +changes you're introducing are not breaking some of the existing features +of *OpenWISP Firmware Upgrader*. -In case you need to add breaking changes, you can overwrite the tests defined -in the base classes to test your own behavior. +In case you need to add breaking changes, you can overwrite the tests +defined in the base classes to test your own behavior. -See the `tests of the sample app `_ +See the `tests of the sample app +`_ to find out how to do this. -You can then run tests with:: +You can then run tests with: + +.. code-block:: # the --parallel flag is optional ./manage.py test --parallel myupgrader @@ -263,21 +304,28 @@ You can then run tests with:: Substitute ``myupgrader`` with the name you chose in step 1. For more information about automated tests in django, please refer to -`"Testing in Django" `_. +`"Testing in Django" +`_. + +Other Base Classes That Can be Inherited and Extended +----------------------------------------------------- -Other base classes that can be inherited and extended -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The following steps are not required and are intended for more advanced +customization. -The following steps are not required and are intended for more advanced customization. +.. _firmware_upgrader_image_download_view: ``FirmwareImageDownloadView`` -############################# +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -This view controls how the firmware images are stored and who has permission to download them. +This view controls how the firmware images are stored and who has +permission to download them. -The full python path is: ``openwisp_firmware_upgrader.private_storage.FirmwareImageDownloadView``. +The full python path is: +``openwisp_firmware_upgrader.private_storage.FirmwareImageDownloadView``. -If you want to extend this view, you will have to perform the additional steps below. +If you want to extend this view, you will have to perform the additional +steps below. Step 1. import and extend view: @@ -285,9 +333,10 @@ Step 1. import and extend view: # myupgrader/views.py from openwisp_firmware_upgrader.private_storage import ( - FirmwareImageDownloadView as BaseFirmwareImageDownloadView + FirmwareImageDownloadView as BaseFirmwareImageDownloadView, ) + class FirmwareImageDownloadView(BaseFirmwareImageDownloadView): # add your customizations here ... pass @@ -296,7 +345,10 @@ Step 2: remove the following line from your root ``urls.py`` file: .. code-block:: python - path('firmware/', include('openwisp_firmware_upgrader.private_storage.urls')), + path( + "firmware/", + include("openwisp_firmware_upgrader.private_storage.urls"), + ), Step 3: add an URL route pointing to your custom view in ``urls.py`` file: @@ -307,25 +359,33 @@ Step 3: add an URL route pointing to your custom view in ``urls.py`` file: urlpatterns = [ # ... other URLs - path('', FirmwareImageDownloadView.as_view(), name='serve_private_file',), + path( + "", + FirmwareImageDownloadView.as_view(), + name="serve_private_file", + ), ] -For more information regarding django views, please refer to the -`"Class based views" section in the django documentation `_. - -API views -~~~~~~~~~ - -If you need to customize the behavior of the API views, the procedure to follow -is similar to the one described in -`FirmwareImageDownloadView <#firmwareimagedownloadview>`_, -with the difference that you may also want to create your own -`serializers `_ -if needed. - -The API code is stored in -`openwisp_firmware_upgrader.api `_ -and is built using `django-rest-framework `_ - -For more information regarding Django REST Framework API views, please refer to the -`"Generic views" section in the Django REST Framework documentation `_. +For more information regarding django views, please refer to the `"Class +based views" section in the django documentation +`_. + +API Views +--------- + +If you need to customize the behavior of the API views, the procedure to +follow is similar to the one described in :ref:`FirmwareImageDownloadView +`, with the difference that you may +also want to create your own `serializers +`_ if +needed. + +The API code is stored in `openwisp_firmware_upgrader.api +`_ +and is built using `django-rest-framework +`_ + +For more information regarding Django REST Framework API views, please +refer to the `"Generic views" section in the Django REST Framework +documentation +`_. diff --git a/docs/developer/index.rst b/docs/developer/index.rst new file mode 100644 index 0000000..20af03f --- /dev/null +++ b/docs/developer/index.rst @@ -0,0 +1,15 @@ +Developer Docs Index +==================== + +.. include:: ../partials/developer-docs.rst + +.. toctree:: + :maxdepth: 2 + + ./installation.rst + ./extending.rst + +Other useful resources: + + - :doc:`../user/rest-api` + - :doc:`../user/settings` diff --git a/docs/developer/installation.rst b/docs/developer/installation.rst index f07ed92..7466da9 100644 --- a/docs/developer/installation.rst +++ b/docs/developer/installation.rst @@ -1,16 +1,17 @@ -Developer installation instructions ------------------------------------ +Developer Installation Instructions +=================================== -.. include:: /partials/developers-docs-warning.rst +.. include:: ../partials/developer-docs.rst Requirements -~~~~~~~~~~~~ +------------ - Python >= 3.8 -- openwisp-controller (and its dependencies) >= 1.0.0 +- :doc:`OpenWISP Controller (and its dependencies) + ` >= 1.0.0 Install Dependencies -~~~~~~~~~~~~~~~~~~~~ +-------------------- Install spatialite and sqlite: @@ -19,23 +20,26 @@ Install spatialite and sqlite: sudo apt-get install sqlite3 libsqlite3-dev openssl libssl-dev sudo apt-get install gdal-bin libproj-dev libgeos-dev libspatialite-dev -.. important:: +Installing for Development +-------------------------- - If you want to add ``openwisp-firmware-upgrader`` in an existing Django - project, then you can take reference from the - `test project in openwisp-firmware-upgrader repository - `_ +Fork and clone the forked repository: -Installing for development -~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. code-block:: shell -Install your forked repo: + git clone git://github.com//openwisp-firmware-upgrader + +Navigate into the cloned repository: .. code-block:: shell - git clone git://github.com//openwisp-firmware-upgrader cd openwisp-firmware-upgrader/ - python setup.py develop + +Launch Redis: + +.. code-block:: shell + + docker-compose up -d redis Install test requirements: @@ -43,6 +47,33 @@ Install test requirements: pip install -r requirements-test.txt +Setup and activate a virtual-environment (we'll be using `virtualenv +`): + +.. code-block:: shell + + python -m virtualenv env + source env/bin/activate + +Make sure that your base python packages are up to date before moving to +the next step: + +.. code-block:: shell + + pip install -U pip wheel setuptools + +Install development dependencies: + +.. code-block:: shell + + pip install -e . + pip install -r requirements-test.txt + sudo npm install -g jshint stylelint + +Install WebDriver for Chromium for your browser version from +https://chromedriver.chromium.org/home and Extract ``chromedriver`` to one +of directories from your ``$PATH`` (example: ``~/.local/bin/``). + Create database: .. code-block:: shell @@ -59,8 +90,8 @@ Launch development server: You can access the admin interface at http://127.0.0.1:8000/admin/. -Run celery and celery-beat with the following commands -(separate terminal windows are needed): +Run celery and celery-beat with the following commands (separate terminal +windows are needed): .. code-block:: shell @@ -81,8 +112,16 @@ Run tests with: # tests for the sample app SAMPLE_APP=1 ./runtests.py --keepdb --failfast -When running the last line of the previous example, the environment variable -``SAMPLE_APP`` activates the app in ``/tests/openwisp2/sample_firmware_upgrader/`` -which is a simple django app that extends ``openwisp-firmware-upgrader`` with -the sole purpose of testing its extensibility, for more information regarding -this concept, read the following section. +When running the last line of the previous example, the environment +variable ``SAMPLE_APP`` activates the app in +``/tests/openwisp2/sample_firmware_upgrader/`` which is a simple django +app that extends ``openwisp-firmware-upgrader`` with the sole purpose of +testing its extensibility, for more information regarding this concept, +read :doc:`extending`. + +.. important:: + + If you want to add ``openwisp-firmware-upgrader`` in an existing + Django project, then you can take reference from the `test project in + openwisp-firmware-upgrader repository + `_ diff --git a/docs/index.rst b/docs/index.rst index 4ab6869..309566e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,40 +1,28 @@ -OpenWISP Firmware Upgrader -========================== +Firmware Upgrader +================= -.. warning:: +A firmware upgrade solution designed specifically for OpenWRT devices, +with the potential to support other embedded operating systems in the +future. It offers a robust and automated upgrade process, featuring +functionalities such as automatic device detection, retry mechanisms for +network failures, mass upgrades, and a REST API for integration. - This is the latest version - - -Firmware upgrade module of OpenWISP. - -.. rubric:: Features - -- Stores information of each upgrade operation which can be seen from the device page -- Automatic retries for recoverable failures - (eg: firmware image upload issues because of intermittent internet connection) -- Performs a final check to find out if the upgrade completed successfully or not -- Prevents accidental multiple upgrades using the same firmware image -- Single device upgrade -- Mass upgrades -- Possibility to divide firmware images in categories -- `REST API <#rest-api>`__ -- `Possibility of writing custom upgraders <#writing-custom-firmware-upgrader-classes>`_ for other - firmware OSes or for custom OpenWRT based firmwares -- Configurable timeouts -- `Extensible <#extending-openwisp-firmware-upgrader>`_ - -.. image:: https://raw.githubusercontent.com/openwisp/openwisp2-docs/master/assets/design/openwisp-logo-black.svg - :target: http://openwisp.org +For a comprehensive overview of features, please refer to the +:doc:`user/intro` page. .. toctree:: + :caption: User Docs :maxdepth: 1 + ./user/intro.rst + ./user/quickstart.rst + ./user/automatic-device-firmware-detection.rst + ./user/custom-firmware-upgrader.rst + ./user/rest-api.rst + ./user/settings.rst - user/Quickstart.rst - user/automatic-device-firmware-detection.rst - user/custom-firmware-upgrader.rst - user/rest-api.rst - user/settings.rst - developer/developer-docs.rst +.. toctree:: + :caption: Developer Docs + :maxdepth: 2 + Developer Docs Index diff --git a/docs/partials/developer-docs.rst b/docs/partials/developer-docs.rst new file mode 100644 index 0000000..4c06f21 --- /dev/null +++ b/docs/partials/developer-docs.rst @@ -0,0 +1,12 @@ +.. note:: + + This documentation page is aimed at developers who want to customize, + change or extend the code of Firmware Upgrader in order to modify its + behavior (eg: for personal or commercial purposes or to fix a bug, + implement a new feature or contribute to the project in general). + + If you aren't a developer and you are looking for information on how + to use OpenWISP, please refer to: + + - :doc:`General OpenWISP Quickstart ` + - :doc:`Firmware Upgrader User Docs ` diff --git a/docs/user/automatic-device-firmware-detection.rst b/docs/user/automatic-device-firmware-detection.rst index 42907b7..630e410 100644 --- a/docs/user/automatic-device-firmware-detection.rst +++ b/docs/user/automatic-device-firmware-detection.rst @@ -1,8 +1,8 @@ -Automatic device firmware detection ------------------------------------ +Automatic Device Firmware Detection +=================================== -*OpenWISP Firmware Upgrader* maintains a data structure for mapping -the firmware image files to board names called ``OPENWRT_FIRMWARE_IMAGE_MAP``. +*OpenWISP Firmware Upgrader* maintains a data structure for mapping the +firmware image files to board names called ``OPENWRT_FIRMWARE_IMAGE_MAP``. Here is an example firmware image item from ``OPENWRT_FIRMWARE_IMAGE_MAP`` @@ -10,22 +10,22 @@ Here is an example firmware image item from ``OPENWRT_FIRMWARE_IMAGE_MAP`` { # Firmware image file name. - 'ar71xx-generic-cf-e320n-v2-squashfs-sysupgrade.bin': { + "ar71xx-generic-cf-e320n-v2-squashfs-sysupgrade.bin": { # Human readable name of the model which is displayed on # the UI - 'label': 'COMFAST CF-E320N v2 (OpenWRT 19.07 and earlier)', + "label": "COMFAST CF-E320N v2 (OpenWRT 19.07 and earlier)", # Tupe of board names with which the different versions # of the hardware are identified on OpenWrt - 'boards': ('COMFAST CF-E320N v2',), + "boards": ("COMFAST CF-E320N v2",), } } -When a device registers on OpenWISP, the `openwisp-config agent -`_ -read the device board name from `/tmp/sysinfo/model` and sends it to OpenWISP. -This value is then saved in the ``Device.model`` field. -*OpenWISP Firmware Upgrader* uses this field to automatically detect -the correct firmware image for the device. +When a device registers on OpenWISP, the :doc:`openwisp-config agent +` reads the device board name from +`/tmp/sysinfo/model` and sends it to OpenWISP. This value is then saved in +the ``Device.model`` field. *OpenWISP Firmware Upgrader* uses this field +to automatically detect the correct firmware image for the device. -Use the :ref:`OPENWISP_CUSTOM_OPENWRT_IMAGES <#openwisp_custom_openwrt_images>`_ -setting to add additional firmware image in your project. +Use the :ref:`OPENWISP_CUSTOM_OPENWRT_IMAGES +` setting to add additional firmware image +in your project. diff --git a/docs/user/custom-firmware-upgrader.rst b/docs/user/custom-firmware-upgrader.rst index 7eeb683..380541a 100644 --- a/docs/user/custom-firmware-upgrader.rst +++ b/docs/user/custom-firmware-upgrader.rst @@ -1,8 +1,8 @@ Writing Custom Firmware Upgrader Classes ----------------------------------------- +======================================== -You can write custom upgraders for other firmware OSes or for -custom OpenWrt based firmwares. +You can write custom upgraders for other firmware OSes or for custom +OpenWrt based firmwares. Here is an example custom OpenWrt firmware upgrader class: @@ -10,20 +10,22 @@ Here is an example custom OpenWrt firmware upgrader class: from openwisp_firmware_upgrader.upgraders.openwrt import OpenWrt + class CustomOpenWrtBasedFirmware(OpenWrt): # this firmware uses a custom upgrade command - UPGRADE_COMMAND = 'upgrade_firmware.sh --keep-config' + UPGRADE_COMMAND = "upgrade_firmware.sh --keep-config" # it takes somewhat more time to boot so it needs more time RECONNECT_DELAY = 150 RECONNECT_RETRY_DELAY = 5 RECONNECT_MAX_RETRIES = 20 def get_remote_path(self, image): - return '/tmp/firmware.img' + return "/tmp/firmware.img" def get_upgrade_command(self, path): return self.UPGRADE_COMMAND -You will need to place your custom upgrader class on the python path -of your application and then add this path to the :ref:`OPENWISP_FIRMWARE_UPGRADERS_MAP -<#openwisp_firmware_upgraders_map>`_ setting. +You will need to place your custom upgrader class on the python path of +your application and then add this path to the +:ref:`OPENWISP_FIRMWARE_UPGRADERS_MAP ` +setting. diff --git a/docs/user/intro.rst b/docs/user/intro.rst new file mode 100644 index 0000000..4892ccf --- /dev/null +++ b/docs/user/intro.rst @@ -0,0 +1,18 @@ +Firmware Upgrader: Features +=========================== + +- Stores information of each upgrade operation which can be seen from the + device page +- Automatic retries for recoverable failures (eg: firmware image upload + issues because of intermittent internet connection) +- Performs a final check to find out if the upgrade completed successfully + or not +- Prevents accidental multiple upgrades using the same firmware image +- Single device upgrade +- Mass upgrades +- Possibility to divide firmware images in categories +- :doc:`REST API ` +- :doc:`Possibility of writing custom upgraders + ` for other firmware OSes or for custom + OpenWRT based firmwares +- Configurable timeouts diff --git a/docs/user/quickstart.rst b/docs/user/quickstart.rst index f36e437..08dbc5a 100644 --- a/docs/user/quickstart.rst +++ b/docs/user/quickstart.rst @@ -1,102 +1,113 @@ Quickstart Guide ----------------- +================ -Requirements: +Requirements +------------ -- Devices running at least OpenWRT 12.09 Attitude Adjustment, older versions - of OpenWRT have not worked at all in our tests -- Devices must have enough free RAM to be able to upload the - new image to ``/tmp`` +- Devices running at least OpenWRT 12.09 Attitude Adjustment, older + versions of OpenWRT have not worked at all in our tests +- Devices must have enough free RAM to be able to upload the new image to + ``/tmp`` -1. Create a category -~~~~~~~~~~~~~~~~~~~~ +1. Create a Category +-------------------- -Create a category for your firmware images -by going to *Firmware management > Firmware categories > Add firmware category*, -if you use only one firmware type in your network, you could simply -name the category "default" or "standard". +Create a category for your firmware images by going to *Firmware +management > Firmware categories > Add firmware category*, if you use only +one firmware type in your network, you could simply name the category +"default" or "standard". .. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-category.gif + :target: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-category.gif -If you use multiple firmware images with different features, create one category -for each firmware type, eg: +If you use multiple firmware images with different features, create one +category for each firmware type, eg: - WiFi - SDN router - LoRa Gateway This is necessary in order to perform mass upgrades only on specific -firmware categories when, for example, a new *LoRa Gateway* firmware becomes available. +firmware categories when, for example, a new *LoRa Gateway* firmware +becomes available. -2. Create the build object -~~~~~~~~~~~~~~~~~~~~~~~~~~ +2. Create the Build Object +-------------------------- -Create a build a build object by going to -*Firmware management > Firmware builds > Add firmware build*, -the build object is related to a firmware category and is the collection of the -different firmware images which have been compiled for the different hardware models -supported by the system. +Create a build a build object by going to *Firmware management > Firmware +builds > Add firmware build*, the build object is related to a firmware +category and is the collection of the different firmware images which have +been compiled for the different hardware models supported by the system. -The version field indicates the firmware version, the change log field is optional but -we recommend filling it to help operators know the differences between each version. +The version field indicates the firmware version, the change log field is +optional but we recommend filling it to help operators know the +differences between each version. .. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-build.gif + :target: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-build.gif -An important but optional field of the build model is **OS identifier**, this field -should match the value of the **Operating System** field which gets automatically filled -during device registration, eg: ``OpenWrt 19.07-SNAPSHOT r11061-6ffd4d8a4d``. -It is used by the firmware-upgrader module to automatically -create ``DeviceFirmware`` objects for existing devices or when new devices register. -A ``DeviceFirmware`` object represent the relationship between a device and a firmware image, -it basically tells us which firmware image is installed on the device. +An important but optional field of the build model is **OS identifier**, +this field should match the value of the **Operating System** field which +gets automatically filled during device registration, eg: ``OpenWrt +19.07-SNAPSHOT r11061-6ffd4d8a4d``. It is used by the firmware-upgrader +module to automatically create ``DeviceFirmware`` objects for existing +devices or when new devices register. A ``DeviceFirmware`` object +represent the relationship between a device and a firmware image, it +basically tells us which firmware image is installed on the device. -To find out the exact value to use, you should either do a -test flash on a device and register it to the system or you should inspect the firmware image -by decompressing it and find the generated value in the firmware image. +To find out the exact value to use, you should either do a test flash on a +device and register it to the system or you should inspect the firmware +image by decompressing it and find the generated value in the firmware +image. -If you're not sure about what **OS identifier** to use, just leave it empty, you can fill -it later on when you find out. +If you're not sure about what **OS identifier** to use, just leave it +empty, you can fill it later on when you find out. Now save the build object to create it. -3. Upload images to the build -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +3. Upload Images to the Build +----------------------------- -Now is time to add images to the build, we suggest adding one image at time. -Alternatively the `REST API <#rest-api>`__ can be used to automate this step. +Now is time to add images to the build, we suggest adding one image at +time. Alternatively the :doc:`REST API ` can be used to automate +this step. .. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-firmwareimage.gif + :target: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-firmwareimage.gif If you use a hardware model which is not listed in the image types, if the -hardware model is officially supported by OpenWRT, you can send us a pull-request to add it, -otherwise you can use :ref:`the setting OPENWISP_CUSTOM_OPENWRT_IMAGES <#openwisp_custom_openwrt_images>`__ -to add it. +hardware model is officially supported by OpenWRT, you can send us a +pull-request to add it, otherwise you can use :ref:`the setting +OPENWISP_CUSTOM_OPENWRT_IMAGES ` to add +it. -4. Perform a firmware upgrade to a specific device -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +4. Perform a Firmware Upgrade to a Specific Device +-------------------------------------------------- .. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-devicefirmware.gif + :target: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-devicefirmware.gif -Once a new build is ready, has been created in the system and its image have been uploaded, -it will be the time to finally upgrade our devices. +Once a new build is ready, has been created in the system and its image +have been uploaded, it will be the time to finally upgrade our devices. To perform the upgrade of a single device, navigate to the device details, then go to the "Firmware" tab. -If you correctly filled **OS identifier** in step 2, you should have a situation -similar to the one above: in this example, the device is using version ``1.0`` -and we want to upgrade it to version ``2.0``, once the new firmware image -is selected we just have to hit save, then a new tab will appear in the device page -which allows us to see what's going on during the upgrade. +If you correctly filled **OS identifier** in step 2, you should have a +situation similar to the one above: in this example, the device is using +version ``1.0`` and we want to upgrade it to version ``2.0``, once the new +firmware image is selected we just have to hit save, then a new tab will +appear in the device page which allows us to see what's going on during +the upgrade. -Right now, the update of the upgrade information is not asynchronous yet, so you will -have to reload the page periodically to find new information. This will be addressed -in a future release. +Right now, the update of the upgrade information is not asynchronous yet, +so you will have to reload the page periodically to find new information. +This will be addressed in a future release. -5. Performing mass upgrades -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +5. Performing Mass Upgrades +--------------------------- -First of all, please ensure the following preconditions are met: +Before proceeding, please ensure the following preconditions are met: - the system is configured correctly - the new firmware images are working as expected @@ -105,18 +116,20 @@ First of all, please ensure the following preconditions are met: At this stage you can try a mass upgrade by doing the following: - go to the build list page -- select the build which contains the latest firmware images you - want the devices to be upgraded with +- select the build which contains the latest firmware images you want the + devices to be upgraded with - click on "Mass-upgrade devices related to the selected build". .. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-batch-upgrade.gif + :target: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-batch-upgrade.gif -At this point you should see a summary page which will inform you of which devices -are going to be upgraded, you can either confirm the operation or cancel. +At this point you should see a summary page which will inform you of which +devices are going to be upgraded, you can either confirm the operation or +cancel. -Once the operation is confirmed you will be redirected to a page in which you -can monitor the progress of the upgrade operations. +Once the operation is confirmed you will be redirected to a page in which +you can monitor the progress of the upgrade operations. -Right now, the update of the upgrade information is not asynchronous yet, so you will -have to reload the page periodically to find new information. This will be addressed -in a future release. +Right now, the update of the upgrade information is not asynchronous yet, +so you will have to reload the page periodically to find new information. +This will be addressed in a future release. diff --git a/docs/user/rest-api.rst b/docs/user/rest-api.rst index 942755d..e72a604 100644 --- a/docs/user/rest-api.rst +++ b/docs/user/rest-api.rst @@ -1,50 +1,59 @@ -REST API --------- +REST API Reference +================== -To enable the API the setting -`OPENWISP_FIRMWARE_UPGRADER_API <#openwisp-firmware-upgrader-api>`_ -must be set to ``True``. +.. note:: -Live documentation -~~~~~~~~~~~~~~~~~~ + To enable the API, the setting :ref:`OPENWISP_FIRMWARE_UPGRADER_API + ` must be set to ``True``. + +.. _firmware_upgrader_live_documentation: + +Live Documentation +------------------ .. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/api-docs.png + :target: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/api-docs.png -A general live API documentation (following the OpenAPI specification) at ``/api/v1/docs/``. +A general live API documentation (following the OpenAPI specification) at +``/api/v1/docs/``. -Browsable web interface -~~~~~~~~~~~~~~~~~~~~~~~ +.. _firmware_upgrader_browsable_web_interface: + +Browsable Web Interface +----------------------- .. image:: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/api-ui.png + :target: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/api-ui.png -Additionally, opening any of the endpoints `listed below <#list-of-endpoints>`_ -directly in the browser will show the `browsable API interface of Django-REST-Framework -`_, -which makes it even easier to find out the details of each endpoint. +Additionally, opening any of the endpoints :ref:`listed below +` directly in the browser will show the +`browsable API interface of Django-REST-Framework +`_, which +makes it even easier to find out the details of each endpoint. Authentication -~~~~~~~~~~~~~~ +-------------- -See openwisp-users: `authenticating with the user token -`_. +See openwisp-users: :ref:`authenticating with the user token +`. -When browsing the API via the `Live documentation <#live-documentation>`_ -or the `Browsable web page <#browsable-web-interface>`_, you can also use +When browsing the API via the :ref:`firmware_upgrader_live_documentation` +or the :ref:`firmware_upgrader_browsable_web_interface`, you can also use the session authentication by logging in the django admin. Pagination -~~~~~~~~~~ +---------- -All *list* endpoints support the ``page_size`` parameter that allows paginating -the results in conjunction with the ``page`` parameter. +All *list* endpoints support the ``page_size`` parameter that allows +paginating the results in conjunction with the ``page`` parameter. .. code-block:: text GET /api/v1/firmware-upgrader/build/?page_size=10 GET /api/v1/firmware-upgrader/build/?page_size=10&page=2 -Filtering by organization slug -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Filtering by Organization Slug +------------------------------ Most endpoints allow to filter by organization slug, eg: @@ -52,16 +61,19 @@ Most endpoints allow to filter by organization slug, eg: GET /api/v1/firmware-upgrader/build/?organization=org-slug -List of endpoints -~~~~~~~~~~~~~~~~~ +.. _firmware_upgrader_list_endpoints: -Since the detailed explanation is contained in the `Live documentation <#live-documentation>`_ -and in the `Browsable web page <#browsable-web-interface>`_ of each point, -here we'll provide just a list of the available endpoints, -for further information please open the URL of the endpoint in your browser. +List of Endpoints +----------------- -List mass upgrade operations -############################ +Since the detailed explanation is contained in the +:ref:`firmware_upgrader_live_documentation` and in the +:ref:`firmware_upgrader_browsable_web_interface` of each point, here we'll +provide just a list of the available endpoints, for further information +please open the URL of the endpoint in your browser. + +List Mass Upgrade Operations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text @@ -81,15 +93,15 @@ Here's a few examples: GET /api/v1/firmware-upgrader/batch-upgrade-operation/?build={build_id} GET /api/v1/firmware-upgrader/batch-upgrade-operation/?status={status} -Get mass upgrade operation detail -################################# +Get Mass Upgrade Operation Detail +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text GET /api/v1/firmware-upgrader/batch-upgrade-operation/{id}/ -List firmware builds -#################### +List Firmware Builds +~~~~~~~~~~~~~~~~~~~~ .. code-block:: text @@ -100,7 +112,7 @@ List firmware builds The list of firmware builds provides the following filters: - ``category`` (Firmware category ID) -- ``version`` (Firmware build version) +- ``version`` (Firmware build version) - ``os`` (Firmware build os identifier) Here's a few examples: @@ -111,43 +123,43 @@ Here's a few examples: GET /api/v1/firmware-upgrader/build/?version={version} GET /api/v1/firmware-upgrader/build/?os={os} -Create firmware build -##################### +Create Firmware Build +~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text POST /api/v1/firmware-upgrader/build/ -Get firmware build details -########################## +Get Firmware Build Details +~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text GET /api/v1/firmware-upgrader/build/{id}/ -Change details of firmware build -################################ +Change Details of Firmware Build +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text PUT /api/v1/firmware-upgrader/build/{id}/ -Patch details of firmware build -############################### +Patch Details of Firmware Build +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text PATCH /api/v1/firmware-upgrader/build/{id}/ -Delete firmware build -##################### +Delete Firmware Build +~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text DELETE /api/v1/firmware-upgrader/build/{id}/ -Get list of images of a firmware build -###################################### +Get List of Images of a Firmware Build +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text @@ -155,43 +167,43 @@ Get list of images of a firmware build **Available filters** -The list of images of a firmware build can be filtered by using -``type`` (any one of the available firmware image types). +The list of images of a firmware build can be filtered by using ``type`` +(any one of the available firmware image types). .. code-block:: text GET /api/v1/firmware-upgrader/build/{id}/image/?type={type} -Upload new firmware image to the build -###################################### +Upload New Firmware Image to the Build +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text POST /api/v1/firmware-upgrader/build/{id}/image/ -Get firmware image details -########################## +Get Firmware Image Details +~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text GET /api/v1/firmware-upgrader/build/{build_id}/image/{id}/ -Delete firmware image -##################### +Delete Firmware Image +~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text DELETE /api/v1/firmware-upgrader/build/{build_id}/image/{id}/ -Download firmware image -####################### +Download Firmware Image +~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text GET /api/v1/firmware-upgrader/build/{build_id}/image/{id}/download/ -Perform batch upgrade -##################### +Perform Batch Upgrade +~~~~~~~~~~~~~~~~~~~~~ Upgrades all the devices related to the specified build ID. @@ -199,63 +211,63 @@ Upgrades all the devices related to the specified build ID. POST /api/v1/firmware-upgrader/build/{id}/upgrade/ -Dry-run batch upgrade -##################### +Dry-run Batch Upgrade +~~~~~~~~~~~~~~~~~~~~~ Returns a list representing the ``DeviceFirmware`` and ``Device`` instances that would be upgraded if POST is used. -``Device`` objects are indicated only when no ``DeviceFirmware`` -object exists for a device which would be upgraded. +``Device`` objects are indicated only when no ``DeviceFirmware`` object +exists for a device which would be upgraded. .. code-block:: text GET /api/v1/firmware-upgrader/build/{id}/upgrade/ -List firmware categories -######################## +List Firmware Categories +~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text GET /api/v1/firmware-upgrader/category/ -Create new firmware category -############################ +Create New Firmware Category +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text POST /api/v1/firmware-upgrader/category/ -Get firmware category details -############################# +Get Firmware Category Details +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text GET /api/v1/firmware-upgrader/category/{id}/ -Change the details of a firmware category -######################################### +Change the Details of a Firmware Category +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text PUT /api/v1/firmware-upgrader/category/{id}/ -Patch the details of a firmware category -######################################## +Patch the Details of a Firmware Category +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text PATCH /api/v1/firmware-upgrader/category/{id}/ -Delete a firmware category -########################## +Delete a Firmware Category +~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text DELETE /api/v1/firmware-upgrader/category/{id}/ -List upgrade operations -####################### +List Upgrade Operations +~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text @@ -266,12 +278,11 @@ List upgrade operations The list of upgrade operations provides the following filters: - ``device__organization`` (Organization ID of the device) -- ``device__organization_slug`` (Organization slug of the device) +- ``device__organization_slug`` (Organization slug of the device) - ``device`` (Device ID) - ``image`` (Firmware image ID) - ``status`` (One of: in-progress, success, failed, aborted) - Here's a few examples: .. code-block:: text @@ -282,15 +293,15 @@ Here's a few examples: GET /api/v1/firmware-upgrader/upgrade-operation/?image={image_id} GET /api/v1/firmware-upgrader/upgrade-operation/?status={status} -Get upgrade operation details -############################# +Get Upgrade Operation Details +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text GET /api/v1/firmware-upgrader/upgrade-operation/{id} -List device upgrade operations -############################## +List Device Upgrade Operations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text @@ -298,46 +309,46 @@ List device upgrade operations **Available filters** -The list of device upgrade operations can be filtered by -``status`` (one of: in-progress, success, failed, aborted). +The list of device upgrade operations can be filtered by ``status`` (one +of: in-progress, success, failed, aborted). .. code-block:: text GET /api/v1/firmware-upgrader/device/{device_id}/upgrade-operation/?status={status} -Create device firmware -###################### +Create Device Firmware +~~~~~~~~~~~~~~~~~~~~~~ -Sending a PUT request to the endpoint below will -create a new device firmware if it does not already exist. +Sending a PUT request to the endpoint below will create a new device +firmware if it does not already exist. .. code-block:: text PUT /api/v1/firmware-upgrader/device/{device_id}/firmware/ -Get device firmware details -########################### +Get Device Firmware Details +~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text GET /api/v1/firmware-upgrader/device/{device_id}/firmware/ -Change details of device firmware -################################# +Change Details of Device Firmware +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text PUT /api/v1/firmware-upgrader/device/{device_id}/firmware/ -Patch details of device firmware -################################# +Patch Details of Device Firmware +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text PATCH /api/v1/firmware-upgrader/device/{device_id}/firmware/ -Delete device firmware -###################### +Delete Device Firmware +~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text diff --git a/docs/user/settings.rst b/docs/user/settings.rst index 18a5188..efb10c7 100644 --- a/docs/user/settings.rst +++ b/docs/user/settings.rst @@ -1,103 +1,102 @@ Settings --------- +======== ``OPENWISP_FIRMWARE_UPGRADER_RETRY_OPTIONS`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------------------------------- -+--------------+--------------+ -| **type**: | ``dict`` | -+--------------+--------------+ -| **default**: | see below | -+--------------+--------------+ +============ ========= +**type**: ``dict`` +**default**: see below +============ ========= .. code-block:: python # default value of OPENWISP_FIRMWARE_UPGRADER_RETRY_OPTIONS: dict( - max_retries=4, - retry_backoff=60, - retry_backoff_max=600, - retry_jitter=True, + max_retries=4, + retry_backoff=60, + retry_backoff_max=600, + retry_jitter=True, ) Retry settings for recoverable failures during firmware upgrades. By default if an upgrade operation fails before the firmware is flashed -(eg: because of a network issue during the upload of the image), -the upgrade operation will be retried 4 more times with an exponential -random backoff and a maximum delay of 10 minutes. +(eg: because of a network issue during the upload of the image), the +upgrade operation will be retried 4 more times with an exponential random +backoff and a maximum delay of 10 minutes. -For more information regarding these settings, consult the `celery documentation -regarding automatic retries for known errors +For more information regarding these settings, consult the `celery +documentation regarding automatic retries for known errors `_. ``OPENWISP_FIRMWARE_UPGRADER_TASK_TIMEOUT`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------- -+--------------+--------------+ -| **type**: | ``int`` | -+--------------+--------------+ -| **default**: | ``600`` | -+--------------+--------------+ +============ ======= +**type**: ``int`` +**default**: ``600`` +============ ======= Timeout for the background tasks which perform firmware upgrades. -If for some unexpected reason an upgrade remains stuck for more than 10 minutes, -the upgrade operation will be flagged as failed and the task will be killed. +If for some unexpected reason an upgrade remains stuck for more than 10 +minutes, the upgrade operation will be flagged as failed and the task will +be killed. This should not happen, but a global task time out is a best practice when -using background tasks because it prevents the situation in which an unexpected -bug causes a specific task to hang, which will quickly fill all the available -slots in a background queue and prevent other tasks from being executed, which -will end up affecting negatively the rest of the application. +using background tasks because it prevents the situation in which an +unexpected bug causes a specific task to hang, which will quickly fill all +the available slots in a background queue and prevent other tasks from +being executed, which will end up affecting negatively the rest of the +application. .. _openwisp_custom_openwrt_images: ``OPENWISP_CUSTOM_OPENWRT_IMAGES`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +---------------------------------- -+--------------+-------------+ -| **type**: | ``tuple`` | -+--------------+-------------+ -| **default**: | ``None`` | -+--------------+-------------+ +============ ========= +**type**: ``tuple`` +**default**: ``None`` +============ ========= This setting can be used to extend the list of firmware image types -included in *OpenWISP Firmware Upgrader*. This setting is suited to -add support for custom OpenWrt images. +included in *OpenWISP Firmware Upgrader*. This setting is suited to add +support for custom OpenWrt images. .. code-block:: python OPENWISP_CUSTOM_OPENWRT_IMAGES = ( ( # Firmware image file name. - 'customimage-squashfs-sysupgrade.bin', { + "customimage-squashfs-sysupgrade.bin", + { # Human readable name of the model which is displayed on # the UI - 'label': 'Custom WAP-1200', + "label": "Custom WAP-1200", # Tuple of board names with which the different versions of # the hardware are identified on OpenWrt - 'boards': ('CWAP1200',) - } + "boards": ("CWAP1200",), + }, ), ) -Kindly read `"Automatic detection of firmware of device" -<#automatic-device-firmware-detection>`_ -section of this documentation to know how *OpenWISP Firmware Upgrader* -uses this setting in upgrades. +Kindly read :doc:`automatic-device-firmware-detection` section of this +documentation to know how *OpenWISP Firmware Upgrader* uses this setting +in upgrades. ``OPENWISP_FIRMWARE_UPGRADER_MAX_FILE_SIZE`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------------------------------- -+--------------+------------------------------+ -| **type**: | ``int`` | -+--------------+------------------------------+ -| **default**: | ``30 * 1024 * 1024`` (30 MB) | -+--------------+------------------------------+ +============ ============================ +**type**: ``int`` +**default**: ``30 * 1024 * 1024`` (30 MB) +============ ============================ -This setting can be used to set the maximum size limit for firmware images, eg: +This setting can be used to set the maximum size limit for firmware +images, eg: .. code-block:: python @@ -107,59 +106,57 @@ This setting can be used to set the maximum size limit for firmware images, eg: - Value must be specified in bytes. ``None`` means unlimited. +.. _openwisp_firmware_upgrader_api: + ``OPENWISP_FIRMWARE_UPGRADER_API`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +---------------------------------- -+--------------+-----------+ -| **type**: | ``bool`` | -+--------------+-----------+ -| **default**: | ``True`` | -+--------------+-----------+ +============ ======== +**type**: ``bool`` +**default**: ``True`` +============ ======== Indicates whether the API for Firmware Upgrader is enabled or not. ``OPENWISP_FIRMWARE_UPGRADER_OPENWRT_SETTINGS`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +----------------------------------------------- -+--------------+-----------+ -| **type**: | ``dict`` | -+--------------+-----------+ -| **default**: | ``{}`` | -+--------------+-----------+ +============ ======== +**type**: ``dict`` +**default**: ``{}`` +============ ======== Allows changing the default OpenWRT upgrader settings, eg: .. code-block:: python OPENWISP_FIRMWARE_UPGRADER_OPENWRT_SETTINGS = { - 'reconnect_delay': 120, - 'reconnect_retry_delay': 20, - 'reconnect_max_retries': 15, - 'upgrade_timeout': 90, + "reconnect_delay": 120, + "reconnect_retry_delay": 20, + "reconnect_max_retries": 15, + "upgrade_timeout": 90, } - ``reconnect_delay``: amount of seconds to wait before trying to connect - again to the device after the upgrade command has been launched; - the re-connection step is necessary to verify the upgrade has completed successfully; - defaults to ``120`` seconds + again to the device after the upgrade command has been launched; the + re-connection step is necessary to verify the upgrade has completed + successfully; defaults to ``120`` seconds - ``reconnect_retry_delay``: amount of seconds to wait after a - re-connection attempt has failed; - defaults to ``20`` seconds -- ``reconnect_max_retries``: maximum re-connection attempts - defaults to ``15`` attempts -- ``upgrade_timeout``: amount of seconds before the shell session - is closed after the upgrade command is launched on the device, - useful in case the upgrade command hangs (it happens on older OpenWRT versions); + re-connection attempt has failed; defaults to ``20`` seconds +- ``reconnect_max_retries``: maximum re-connection attempts defaults to + ``15`` attempts +- ``upgrade_timeout``: amount of seconds before the shell session is + closed after the upgrade command is launched on the device, useful in + case the upgrade command hangs (it happens on older OpenWRT versions); defaults to ``90`` seconds ``OPENWISP_FIRMWARE_API_BASEURL`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +--------------------------------- -+--------------+-----------------------------------+ -| **type**: | ``dict`` | -+--------------+-----------------------------------+ -| **default**: | ``/`` (points to same server) | -+--------------+-----------------------------------+ +============ ============================= +**type**: ``dict`` +**default**: ``/`` (points to same server) +============ ============================= If you have a seperate instance of openwisp-firmware-upgrader API on a different domain, you can use this option to change the base of the image @@ -169,39 +166,39 @@ example value: ``https://myfirmware.myapp.com``. .. _openwisp_firmware_upgraders_map: ``OPENWISP_FIRMWARE_UPGRADERS_MAP`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+--------------+-------------------------------------------------------------------------------------------------------------------------------+ -| **type**: | ``dict`` | -+--------------+-------------------------------------------------------------------------------------------------------------------------------+ -| **default**: | .. code-block:: python | -| | | -| | { | -| | 'openwisp_controller.connection.connectors.openwrt.ssh.OpenWrt': 'openwisp_firmware_upgrader.upgraders.openwrt.OpenWrt', | -| | } | -+--------------+-------------------------------------------------------------------------------------------------------------------------------+ +----------------------------------- + +============ ================================================================================================================================ +**type**: ``dict`` +**default**: .. code-block:: python + + { + "openwisp_controller.connection.connectors.openwrt.ssh.OpenWrt": "openwisp_firmware_upgrader.upgraders.openwrt.OpenWrt", + } +============ ================================================================================================================================ A dictionary that maps update strategies to upgraders. -If you want to use a custom update strategy you will need to use this setting -to provide an entry with the class path of your update strategy as the key. +If you want to use a custom update strategy you will need to use this +setting to provide an entry with the class path of your update strategy as +the key. -If you need to use a `custom upgrader class <#writing-custom-firmware-upgrader-classes>`_ -you will need to use this setting to provide an entry with the class path of your upgrader -as the value. +If you need to use a :doc:`custom upgrader class +` you will need to use this setting to provide +an entry with the class path of your upgrader as the value. ``OPENWISP_FIRMWARE_PRIVATE_STORAGE_INSTANCE`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +---------------------------------------------- -+--------------+-------------------------------------------------------------------------------------+ -| **type**: | ``str`` | -+--------------+-------------------------------------------------------------------------------------+ -| **default**: | ``openwisp_firmware_upgrader.private_storage.storage.file_system_private_storage`` | -+--------------+-------------------------------------------------------------------------------------+ +============ ================================================================================== +**type**: ``str`` +**default**: ``openwisp_firmware_upgrader.private_storage.storage.file_system_private_storage`` +============ ================================================================================== Dotted path to an instance of any one of the storage classes in -`private_storage `_. +`private_storage +`_. This instance is used to store firmware image files. -By default, an instance of ``private_storage.storage.files.PrivateFileSystemStorage`` -is used. +By default, an instance of +``private_storage.storage.files.PrivateFileSystemStorage`` is used. From 416d19eaa5d1a21ec3afb32c90de5c37cad09fda Mon Sep 17 00:00:00 2001 From: Gagan Deep Date: Fri, 14 Jun 2024 15:41:43 +0530 Subject: [PATCH 06/18] [skip ci] Fixed settings docs --- docs/user/settings.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/user/settings.rst b/docs/user/settings.rst index efb10c7..12685ac 100644 --- a/docs/user/settings.rst +++ b/docs/user/settings.rst @@ -1,6 +1,8 @@ Settings ======== +.. include:: /partials/settings-note.rst + ``OPENWISP_FIRMWARE_UPGRADER_RETRY_OPTIONS`` -------------------------------------------- From bab5aeb82de89b085a5ea2559256f32369933504 Mon Sep 17 00:00:00 2001 From: Gagan Deep Date: Fri, 14 Jun 2024 18:16:41 +0530 Subject: [PATCH 07/18] [skip ci] Fixed partial --- docs/developer/extending.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developer/extending.rst b/docs/developer/extending.rst index 104bc1d..9cfee76 100644 --- a/docs/developer/extending.rst +++ b/docs/developer/extending.rst @@ -1,7 +1,7 @@ Extending OpenWISP Firmware Upgrader ==================================== -.. include:: /partials/developers-docs-warning.rst +.. include:: ../partials/developer-docs.rst One of the core values of the OpenWISP project is `Software Reusability `_, From 8f35f4ac59376c3a13f09a01616803c94769c7fc Mon Sep 17 00:00:00 2001 From: Gagan Deep Date: Wed, 19 Jun 2024 19:18:48 +0530 Subject: [PATCH 08/18] [skip ci] Point to Django 4.2 docs --- docs/developer/extending.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/developer/extending.rst b/docs/developer/extending.rst index 9cfee76..e674e75 100644 --- a/docs/developer/extending.rst +++ b/docs/developer/extending.rst @@ -57,7 +57,7 @@ been removed: For more information about how to work with django projects and django apps, please refer to the `django documentation -`_. +`_. 2. Install ``openwisp-firmware-upgrader`` ----------------------------------------- @@ -133,7 +133,7 @@ You have to replicate and adapt that code in your project. For more information regarding the concept of ``AppConfig`` please refer to the `"Applications" section in the django documentation -`_. +`_. 7. Create your Custom Models ---------------------------- @@ -146,7 +146,7 @@ You can add fields in a similar way in your ``models.py`` file. **Note**: for doubts regarding how to use, extend or develop models please refer to the `"Models" section in the django documentation -`_. +`_. 8. Add Swapper Configurations ----------------------------- @@ -180,7 +180,7 @@ Create and apply database migrations: For more information, refer to the `"Migrations" section in the django documentation -`_. +`_. 10. Create the Admin -------------------- @@ -194,7 +194,7 @@ are described below. For more information regarding how the django admin works, or how it can be customized, please refer to `"The django admin site" section in the django documentation -`_. +`_. 1. Monkey Patching ~~~~~~~~~~~~~~~~~~ @@ -266,7 +266,7 @@ file in the test project. For more information about URL configuration in django, please refer to the `"URL dispatcher" section in the django documentation -`_. +`_. 12. Create Celery.py -------------------- @@ -305,7 +305,7 @@ Substitute ``myupgrader`` with the name you chose in step 1. For more information about automated tests in django, please refer to `"Testing in Django" -`_. +`_. Other Base Classes That Can be Inherited and Extended ----------------------------------------------------- @@ -368,7 +368,7 @@ Step 3: add an URL route pointing to your custom view in ``urls.py`` file: For more information regarding django views, please refer to the `"Class based views" section in the django documentation -`_. +`_. API Views --------- From 082d326a910d3922a3133aeb9b9badb801194410 Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Thu, 11 Jul 2024 18:17:16 -0400 Subject: [PATCH 09/18] [docs] Added link to github repo --- docs/index.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index 309566e..5dbab5a 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,6 +1,9 @@ Firmware Upgrader ================= +**Source code**: `github.com/openwisp/openwisp-firmware-upgrader +`_. + A firmware upgrade solution designed specifically for OpenWRT devices, with the potential to support other embedded operating systems in the future. It offers a robust and automated upgrade process, featuring From 6a7817975b0fe7581e9a06dc1d21d529de806f7a Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Sat, 13 Jul 2024 14:22:02 -0400 Subject: [PATCH 10/18] [docs] OpenWRT > OpenWrt --- CHANGES.rst | 78 ++++++++-------- docs/index.rst | 2 +- .../automatic-device-firmware-detection.rst | 2 +- docs/user/intro.rst | 2 +- docs/user/quickstart.rst | 6 +- docs/user/settings.rst | 4 +- openwisp_firmware_upgrader/hardware.py | 90 +++++++++---------- .../upgraders/openwisp.py | 2 +- .../upgraders/openwrt.py | 2 +- 9 files changed, 94 insertions(+), 94 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index bfc4882..0ee2eaf 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -38,52 +38,52 @@ Features - Added following firmwares to the default firmware image map: - Custom WAP-1200 - - COMFAST CF-E320N v2 (OpenWRT 19.07 and earlier) + - COMFAST CF-E320N v2 (OpenWrt 19.07 and earlier) - EnGenius EAP1300 - Linksys WRT1900ACS - Linksys WRT3200ACM - Raspberry Pi 2 Model B - Raspberry Pi 3 Model B - - TP-Link Archer C7 v1 (OpenWRT 19.07 and earlier) - - TP-Link Archer C7 v1 (OpenWRT 19.07 and later) - - TP-Link Archer C7 v2 (OpenWRT 19.07 and earlier) - - TP-Link Archer C7 v2 (OpenWRT 19.07 and later) - - TP-Link Archer C7 v4 (OpenWRT 19.07 and earlier) - - TP-Link Archer C7 v4 (OpenWRT 19.07 and later) - - TP-Link Archer C7 v5 (OpenWRT 19.07 and earlier) - - TP-Link Archer C7 v5 (OpenWRT 19.07 and later) + - TP-Link Archer C7 v1 (OpenWrt 19.07 and earlier) + - TP-Link Archer C7 v1 (OpenWrt 19.07 and later) + - TP-Link Archer C7 v2 (OpenWrt 19.07 and earlier) + - TP-Link Archer C7 v2 (OpenWrt 19.07 and later) + - TP-Link Archer C7 v4 (OpenWrt 19.07 and earlier) + - TP-Link Archer C7 v4 (OpenWrt 19.07 and later) + - TP-Link Archer C7 v5 (OpenWrt 19.07 and earlier) + - TP-Link Archer C7 v5 (OpenWrt 19.07 and later) - TP-Link Archer C50 v4 - - TP-LINK CPE210 v3 (OpenWRT 19.07 and earlier) - - TP-LINK CPE210 v2 (OpenWRT 19.07 and later) - - TP-LINK CPE210 v3 (OpenWRT 19.07 and later) - - TP-LINK CPE510 v3 (OpenWRT 19.07 and later) - - TP-Link WDR3600 v1 (OpenWRT 19.07 and earlier) - - TP-Link WDR3600 v1 (OpenWRT 19.07 and later) - - TP-Link WDR4300 v1 (OpenWRT 19.07 and earlier) - - TP-Link WDR4300 v1 (OpenWRT 19.07 and later) - - TP-Link WDR4300 v1 Israel Version (OpenWRT 19.07 and earlier) - - TP-Link WDR4300 v1 Israel Version (OpenWRT 19.07 and later) - - TP-Link WR2543N/ND (OpenWRT 19.07 and earlier) - - TP-Link WR2543N/ND (OpenWRT 19.07 and later) + - TP-LINK CPE210 v3 (OpenWrt 19.07 and earlier) + - TP-LINK CPE210 v2 (OpenWrt 19.07 and later) + - TP-LINK CPE210 v3 (OpenWrt 19.07 and later) + - TP-LINK CPE510 v3 (OpenWrt 19.07 and later) + - TP-Link WDR3600 v1 (OpenWrt 19.07 and earlier) + - TP-Link WDR3600 v1 (OpenWrt 19.07 and later) + - TP-Link WDR4300 v1 (OpenWrt 19.07 and earlier) + - TP-Link WDR4300 v1 (OpenWrt 19.07 and later) + - TP-Link WDR4300 v1 Israel Version (OpenWrt 19.07 and earlier) + - TP-Link WDR4300 v1 Israel Version (OpenWrt 19.07 and later) + - TP-Link WR2543N/ND (OpenWrt 19.07 and earlier) + - TP-Link WR2543N/ND (OpenWrt 19.07 and later) - TP-Link TL-WR902AC v3 - - Ubiquiti AirRouter (OpenWRT 19.07 and earlier) - - Ubiquiti AirRouter (OpenWRT 19.07 and later) + - Ubiquiti AirRouter (OpenWrt 19.07 and earlier) + - Ubiquiti AirRouter (OpenWrt 19.07 and later) - Ubiquiti EdgeRouter Lite - - Ubiquiti Nanostation Loco M2 - XW (OpenWRT 19.07 and earlier) - - Ubiquiti Nanostation Loco M (OpenWRT 19.07 and later) - - Ubiquiti Nanostation Loco M - XW (OpenWRT 19.07 and later) - - Ubiquiti Nanostation M - XW (OpenWRT 19.07 and earlier) - - Ubiquiti Nanostation M (OpenWRT 19.07 and earlier) - - Ubiquiti Nanostation M - XW (OpenWRT 19.07 and later) - - Ubiquiti Nanostation M (OpenWRT 19.07 and later) - - Ubiquiti Picostation Bullet XW (OpenWRT 19.07 and earlier) - - Ubiquiti Picostation M2HP & Bullet (OpenWRT 19.07 and earlier) - - Ubiquiti Picostation M (OpenWRT 19.07 and later) - - Ubiquiti Unifi AC Mesh (OpenWRT 19.07 and earlier) - - Ubiquiti Unifi AC Mesh (OpenWRT 19.07 and later) - - Ubiquiti Unifi AC Mesh-Pro (OpenWRT 19.07 and earlier) - - Ubiquiti Unifi AC Mesh-Pro (OpenWRT 19.07 and later) - - Ubiquiti UniFi AC Pro (OpenWRT 19.07 and later) + - Ubiquiti Nanostation Loco M2 - XW (OpenWrt 19.07 and earlier) + - Ubiquiti Nanostation Loco M (OpenWrt 19.07 and later) + - Ubiquiti Nanostation Loco M - XW (OpenWrt 19.07 and later) + - Ubiquiti Nanostation M - XW (OpenWrt 19.07 and earlier) + - Ubiquiti Nanostation M (OpenWrt 19.07 and earlier) + - Ubiquiti Nanostation M - XW (OpenWrt 19.07 and later) + - Ubiquiti Nanostation M (OpenWrt 19.07 and later) + - Ubiquiti Picostation Bullet XW (OpenWrt 19.07 and earlier) + - Ubiquiti Picostation M2HP & Bullet (OpenWrt 19.07 and earlier) + - Ubiquiti Picostation M (OpenWrt 19.07 and later) + - Ubiquiti Unifi AC Mesh (OpenWrt 19.07 and earlier) + - Ubiquiti Unifi AC Mesh (OpenWrt 19.07 and later) + - Ubiquiti Unifi AC Mesh-Pro (OpenWrt 19.07 and earlier) + - Ubiquiti Unifi AC Mesh-Pro (OpenWrt 19.07 and later) + - Ubiquiti UniFi AC Pro (OpenWrt 19.07 and later) - VMware, Inc. VMware Virtual Platform - ZBT-WG3526 (16M) - x86 32 bit (various models) @@ -114,7 +114,7 @@ Other changes - Avoid deletion of ``UpgradeOperation`` when related ``Firmware Image`` is deleted -- Increased default retries in OpenWRT upgrader from +- Increased default retries in OpenWrt upgrader from ``15`` to ``40`` - Made firmware upgrade logs translatable - Changed the default API throttle rate from ``400/hour`` to ``1000/minute`` diff --git a/docs/index.rst b/docs/index.rst index 5dbab5a..2f4f8e3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -4,7 +4,7 @@ Firmware Upgrader **Source code**: `github.com/openwisp/openwisp-firmware-upgrader `_. -A firmware upgrade solution designed specifically for OpenWRT devices, +A firmware upgrade solution designed specifically for OpenWrt devices, with the potential to support other embedded operating systems in the future. It offers a robust and automated upgrade process, featuring functionalities such as automatic device detection, retry mechanisms for diff --git a/docs/user/automatic-device-firmware-detection.rst b/docs/user/automatic-device-firmware-detection.rst index 630e410..77112ac 100644 --- a/docs/user/automatic-device-firmware-detection.rst +++ b/docs/user/automatic-device-firmware-detection.rst @@ -13,7 +13,7 @@ Here is an example firmware image item from ``OPENWRT_FIRMWARE_IMAGE_MAP`` "ar71xx-generic-cf-e320n-v2-squashfs-sysupgrade.bin": { # Human readable name of the model which is displayed on # the UI - "label": "COMFAST CF-E320N v2 (OpenWRT 19.07 and earlier)", + "label": "COMFAST CF-E320N v2 (OpenWrt 19.07 and earlier)", # Tupe of board names with which the different versions # of the hardware are identified on OpenWrt "boards": ("COMFAST CF-E320N v2",), diff --git a/docs/user/intro.rst b/docs/user/intro.rst index 4892ccf..8ad18ea 100644 --- a/docs/user/intro.rst +++ b/docs/user/intro.rst @@ -14,5 +14,5 @@ Firmware Upgrader: Features - :doc:`REST API ` - :doc:`Possibility of writing custom upgraders ` for other firmware OSes or for custom - OpenWRT based firmwares + OpenWrt based firmwares - Configurable timeouts diff --git a/docs/user/quickstart.rst b/docs/user/quickstart.rst index 08dbc5a..09779c9 100644 --- a/docs/user/quickstart.rst +++ b/docs/user/quickstart.rst @@ -4,8 +4,8 @@ Quickstart Guide Requirements ------------ -- Devices running at least OpenWRT 12.09 Attitude Adjustment, older - versions of OpenWRT have not worked at all in our tests +- Devices running at least OpenWrt 12.09 Attitude Adjustment, older + versions of OpenWrt have not worked at all in our tests - Devices must have enough free RAM to be able to upload the new image to ``/tmp`` @@ -76,7 +76,7 @@ this step. :target: https://raw.githubusercontent.com/openwisp/openwisp-firmware-upgrader/docs/docs/images/quickstart-firmwareimage.gif If you use a hardware model which is not listed in the image types, if the -hardware model is officially supported by OpenWRT, you can send us a +hardware model is officially supported by OpenWrt, you can send us a pull-request to add it, otherwise you can use :ref:`the setting OPENWISP_CUSTOM_OPENWRT_IMAGES ` to add it. diff --git a/docs/user/settings.rst b/docs/user/settings.rst index 12685ac..6b9de63 100644 --- a/docs/user/settings.rst +++ b/docs/user/settings.rst @@ -128,7 +128,7 @@ Indicates whether the API for Firmware Upgrader is enabled or not. **default**: ``{}`` ============ ======== -Allows changing the default OpenWRT upgrader settings, eg: +Allows changing the default OpenWrt upgrader settings, eg: .. code-block:: python @@ -149,7 +149,7 @@ Allows changing the default OpenWRT upgrader settings, eg: ``15`` attempts - ``upgrade_timeout``: amount of seconds before the shell session is closed after the upgrade command is launched on the device, useful in - case the upgrade command hangs (it happens on older OpenWRT versions); + case the upgrade command hangs (it happens on older OpenWrt versions); defaults to ``90`` seconds ``OPENWISP_FIRMWARE_API_BASEURL`` diff --git a/openwisp_firmware_upgrader/hardware.py b/openwisp_firmware_upgrader/hardware.py index e18cc5b..38f5530 100644 --- a/openwisp_firmware_upgrader/hardware.py +++ b/openwisp_firmware_upgrader/hardware.py @@ -1,6 +1,6 @@ """ Mapping between hardware models and firwmare image -This if focused on OpenWRT only for now, but it should +This if focused on OpenWrt only for now, but it should be possible to add support for different embedded systems in the future. """ @@ -19,7 +19,7 @@ ( 'ar71xx-generic-cf-e320n-v2-squashfs-sysupgrade.bin', { - 'label': 'COMFAST CF-E320N v2 (OpenWRT 19.07 and earlier)', + 'label': 'COMFAST CF-E320N v2 (OpenWrt 19.07 and earlier)', 'boards': ('COMFAST CF-E320N v2',), }, ), @@ -95,56 +95,56 @@ ( 'ar71xx-generic-archer-c7-v1-squashfs-sysupgrade.bin', { - 'label': 'TP-Link Archer C7 v1 (OpenWRT 19.07 and earlier)', + 'label': 'TP-Link Archer C7 v1 (OpenWrt 19.07 and earlier)', 'boards': ('tplink,archer-c7-v1',), }, ), ( 'ath79-generic-tplink_archer-c7-v1-squashfs-sysupgrade.bin', { - 'label': 'TP-Link Archer C7 v1 (OpenWRT 19.07 and later)', + 'label': 'TP-Link Archer C7 v1 (OpenWrt 19.07 and later)', 'boards': ('tplink,archer-c7-v1',), }, ), ( 'ar71xx-generic-archer-c7-v2-squashfs-sysupgrade.bin', { - 'label': 'TP-Link Archer C7 v2 (OpenWRT 19.07 and earlier)', + 'label': 'TP-Link Archer C7 v2 (OpenWrt 19.07 and earlier)', 'boards': ('TP-Link Archer C7 v2', 'TP-Link Archer C7 v3'), }, ), ( 'ath79-generic-tplink_archer-c7-v2-squashfs-sysupgrade.bin', { - 'label': 'TP-Link Archer C7 v2 (OpenWRT 19.07 and later)', + 'label': 'TP-Link Archer C7 v2 (OpenWrt 19.07 and later)', 'boards': ('TP-Link Archer C7 v2', 'TP-Link Archer C7 v3'), }, ), ( 'ar71xx-generic-archer-c7-v4-squashfs-sysupgrade.bin', { - 'label': 'TP-Link Archer C7 v4 (OpenWRT 19.07 and earlier)', + 'label': 'TP-Link Archer C7 v4 (OpenWrt 19.07 and earlier)', 'boards': ('TP-Link Archer C7 v4',), }, ), ( 'ath79-generic-tplink_archer-c7-v4-squashfs-sysupgrade.bin', { - 'label': 'TP-Link Archer C7 v4 (OpenWRT 19.07 and later)', + 'label': 'TP-Link Archer C7 v4 (OpenWrt 19.07 and later)', 'boards': ('TP-Link Archer C7 v4',), }, ), ( 'ar71xx-generic-archer-c7-v5-squashfs-sysupgrade.bin', { - 'label': 'TP-Link Archer C7 v5 (OpenWRT 19.07 and earlier)', + 'label': 'TP-Link Archer C7 v5 (OpenWrt 19.07 and earlier)', 'boards': ('TP-Link Archer C7 v5',), }, ), ( 'ath79-generic-tplink_archer-c7-v5-squashfs-sysupgrade.bin', { - 'label': 'TP-Link Archer C7 v5 (OpenWRT 19.07 and later)', + 'label': 'TP-Link Archer C7 v5 (OpenWrt 19.07 and later)', 'boards': ('TP-Link Archer C7 v5',), }, ), @@ -158,28 +158,28 @@ ( 'ar71xx-generic-cpe210-220-v1-squashfs-sysupgrade.bin', { - 'label': 'TP-LINK CPE210 v3 (OpenWRT 19.07 and earlier)', + 'label': 'TP-LINK CPE210 v3 (OpenWrt 19.07 and earlier)', 'boards': ('TP-LINK CPE210 v1', 'TP-LINK CPE220 v1'), }, ), ( 'ath79-generic-tplink_cpe210-v2-squashfs-sysupgrade.bin', { - 'label': 'TP-LINK CPE210 v2 (OpenWRT 19.07 and later)', + 'label': 'TP-LINK CPE210 v2 (OpenWrt 19.07 and later)', 'boards': ('TP-LINK CPE210 v2',), }, ), ( 'ath79-generic-tplink_cpe210-v3-squashfs-sysupgrade.bin', { - 'label': 'TP-LINK CPE210 v3 (OpenWRT 19.07 and later)', + 'label': 'TP-LINK CPE210 v3 (OpenWrt 19.07 and later)', 'boards': ('TP-LINK CPE210 v3',), }, ), ( 'ath79-generic-tplink_cpe510-v3-squashfs-sysupgrade.bin', { - 'label': 'TP-LINK CPE510 v3 (OpenWRT 19.07 and later)', + 'label': 'TP-LINK CPE510 v3 (OpenWrt 19.07 and later)', 'boards': ('TP-LINK CPE510 v3',), }, ), @@ -193,56 +193,56 @@ ( 'ar71xx-generic-tl-wdr3600-v1-squashfs-sysupgrade.bin', { - 'label': 'TP-Link WDR3600 v1 (OpenWRT 19.07 and earlier)', + 'label': 'TP-Link WDR3600 v1 (OpenWrt 19.07 and earlier)', 'boards': ('TP-Link TL-WDR3600 v1',), }, ), ( 'ath79-generic-tplink_tl-wdr3600-v1-squashfs-sysupgrade.bin', { - 'label': 'TP-Link WDR3600 v1 (OpenWRT 19.07 and later)', + 'label': 'TP-Link WDR3600 v1 (OpenWrt 19.07 and later)', 'boards': ('TP-Link TL-WDR3600 v1',), }, ), ( 'ar71xx-generic-tl-wdr4300-v1-squashfs-sysupgrade.bin', { - 'label': 'TP-Link WDR4300 v1 (OpenWRT 19.07 and earlier)', + 'label': 'TP-Link WDR4300 v1 (OpenWrt 19.07 and earlier)', 'boards': ('TP-Link TL-WDR4300 v1',), }, ), ( 'ath79-generic-tplink_tl-wdr4300-v1-squashfs-sysupgrade.bin', { - 'label': 'TP-Link WDR4300 v1 (OpenWRT 19.07 and later)', + 'label': 'TP-Link WDR4300 v1 (OpenWrt 19.07 and later)', 'boards': ('TP-Link TL-WDR4300 v1',), }, ), ( 'ar71xx-generic-tl-wdr4300-v1-il-squashfs-sysupgrade.bin', { - 'label': 'TP-Link WDR4300 v1 Israel Version (OpenWRT 19.07 and earlier)', + 'label': 'TP-Link WDR4300 v1 Israel Version (OpenWrt 19.07 and earlier)', 'boards': ('TP-LINK TL-WDR4300 v1 (IL)',), }, ), ( 'ath79-generic-tplink_tl-wdr4300-v1-il-squashfs-sysupgrade.bin', { - 'label': 'TP-Link WDR4300 v1 Israel Version (OpenWRT 19.07 and later)', + 'label': 'TP-Link WDR4300 v1 Israel Version (OpenWrt 19.07 and later)', 'boards': ('TP-LINK TL-WDR4300 v1 (IL)',), }, ), ( 'ar71xx-generic-tl-wr2543-v1-squashfs-sysupgrade.bin', { - 'label': 'TP-Link WR2543N/ND (OpenWRT 19.07 and earlier)', + 'label': 'TP-Link WR2543N/ND (OpenWrt 19.07 and earlier)', 'boards': ('TP-Link TL-WR2543N/ND',), }, ), ( 'ath79-generic-tplink_tl-wr2543-v1-squashfs-sysupgrade.bin', { - 'label': 'TP-Link WR2543N/ND (OpenWRT 19.07 and later)', + 'label': 'TP-Link WR2543N/ND (OpenWrt 19.07 and later)', 'boards': ('TP-Link TL-WR2543N/ND',), }, ), @@ -256,14 +256,14 @@ ( 'ar71xx-generic-ubnt-airrouter-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti AirRouter (OpenWRT 19.07 and earlier)', + 'label': 'Ubiquiti AirRouter (OpenWrt 19.07 and earlier)', 'boards': ('Ubiquiti AirRouter',), }, ), ( 'ath79-generic-ubnt_airrouter-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti AirRouter (OpenWRT 19.07 and later)', + 'label': 'Ubiquiti AirRouter (OpenWrt 19.07 and later)', 'boards': ('Ubiquiti AirRouter',), }, ), @@ -278,7 +278,7 @@ ( 'ar71xx-generic-ubnt-loco-m-xw-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Nanostation Loco M2 - XW (OpenWRT 19.07 and earlier)', + 'label': 'Ubiquiti Nanostation Loco M2 - XW (OpenWrt 19.07 and earlier)', 'boards': ('Ubiquiti Loco XW',), }, ), @@ -286,7 +286,7 @@ ( 'ath79-generic-ubnt_nanostation-loco-m-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Nanostation Loco M (OpenWRT 19.07 and later)', + 'label': 'Ubiquiti Nanostation Loco M (OpenWrt 19.07 and later)', 'boards': ('Ubiquiti Nanostation Loco M',), }, ), @@ -294,7 +294,7 @@ ( 'ath79-generic-ubnt_nanostation-loco-m-xw-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Nanostation Loco M - XW (OpenWRT 19.07 and later)', + 'label': 'Ubiquiti Nanostation Loco M - XW (OpenWrt 19.07 and later)', 'boards': ('Ubiquiti Nanostation Loco M (XW)',), }, ), @@ -302,7 +302,7 @@ ( 'ar71xx-generic-ubnt-nano-m-xw-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Nanostation M - XW (OpenWRT 19.07 and earlier)', + 'label': 'Ubiquiti Nanostation M - XW (OpenWrt 19.07 and earlier)', 'boards': ('Ubiquiti Nano M XW',), }, ), @@ -310,7 +310,7 @@ ( 'ar71xx-generic-ubnt-nano-m-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Nanostation M (OpenWRT 19.07 and earlier)', + 'label': 'Ubiquiti Nanostation M (OpenWrt 19.07 and earlier)', 'boards': ( 'Ubiquiti Nano-M', 'Ubiquiti NanoStation M2', @@ -324,7 +324,7 @@ ( 'ath79-generic-ubnt_nanostation-m-xw-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Nanostation M - XW (OpenWRT 19.07 and later)', + 'label': 'Ubiquiti Nanostation M - XW (OpenWrt 19.07 and later)', 'boards': ( 'Ubiquiti Nanostation M (XW)', 'Ubiquiti Nanostation M XW', @@ -335,7 +335,7 @@ ( 'ath79-generic-ubnt_nanostation-m-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Nanostation M (OpenWRT 19.07 and later)', + 'label': 'Ubiquiti Nanostation M (OpenWrt 19.07 and later)', 'boards': ('Ubiquiti Nanostation M',), }, ), @@ -343,7 +343,7 @@ ( 'ar71xx-generic-ubnt-bullet-m-xw-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Picostation Bullet XW (OpenWRT 19.07 and earlier)', + 'label': 'Ubiquiti Picostation Bullet XW (OpenWrt 19.07 and earlier)', 'boards': ('Ubiquiti Bullet-M XW',), }, ), @@ -351,7 +351,7 @@ ( 'ar71xx-generic-ubnt-bullet-m-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Picostation M2HP & Bullet (OpenWRT 19.07 and earlier)', + 'label': 'Ubiquiti Picostation M2HP & Bullet (OpenWrt 19.07 and earlier)', 'boards': ( 'Ubiquiti Bullet-M', 'Ubiquiti PicoStation M2', @@ -363,7 +363,7 @@ ( 'ath79-generic-ubnt_picostation-m-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Picostation M (OpenWRT 19.07 and later)', + 'label': 'Ubiquiti Picostation M (OpenWrt 19.07 and later)', 'boards': ('Ubiquiti Picostation M',), }, ), @@ -371,7 +371,7 @@ ( 'ath79-generic-ubnt_unifi-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti UniFi (OpenWRT 19.07 and later)', + 'label': 'Ubiquiti UniFi (OpenWrt 19.07 and later)', 'boards': ('Ubiquiti UniFi',), }, ), @@ -379,7 +379,7 @@ ( 'ath79-generic-ubnt_unifiac-lr-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti UniFi AC LR (OpenWRT 19.07 and later)', + 'label': 'Ubiquiti UniFi AC LR (OpenWrt 19.07 and later)', 'boards': ('Ubiquiti UniFi AC LR',), }, ), @@ -387,7 +387,7 @@ ( 'ar71xx-generic-ubnt-unifiac-mesh-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Unifi AC Mesh (OpenWRT 19.07 and earlier)', + 'label': 'Ubiquiti Unifi AC Mesh (OpenWrt 19.07 and earlier)', 'boards': ( 'Ubiquiti UniFi AC-Mesh', 'Ubiquiti UniFi-AC-MESH', @@ -399,7 +399,7 @@ ( 'ath79-generic-ubnt_unifiac-mesh-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Unifi AC Mesh (OpenWRT 19.07 and later)', + 'label': 'Ubiquiti Unifi AC Mesh (OpenWrt 19.07 and later)', 'boards': ( 'Ubiquiti UniFi AC Mesh', 'Ubiquiti UniFi AC-Mesh', @@ -412,7 +412,7 @@ ( 'ar71xx-generic-ubnt-unifiac-mesh-pro-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Unifi AC Mesh-Pro (OpenWRT 19.07 and earlier)', + 'label': 'Ubiquiti Unifi AC Mesh-Pro (OpenWrt 19.07 and earlier)', 'boards': ('Ubiquiti UniFi AC-Mesh-Pro',), }, ), @@ -420,7 +420,7 @@ ( 'ath79-generic-ubnt_unifiac-mesh-pro-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti Unifi AC Mesh-Pro (OpenWRT 19.07 and later)', + 'label': 'Ubiquiti Unifi AC Mesh-Pro (OpenWrt 19.07 and later)', 'boards': ('Ubiquiti UniFi AC-Mesh Pro',), }, ), @@ -428,7 +428,7 @@ ( 'ath79-generic-ubnt_unifiac-pro-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti UniFi AC Pro (OpenWRT 19.07 and later)', + 'label': 'Ubiquiti UniFi AC Pro (OpenWrt 19.07 and later)', 'boards': ('Ubiquiti UniFi AC Pro', 'Ubiquiti UniFi-AC-PRO'), }, ), @@ -436,7 +436,7 @@ ( 'ath79-generic-ubnt_unifi-ap-pro-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti UniFi AP Pro (OpenWRT 19.07 and later)', + 'label': 'Ubiquiti UniFi AP Pro (OpenWrt 19.07 and later)', 'boards': ('Ubiquiti UniFi AP Pro',), }, ), @@ -444,7 +444,7 @@ ( 'ar71xx-generic-ubnt-uap-pro-squashfs-sysupgrade.bin', { - 'label': 'Ubiquiti UniFi AP Pro (OpenWRT 19.07 and earlier)', + 'label': 'Ubiquiti UniFi AP Pro (OpenWrt 19.07 and earlier)', 'boards': ('Ubiquiti UAP Pro',), }, ), @@ -458,7 +458,7 @@ ( 'ar71xx-generic-xd3200-squashfs-sysupgrade.bin', { - 'label': 'YunCore XD3200 (OpenWRT 19.07 and earlier)', + 'label': 'YunCore XD3200 (OpenWrt 19.07 and earlier)', 'boards': ('YunCore XD3200',), }, ), @@ -534,7 +534,7 @@ ) ) -# OpenWRT only for now, in the future we'll merge +# OpenWrt only for now, in the future we'll merge # different dictionaries representing different firmwares # eg: AirOS, Raspbian FIRMWARE_IMAGE_MAP = OPENWRT_FIRMWARE_IMAGE_MAP diff --git a/openwisp_firmware_upgrader/upgraders/openwisp.py b/openwisp_firmware_upgrader/upgraders/openwisp.py index 9f3acaf..d384360 100644 --- a/openwisp_firmware_upgrader/upgraders/openwisp.py +++ b/openwisp_firmware_upgrader/upgraders/openwisp.py @@ -34,7 +34,7 @@ def _test_image(self, path): # pragma: no cover def _reflash_legacy(self, path, timeout): # pragma: no cover self.log( _( - 'The version used is OpenWRT Backfire, ' + 'The version used is OpenWrt Backfire, ' 'using legacy reflash instructions.' ) ) diff --git a/openwisp_firmware_upgrader/upgraders/openwrt.py b/openwisp_firmware_upgrader/upgraders/openwrt.py index 7a8cf48..d955ccd 100644 --- a/openwisp_firmware_upgrader/upgraders/openwrt.py +++ b/openwisp_firmware_upgrader/upgraders/openwrt.py @@ -378,7 +378,7 @@ def _reflash(self, path): this method will execute the reflashing operation in another process because the SSH connection may hang indefinitely while reflashing and would block the program; setting a timeout to `exec_command` - doesn't seem to take effect on some OpenWRT versions + doesn't seem to take effect on some OpenWrt versions so at least we can stop the process using `subprocess.join(timeout=self.UPGRADE_TIMEOUT)` """ From e95dccad45d54b316bf281e46bd569fd3e76bc6a Mon Sep 17 00:00:00 2001 From: Gagan Deep Date: Mon, 15 Jul 2024 19:20:58 +0530 Subject: [PATCH 11/18] [skip ci] Updated docs website URL --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 27d48f6..c0d05e7 100644 --- a/README.rst +++ b/README.rst @@ -43,9 +43,9 @@ Documentation ------------- - `Developer documentation - `_ + `_ - `User documentation - `_ + `_ Contributing ------------ From 7d9674027669fea93685844b2699a1354665ae0e Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Mon, 15 Jul 2024 20:43:15 -0400 Subject: [PATCH 12/18] [docs] Table of contents, consistency, fixes [skip ci] --- docs/developer/extending.rst | 15 ++++++++++----- docs/developer/index.rst | 4 ++-- docs/developer/installation.rst | 6 +++++- docs/user/quickstart.rst | 4 ++++ docs/user/rest-api.rst | 7 +++---- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/docs/developer/extending.rst b/docs/developer/extending.rst index e674e75..fab8231 100644 --- a/docs/developer/extending.rst +++ b/docs/developer/extending.rst @@ -3,8 +3,7 @@ Extending OpenWISP Firmware Upgrader .. include:: ../partials/developer-docs.rst -One of the core values of the OpenWISP project is `Software Reusability -`_, +One of the core values of the OpenWISP project is :ref:`Software Reusability `,, for this reason *OpenWISP Firmware Upgrader* provides a set of base classes which can be imported, extended and reused to create derivative apps. @@ -19,9 +18,15 @@ and the `sample app will serve you as source of truth: just replicate and adapt that code to get a basic derivative of *OpenWISP Firmware Upgrader* working. -**Premise**: if you plan on using a customized version of this module, we -suggest to start with it since the beginning, because migrating your data -from the default module to your extended version may be time consuming. +.. important:: + + If you plan on using a customized version of this module, we suggest + to start with it since the beginning, because migrating your data from + the default module to your extended version may be time consuming. + +.. contents:: **Table of Contents**: + :depth: 2 + :local: 1. Initialize your Custom Module -------------------------------- diff --git a/docs/developer/index.rst b/docs/developer/index.rst index 20af03f..9555429 100644 --- a/docs/developer/index.rst +++ b/docs/developer/index.rst @@ -1,5 +1,5 @@ -Developer Docs Index -==================== +Developer Docs +============== .. include:: ../partials/developer-docs.rst diff --git a/docs/developer/installation.rst b/docs/developer/installation.rst index 7466da9..458461d 100644 --- a/docs/developer/installation.rst +++ b/docs/developer/installation.rst @@ -3,6 +3,10 @@ Developer Installation Instructions .. include:: ../partials/developer-docs.rst +.. contents:: **Table of contents**: + :depth: 2 + :local: + Requirements ------------ @@ -88,7 +92,7 @@ Launch development server: ./manage.py runserver 0.0.0.0:8000 -You can access the admin interface at http://127.0.0.1:8000/admin/. +You can access the admin interface at ``http://127.0.0.1:8000/admin/``. Run celery and celery-beat with the following commands (separate terminal windows are needed): diff --git a/docs/user/quickstart.rst b/docs/user/quickstart.rst index 09779c9..1844f90 100644 --- a/docs/user/quickstart.rst +++ b/docs/user/quickstart.rst @@ -1,6 +1,10 @@ Quickstart Guide ================ +.. contents:: **Table of contents**: + :depth: 2 + :local: + Requirements ------------ diff --git a/docs/user/rest-api.rst b/docs/user/rest-api.rst index e72a604..9222a46 100644 --- a/docs/user/rest-api.rst +++ b/docs/user/rest-api.rst @@ -1,10 +1,9 @@ REST API Reference ================== -.. note:: - - To enable the API, the setting :ref:`OPENWISP_FIRMWARE_UPGRADER_API - ` must be set to ``True``. +.. contents:: **Table of contents**: + :depth: 1 + :local: .. _firmware_upgrader_live_documentation: From 5192c6d77f9e8852c68d91ebf388e0daddf7cf4d Mon Sep 17 00:00:00 2001 From: Gagan Deep Date: Tue, 16 Jul 2024 14:28:10 +0530 Subject: [PATCH 13/18] [skip ci] Update quickstart.rst --- docs/user/quickstart.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/quickstart.rst b/docs/user/quickstart.rst index 1844f90..47402f8 100644 --- a/docs/user/quickstart.rst +++ b/docs/user/quickstart.rst @@ -38,7 +38,7 @@ becomes available. 2. Create the Build Object -------------------------- -Create a build a build object by going to *Firmware management > Firmware +Create a build object by going to *Firmware management > Firmware builds > Add firmware build*, the build object is related to a firmware category and is the collection of the different firmware images which have been compiled for the different hardware models supported by the system. From 6972fe99895d1d69ca63862e36aeeee84eef1c1e Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Tue, 16 Jul 2024 18:16:32 -0400 Subject: [PATCH 14/18] [docs] Fixed virtualenv link [skip ci] --- docs/developer/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developer/installation.rst b/docs/developer/installation.rst index 458461d..78cbde4 100644 --- a/docs/developer/installation.rst +++ b/docs/developer/installation.rst @@ -52,7 +52,7 @@ Install test requirements: pip install -r requirements-test.txt Setup and activate a virtual-environment (we'll be using `virtualenv -`): +`_): .. code-block:: shell From 285276572e5b895536b77e7580fb37df700b2cba Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Thu, 18 Jul 2024 19:14:45 -0400 Subject: [PATCH 15/18] [docs] Minor improvement [skip ci] --- docs/developer/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developer/installation.rst b/docs/developer/installation.rst index 78cbde4..5b85c9e 100644 --- a/docs/developer/installation.rst +++ b/docs/developer/installation.rst @@ -125,7 +125,7 @@ read :doc:`extending`. .. important:: - If you want to add ``openwisp-firmware-upgrader`` in an existing + If you want to add ``openwisp-firmware-upgrader`` to an existing Django project, then you can take reference from the `test project in openwisp-firmware-upgrader repository `_ From a31e03c6902e423ff76d372275f3ee2f0ce0743a Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Mon, 22 Jul 2024 19:24:25 -0400 Subject: [PATCH 16/18] [docs] Added diagram [skip ci] --- ...itecture-v2-openwisp-firmware-upgrader.png | Bin 0 -> 395076 bytes docs/index.rst | 39 +++++++++++++----- 2 files changed, 28 insertions(+), 11 deletions(-) create mode 100644 docs/images/architecture-v2-openwisp-firmware-upgrader.png diff --git a/docs/images/architecture-v2-openwisp-firmware-upgrader.png b/docs/images/architecture-v2-openwisp-firmware-upgrader.png new file mode 100644 index 0000000000000000000000000000000000000000..4eb24d55d19758bab86db7e3c732c93b94745d0a GIT binary patch literal 395076 zcmd4&Wl&qu8ZZi{rG*;OQVKL^vEtg`R@{pfhvEbX?%I~(1b26Lf?JEbYl0MlySv=b zbI#2B&3FIYKX+~>nU%dBS&wI}XYT}lk(a=H@%{w>0Kk-z6jcHMorw(;q&P8 z$0Qd301fa(Rz>Xo{yrfg;r{OK{_2d6k2g^8RYgU`&d$zpd&Uy@?cK%k*-)jc6wUPp z{O;`V_Gs(=_L|)^;&i0?c7OHeVEt-s`eLpd5V3rJeR15GEzQjQo{-?AJMVh?@AcOF z?d|PxN7miRZe3j+fYa!Dcj*G&dAU5&lLMWcoV>ca+AAkK=`BhqslJ%+yJ?LUDc?Bl zFS)q5xLTP!pZX$ z2naAUGt<=6sHv`g%&X?$;Be5Ngnm8N8%I} z6&V^DWM^kDLkI!-K?fDT($mv#rgOINy@bQ3CjKgI@M+1|^s+ngW09Zx&U0^N)z?iabA zrL$%&p5FB4*tBj|&l&#e+dXKC*M_aOjm-EtIGC}L9sN$pA5gwu)VyD_iv01TVQ!b# zCBJv|@H}6sGv!Bpu%+<#^4x@k{k6rp;-ExLMiHB+`x)`O{-;0L*xb!b6+V6PR|dsb zw2#&lsPgeKMo)?6EcQ1y=eG&6KkTAFLH^nKn(0jAx=3e zYMg`L8uxRH9_ze}zGBmZ6k*ryXSWT-29Uh*(nV}`Wj<_F82x|h_1pW;#!=h--B%7P zElBB80AMjM&R9dyn|!!(QjHS2$^Zr>Ejf7JrAQ&&-XwkHK%T6z*ROMgB6~3eTf=0= zJ?6Q!t1#A{F?%1$8D4)IS5{MPEk3HvXn7Y8ELw;I*GqxqNHzT}5J}t};rG*k15?5z z&8Ga;ax+ktcMBpZUqhOtb$4axt15ls;VI3S-z?Mp-*s#!g$x9egG;3mt?E2W@FG{k zLQq?Uwpb%BbftPvUT6Ze&zd2%V$LsgK1>gcW=0`6Wcz1jwx9&t_rTXU-KL;u| z=y4%4-t~F-Uf&yTRw~{q4Wzz-N&x`}_<2x+>crdelu#ohLpa2Jmz|bv=|W3h&f@RR z<(^jpV(zeCICeN2IvH^o4S$}vHmH{X@?(-*J5AM%%`2WXAN^2RK}o-CtRKt+>}<2V|f#3U-5zs6|_j_uASuA75Q;P z(EqrckH#T}(iaxQnF;3hEXPPNkh=?3ySdP>G+fq}_p#n2uWAyV7M?TRH@k~B*j=aq z85+ub{k^gc1+K^awgU|Vfs>j;$7y9SZ^BpGrZc4I?c*sB*|_O$2`e9AZyLx2@|(@! zF=q3mYUN-+D;nT{IS&es>`+3FqI5md#7+3Au05N^Fesx|+7!>M&~(>!lQk?4Q(NnA zbjx6-zuvgJYuWa)pcA7`H1lwkjO^LR(`O&%w0|?rlytJVqat=zjK`-C8R*<>4hj?W zG{7G_x*j~QTvw-`mdV}y=+7gsx69QDU(AMfIcc5eVD5{8Mj~AxYE+a3dxu>oV$+S0 z{J+EqshLuD+GZ!S?))~(=C(hfdp5~4Sn29~#jY?+&wYY|VZ3%Yr zuR?%Nqk{$+WL(|pPs!o}<9ey{ZdgkC`XKnVr7DAaD~RDdOhV;A3+u4kOCz=j&erxi zbN{J~y9v*78d98u+dQMN2fHC4Wmhw7Yn3uyjY9mC&e#Rl%?7+4sW0>4ZuM)c`Ms)2{FH{geNSR(OQ_W=YdwA z5Sz^IpQ5zVcHk~1es+_ygrods2R5>>YM1g z($iU5bm}uW6nlwQTUbgoX zY+uJVyTZp@mh^V1$yAeda;u4HSgY%&F1Ag#IH+P~DOQd86ZUQ7E=m%J37en6O^mc7!jnH&?lpujBl5%)FxC zc=?LLUWE6|(&)rgsrv47jcu4$@y-h@*B!3IW-WYI%Xxv0tnSr#af%|Waw*`QiVJvX}C`vLOYso zWAN~3tf;jW!&^->gGS4q6aG$xw&^=L59 zubzKpbxXG_XPz|LLcoE~Y_BWRd=O~v$5-a3_>Ku;W<#{e&s=MiEd#lQeO%ypA+JN^ z`qvr_aKj63Z{BNUKF`G@zH+hub#}?PoYvxk4AA1bbaskqo@X*`agwB03Nln4 zEUA*Ks(J@j<6oHDveDWN<%nIq(qhN_7A0q%V0N0iwP!vA(^IIi8=Kzzs%WlW?Q&fu z8f7tjJs~UI9V+@ZiJsUDZgZ~03!9cGjojwN{PM?S!6aQzpspa|h)YBVvgOr3_e-ih z7c)+?sl#jb`f^-#Epg(A4vYrCN(CJalCGbRcZr<{p6xBxLXSg{7l+cCTIA`3JiY<% zqGTR1f&mQc(Sz$zBth1r{0bChg4-mxc7FFbN|* zv6C(Sx@K@P*gKq^)nMm`IAnseNIXmOaL4?bWR&74qVZt@3Nk>0XRi`NfV1OWWEWbz zPFNokLCay)uf0n?SY@BA+cft;TCc#RI#pPwz6=)RmWV{{@o{lERl)jzmhqTqm}01t zwV)v!Cs|<&9ab%6pWl&ao7b9$NwRMmia_jj}&i;=dbo ze9gL6`9IyMG~%v3{Q%B_)Rej%BJML(GfOq88t`>s;jy6QB2nfsB?UG}$WKwbE&nD} z{+>c#CC81x{H7AT5gOLsFp9xSyH1veRZ3KBLG0k32AyZg;665cVQIV6XQF0KN`{bYWm2ve9Op8|E)455 z@80CgY8$Dp)}RMiB-R-|O%YmbPu{{&hEeP3M(2`@V2|PbhCLBJtvWnC16|3tf#>%e zEfsBXmG}{p?r#v6sZ1b1A(y?z@RNgvlkN~NQ z*u>YY3f~G4ST?5%a8bC8TaC8%VCrv+#!7U6O(VFSp1^c`%x{KOsp&xCr(1V6G_mxa z<;4qd5})Eu;4Jj$OkE8pu04~WO>EUBg7*Vh=5-Fm3>HiVbtzlgx$cXe2fk+J|W4kXzA0J4WaWZGsDejNmq%N^**$MivCG zE(`16e5vDSnFOVxilh6GDVQRTr}I=CZ;VP{WJKv6)pkB{LY%-!yOwgS%jx1rMWJj8 zE3fJ>6)U-1ObwnKQ@!Ht-m@H22c7|*r( zCHw>Rzmy`(@OZE7)MFgmRy1d$yvhuzMI*r?YE0*iYAsk1AftjQd4)Z!n6gg^pkzGP z4``o$a()I|bA|PHsi>7JPg%p?qSmWAOKa&kc8<1HW4Iy`sP6wsM`R+wXv`=~7_0Yr5Ds%f-gc4w5UqU_X^ zh9AQ9NlSc?-TM0+H7*?gX6mRFXt;+)Ck5433Yl+gT zeaMyh2U`&A6uMPp=+yg}TQiZH#xq@C_`t;le-nGpa~rgeIc!3}Zi4lq7KB ztFwJmdks4|gzIHDSi*5c7w9SY2CT{}JXUNg{n7Qyw%3$?sZ`lY^N@y;!y+Z6-2quE$@#SIr|U z4Y$#@U!iKuJe&S+?3NH^+`0F~A*A__?Y{fQXnK~szZ@0Msfj#v&uY{xD_d+6=vX~< z^JKi^1y&fUO`B^?swX*}P16loQkg*tBZ{ZC{?t61rnR2j)*3$#WKi2GI<)utQc$9r zcNUEdqVV^!OV*v;LF%c`YL-q}oXryyzAx&xKty0Xugr0gG7-<0jlE6)eh?C*! zqca*gV1wipD2@g29mdKFc?HjgHh~R0@Lr*uIv@?47hbaW{8?~aFz#1-AM%pm|E^8; zEw#_#ktYV=w>E#hhYZb%Ls|BGOZ9beC5>0X^zxW8i;&Yv?LO1W;opo}Q zgW0;TYbW>=@O@Jh{xN3Z-aoY`4s_GfsGtA8R-NuU z*O;-LTB9nx$dWrRVrz%n;b@;`X_6h=Blk|VhEExtx6SEs1XKsf`?bI&B~mw=w#$=c`Bw1ZxE)<9n{uVBON;cTT@QjVXI0r zuLBQ*C_x3QH`|Sk9_j!gEAK1XrR`{w-mii=1MD7AV+^a`^k}qlb`mZ``u@CQPn$;2 zYwPesU&YscAsQ!|k!N9uPrG3$2pmtHUnvTdTQIR!YKfsf3(;M0T72|7Zom=W(0dMM z{)JG>7#w~1Ex6aINssf5Ztda5od*-C#BBoHD7KRQ_#rhWq1Y6JFLMhW;IZMd zv0ddB-KHWrdp|5c|V1D}RI3rk_ z3<2aklx-^9uRH=;!?~U$Gg>H1vLXJ|k^g{k}i#KOF<%)A4{)oFShea{ZVZ66_PfyMPpf&Yg}5rtvDf0dg1`DO)wh&I`;ZKjtw zg!ZFD8Oxgcxyt*-iN6LCzV?jx=G_9%q^zXee!`@qgyAwKHLrkeY}C>z4O*}8`YnP*=yMLc zMy}S52TyOJq|f3fNKrQ8`SiB!_pQp7A~+0s)4Z9GP~YnxC=GYX6-3$JAr%yx$1Zj* zT@_Mbwrj+9TV5GiS^5vMWg=-j1zKYtZ2<-rs5|ZM`5dY@M1o>ZFv3CK<>xV@w)MfQ znz;l_dtHV_OTFtB6)vj{GmmZ`Wn-o*JGZTftLu5EKIc^PTdweUCUfb+pehecxu(#i6#|vBH0WVAivWLnp$&d)==x z))jOI0HnZQEp^Y2(MhvHRGLey3`+%17Iv%L03&)szeEjZTr|A$7cwBiJ{#QU-=A`U zqO6_l{1I26*#&)T-&)@zA*Asq%eOBOf?vnFC_E+L0Ip9hDHl(9+jo8A%hj}mX#Jth zpFL|TiVsmv&!e?$s&%Z>ZnQNl1tC8ALqEexl>$KTbZB*66`ejH&{%p91B1H_bGAFq zZq+=PNEEE_kX`JClsc=`3Oo=< ze%P+dZLK}SxO?cRf3ARbiSq{7-|wuA77TktW;r1%W{Y&|@0R!P@UcF7;XD611D2^Y zbGyIdVEzeiY3Pa!#$khpJ)o*Y=K}Sr-40YFlev!vbyw%0ZF_l9YL&CIz){-FV4w&& z9~kv3*IJtBwGJ$Z$&(iB-Y)Z2bszmB;&B=}J%RmJCy-rNaA13S5?Ahh+D)ISBq~#Y z`dMuAW~WJxjFf9MX(fANRnYnQ=Iex6htVCMEmhhj&6gP0rB1#Bwfl7I=Bo~uf&1HW z6BD^?7}$r7yMdh5XuA`sS|6WA`pMWAwz|~Z^*cohh(2W8b09>H(+`(CBBA-l;nd%| z)$_XDTgiUbq4I*+Gba|bcR~$m;%0y}U9G}KU0iLLv`CUB?xRf_{b7G>2_KT~z~VV@ zSC%tYM7=K;--=I9%d_0|{^-;}gYCBX9j9j9t_KF#(4fJ0R(wwg9?)Dsy52bR!?xRk z^aI!jcZmPn()3%9W||crQ*PjrK|_3k;PJ*%$>x#+xH5u4pz4bZFfhR+?A<;k#L|%k zVW!PVTh=>)>>i3%i1?S)%$6{o`5wy8@ywX)Yf7956(NCyD1yoK?z5diH|`A(&$TR2evO zf8t~5p9k_;!` zY82u0S%b%*pwe|LA|}%Z$^H_IcgfO<@@X_W^TYW$JTIq8R9tIVosmmxacF30%t}?5 zsQU!}BehUEYn|YEfvQtQV2ZdRfmqoU9(f>rPGINO+Kp@t>=zrqwvGZ}YK!CAWw60q zPxfbmJ~d=l2}lWCx)H({E+@&;BK1!IsFGTKZ{Q4&N}UD z=IB%&%tAvIA8D{M;I?!;t){CgMluUO8W%S`(jGgW23f_KlGc*Po4>H2alt@UZ@_pi zH1?j@yL|OZX)PIy^nLawwps^st#R$=DyT^>@H9@11YfjoW(WJ7=cjIX7nnC+Vt|Ln z_+#Qo*kf%H_zQ}LA7N=AxWs3~{jO9hGlYYoD5|o>>eX7KUo67LTB_AU)j9b69h+W3 zV6atkbxp=oFa_bxa)Wm&ysLx~7xj!zJS{}~=Hux4*Fr-LM=J12bdKn)7F`i=`-9OF ziy++uJqSg?IhyDZ9}*NwNZIggZ+?Xc@cTnHG<0%PeHfF|3?V80N|gILIhvpPH`9}|?@zz`N&>g7z*+hs1(1tPLw2fhKS2j%QvD=IeiAxi zLR_0cqcMl7ssOI6*>kCcgOWRiO4#98yb2=RhjT79nz5{|!u3xzrtw^tq<*INGfzPS z@$J7txknq_wyUon_9V7grkKFpL%l6~+F9<%jrCyLYE0{@=SE9 zZO5(Wl|YDy3b67DAPk$kJ&&PERc5_PVryKmu}jHjq*KvoF0(JnRPnJF7glkx9G#4| z5#Gx%>fsv?vbfiB3FZ)_6h&^0KA+RLxOoE==dxdQs%#;o4s2+aEKR?hz8jT=`zh*4 zQPCQDZR(Z`$g4?EEX+s+PEboF%R;s4X?9k|4zbppI?9dtYAAME zO{jsu>C1qNo61*1#{<5-esvq5m(wg5F4BzbJ@~O9Lk{_yx7U?|C;#|hv?;CI4LH5p zMws+f5sG&@Ev^k|mjfoMty)$i&e=*f4`iUlSq&6fhM|-i$?5H1fh~LPmF6cXVNl(B z3>uofxa%k(_cdE!(yU1pm{CyC0*F}bngZ!+obTrq53Nmka=RdBFKCMA-(UE8zvh5k zEc(1%(wWS}Vs)_8;XK3E>Xzs(Y4@PsQ_QO)L|I4()rq@)t67;ObZ&fRA_vqQH`ZaD zv;{7{XN^*NUyzQw8ur1eSk7xK(Oa=h4@WL;JC1RaHH`PR508QB z5ORW|J4Lrgk)XuJOk)-y2Upi+0osQn1``-wm%_&-dDZI49*P+8#?dfzo`wRM2h-E_ z1p?tTtAdrQR^cEe+Skf1il`IH_fAWc@R!`7U+hQ;1`p)+so;sxjdmeODXZEDFW`6gnzDO6exCiGcdufe+ zF6zmJYHx>jzj6EZ%9{|ir@zIixnp0PWD7{r(KR7zm9JpqfmjsmsHfjuge1MTR z+jc@#j38Nuza!X9R&V_zJVufpqqddb`e5Yv^B0v$(8Op1zM5pKx%mL#!wI&H?GT)G z>FE-6+0tZO&yULHhuVw_=B^@4110vk0eysl2s^`QEA5$YD-S|`x0x{ukpb%1XV*kX z_AU_}f_=sw<^jIXfPx+GXhq>Ya1)dZ-|_A>&5-Wu%1UNbJ{m)38iVrECqMaX*H17h z>ZA?H0^c+0UkSHcMx!2&)4$UkAR9IL)Qv7p2KoCKRZVPWd%dESIuZ%{j#lS~i-(S( zCs#-bVwu<6R5`QPkWBN9WVLV*DsXYKF|!i$#mb(;_oX&@zDAG2$Rm46={l9#2W)g% zyA@K4lF?B4-Y*shMqZn!=hNhHGC^KB8Ac(cb{!I6k5F4QGTHuwK+RjZTEy;UQa$>Q ztW94iE6SDo#0Uo&va|guly<1Mc#kcxQ~I*eKNNz{;dK0nNb4!r@6N_-1pbODHZ!(< zJ9cT;+*617a6~7!lb0^h?aiBhvG29(5@CqLWi(S>rje4z+~RV!QAE#Nwr^>@?{RrE zJ02+DH%gyYOM5= zFbJ-Ddvg`#&Fe)gYJ$0*@(Oq<-8_~4Uv-9l#MovrjEU+SBKL;QPy$aEjKy%b&EjZe zX)~?&E5R|TGDo)>y(kbhDZ4){Dci&|%~{M*w*}CCf0?u4RSt@=TL^vwblzXM&11Y) zF$#70Xdv36P3vZanZ3B77mBR5OLm;iSBjher~-P(^N=xPSCJJ=W}9NX7rv*brwSxI zZ8U7=DnZqvS#$y7j)E}()Qh*$H8v!7h9!&n=4;RXS@eS$p~wm}GT=>25X?0zQqSIm21|| z;FX$>?t?*MWv?AE0ml~tur^W7Z?;Bue$Q~BqM0gmljh43A4YM=+j@*)qvDl;D>d(} zo&W$i=Xjs-!EG#_emyu>W&t=5J7HieULF={UvpA28bCdKCPU6@X-Rvj-2hu1@UIW^ z;Fo`$qklc1haS(rPR+lL4a$0`jtuOF#(Z5>o76)WhecxN(MuF2D#QTl`Tvc?e-yv( zXBy*DMJv$(?dYH#$xIzsmHUM*<^DPf+_;VCgAbj}yQy~b7*F~0iYJ=y0nf@O`^&`N; z6>327dKf&!tKA0WQL6n7JIt~mMcr8KHAVHn{>S@aiQhEie2-hgL*W3gRxh-R&t2wd zUw|m-C(zSD40>O@-ZjS4`?R4^c-8iOrqyw{-v-$tA6x9 zNIK{NLkRL6j?%;&t@_6UJJk3nAM-ze2ZRS8YMtsw`>I9LJ5TcgyUd^*&^ zDAPPJK{5CO{6B<3QRHJjeEthU!6*FwBkx5B&tj6(;|F99vb0CR@V}j%yHil&AE>3$ zK^J6dy~8es5(m8I$g&2#{QuCUafSVZ{zs<=A^!>dK=1{4LmhlJ<@;ZH07{R4Yoc^P z3WAdLT0DRBuG(E}#l*$6*IIiB+?cx=bttda{LTEsL_XN#-eMI;N+-au4YI?FM2jsN+>)gRfZY6s8n%TauAWfy*BsJHid zXlBMIsc@gmelDIKW|n4Ve`&#nqb>6LJCP&kUVo2=ZhviUyXYU+8pe&UUeQa7h_3u5 z8e>CPv~1VUI;cu zjJecdx4UO)0y%lTf4y2eyg05ap6FS-tv-YuH*L-Ch;ye&U*ee~_1(TqblH{LZ@QP& zD`)}*8@w_en76(F;oBI8h$D_t~tS`3fKwH?82zm4iRUX3E zp-x;M_3RZ@WVC_p4wsqtF8sVQ7$@T{H{6Ydd;{<$cMHR4frO&CYj}1M`)qNyYmGUF zz-8=U-vAQcBhe0lWP{n7Q*;({^~$Jq9n-2nsO(G!3H0dma5;xgw~sF6s*&J`m^8gQ zKJ7j&XH9b)YxbH7z*rs9*$6h_dyd1Fb!G>>JN0mJWe=U^gm+4daMatWaKFgX22SU= z#>geVMDFNMh3@%7M@5|G)Xtl$U;oU*HzB7c|6so461xr)i6jFunIE!q2L+cbSgs#~ zx^qe^V>3}jVgA08YX;V&POeBWB%5g)$e)b&OTeWhZ>2qc;Wuf6H6U4&IrK zo$lJqZ~9~%HLH-T{ZO?o(0rc;>Yn6IYw*#BPl-Ed8*=?(C)y!w5rA4TW%uzELRBjc zKX}k+I6bd=ihp_GsXDhQ#n-CzIR!kY^Nh~=o`o#`F0mw z>z#=%9-eveW^V`nvQWW1cRK^#K^tvX7iYmTXuHptr_PEiyZ5dm7ri-!0D~bx3c_Lp zLdqMJ|1ZVu^|D2nUJVWAgG}71F`16*gLLvbSKS)>L1CkO-JWjYW}HNKSCDi+A4_3DT;6^i5C3n`(AzX7=ANVoU5v zHbKt5j%Y%89w;>!FLFUJA8LE%NMAhp%Q<(>biYt%rvTbzc#2iUxwcmT6=!TsIiCq z$1_DEa-3dK3wjS-I-XU%sqHaT0p=*)u~~Y%HG-yiebl2F+LH!r-HagjOsPShxmBE;dG;lgsUy}{#SBLm8z(`L@r&qJ)<&DP7;){-uC@?KQK zpY7VYcqEn%O^EBdrd5LO3a@<&K|&CZUu%0dBx$pB6J50~_5|yBoe@~w`$f<%&!&41 z-{10ii0f||9hyKW?I{M$G^yvlGV9_r%(GkIN{G%7HJ@@e;hXF?iJWB|c6tmQO+%90J$bd{$> zUf2_qV>??QFKxFo8ZyV}%(EOkq+Dtt$JOin-1$xe44SKTGJ8c_wQ3FTss>EGmfPIq zQ;*H8A;nQZIuf<3P^1Mj-@na;2l-NzTqZWVl;AVt1HrSQ90}E&m+g4*IGAxW=K0x_ z;gSkG9^^sXXt{pb;}ka-re;Lf3T_)=w_8C^xAvUQ7igMm_jxy7emQ@!tzVI!`3^FJ zebZt*LoY=#B|w{qb(WTaS)DBw>&%1>77aa0wDM#K2B~oMnh@9-jCTcKX{^*F3D?ul zF+Bxp$nn3@^yC@$>zjddr1lCZ1;^@+bb0;e+oXCYoR0Yn_UH%b&W)DzyP*eqft%Cx zb)C~<9SH`>_W%uY67t=u;1@C%0iX$*vY||OR`L{L1^F;q2Dm!nse7}d;44Ttw4hhr zyV1_w`rLT2UiehE?gi@_+S`f`hNpHq{*SzTrx&x$^!#im<82~v*NDx~9z%rEp%Rgx z>>*k88;2samj+XLn3dsJA?D(4Ls+|d@mrjX_Pi%c6mS;zd0bqFdS2|UZ9Mo$a4|4F zy)YLF#rkD*^b{w>V#db0EZg`j`<$xOlG~wky>A;&1UDtw_?_ZM(w7yt<(4Q(XIoz9tDLxZfw2aNrIHY6yL4+|#*Kf$L2X&(n z%!VG1r2~0omCc-eK?A(W=`+nLQB4&oOhF)%<#=8lSzht0Kfsq$Iun+km&)RY7*xhm z#s-{KKP6x|SrwqOO*3zO7_B$j#DtH0LALDm6_(`TGv|_xpg)0s7XpTnCF(etpQj2D zj_=wK@9%X=^EAt9yQgJAtC*3q0&+WHGM4afY61#7sAueE7TGyducvu%dDW3rEe!M% zsi8+l+QpmOk)T&eC#9t<+d@E`2fOmc&)Ci6t)G74fQ+;Zo-lqTT)0Y^yQYMU3^kV5 zLL9AS-SvLg;Mcv5cEaiUQ>XbV=;pw;6A--ypN>316D*$N5&!7(hjy9)VY~WL-RY72 zA(lPXe{F^=*hn}W2-2T`jrzREtDRBPJlV11Iunoq>YDBq={_lxQ8D~7)P}P`?%pcVs*>Ezx0sipZ zBC8_sGmiGRDmk6$UjLYmxdH68C3blH1b(6L!?1FATbcJF04WPJz}#=jcRtzbCy2Nx zxly3g+&ebVwRW$-u6g-u@92Z~^@aFr<4}G^ukh#*9eeL;Q)vb4hs6fPySaR9^`lc{r^z? zPavEp4~$`tZn6`*q^jW>STiT$jtRV__u%%A4ObSd3ZYaB*-9II4XnKRymiZ8C6Pz_e0EVSULo3!tWJ5dunZ)+K?aC@^4;{-Y-H z_1kbg2_W;Yxoqg+?EN9XSdW^Sq4-`N^e4`PL#|5fv@srxbf*h%p2ZTT+PjmZBLF%MoVVDg+eF@fMl;LjLS36gIjyO=FT$=#)3r!J|Z-s^33< ziH1%cR(?1nx<7t6wf2t3708|tnZlmFTT|UmgWycaY7r;ZpI_}eZrKiE@s)R4+l+@Q z@T=uoyC*`o(e0mHiA*iZEsKKv!9HH(jxwd)<^OwZ&-?joAbW+F-Q;%1 z<i0bJ9_qXW|JN}7P0_E;r*}2tLqp8fnhaqFiLdQcPL*M-MEJT+=Su-h z8GLg2my0xyqPTOu_U~?v0i~$DiJmKhU7S-;2b9pwP8aC71x(o054PCDw(C~Z&(xd_ zg#iOe2SXQr-O!t%x&Qu*b3zQJz*fN==xz33v%^*q9K2d+Az!JMiI4C(j|`~&HJijD zel#563eWRbZxTDvt1E~vG&Nf^tO_6v3DcRSQ0y>iqtE#8Z2YsO)+U3dwbZ+-fTrAD zM;nSVp?VxD-!|uwK0zO*SLs$Aompyyq=+cph>FeC`E(ia8(}?Tygk4A7F+`YN>!{! zQb5Rg<_VjXq3KZlm^4i$`cUqtb=@XUY6OHu>Qj%W9DiI-5RcI=G_GQnF5M z^v(7$i}pZ*6NP^!4oQe+%xv>!U~g4-!{%37I6-K?s0q$xjFa?%Q;)vQ8~tkBsH@o^ zgrxl}byO}8QNc-5vEH1>@siidkhIV4UCECiXe#HZJx?}f%^SxM6Tgx!

>?^N-~F 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 z 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

v}cVs?BG$rY=I-Ut_eh})hsCV|8JvTld^Bu2^ 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%0Ddnm@ngZ^y9> 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 l4V4#?k^J;fDxgd@kHt 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

  • -_^|Ifoti7AP{ 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

    r5=T1*?SR)pvF`_nink>ru4_3qT^ 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 literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index 2f4f8e3..da8f7ee 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,20 +1,37 @@ Firmware Upgrader ================= -**Source code**: `github.com/openwisp/openwisp-firmware-upgrader -`_. +.. seealso:: -A firmware upgrade solution designed specifically for OpenWrt devices, -with the potential to support other embedded operating systems in the -future. It offers a robust and automated upgrade process, featuring -functionalities such as automatic device detection, retry mechanisms for -network failures, mass upgrades, and a REST API for integration. + **Source code**: `github.com/openwisp/openwisp-firmware-upgrader + `_. -For a comprehensive overview of features, please refer to the -:doc:`user/intro` page. +A firmware upgrade solution designed specifically for OpenWrt devices, with the +potential to support other embedded operating systems in the future. It offers a robust +and automated upgrade process, featuring functionalities such as automatic device +detection, retry mechanisms for network failures, mass upgrades, and a REST API for +integration. + +For a comprehensive overview of features, please refer to the :doc:`user/intro` page. + +The following diagram illustrates the role of the Firmware Upgrader module within the +OpenWISP architecture. + +.. figure:: images/architecture-v2-openwisp-firmware-upgrader.png + :target: ../_images/architecture-v2-openwisp-firmware-upgrader.png + :align: center + :alt: OpenWISP Architecture: Firmware Upgrader module + + **OpenWISP Architecture: highlighted firmware upgrader module** + +.. important:: + + For an enhanced viewing experience, open the image above in a new browser tab. + + Refer to :doc:`/general/architecture` for more information. .. toctree:: - :caption: User Docs + :caption: Firmware Upgrader Usage Docs :maxdepth: 1 ./user/intro.rst @@ -25,7 +42,7 @@ For a comprehensive overview of features, please refer to the ./user/settings.rst .. toctree:: - :caption: Developer Docs + :caption: Firmware Upgrader Developer Docs :maxdepth: 2 Developer Docs Index From f0aff0b006d4e9030acf91c725f8ee5a9ecf01d2 Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Thu, 1 Aug 2024 18:53:29 -0400 Subject: [PATCH 17/18] [docs] Reformatted docs --- docs/developer/extending.rst | 8 ++++---- docs/index.rst | 20 +++++++++++--------- docs/user/quickstart.rst | 8 ++++---- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/docs/developer/extending.rst b/docs/developer/extending.rst index fab8231..f7d231f 100644 --- a/docs/developer/extending.rst +++ b/docs/developer/extending.rst @@ -3,10 +3,10 @@ Extending OpenWISP Firmware Upgrader .. include:: ../partials/developer-docs.rst -One of the core values of the OpenWISP project is :ref:`Software Reusability `,, -for this reason *OpenWISP Firmware Upgrader* provides a set of base -classes which can be imported, extended and reused to create derivative -apps. +One of the core values of the OpenWISP project is :ref:`Software +Reusability `,, for this reason *OpenWISP +Firmware Upgrader* provides a set of base classes which can be imported, +extended and reused to create derivative apps. In order to implement your custom version of *OpenWISP Firmware Upgrader*, you need to perform the steps described in this section. diff --git a/docs/index.rst b/docs/index.rst index da8f7ee..e98180f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -6,16 +6,17 @@ Firmware Upgrader **Source code**: `github.com/openwisp/openwisp-firmware-upgrader `_. -A firmware upgrade solution designed specifically for OpenWrt devices, with the -potential to support other embedded operating systems in the future. It offers a robust -and automated upgrade process, featuring functionalities such as automatic device -detection, retry mechanisms for network failures, mass upgrades, and a REST API for -integration. +A firmware upgrade solution designed specifically for OpenWrt devices, +with the potential to support other embedded operating systems in the +future. It offers a robust and automated upgrade process, featuring +functionalities such as automatic device detection, retry mechanisms for +network failures, mass upgrades, and a REST API for integration. -For a comprehensive overview of features, please refer to the :doc:`user/intro` page. +For a comprehensive overview of features, please refer to the +:doc:`user/intro` page. -The following diagram illustrates the role of the Firmware Upgrader module within the -OpenWISP architecture. +The following diagram illustrates the role of the Firmware Upgrader module +within the OpenWISP architecture. .. figure:: images/architecture-v2-openwisp-firmware-upgrader.png :target: ../_images/architecture-v2-openwisp-firmware-upgrader.png @@ -26,7 +27,8 @@ OpenWISP architecture. .. important:: - For an enhanced viewing experience, open the image above in a new browser tab. + For an enhanced viewing experience, open the image above in a new + browser tab. Refer to :doc:`/general/architecture` for more information. diff --git a/docs/user/quickstart.rst b/docs/user/quickstart.rst index 47402f8..c4a47cc 100644 --- a/docs/user/quickstart.rst +++ b/docs/user/quickstart.rst @@ -38,10 +38,10 @@ becomes available. 2. Create the Build Object -------------------------- -Create a build object by going to *Firmware management > Firmware -builds > Add firmware build*, the build object is related to a firmware -category and is the collection of the different firmware images which have -been compiled for the different hardware models supported by the system. +Create a build object by going to *Firmware management > Firmware builds > +Add firmware build*, the build object is related to a firmware category +and is the collection of the different firmware images which have been +compiled for the different hardware models supported by the system. The version field indicates the firmware version, the change log field is optional but we recommend filling it to help operators know the From bb48fad20c9d6e7d321fc3a966db700598c1223b Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Sat, 3 Aug 2024 10:54:56 -0400 Subject: [PATCH 18/18] [qa] Don't skip README in docstrfmt --- README.rst | 3 +-- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index c0d05e7..29bb087 100644 --- a/README.rst +++ b/README.rst @@ -44,8 +44,7 @@ Documentation - `Developer documentation `_ -- `User documentation - `_ +- `User documentation `_ Contributing ------------ diff --git a/pyproject.toml b/pyproject.toml index 026925a..96ab33d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ omit = [ ] [tool.docstrfmt] -extend_exclude = ["**/*.py", "README.rst"] +extend_exclude = ["**/*.py"] [tool.isort] known_third_party = ["django", "django_x509"]