## Sobre este sistema

Sistema de Pabx Desenvolvido em Laravel
Este sistema possui um sistema de permisoes de usuários por meio de funções/ cargos

O Sistema conta atualmente com dois níveis de acessos:
- Administrador ( Acesso a todo o sistema );
- Cliente ( Acesso a configuração de pabx criado para ele );

É possível criar outros cargos/ funções através do menu "Cargos" 

## Requisitos Mínimos ##

Debian 10 
PHP 7.4
MariaDB
Composer


## Instalação

### Asterisk

```
apt-get install subversion vim libmariadb-dev unixodbc git cmake  subversion git rsync vim fail2ban sudo ntp postfix mailutils sox  libasterisk-agi-perl libstring-random-perl libdate-simple-perl libmime-lite-perl zip curl redis unixodbc libsox-fmt-mp3 libsasl2-modules sqlite3 libdbd-mysql-perl
cd /usr/src/
wget -c http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz
tar -xzvf asterisk-16-current.tar.gz
cd asterisk-*/
contrib/scripts/get_mp3_source.sh 
contrib/scripts/install_prereq install
./configure
```
#### CONFIGURAÇÃO PIPEDRIVE
Ir no arquivo /etc/sudoers e adicionar o conteúdo:

```
Abaixo de:
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

Inserir:
www-data ALL=(ALL) NOPASSWD: /usr/bin/sox


```

#### Seleção de módulos

Digite o comando make menuconfig e selecione os seguintes módulos

* Addon : format_mp3
* Codec Translators: codec_opus
* Application: app_macro

Siga com a instalação

```
make
make install
make config
make samples
systemctl enable asterisk
```

#### Dependencias de perl

```
perl -MCPAN -e'install Log::Logger'
perl -MCPAN -e'install Switch'
perl -MCPAN -e'install install Date::Range'
```

#### ODBC

```
cd /usr/src/
git clone https://github.com/MariaDB/mariadb-connector-odbc.git
mkdir build && cd build
cmake ../mariadb-connector-odbc/ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCONC_WITH_UNIT_TESTS=Off -DCMAKE_INSTALL_PREFIX=/usr/local
cmake --build . --config RelWithDebInfo
make install
echo "/usr/local/lib" >> /etc/ld.so.conf
```

```
apt-get install odbc-mariadb 
```


### PHP
Obs.: Para debian 11 não é preciso adicionar o repositório <code>https://packages.sury.org/php/ </code>

```
sudo apt install apt-transport-https ca-certificates curl software-properties-common zip gnupg git
sudo curl -fsSL https://packages.sury.org/php/apt.gpg | sudo apt-key add -
sudo add-apt-repository "deb https://packages.sury.org/php/ $(lsb_release -cs) main"
sudo apt update
sudo apt install php7.4-common php7.4-cli libapache2-mod-php7.4
sudo apt-get install php7.4-mbstring php7.4-xml php7.4-mysql php7.4-curl php7.4-sqlite php7.4-zip
```



### Composer
```
sudo curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer
```

### MYSQL
```
sudo apt update
sudo apt install mariadb-server
```

Acesse o Mysql de sua máquina como o usuário root
```
mysql -u root -p
```

Criando o Banco:
```
create database pabxvirtual;

CREATE USER 'asteriskuser'@'localhost' IDENTIFIED BY '2sf__d09AJDKaef';

GRANT ALL PRIVILEGES ON pabxvirtual.* TO 'asteriskuser'@'localhost';

FLUSH PRIVILEGES;

quit;

```

## Projeto
Acessar a pasta
```
cd /var/www/html
```

Remover arquivo index.html
```
rm /var/www/html/index.html
```


Clonar o Projeto
```
sudo git clone https://git.brdsoft.com.br/brdsoft/PabxVirtualLaravel.git pabxvirtual
```

Acessar a pasta do projeto
```
cd pabxvirtual
```


Copiando o arquivo .env
```
cp .env.example .env
```

Altere as configurações referente ao banco nas linhas correspondentes ao '''mysql''' e '''configurações '''
```
APP_URL=http://pabxnovo.brdsoft.com.br


DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=pabxvirtual
DB_USERNAME=asteriskuser
DB_PASSWORD=2sf__d09AJDKaef
```

Acrescentar nas configurações do .env após as configurações de EMAIL correspondente a documentação Swagger
```
LS_SWAGGER_GENERATE_ALWAYS=false
L5_SWAGGER_UI_PERSIST_AUTHORIZATION=true
L5_SWAGGER_CONST_HOST=https://pabxnovo.com.br/api/v3/
```


Alterar o arquivo com as configurações iniciais do Pabx.
Altere a variável ***$url*** para o domínio desejado
```
vi database/seeders/SiteConfigTableSeeder.php
``` 

Instalando dependencias:
```
composer update
```

Agora que o arquivo .env foi criado e configurado o banco de dados é necessário gerar a chave(key) do Laravel e criar um link para a pasta storage dentro diretorio public
```
php artisan key:generate

php artisan storage:link
```

### Criando as tabelas no Banco de Dados
Para gerar as tabelas no banco execute o seguinte comando
```
php artisan migrate --seed
```
O Comando acima irá gerar todas as tabelas junto com as permissões de usuários, os dois cargos/ funções e um usuário Administrador e ainda vai relacionar as permissões padrões para o cargo Cliente


## Criando Pastas necessárias
```
mkdir /home/tmp -p
mkdir /var/www/html/pabxvirtual/storage/app/public/dl_files/customer -p
```

## Dando permissão para a pasta storage
É necessário dar permissão para a pasta storage, para o sistema gerar alguns logs e arquivos necessários.
Dentro da pasta raiz do projeto execute o seguinte comando:
```
sudo chmod -R 777 storage
```
## Comando para gerar o HTML da documentação API
Deverá gerar um arquivo JSON, que depois será transformado em página HTML.

```
php artisan l5-swagger:generate
```

### Usuário padrão do sistema
```
usuário:    admin@brdsoft.com.br
senha:      ao^2r%55KNbs
```
## Configurações no PHP para API Sigma
Para que seja gerado as telas corretamente será necessário realizar as seguintes configurações no php.
```
vi /etc/php/7.4/apache2/php.ini
```
Habilite o short_open_tags
```
short_open_tags = ON
```

Desabilite o display_errors para não gerar erros do php na página web
```
display_errors = OFF
```
Em seguida, realize um restart no Apache
```
systemctl restart apache2
```
## Configurações do Apache

### Configurando Virtual Host
```
sudo cp -r common/apache/* /etc/apache2/sites-enabled/
```
Após copiar o modelo do Virtual Host, editar para configurar a URL correta


### Desabilitando Virtual Host Default e ativando módulos necessários
```
a2dissite 000-default
sudo a2enmod ssl
sudo a2enmod rewrite
systemctl restart apache2.service
```


## Adicionando os arquivos do asterisk
```
sudo mv /etc/asterisk /etc/asterisk.orig
sudo cp -r /var/www/html/pabxvirtual/common/asterisk /etc/asterisk
sudo cp -r /var/www/html/pabxvirtual/common/agi/* /var/lib/asterisk/agi-bin/
sudo cp -r /var/www/html/pabxvirtual/common/bin/* /usr/local/bin/
sudo cp -r /var/www/html/pabxvirtual/common/logrotate/* /etc/logrotate.d/
sudo cp -r /var/www/html/pabxvirtual/common/etc/* /etc
sudo cp -r /var/www/html/pabxvirtual/common/postfix/* /etc/postfix/

cd /etc/postfix/
postmap sasl_passwd

cp -r /var/www/html/pabxvirtual/common/cron/* /etc/cron.d/
cp -r /var/www/html/pabxvirtual/common/etc/systemd/* /etc/systemd/system/
cp -r /var/www/html/pabxvirtual/common/fail2ban/* /etc/fail2ban/jail.d/

systemctl restart fail2ban

chown -R www-data.www-data /var/log/asterisk
chown -R www-data.www-data /var/run/asterisk
chown -R www-data.www-data /var/spool/asterisk
chown -R www-data.www-data /var/lib/asterisk
chown -R root.www-data /var/lib/asterisk/moh-custom/
chown -R www-data.www-data /etc/asterisk/
chmod 775 /var/lib/asterisk/moh-custom/
chmod +x /usr/local/bin/whitelist*
chmod +x /usr/local/bin/verifica_pedidos_downloads.pl
```

## Configuracoes Adicionais (manuais)

Criar os seguintes diretórios
```
mkdir /etc/asterisk/pjsip-customer 
mkdir /etc/asterisk/pjsip-trunks
```

Alterar o endereço ip no arquivo pjsip.conf
```
vi /etc/asterisk/pjsip.conf 
```

Executar o reload
```
/usr/local/bin/reloadsip 1
```

### ODBC

Após o termino da instalação alterar o arquivo odbcinst.ini no local driver conforme abaixo:
```
vi /etc/odbcinst.ini
```

De: Driver = /usr/local/./lib64/libmaodbc.so

Para: Driver = /usr/lib/x86_64-linux-gnu/odbc/libmaodbc.so


### Apache

Edite o arquivo abaixo e adicione os certificados corretos, o certificado é obrigatorio para uso de webrtc e informa o domínio correto

```
vi /etc/apache2/sites-enabled/pabxvirtual.conf 
```

### Postfix

Edite os arquivos abaixo de acordo com a credencial e servidor a ser usada para o serviço de email.

Já está configurado com uma conta da brdsoft, mas é natural que o cliente queira usar uma conta de email de seu proprio domínio

```
vi /etc/postfix/main.cf
vi /etc/postfix/sasl_passwd
/etc/postfix/sender_canonical_maps
```

Validar se existe o arquivo sasl_passwd.db na pasta /etc/postfix

*** IMPORTANTE ***

Reiniciar o serviçço do postfix 
```
systemctl restart postfix.
```

### Cron

Verifique os arquivos na pasta /etc/cron.d/ para verificar a necessidade de habilitar ou alterar os tempos

### G729
o Módulo G729 pode ser baixado aqui 
```
http://asterisk.hosting.lv/
``` 

(levando em conta o processador e arquitetura correta) e colocar dentro do diretório 

```
/usr/lib/asterisk/modules
```

E em seguida carregá-lo ou reiniciar o asterisk,  porém, temos uma cópia deste módulo dentro do diretório common/asterisk/g729 na raiz do projeto.

Para baixar codec para o Asterisk 16.
```
cd /usr/lib/asterisk/modules
wget http://asterisk.hosting.lv/bin/codec_g729-ast160-gcc4-glibc-x86_64-core2.so
```


## Pós Instalação (PRODUÇÃO):

Alterar Configurações de E-mail no Painel do Cliente

### Stun ###
Se o servidor tiver servidor stun necessário trocar o IP, Caso não tiver favor desconsiderar ! :)



Alterar arquivo /usr/local/bin/sip_extensions_pj.php
```
Alterar onde tem o nome pab01 para pabx caso o dominio do cliente não tiver pabx01.dominio.com.br for somente pabx.dominio.com.br
```

### SSL ###
Instalação de Certificado SSL no Asterisk
Editar os arquivos http.conf e pjsip.conf informando o path do certificado utilizado pelo apache
```
vi /etc/asterisk/http.conf
vi /etc/asterisk/pjsip.conf 
```

### Whitelist ###

Para ativar o serviço de Whitelist é necessário ativar dois serviços
```
systemctl start whitelist.service
systemctl start whitelist.timer

systemctl enable whitelist.service
systemctl enable whitelist.timer

```
Com isso, ao reiniciar o servidor o sistema de whitelist será iniciado jundo ao sistema operacional

### Limpeza de CDR ###
Se o Cliente possuir o Módulo de Limpeza de CDR acessar o arquivo do cron e descomentar configurando o tempo desejado
```
vi /etc/cron.d/cleanCdr
```

### Fail2Ban ###
Adicionando a regra para ser lida antes do fail2Ban
```
iptables -I INPUT -j WhiteList
``` 


Recomenda-se alterar o fail2ban para adicionar as regras dele sempre por ultimo para melhor funcionamento, para isso
altere o arquivo /etc/fail2ban/actions.d/iptables-multiport.conf alterando a insercao com -I por -A


### Netfilter Persistent ###

Caso o cliente opte por usar firewall podemos instalar o iptables-persistent no debian , este necessita de um plugin, instrucoes 
basicas estao na pasta common/iptables-persistent

## Uso do GPG
```
apt-get install php7.4-dev
apt-get -y install libgpgme11-dev
pecl install pecl_http
pecl install gnupg
```

Editar o arquivo do php inserindo o registro ***gnupg.so***
```
vi /etc/php/7.4/apache2/php.ini 
vi /etc/php/7.4/cli/php.ini 

extension=gnupg.so
```

Comentar a linha 1520 a 1524 do arquivo GPG da Vendor
```
 vi /var/www/html/pabxvirtual/vendor/dbeurive/gpg/src/Gpg.php
```

Criar a pasta no diretório do apache .gnupg e dar permissão do Apache
```
mkdir /var/www/.gnupg -p


chown -R www-data.www-data /var/www/.gnupg/
```

Verificando:
```
php -i | grep -i gnupg
```

## Permissões
Para que apareça todas as permissões na tela de cargos, é necessário fazer um vínculo entre as permissões e os grupos.
Para que isso aconteça, faça login no sistema e acesse a seguinte rota:
```
http://<dominio_do_pabx>/admin/permissionGroups
```

Ou vá no menu "Configurações" -> "Cargos" -> "Grupos" -> "Atualizar Grupos"

# Atualizações #

Na maioria das vezes são criados novos módulos ou permissões e também criados novas rotas.

Para instalar novas dependências (Quando é alterado o composer.json)
```
composer update
```

Caso não precise instalar nenhuma dependência nova, execute o compando abaixo para realizar o autoload das novas funções

```
composer dumpautoload
```

Caso tenha criado um novo módulo
```
php artisan db:seed --class=GerenciamentoDeModulos
```
Caso tenha altuma migration nova para ser executada:
```
php artisan migrate
```

Caso tenha alterado um dos arquivos de Rota:
```
php artisan route:cache
```
Caso ocorra problema nas permissões  que não foram atribuidas ao grupo
```
php artisan db:seed --class=PermissionGroupSeeder
```


