[bug] SSH connection leaked when update_config() raises an exception
I maintainer di solito rispondono entro 1 giorno
@tomsebastian10 ci sta già lavorando.
Dal 21/3/2026.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 55/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Ferma
- Stack tecnologico
- python
- Ambito
- backend, networking
Direzione di ricerca
Inizia in openwisp_controller/connection/base/models.py intorno alle righe 365–373 e leggi il flusso di DeviceConnection.update_config(). Riproduci un invio della configurazione fallito, quindi verifica che la connessione SSH venga disconnessa sia al completamento corretto sia al completamento dovuto a un'eccezione, senza lasciare descrittori di file aperti.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
● Describe the bug
In DeviceConnection.update_config(), the SSH connection is only closed
in the else block, which means it is never disconnected when an
exception occurs during a config push. Over time this leaks SSH file
descriptors and can crash the controller process with:
OSError: [Errno 24] Too many open files
● Steps To Reproduce
- Set up a device with an SSH
DeviceConnection - Make the config push fail intentionally (e.g. wrong credentials, unreachable device, or network drop mid-transfer)
- Observe that no
disconnect()is called — the SSH session stays open - Repeat for multiple devices; file descriptor count keeps growing
● Root cause (file + line)
File: openwisp_controller/connection/base/models.py
Lines: 365–373
def update_config(self):
self.connect()
if self.is_working:
try:
self.connector_instance.update_config()
except Exception as e:
logger.exception(e)
else:
self.disconnect() # ← only runs when NO exception is raised
The else block in a try/except/else only executes when the try
block completes without raising. Any exception causes disconnect()
to be skipped entirely.
● Expected behavior
The SSH connection should always be closed after update_config()
completes — whether it succeeded or failed — to prevent file descriptor
leaks on production controllers.
● Proposed fix
Change else to finally:
def update_config(self):
self.connect()
if self.is_working:
try:
self.connector_instance.update_config()
except Exception as e:
logger.exception(e)
finally:
self.disconnect() # ← runs always, success OR failure
● Screenshots
Not applicable (code-level bug).
● System Information
- OS: Ubuntu 24.04 LTS
- Python Version: Python 3.10+
- Django Version: Django 4.2+
- Browser and Browser Version (if applicable): Not applicable
- Lingua principale
- Python
- Stelle
- 779
- Fork
- 328
- Merge medio
- 2g 19h
- PR unite (30g)
- 7
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di openwisp/openwisp-controller
-
[fix] Recent Commands row uses "created" timestamp for the "Modified" fieldForse già presa @xovishnukosuri l’ha presa 215 giorni fa. Apertabug
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
openwisp/openwisp-controller#1263 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
[feature] Emit a signal when a device operating system changesForse già presa @kimpasha23-beep l’ha presa 4 giorni fa. Apertaenhancement
Difficoltà 3/5 Mezza giornata Idoneità per principianti 65/100
openwisp/openwisp-controller#1506 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
[feature] Add board_name field to Device model for DTB board identificationForse già presa @atif09 l’ha presa 27 giorni fa. Apertaenhancement gsoc
openwisp/openwisp-controller#1491 · 2 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
[bug:gsoc26] Mass command wizards started in two browser tabs overwrite each otherForse già presa @dee077 l’ha presa 29 giorni fa. Apertabug
openwisp/openwisp-controller#1489 · 2 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 5/5 Più di una settimana Idoneità per principianti 30/100
openwisp/openwisp-controller#1484 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di openwisp/openwisp-controller
Issue simili
-
fix formatting of the sample database page of the docsForse già presa @Aaqibhafeezkhan l’ha presa oggi. Apertadocumentation good first issue help wanted
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
chaoss/CollectOSS#544 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
area/plugin good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
kestra-io/plugin-soda#137 ·
-
Difficoltà 2/5 Mezza giornata Idoneità per principianti 62/100
ibm-granite/granite.build#504 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno