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:

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

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

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

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:

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.

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.

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.