meta data for this page
  •  

Gerenciador de CPE - GenieACS

1- Instalando o GenieACS (Necessário dispor de uma Máquina/VM para a Instalação do GenieACS)

        curl -sL https://deb.nodesource.com/setup_12.x -o nodesource_setup.sh

        wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
        # debian 10 
        echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/4.4 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
        
        # debian 9
        #echo "deb http://repo.mongodb.org/apt/debian stretch/mongodb-org/4.4 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
        
        apt-get update
        apt-get install -y gnupg
        apt-get install -y mongodb-org
        
        systemctl start mongod
        systemctl enable mongod
        
        apt-get install gcc g++ make
        apt-get update && sudo apt-get install yarn
        apt install nodejs
        
        npm install -g [email protected]
        useradd --system --no-create-home --user-group genieacs
        mkdir -p /opt/genieacs
        mkdir -p /opt/genieacs/ext
        chown genieacs:genieacs /opt/genieacs/ext
        
        cat < /opt/genieacs/genieacs.env
        GENIEACS_CWMP_ACCESS_LOG_FILE=/var/log/genieacs/genieacs-cwmp-access.log
        GENIEACS_NBI_ACCESS_LOG_FILE=/var/log/genieacs/genieacs-nbi-access.log
        GENIEACS_FS_ACCESS_LOG_FILE=/var/log/genieacs/genieacs-fs-access.log
        GENIEACS_UI_ACCESS_LOG_FILE=/var/log/genieacs/genieacs-ui-access.log
        GENIEACS_DEBUG_FILE=/var/log/genieacs/genieacs-debug.yaml
        NODE_OPTIONS=--enable-source-maps
        GENIEACS_EXT_DIR=/opt/genieacs/ext
        GENIEACS_UI_JWT_SECRET=secret
        EOF
        
        chown genieacs:genieacs /opt/genieacs/genieacs.env
        chmod 600 /opt/genieacs/genieacs.env
        
        
        cat < /etc/systemd/system/genieacs-cwmp.service
        [Unit]
        Description=GenieACS CWMP
        After=network.target
        
        [Service]
        User=genieacs
        EnvironmentFile=/opt/genieacs/genieacs.env
        ExecStart=/usr/local/bin/genieacs-cwmp
        
        [Install]
        WantedBy=multi-user.target
        EOF
        
        cat < /etc/systemd/system/genieacs-nbi.service
        [Unit]
        Description=GenieACS NBI
        After=network.target
        
        [Service]
        User=genieacs
        EnvironmentFile=/opt/genieacs/genieacs.env
        ExecStart=/usr/local/bin/genieacs-nbi
        
        [Install]
        WantedBy=multi-user.target
        EOF
        
        cat < /etc/systemd/system/genieacs-fs.service
        [Unit]
        Description=GenieACS FS
        After=network.target
        
        [Service]
        User=genieacs
        EnvironmentFile=/opt/genieacs/genieacs.env
        ExecStart=/usr/local/bin/genieacs-fs
        
        [Install]
        WantedBy=multi-user.target
        EOF
        
        cat < /etc/systemd/system/genieacs-ui.service
        [Unit]
        Description=GenieACS UI
        After=network.target
        
        [Service]
        User=genieacs
        EnvironmentFile=/opt/genieacs/genieacs.env
        ExecStart=/usr/local/bin/genieacs-ui
        
        [Install]
        WantedBy=multi-user.target
        EOF
        
        cat < /etc/logrotate.d/genieacs
        /var/log/genieacs/*.log /var/log/genieacs/*.yaml {
            daily
            rotate 30
            compress
            delaycompress
            dateext
        }
        EOF
        
        systemctl enable genieacs-cwmp
        systemctl start genieacs-cwmp
        systemctl status genieacs-cwmp
        
        systemctl enable genieacs-nbi
        systemctl start genieacs-nbi
        systemctl status genieacs-nbi
        
        systemctl enable genieacs-fs
        systemctl start genieacs-fs
        systemctl status genieacs-fs
        
        systemctl enable genieacs-ui
        systemctl start genieacs-ui
        systemctl status genieacs-ui
      

A API do GenieACS não possui autenticação, então ela deve ser habilitada apenas para o IP do SGP.

Caso o SGP seja em nuvem, é preciso instalar o NGINX no servidor do GenieACS e configurá-lo a fim de que ele funcione como um proxy para o GenieACS. Pra isso, segue-se os passos abaixo.

Instalando e configurando o NGINX

Instalação do NGINX

apt install nginx

mkdir /etc/nginx/ssl

Gera-se os certificados auto assinados para possibilitar usar o https.

openssl req -x509 -nodes -days 730 -newkey rsa:2048 -keyout /etc/nginx/ssl/server.key -out /etc/nginx/ssl/server.crt

Ao executar esse comando, é necessário interagir com o terminal conforme abaixo:

Utilização do Terminal

BR
Rio Grande do Norte
Natal
GenieACS
GenieACS
localhost
[email protected]

Cria-se um token de acesso.

O Token de acesso pode ser gerado de qualquer forma. Contudo, uma forma fácil de gerar um token seguro é pelo comando:

cat /proc/sys/kernel/random/uuid

Criação do token

Substitui-se o arquivo /etc/nginx/sites-enabled/default .

Substituir o TOKEN_AQUI pelo token de acesso.

      cat < /etc/nginx/sites-enabled/default
        server {
            listen 7558 ssl default_server;
            listen [::]:7558 ssl default_server;
        
            root /var/www/html;
        
            server_name _;
        
            ssl_certificate /etc/nginx/ssl/server.crt;
            ssl_certificate_key /etc/nginx/ssl/server.key;
        
            location / {
                proxy_set_header Host \$http_host;
                proxy_set_header X-Real-IP \$remote_addr;
                proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto \$scheme;
                proxy_read_timeout 3600;
                proxy_pass_request_headers on;
                if (\$http_apikey != "TOKEN_AQUI"){
                    return 401;
                }
                proxy_pass http://localhost:7557/;
            }
        }
        EOF
    

Por fim:

/etc/init.d/nginx restart
systemctl enable nginx

Feito isso, basta bloquear a conexão externa para a porta 7557 e liberar para a 7558 e a api vai estar com um nível básico de segurança.

2- Configurando o GenieACS

Na página de configuração GenieCAS, é necessário acessar Admin -> Provisions e editar o script default com o conteúdo:

      const hourly = Date.now(3600000);
const every_ten_minutes = Date.now(600000);
const dayly = Date.now(24*3600000);

// Refresh basic parameters hourly
declare("InternetGatewayDevice.DeviceInfo.HardwareVersion", {path: hourly, value: hourly});
declare("InternetGatewayDevice.DeviceInfo.SoftwareVersion", {path: hourly, value: hourly});
declare("InternetGatewayDevice.WANDevice.*.WANConnectionDevice.*.WANPPPConnection.*.MACAddress", {path: hourly, value: hourly});
declare("InternetGatewayDevice.WANDevice.*.WANConnectionDevice.*.WANPPPConnection.*.Username", {path: hourly, value: every_ten_minutes});
declare("InternetGatewayDevice.WANDevice.*.WANConnectionDevice.*.WANPPPConnection.*.Uptime", {path: hourly, value: every_ten_minutes});
declare("InternetGatewayDevice.WANDevice.*.WANConnectionDevice.*.WANPPPConnection.*.RemoteIPAddress", {path: hourly, value: every_ten_minutes});
declare("InternetGatewayDevice.WANDevice.*.WANConnectionDevice.*.WANPPPConnection.*.DefaultGateway", {path: hourly, value: every_ten_minutes});
declare("InternetGatewayDevice.WANDevice.*.WANConnectionDevice.*.WANIPConnection.*.DefaultGateway", {path: hourly, value: every_ten_minutes});
declare("InternetGatewayDevice.WANDevice.*.WANConnectionDevice.*.WANIPConnection.*.ExternalIPAddress", {path: hourly, value: hourly});
declare("InternetGatewayDevice.LANDevice.*.WLANConfiguration.*.SSID", {path: hourly, value: hourly});
declare("InternetGatewayDevice.LANDevice.*.WLANConfiguration.*.Standard", {path: hourly, value: hourly});
declare("InternetGatewayDevice.LANDevice.*.WLANConfiguration.*.Enabled", {path: hourly, value: hourly});
declare("InternetGatewayDevice.LANDevice.*.WLANConfiguration.*.Standard", {path: hourly, value: hourly});
declare("InternetGatewayDevice.LANDevice.*.WLANConfiguration.*.*.Standard", {path: hourly, value: hourly});
declare("InternetGatewayDevice.LANDevice.*.Hosts.Host.*.HostName", {path: every_ten_minutes, value: every_ten_minutes});
declare("InternetGatewayDevice.LANDevice.*.Hosts.Host.*.Enable", {path: every_ten_minutes, value: every_ten_minutes});
declare("InternetGatewayDevice.LANDevice.*.Hosts.Host.*.Active", {path: every_ten_minutes, value: every_ten_minutes});
declare("InternetGatewayDevice.LANDevice.*.Hosts.Host.*.IPAddress", {path: every_ten_minutes, value: every_ten_minutes});
declare("InternetGatewayDevice.LANDevice.*.Hosts.Host.*.MACAddress", {path: every_ten_minutes, value: every_ten_minutes});
    
Imagem de exemplo GenieACS

Por motivos de segurança, nenhum equipamento envia campos relativos a senha para o GenieACS. Entretanto, quando o GenieACS envia qualquer desses campos ao equipamento, ele salva a informação enviada. Por esses motivos acima, atualizar um atributo de senha (buscando do equipamento) irá fazer a o campo ser apagado do GenieACS.

Bootstrap

Na página de configuração GenieCAS, é necessário acessar Admin > Provisions e editar o script bootstrap com o conteúdo:

      /*

Realiza a configuração inicial para dispositivos da TP-Link.

Se o dispositivo estiver com a tag NOT_PROVISION o script não será executado.
    
Se o usuário do PPPOE estiver correto, o script não será executado. 

*/

const now = Date.now();

const notProvision = declare("Tags.NOT_PROVISION", {value: 1});

if (notProvision.value !== undefined) {
   
    return;
}

const mac = declare( "InternetGatewayDevice.WANDevice.1.WANEthernetInterfaceConfig.MACAddress", {value: 1}).value[0];

let auth = ext( "sistema", 'pppoeLoginByMac', mac );

if( !auth || !auth.username || !auth.password ) {
  
    
}

declare("InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.*.*", {path: now}); //refresh
declare("InternetGatewayDevice.LANDevice.*.WLANConfiguration.*.*", {path: now}); //refresh

const username = declare("InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.Username", {value: 1} );

if( username && username.value && username.value.length > 1 && auth.username == username.value[0] ) {

	return;
}

// configura o PPPOE com o usuario encontrado
createPPPOEConnection( auth );


function createPPPOEConnection( auth ) {
  
    declare("InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.*.Enable", {path: now, value: now}, {value: false});

    declare("InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.*", null, {path: 1});

    declare("InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.*.*", {path: now}); //refresh

    declare("InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.*.ConnectionType", {value: now}, {value: "IP_Routed"});
    declare("InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.*.Enable", {value: now}, {value: true});

    declare("InternetGatewayDevice.WANDevice.*.WANConnectionDevice.*.WANPPPConnection.*.Username", {value: now}, {value: auth.username});
    declare("InternetGatewayDevice.WANDevice.*.WANConnectionDevice.*.WANPPPConnection.*.Password", {value: now}, {value: auth.password});

    declare("InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.PPPAuthenticationProtocol", {value: now}, {value: "AUTO_AUTH"});

    if(auth.wifi_ssid && auth.wifi_ssid.trim()){
    	declare("InternetGatewayDevice.LANDevice.*.WLANConfiguration.1.SSID",{value: now}, {value: auth.wifi_ssid});
    }

    if(auth.wifi_password && auth.wifi_password.trim().length >= 8){
    	declare("InternetGatewayDevice.LANDevice.*.WLANConfiguration.1.PreSharedKey.*.KeyPassphrase",{value: now}, {value: auth.wifi_password});
    }
    if(auth.wifi_channel && auth.wifi_channel.trim().length){
    	declare("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.Channel",{value: now}, {value: auth.wifi_channel});
    }
}
    

Em seguida, adiciona-se o arquivo /opt/genieacs/ext/sistema com o conteúdo:

      #!/usr/bin/env node

let https = require( "https" );

const options = (dados)=>{
    return {
        hostname: 'demo.sgp.net.br',
        port: 443,
        path: '/api/ura/consultacliente',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': Buffer.byteLength(JSON.stringify(dados)),
        },
    }
}

function pppoeLoginByMac( args, callback ) {    
    const dados = {
        mac_dhcp: args[0],
        "app": "ura",
        "token": "1a551977-a459-4743-9a52-e9d1ca46a480"
    }

    const opts = options(dados)

    const req = https.request(opts, function(response) {
        let data = ''
        response.on('data', function( newData ){
            data += newData
        });
        response.on('end', function(){
            const parsedData = JSON.parse(data);
            let auth = {};
            if( parsedData.contratos && parsedData.contratos.length > 0 ) {
                auth = {
                    username: parsedData.contratos[0].servico_login,
                    password: parsedData.contratos[0].servico_senha,
                    wifi_ssid: parsedData.contratos[0].servico_wifi_ssid,
                    wifi_password: parsedData.contratos[0].servico_wifi_password,
                    wifi_channel: parsedData.contratos[0].servico_wifi_channel,
                    wifi_ssid_5: parsedData.contratos[0].servico_wifi_ssid_5,
                    wifi_password_5: parsedData.contratos[0].servico_wifi_password_5,
                    wifi_channel_5: parsedData.contratos[0].servico_wifi_channel_5,
                };
            }

            callback( null, auth );
        });
    }); 

    req.write(JSON.stringify(dados))
    req.end()
}
exports.pppoeLoginByMac = pppoeLoginByMac;
    

3- Configurar os dados do Gerenciador no SGP

No Menu Sistema -> Gerenciador de CPE

Configurações no SGP

Parâmetros JSON

      {"url": "http://XXX.XXX.XXX.XXX:7557", "token": "TOKEN_AQUI", "mac_filters": 
["InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.Username", 
 "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.2.Username", 
 "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Username", 
 "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.2.Username", 
 "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Username", 
 "InternetGatewayDevice.WANDevice.2.WANConnectionDevice.1.WANPPPConnection.1.Username", 
 "InternetGatewayDevice.WANDevice.2.WANConnectionDevice.1.WANPPPConnection.2.Username", 
 "InternetGatewayDevice.WANDevice.2.WANConnectionDevice.2.WANPPPConnection.1.Username", 
 "InternetGatewayDevice.WANDevice.2.WANConnectionDevice.2.WANPPPConnection.2.Username"]}
    

Caso tenha sido configurado o NGINX no, é necessário mudar a o protocolo da url para https, colocar o token de acesso e substituir a porta 7557 pela porta do NGINX, que é configurada como 7558.

SALVAR

4- Configurar os dados do Roteador

No contrato do cliente alterar as seguintes informações:

Configurações do contrato do cliente

Após configurar, salvar, e já será possível observar a nova aba Gerenciador CPE que mostrará as informações da seguinte forma:

  • Sincronizar -> Cria/Resgata o cadastro do cliente no GenieACS.

  • Importar WIFI -> Pega as informações do Wifi do cliente e salva no Serviço de Internet do Contrato no SGP.

  • Definir WIFI -> Pega as configurações de Wifi do Contrato no SGP e configura no equipamento do cliente via GenieACS.

  • Configurar WAN -> Pega os dados do PPPoE do Contrato no SGP e configura no equipamento do cliente via GenieACS.

  • Ping -> Executa o ping no equipamento e retorna o resultado.

  • SpeedTeste -> Não disponível para o GenieACS.

Configuração feita

5- Edições

Editar o Wifi -> No contrato do cliente terá as seguintes opções:

Opçoes dentro do contrato

Salvar e depois ir na Aba "Gerenciador CPE" e botão "Definir Wifi" para aplicar as alterações e enviar para o GenieACS.

Botão Definir Wifi

Por motivos de segurança, nenhum equipamento envia campos relativos a senha para o GenieACS. Entretanto, quando o GenieACS envia qualquer desses campos ao equipamento, ele salva a informação enviada. Por esses motivos acima, atualizar um atributo de senha (buscando do equipamento) irá fazer a o campo ser apagado do GenieACS.