controlar wpa_supplicant usando node.js

controlar wpa_supplicant usando node.js

Me gustaría controlar wpa_supplicant usando un módulo node.js. Lo más importante es que quiero poder detectar fallos de conexión para poder escribir un programa que pueda actuar sobre ellos.

Hasta ahora, la configuración de una conexión inalámbrica usando wpa_supplicant con comandos de terminal ha sido exitosa. Intenté acceder a la interfaz wlan0 utilizando el módulo dbus-native pero no pude acceder a la interfaz.

También estoy abierto a utilizar otros módulos de nodos existentes o escribir el mío propio si me pueden orientar en la dirección correcta.

¿Alguien podría ayudarme a avanzar aquí?

Código que he probado hasta ahora:

var dbus = require('dbus-native');
var util = require('util');

var bus = dbus.systemBus();
var wpas = bus.getService('fi.w1.wpa_supplicant1');

var wpai = wpas.getInterface('/fi/w1/wpa_supplicant1'
    , 'fi.w1.wpa_supplicant1', function (err, iface) {
        //console.log(err, iface);

        iface.on('PropertiesChanged', function(dict) {
            console.log('interface properties have changed!');
            console.log(dict);
        });

        iface.on('InterfaceAdded', function(path, dict) {
            console.log('interface has been added!');
            console.log(path, dict);
        });

        iface.on('InterfaceRemoved', function(path) {
            console.log('interface has been removed!');
            console.log(path);
        });

        // wpa_supplicant denies knowledge of the interface
        iface.GetInterface('wlan0', function (err, iface2) {
            console.log( arguments );
            console.log(err, iface2);
        });

        //error couldn't grab interface
        iface.CreateInterface([
            ['Ifname',
                ['s', 'wlan0']
            ]
        ], function (err, iface3){
            console.log(err, iface3);
        });

        //error couldn't grab interface
        iface.CreateInterface([
            ['Ifname',
                ['s', 'wlan0']
            ],
            ['Driver',
                ['s', 'nl80211']
            ],
            ['ConfigFile',
                ['s', '~/etc/wpa_supplicant/wpa_supplicant.conf']
            ]
        ], function (err, iface3){
            console.log(err, iface3);
        });

    });

Actualización 1:

Utilicé la API de propiedades de DBus para investigar las propiedades de las interfaces y descubrí que la propiedad en sí era nula.

wpas.getInterface('/fi/w1/wpa_supplicant1', 'org.freedesktop.DBus.Properties', function(err, device) {
                device.GetAll('fi.w1.wpa_supplicant1', function(err, prop) {
                    var props = arrToMap(prop);
                    console.log(err,props);
                });
            });

function arrToMap(arr) {
    var output = {};
    for (var i = 0; i < arr.length; i++) {
        output[arr[i][0]] = arr[i][1][1][0];
    }
    return output;
}

Mi única conclusión es que wpa_supplicant nunca registra ninguna interfaz nueva con dbus.

(Me aseguré de configurar mi wlan0 usando wpa_supplicant usando comandos de terminal)

Actualización 2:

Intenté continuamente descubrir por qué la siguiente parte de mi código sigue dándome el error:

[ 'wpa_supplicant no pudo acceder a esta interfaz.' ]

  iface.CreateInterface([
            ['Ifname',
                ['s', 'wlan0']
            ]
        ], function (err, iface3){
            console.log(err, iface3);
        });

Respuesta1

No estoy seguro de cómo NodeJs maneja esto, pero no puedo crear una interfaz una y otra vez en el solicitante de wpa. Una vez que haya registrado una interfaz en wpa, arroja un error al llamar nuevamente a "create_interface".

Para aclarar, "Crear interfaz" es una funcionalidad que se usa solo la primera vez que usa la interfaz. Por ejemplo, he trabajado con wpa supplicant en Python, y la API de python wpa supplicant tiene dos funcionalidades para esto, "create_interface" y "get_interface".

He estado usando esto en un dispositivo IoT, así que comparto el código Python:

try:
    wpa.create_interface('wlp2s0')
except:
    wpa.get_interface('wlp2s0')

donde 'wlp2s0' es el nombre de la interfaz.

información relacionada