Você está na página 1de 16

Gerenciador de CPE -

GenieACS
PASSO 1:
Instalação do NGINX

apt install nginx

mkdir /etc/nginx/ssl

PASSO 2:
Precisamos copiar e colar esse comando no terminal. 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

PASSO 3:

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


abaixo:
BR

Rio Grande do Norte

Natal

GenieACS

GenieACS

localhost

admin@localhost

PASSO 4:
Seguindo esse processo de interação, 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

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

Substituir o TOKEN_AQUI pelo token de acesso.


cat <<EOF> /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

Basta apenas copiar e colar os comandos no terminal com a informação do token gerado no
passo 4.

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

PASSO 1: Criar usuário do SGP para acesso web do GenieACS

Admin > Users > New.

PASSO 2: EDITAR SCRIPT DEFAULT


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});


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.

PASSO 2: EDITAR SCRIPT 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.PPPAuthenticationP

{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});

PASSO 3:
Em seguida, Acessar o servidor do GenieACS via SSH e criar/adicionar 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;

O script acima pode ser substituído pelo abaixo caso o cliente utilize VOIP e queira pegar os
dados do SIP.
(SGP de exemplo nos comentários)

#!/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",
"servicos_dados": 1

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 ) {

telefonia = parsedData.contratos[0]?.servicos_dados?.filter((servico) =>

return servico.tipo === 'telefonia'

})[0]

auth = {

cpf_cnpj: parsedData.contratos[0].cpfCnpj,

contrato: parsedData.contratos[0].contratoId,

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,

sip_url: telefonia?.linhas?.[0]?.dados?.domain,

sip_username: telefonia?.login,

sip_password: telefonia?.password

};

callback( null, auth );

});

});

req.write(JSON.stringify(dados))

req.end()

exports.pppoeLoginByMac = pppoeLoginByMac;

OBS: se o cliente estiver utilizando o GenieACS em docker, utilizar o comando "docker ps" para
buscar o CONTAINER ID e o comando "docker exec -it #CONTAINER-ID /bin/bash" para acessar
o servidor

3- Configurar os dados do Gerenciador no SGP

Menu: SISTEMA >> GERENCIADOR DE CPE


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 servidor do cliente, é 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:

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
5- EDIÇÕES

EDITAR O WIFI

No contrato do cliente terá as seguintes opções:

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

Image not found or type unknown

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.

Revisão #42

Criado Wed, Jan 5, 2022 5:32 PM por Jefferson Raylan

Atualizado Tue, Nov 8, 2022 7:36 PM por Daniel Borges

Você também pode gostar