OpenWISP 26.09
This release brings major improvements to maps, firmware management, device location data, consistency, REST API endpoints, and bug fixes.
Highlights
Better geographic and indoor map experience
More flexible firmware upgrades
Richer device location data
Below you can find the detailed full change log for all the modules included in this release. Enjoy!
openwisp-users (v1.3)
Features
Added user account expiration with automatic deactivation and reminder emails.
Allowed customizing the password reset form.
Added API key management to the user admin. Authorized administrators can create and delete API keys for users, while users can always delete their own API keys. API keys belonging to other users are masked.
Added extensible field serialization to the export_users command, including custom serializers, related object extraction and relation traversal.
This changes the structure of the generated CSV output and may require updates to scripts which parse it.
Added
OPENWISP_USERS_SOCIALACCOUNT_ADMIN_NEEDEDto support custom allauth OAuth/SAML providers when automatic detection is not sufficient.
Changes
Other changes
Improved password expiration handling with SSO and REST API authentication. Users authenticated through passwordless methods such as SAML, OAuth and sesame magic links are no longer prompted to update an expired local password. REST API clients now receive a JSON
403response instead of an HTML redirect.Renamed the "Is admin" label to "Organization manager".
Improved admin theme consistency by using shared theme colors provided by OpenWISP Utils.
Dependencies
Added dj-rest-auth>=7.2.0,<7.3.
Bumped
django-organizationsfrom>=2.5.0,<2.6.0to >=2.7.0,<2.8.0.Bumped
django-extensionsfrom>=3.2,<4.2to >=4.1,<4.2.Bumped
django-allauth[socialaccount]from>=65.12.0,<65.14.0to >=65.19.1,<65.20.0.Bumped
django-phonenumber-fieldfrom>=8.1.0,<8.2.0to >=8.5.0,<8.6.0.Bumped
phonenumbersfrom>=9.0.10,<9.1.0to >=9.0.38,<9.1.0.Bumped
django-reversionfrom~=6.0.0to ~=6.3.0.Bumped
django-redisfrom~=6.0.0to ~=7.0.0.Bumped
openwisp-utils[rest,celery]from~=1.2.0to ~=1.3.0.Dropped support for Django
4.2.0.Dropped support for Python
3.9.
Bugfixes
Fixed custom REST API view overrides so
get_api_urls()correctly uses callbacks from custom view modules while falling back to the default views when an override is not provided.Fixed infinite recursion when custom API views subclass
ChangePasswordView.
openwisp-notifications (v1.3)
Features
Added target URL suffix support to the
notifysignal.
Changes
Backward-incompatible changes
Changed notification types to be mandatory.
Notification.typecan no longer be null andnotify.send()now requires thetypeargument.
Other changes
Updated notification preference colors to use OpenWISP theme colors, improving compatibility with customized themes.
Updated notification preferences to respect Django permissions, allowing users to modify other users' preferences only when they have the required permissions.
Replaced the third-party JSONField with Django's built-in JSONField.
Dependencies
Bugfixes
Fixed global notification setting integrity by ensuring that each user can have only one global notification setting and resolving existing duplicates.
Fixed web notifications being received when disabled globally.
Fixed fragment notifications remaining open when already on their target page.
Fixed support for swappable user models by removing a hard-coded dependency on
openwisp-users.Fixed database migration from the third-party JSONField to Django's JSONField so PostgreSQL columns are correctly converted from text to
jsonbduring upgrades.Fixed notification admin object ID extraction.
Fixed an invalid escape sequence warning in
setup.py.
openwisp-controller (v1.3)
Features
Added WHOIS lookup and geographic location estimation for devices, including WHOIS details in the admin UI, automatic refresh of stale WHOIS data, estimated-location notifications and warnings, and admin and API filters for estimated locations.
Added WebSocket support for broadcasting all location updates.
Added an API endpoint for retrieving indoor device coordinates for a location.
Added location and floor plan filters to the device list API, allowing searches by location name and filtering by location or floor plan UUID.
Added generic cache invalidation for configuration models. Models can declare cache dependencies using
CacheDependency, and the newprint_cache_dependenciesmanagement command can be used to inspect the dependency graph.Allowed devices to update their name during re-registration.
Changes
Other changes
Enforced the deactivated device state across OpenWISP Controller. Deactivated devices can no longer register, receive configuration updates, run remote commands, or receive automatically assigned templates. Cleanup and security operations continue to work normally.
Allowed deleting organizations containing active devices while displaying a warning about the active devices that will be affected.
Replaced the third-party
jsonfieldimplementation with Django's built-inJSONField#1061, including migration handling for databases upgraded from older OpenWISP Controller versions.Changed VPN synchronization errors and recovery events to use
generic_messagenotifications #1049.Improved command status visibility in the admin interface by highlighting statuses with different colors #812.
Dependencies
Bumped
django-reversionfrom~=6.0.0to ~=6.3.0.Bumped
netjsonconfigfrom~=1.2.0to ~=1.3.0.Bumped
django-x509from~=1.3.0to ~=1.4.0.Bumped
django-locifrom~=1.2.0to ~=1.3.0.Bumped
django-flat-json-widgetfrom~=0.4.0to ~=0.5.0.Bumped
openwisp-usersfrom~=1.2.0to ~=1.3.0.Bumped
openwisp-utils[celery,channels]from~=1.2.0to ~=1.3.0.Bumped
openwisp-notificationsfrom~=1.2.0to ~=1.3.0.Bumped
openwisp-ipamfrom~=1.2.0to ~=1.3.1.Bumped
djangorestframework-gisfrom~=1.2.0to ~=1.3.0.Bumped
paramikofrom~=4.0.0to ~=5.0.0.Bumped
scpfrom~=0.15.0to ~=0.16.1.Bumped
django-import-exportfrom~=4.3.10to ~=4.4.1.Added geoip2>=5.3.0,<6.0.0.
Dropped support for Django
4.2.Dropped support for Python
3.9.
Bugfixes
Fixed subnet-division rules allocating addresses already in use by respecting existing child prefixes and pre-allocated IP addresses.
Fixed background command and connection operations potentially restoring objects that had been deleted concurrently or causing foreign key errors.
Fixed VPN client synchronization when switching VPN templates, preventing inconsistent client state during repeated template updates.
Fixed SSH connections remaining open when
update_config()failed.Fixed malformed UUID URLs returning HTTP 500 instead of HTTP 404.
Fixed the Device admin delete confirmation page when OpenWISP Controller is extended by downstream applications.
Fixed a typo in the
update_strategyvalidation error message.
openwisp-monitoring (v1.3)
Features
Added indoor maps, allowing users to drill down from the geographic map to floor plans, retrieve indoor device information through the REST API, and filter locations by device status.
Added a dedicated geographic map page with links from device pages and bookmarkable map actions for sharing specific map views.
Allowed moving devices to update their position in real time on the dashboard map.
Allowed opening indoor floor maps directly from their URL, including navigation between floors without first selecting a device.
Added inspection and filtering of problematic metrics from the device list, making it easier to identify unhealthy devices without leaving the list page.
Changes
Other changes
Improved location health status on the geographic map. Location markers now represent the predominant active-device health status while handling deactivated devices separately.
Added 5G signal information and support for partial mobile signal metrics, including 5G RSSI and additional signal information in the device admin status tab.
Simplified map world wrapping using the functionality provided by
netjsongraph.js.Replaced the third-party
JSONFieldimplementation with Django's built-in JSONField, while preserving existing PostgreSQL data correctly during upgrades.
Dependencies
Bumped
openwisp-controllerfrom~=1.2.0to ~=1.3.0.Bumped
django-nested-adminfrom~=4.1.4to ~=4.1.6.Bumped
python-dateutilfrom>=2.7.0,<3.0.0to >=2.9.0.post0,<3.0.0.Upgraded netjsongraph.js to 0.4.0.
Updated the bundled
Plotly.js,Moment.js, andLeaflet Fullscreenlibraries.Dropped support for Django
4.2.Dropped support for Python
3.9.
Bugfixes
Fixed incorrect metric health after a device became unknown, ensuring the correct health status is shown if the device is later reactivated.
Fixed mobile signal attributes with zero values not being displayed.
openwisp-firmware-upgrader (v1.3)
Features
Added real-time progress updates for single and mass upgrade operations. Mass upgrade details now use a paginated table which can be filtered by status and organization.
Added mass upgrades by device group or location.
Allowed cancelling upgrade operations.
Added several hardware models to the default firmware image list.
Changes
Other changes
Allowed deletion of completed upgrade operations. Single and batch upgrade operations can now be deleted when they are no longer in progress.
Improved cascade deletion of upgrade operations, allowing parent objects such as organizations to be deleted while still preventing direct deletion of in-progress operations.
Improved breadcrumbs and display names for upgrade operations.
Improved compatibility with OpenWISP admin themes by using shared theme color variables.
Dependencies
Bugfixes
Fixed errors when OPENWISP_FIRMWARE_UPGRADER_API is disabled. Upgrade operation pages no longer raise
NoReverseMatchwhen the REST API is disabled.Fixed upgrade operations being allowed on deactivated devices.
Fixed HTTP 500 errors when device credentials are missing by reporting a validation error instead.
Fixed migration
0002to correctly create permissions when using a custom group model.Fixed HTTP 500 response in the device admin when submitting firmware without selecting an image.
openwisp-ipam (v1.3)
Features
Added support for reserved subnets in the address allocation graph, including their visualization and a dedicated REST API endpoint for retrieving reserved subnet data.
Changes
Other changes
Improved address allocation graph performance by loading graph data asynchronously.
Dependencies
Bugfixes
Fixed duplicate IP address validation across related subnets so IP addresses cannot be duplicated across parent and child subnets.
openwisp-network-topology (v1.3)
Changes
Other changes
Migrated the
NodeandLinkJSON fields to Django's built-in JSONField, replacing the deprecated third-partyjsonfielddependency.Migrated the network topology interface to the OpenWISP theme CSS variables.
Removed the obsolete django-netjsongraph upgrade command.
Dependencies
Bumped
openwisp-usersfrom~=1.2.0to ~=1.3.0.Bumped
netdifffrom~=1.2.0to ~=1.3.0.Bumped
django-flat-json-widgetfrom~=0.4.0to ~=0.5.0.Bumped
openwisp-utils[celery,channels]from~=1.2.0to ~=1.3.0.Upgraded
netjsongraph.jsto 0.4.0.Dropped support for Django
4.2.Dropped support for Python
3.9.
Bugfixes
Fixed malformed UUIDs causing errors when accessing views that accept UUID parameters.
openwisp-radius (v1.3)
Features
Added multi-tenancy support for registered users. Registered users can now join multiple organizations independently, using different identity verification methods and verification status for each organization. The
registered_usersCSV export now contains organization-specific registration data in a nested structure.Added the
radius_accounting_closedsignal for integrations which need to react when a RADIUS accounting session closes. OpenWISP Monitoring now uses this signal to reliably record traffic for all closed sessions, including sessions closed in bulk.Added REST API endpoints for reviewing RADIUS batch operations, including filtering, pagination, detail views, and deletion of completed batches.
Added an API endpoint for managing the RADIUS groups assigned to users.
Allowed partial custom REST API view modules, with automatic fallback to the default views when individual custom views are not provided.
Changes
Backward-incompatible changes
Moved password reset functionality to openwisp-users. The local
PasswordResetSerializeris deprecated and password reset requests now always return HTTP 200 regardless of whether the supplied identifier belongs to an existing user.Moved user account expiration handling to openwisp-users and removed the corresponding OpenWISP RADIUS management command.
Other changes
Improved RADIUS session date and time display by using the server timezone consistently with the Django admin.
Removed the obsolete upgrade_from_django_freeradius management command.
Replaced the third-party
jsonfieldpackage with Django's built-inJSONFieldfor RADIUS batch credentials and SMS metadata.
Dependencies
Bumped
dj-rest-authfrom>=6.0,<7.2to >=6.0,<7.3.Bumped
django-redisfrom~=6.0.0to ~=7.0.0.Bumped
weasyprintfrom>=65,<68to >=65,<70.Bumped
openwisp-notificationsto ~=1.3.0.Bumped
openwisp-usersto ~=1.3.0.Bumped
openwisp-utils[rest,celery]to ~=1.3.0.Replaced Exscript with telnetlib3.
Dropped support for Django
4.2.Dropped support for Python
3.9.
Bugfixes
Fixed blank RADIUS check and reply admin pages for view-only users.
Fixed email lookups and SAML email synchronization being case-sensitive.
Fixed the convert_called_station_id command failing to convert Called-Station-ID values.
Fixed WebSocket authorization for RADIUS batch status updates so staff users can only receive updates for organizations they manage.
openwisp-utils (v1.3)
Features
Implemented sub-filter functionality in Django admin #700
Introduced
SubFilterMixinto allow admin filters to be displayed and applied only when a parent filter has specific values. This enhances the admin interface by enabling hierarchical filtering.The filter rendering system has been updated to group parent filters with their sub-filters, displaying sub-filters vertically below their parents. Client-side JavaScript logic dynamically shows or hides sub-filters based on parent filter selections.
Invalid sub-filter usage, such as providing a sub-filter value when its parent is inactive, will now raise
IncorrectLookupParameters. Orphaned sub-filters with invalid configuration will be logged as errors and not rendered.Add OpenWispPagination class with default values #586
Introduces the
OpenWispPaginationclass, inheriting from DRF'sPageNumberPagination. This class provides sensible default values for pagination across OpenWISP modules, configurable via settings.The default page size is set to 10 and the maximum page size to 100. These can be overridden by
OPENWISP_API_DEFAULT_PAGE_SIZEandOPENWISP_API_MAX_PAGE_SIZErespectively. Views can also set apagination_page_sizeattribute to override the default for specific endpoints.Added changelog entry bot #523
Automated issue assignment and removal #571
Added auto-assignment bot with issue assignment, management of stale PR, reassignment on PR reopen and shared helpers in utils.py.
Added CI build failure bot #524
When a CI workflow fails, the bot examines the failure logs and repository context with AI to offer specific guidance for fixing QA check issues, test failures and other common bugs.
Added reusable backport workflow #501
Automates cherry-picking fixes to stable branches via
[backport X.Y]in commit messages or/backport X.Ycomments, with conflict notification.Standardized commit messages using commitizen #110
Commitizen has been integrated in openwisp-utils to standardize how commit messages are written across the project. It introduces an interactive commit workflow that guides contributors to use the correct OpenWISP commit format, ensures commit titles are properly structured, and enforces the presence of an issue reference. The commit message footer is generated automatically using the provided issue number, improving consistency and making commits easier to review and track.
Releaser: added support for non-python packages #522
Changes
Backward-incompatible changes
Removed deprecated
UUIDAdminclass #328The deprecated
UUIDAdminclass has been removed. For equivalent functionality, useCopyableFieldsAdminwithcopyable_fields = ('uuid',).
Other changes
Included commit bodies in releaser changelog
Allowed cascade deletions in
ReadOnlyAdminReadOnlyAdmin.has_delete_permissionpreviously returnedFalseunconditionally, which blocked cascade deletions from parent models (likeOrganization).Added
openwisp_utils.admin.BlockDeleteAllowCascadeMixinto allow reusability of this logic in other OpenWISP modules.Excluded local Python virtual environment directories from QA checks #720
Made menu item registration idempotent #641
Previously, calling
register_menu_grouporregister_menu_subitemtwice with the same configuration at the same position would always raise anImproperlyConfiguredexception. This behavior prevented re-registration, even when an application registered the same menu items again during testing.This change modifies these functions to check if the configuration being registered is identical to the one already present at that position. If the configurations match, the function now logs an informational message and skips the re-registration instead of raising an error. This makes the menu item registration process idempotent and improves testability when applications start again.
Releaser: defined a generic package type to use as fallback
The logic which detected OpenWrt packages has been generalized so that any file which doesn't fall under well defined categories like "python package", "npm package", "ansible role", etc., can fall under the "generic package" type, as long as a VERSION file is defined in the top level directory of the repository, the releaser tool will be able to deal with it, regardless of the tech stack used.
Made changelog bot model configurable and quota-resilient
The changelog bot kept failing with Gemini free-tier quota errors (
RequestsPerDayPerProjectPerModel, 20/day) and marked the workflow as failed, while the CI failure bot stayed green because it swallows the same error. The changelog bot also had no way to switch models and could spend up to three requests per pull request.Forward
GEMINI_MODELthrough the action and reusable workflow so a single variable controls both bots, harden model resolution so an empty value falls back to the default, lower the generation retries from three to two, and exit cleanly on quota errors so the workflow no longer turns red on exhaustion.Also document the
GEMINI_MODELvariable for both bots.SeleniumTestMixin now requires two successful retries after an initial failure
Added default
uuidmethod toCopyableFieldsAdmin#328CopyableFieldsAdminnow ships with a defaultuuid()method that returnsobj.pkand hasshort_descriptionset to'UUID'. This allows subclasses to usecopyable_fields = ('uuid',)without defining their ownuuidmethod when their model uses a UUID primary key.The
uuidfield is not automatically added tocopyable_fields, that's still the developer's explicit decision.Releaser: removed ChatGPT integration #645
Releaser: automated branch selection in changelog porting step #646
Dependencies
Bumped
blackto 26.5.1 (>=25.1,<26.6)Updates the requirements on black to permit the latest version. - Release notes - Changelog - Commits
Bumped
celeryto 5.6.1 (~=5.6.1)Updates the requirements on celery to permit the latest version. - Release notes - Changelog - Commits
Bumped
djangorestframeworkto 3.17.1 (~=3.17.1)Updates the requirements on djangorestframework to permit the latest version. - Release notes - Commits
Bumped
git-cliffto 2.13.1 (~=2.13.1)Updates the requirements on git-cliff to permit the latest version. - Release notes - Changelog - Commits
Bumped
isortto 8.0.1 (>=6.0.1,<8.1.0)Updates the requirements on isort to permit the latest version. - Release notes - Changelog - Commits
Bumped
pytest-asyncioto 1.4.0 (>=1.3.0,<1.5.0)Updates the requirements on pytest-django to permit the latest version. - Release notes - Changelog - Commits
Bumped
seleniumto 4.46.0 (>=4.32,<4.47)Updates the requirements on selenium to permit the latest version. - Release notes - Changelog - Commits
Bumped
tblibto 3.2.2 (~=3.2.2)Updates the requirements on tblib to permit the latest version. - Release notes - Changelog - Commits
Bumped
django-filterto 26.1 (>=25.1,<27.0)Updates the requirements on django-filter to permit the latest version. - Release notes - Changelog - Commits
Bumped
coverageto 7.15.2 (>=7.10.0,<7.16.0)Updates the requirements on coverage to permit the latest version. - Release notes - Changelog - Commits
Bumped
docstrfmtto 2.2.0 (>=2.0.0,<2.3.0)Updates the requirements on docstrfmt to permit the latest version. - Release notes - Changelog - Commits
Bumped
google-genaito 2.7.0 (>=1.62.0,<3.0.0)Updates the requirements on google-genai to permit the latest version. - Release notes - Changelog - Commits
Bumped
django-minify-compress-staticfilesto 1.1.1See Release Notes: https://github.com/openwisp/django-minify-compress-staticfiles/releases/tag/1.1.1
Bumped
pytest-djangoto 4.12.0 (>=4.10,<4.13)Updates the requirements on pytest-django to permit the latest version. - Release notes - Changelog - Commits
Bugfixes
Reload DRF settings after configuring defaults
Bug:
ApiAppConfig.configure_rest_framework_defaultsupdated Django'ssettings.REST_FRAMEWORK, but DRF'sapi_settingshad already loaded its own copy of the configuration. As a result, changes made by apps initialized afterrest_frameworkwere not reflected in the settings actually used by DRF.Fix: Reload
rest_framework.settings.api_settingsafter updatingsettings.REST_FRAMEWORKso DRF uses the latest configuration.Prevented capture decorators from polluting exceptions
CaptureOutput previously tried injecting streams and retried any TypeError. A real failure in a no-argument decorated test retained the expected signature mismatch as exception context, obscuring the regression traceback.
The decorator now selects the valid call signature before executing the test, while preserving support for explicit captured streams, variable arguments, and stacked
mock.patchdecorators.Prevented FallbackMixin from generating spurious migrations #1231
Collect Firefox console logs via WebDriver BiDi #696
Firefox >= 135 no longer loads the Manifest v2 console-capture extension, and Manifest v3 content scripts are not granted host permissions for temporarily installed extensions, so the content script never runs. As a result
get_browser_logs()returnedundefined(which translated toNonein Python) instead of the captured logs on modern Firefox versions, which in turn broke CI builds.The extension was replaced with WebDriver BiDi: a console message handler records every console entry, including those emitted during page load, and the log buffer is reset on each navigation to preserve the previous per-page semantics.
This fixes console capture for every OpenWISP module that relies on
SeleniumTestMixinwithout changing its public API.Excluded
node_modulesdir and other hidden directories from the ReStructuredText QA checkFixed
ValidatedModelSerializervalidation of PUT/PATCH and relationships #633Updated
ValidatedModelSerializer.validate()to:Use
copy()for existing instances to avoid mutating the original.Skip reverse relations (
ForeignObjectRel) duringsetattr.Skip nested relationships.
Convert Django
ValidationErrorto DRFValidationErrorso errors are properly serialized in API responses and work with the parallel test runner.
Triggered changelog bot for backward incompatible changes
Accept
[change!]entries in the changelog bot trigger and validation so backward incompatible PRs receive generated changelog suggestions.Fixed double encoding of device model labels in dashboard #651
Fixed the double-encoding issue in admin dashboard charts where device models with special characters (like &) generated malformed URLs.
Fixed broken skipped Selenium tests in Django parallel runner #619
Fixed Gemini call
Switched to django-minify-compress-staticfiles #565
Replaced the unmaintained django-compress-staticfiles with the new django-minify-compress-staticfiles package for static file minification and compression.
Releaser: perform
git pull --tagsbefore changelog generation
openwisp-wifi-login-pages (v1.3)
Features
Added cross-organization login flow to ensure organization-specific requirements are completed when users log in to a different organization.
Added automatic logout when the RADIUS session is terminated, keeping WiFi Login Pages synchronized with the active RADIUS session.
Changes
Other changes
Removed Captive Portal API.
Updated references to Twitter to X.
Dependencies
Added
@babel/runtime^7.28.6` <https://github.com/babel/babel/releases/tag/v7.28.6>`__.Added
@sentry/node^10.40.0` <https://github.com/getsentry/sentry-javascript/releases/tag/v10.40.0>`__.Bumped
axiosfrom^1.10.0to^1.13.2` <https://github.com/axios/axios/blob/v1.x/CHANGELOG.md>`__.Bumped
concurrentlyfrom^8.2.1to^10.0.5` <https://github.com/open-cli-tools/concurrently/releases/tag/v10.0.5>`__.Bumped
core-jsfrom^3.19.0to^3.47.0` <https://core-js.io/changelog>`__.Bumped
deepmergefrom^4.2.2to^4.3.1` <https://github.com/TehShrike/deepmerge/blob/master/changelog.md>`__.Bumped
dompurifyfrom^3.0.6to^3.3.3` <https://github.com/cure53/DOMPurify/releases/tag/3.3.3>`__.Bumped
duration-formatterfrom^1.0.7to^1.1.1.Bumped
expressfrom^5.1.0to^5.2.1` <https://github.com/expressjs/express/releases/tag/v5.2.1>`__.Bumped
fs-extrafrom^11.1.0to^11.3.3` <https://github.com/jprichardson/node-fs-extra/blob/master/CHANGELOG.md>`__.Bumped
inquirerfrom^8.1.1to^14.0.2` <https://github.com/SBoudrias/Inquirer.js/releases/tag/inquirer%4014.0.2>`__.Bumped
jsdomfrom^22.1.0to^30.0.1` <https://github.com/jsdom/jsdom/releases/tag/v30.0.1>`__.Bumped
markedfrom^16.3.0to^18.0.4` <https://github.com/markedjs/marked/releases/tag/v18.0.4>`__.Bumped
node-plopfrom^0.32.0to^0.32.3` <https://github.com/plopjs/plop/releases/tag/node-plop%400.32.3>`__.Replaced
pretty-bytes^7.0.0withfilesize^11.0.13` <https://github.com/avoidwork/filesize.js/blob/master/CHANGELOG.md>`__.Bumped
qsfrom^6.9.4to^6.14.0` <https://github.com/ljharb/qs/blob/main/CHANGELOG.md>`__.Bumped
ttagfrom^1.7.24to^1.8.12` <https://ttag.js.org/docs/changelog.html>`__.
Bugfixes
Fixed Social Login and SAML users being unable to change their password when it has expired.
Improved password reset error messages so invalid reset URLs and password validation errors are clearly reported.
Fixed organization-wide extra JavaScript files not being copied to the distribution build after upgrading
copy-webpack-plugin.Fixed JavaScript transpilation to ES5, restoring compatibility with older browsers.
openwisp-config (v1.3)
Features
Added support for forcing a configuration reload with SIGUSR2.
Changes
Other changes
Added support for removing the default 6 GHz SSID when OpenWrt uses
oweencryption, which is the default for 6 GHz radios.
Bugfixes
openwrt-openwisp-monitoring (v0.3.1)
Bugfixes
ansible-openwisp2 (v26.09)
Features
Added WHOIS and Estimated Location configuration variables.
Configured nginx to serve precompressed gzip and Brotli files, improving static file delivery by serving precompressed files when available instead of compressing them on the fly.
Added Firmware Upgrader WebSocket routes to support real-time firmware upgrade progress updates.
Added support for user expiration reminder emails, including configuration of the reminder schedule.
Changes
Separated the Redis database used for sessions from the cache database. Deployments with a custom Redis cache URL should verify that it does not conflict with the updated Redis database assignments.
Other changes
Added
--upgradeto the defaultopenwisp2_pip_extra_argsvalue to upgrade dependencies when installing OpenWISP modules.Added support for Ubuntu 26.04.
Dropped support for Debian 11.
Dependencies
Upgraded to OpenWISP Users 1.3.x (see change log).
Upgraded to OpenWISP Controller 1.3.x (see change log).
Upgraded to OpenWISP Monitoring 1.3.x (see change log).
Upgraded to OpenWISP Network Topology 1.3.x (see change log).
Upgraded to OpenWISP Firmware Upgrader 1.3.x (see change log).
Upgraded to OpenWISP RADIUS 1.3.x (see change log).
Upgraded to OpenWISP Notifications 1.3.x (see change log).
Upgraded to Netjsonconfig 1.3.x (see change log).
Bumped
ansible-corefrom>=2.15,<2.19to >=2.20.5,<2.22.Bumped
django-redisfrom>=6.0.0,<6.1.0to >=7.0.0,<7.1.0.Bumped
mysqlclientfrom>=2.2,<2.3to >=2.2.8,<2.3.Bumped
psycopg2from>=2.9,<2.10to >=2.9.12,<2.10.Bumped
uwsgifrom>=2.0.30,<2.1.0to >=2.0.31,<2.1.0.Bumped
django-celery-email-rebootfrom>=4.1,<4.2to 4.2.1.
docker-openwisp (v26.09)
Features
Added support for serving pre-compressed static files with Nginx.
Allowed customizing the installation and upgrade path used by
auto-install.sh.Added the DEV_MODE setting to simplify development deployments by relaxing SSL, HSTS, and related security settings.
Added support for user expiration reminders.
Changes
Other changes
Separated Redis databases used for sessions and cache.
Changed admin XHR requests to use same-origin URLs, removing the need for dashboard API base URL overrides.
Improved OpenVPN CRL reloading to avoid restarting OpenVPN every day when the CRL has not changed.
Changed the default locale, timezone, and related settings to neutral values.
Dependencies
Upgraded to OpenWISP Users 1.3.x (see changelog).
Upgraded to OpenWISP Controller 1.3.x (see changelog).
Upgraded to OpenWISP Monitoring 1.3.x (see changelog).
Upgraded to OpenWISP Network Topology 1.3.x (see changelog).
Upgraded to OpenWISP Firmware Upgrader 1.3.x (see changelog).
Upgraded to OpenWISP RADIUS 1.3.x (see changelog).
Upgraded to OpenWISP Notifications 1.3.x (see changelog).
Upgraded to Netjsonconfig 1.3.x (see changelog).
Bumped
dockerfrom>=7.1.0,<7.2.0to >=7.2.0,<7.3.0.Bumped the Nginx image from
1.31.1-alpineto1.31.5-alpine.Bumped the OpenVPN image from
lisenet/openvpn:2.7.3tolisenet/openvpn:2.7.5.Bumped the Postfix and NFS Alpine base images from
3.23to3.24.Bumped the FreeRADIUS image from
3.2.8-alpineto3.2.10-alpine.Bumped
tldextractfrom>=5.3.1,<5.4.0to >=5.3.2,<5.4.0.Bumped
boto3to>=1.43.84,<1.44.0.
Bugfixes
Fixed OpenVPN startup and default-object handling when
VPN_NAMEcontains white space, configuration names differ, or administrators rename system-managed default objects.Fixed Django Channels Redis connections being configured with timeouts.
Fixed edge cases in auto-install script, including environment variable lookup, configuration rewriting, and validation of the OpenWISP RADIUS setting.