Mudanças entre as edições de "Redes Multimídia (diário 2017-1)"
Linha 45: | Linha 45: | ||
{{collapse top | Aula 2}} | {{collapse top | Aula 2}} | ||
+ | Um PBX IP funciona como uma central telefônica, porém intermediando chamadas VoIP. Com isso, as chamadas são feitas de um telefone IP em direção ao PBX IP, que a encaminha ao telefone IP de destino de acordo com suas regras de discagem. A figura abaixo ilustra como funciona uma chamada VoIP típica através de um PBX IP. | ||
+ | |||
+ | [[imagem:Voip-call.png|500px]] | ||
+ | |||
+ | |||
+ | Nas nossas aulas faremos uso de um PBX IP [http://www.asterisk.org/ Asterisk], que é um software desenvolvido pela [http://www.digium.com/ Digium]. O Asterisk roda em computadores do tipo PC que possuem sistema operacional baseado em Linux. Sua licença é livre, o que significa que não há custo de licenciamento para utilizá-lo. | ||
+ | * [http://www.asterisk.org/get-started Uma visão geral sobre Asterisk] | ||
+ | |||
+ | === PBX IP Asterisk === | ||
+ | |||
+ | * [http://tele.sj.ifsc.edu.br/~msobral/rmu/slides/aula-25.pdf Transparências] | ||
+ | * [http://www.asterisk.org Site oficial do Asterisk] | ||
+ | * [http://www.asteriskguru.com/ Asterisk Guru] | ||
+ | * [http://www.voip-info.org/wiki Dicas sobre Asterisk] | ||
+ | * [http://www.asteriskdocs.org/ Livro online gratuito sobre Asterisk] | ||
+ | * [http://www.packetizer.com/ipmc/sip/papers/understanding_sip_voip/ Introdução a VoIP e SIP] | ||
+ | * Livro [http://www.shopvoip.com.br/index.php?route=product/product&product_id=1263 ''Asterisk: Guia de Configuração - 5a geração''], de Flávio Gonçalves. | ||
+ | |||
+ | |||
+ | '''Asterisk:''' uma solução completa de PABX baseado em software, permitindo ligar o mundo IP ao mundo da rede pública de telefonia comutada. | ||
+ | |||
+ | '''Características Básicas:''' faz tudo que um PABX pequeno e simples faz e pouco mais | ||
+ | * Transferência, música de espera, siga-me, etc. | ||
+ | * Conferência, correio de voz, URA, fila de chamadas, monitoramento de chamadas, integração com o Jabber (Google talk) | ||
+ | |||
+ | |||
+ | [[imagem:Asterisk-ex1.png|400px]] | ||
+ | <br>''Exemplo de cenário de uso do Asterisk'' | ||
+ | |||
+ | |||
+ | <!-- [[imagem:Asterisk-arch.png|500px]] | ||
+ | <br>''Arquitetura modular do Asterisk'' ---> | ||
+ | |||
+ | ==== Canais SIP ==== | ||
+ | |||
+ | Cada telefone SIP deve ter seu identificador cadastrado no Asterisk. O identificador pode tanto ser um número, análogo a um ramal, ou uma string alfanumérica. No terminologia do Asterisk, cada telefone SIP é chamado de ''canal SIP'', e deve estar declarado em /etc/asterisk/sip.conf: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | ; Canal 2000 (um exemplo) | ||
+ | [2000] | ||
+ | defaultuser=maria ; o nome do usuário para fins de autenticação | ||
+ | secret=kabrum | ||
+ | type=friend ; pode efetuar e receber chamadas | ||
+ | host=dynamic ; pode conectar-se a partir de qualquer endereço IP | ||
+ | insecure=port,invite ; | ||
+ | context=alunos ; o contexto do plano de discagem para chamadas originadas neste canal | ||
+ | disallow=all | ||
+ | allow=gsm ; habilita este codec para o João. | ||
+ | allow=alaw ; outro codec | ||
+ | allow=ulaw ; mais um codec | ||
+ | qualify=yes; monitora o UAC | ||
+ | |||
+ | ; Canal 1000 (outro exemplo) | ||
+ | [1000] | ||
+ | defaultuser=joao ; o nome do usuário para fins de autenticação | ||
+ | secret=blabla | ||
+ | type=friend ; pode efetuar e receber chamadas | ||
+ | host=dynamic ; pode conectar-se a partir de qualquer endereço IP | ||
+ | insecure=port,invite ; | ||
+ | context=alunos ; o contexto no plano de discagem para chamadas originadas neste canal | ||
+ | disallow=all | ||
+ | allow=gsm ; habilita este codec | ||
+ | allow=alaw ; outro codec | ||
+ | allow=ulaw ; mais um codec | ||
+ | qualify=yes; monitora o UAC | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | <!-- | ||
+ | Como se pode notar, a declaração de um canal SIP envolve muitos parâmetros que envolvem autenticação, controle de acesso, localização na rede, codecs e possivelmente outras capacidades. Como os valores de alguns parâmetros podem ser iguais para vários canais, o Asterisk possibilita a declaração de perfis (''templates''): | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | ; Perfil alunos | ||
+ | [alunos](!); a sequência "(!)" define isto como um perfil | ||
+ | type=friend ; pode efetuar e receber chamadas | ||
+ | host=dynamic ; pode conectar-se a partir de qualquer endereço IP | ||
+ | insecure=port,invite ; | ||
+ | context=alunos ; o contexto no plano de discagem para chamadas originadas neste canal | ||
+ | disallow=all | ||
+ | allow=gsm ; habilita este codec | ||
+ | allow=alaw ; outro codec | ||
+ | allow=ulaw ; mais um codec | ||
+ | qualify=yes; monitora o UAC | ||
+ | |||
+ | ; Canal 2000 | ||
+ | [2000](alunos); a sequência "(alunos)" copia as definições do perfil "alunos" | ||
+ | defaultuser=maria ; o nome do usuário para fins de autenticação | ||
+ | secret=kabrum | ||
+ | |||
+ | ; Canal joao | ||
+ | [joao](alunos) | ||
+ | defaultuser=joao ; o nome do usuário para fins de autenticação | ||
+ | secret=blabla | ||
+ | </syntaxhighlight> | ||
+ | --> | ||
+ | |||
+ | ==== Plano de discagem ==== | ||
+ | |||
+ | O plano de discagem define como cada chamada deve ser processada. As instruções de processamento residem no arquivo de configuração ''/etc/asterisk/extensions.conf''. O fluxo de processamento de chamadas pode ser visto resumidamente abaixo: | ||
+ | |||
+ | [[imagem:Asterisk-fluxo.png|400px]] | ||
+ | |||
+ | |||
+ | Um exemplo de plano de discagem simples pode ser visto abaixo: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | [alunos]; o nome deste contexto | ||
+ | |||
+ | # Chamadas para o número 101 são feitas via SIP para o canal "maria" | ||
+ | exten=>101,1,Dial(SIP/maria) | ||
+ | same=>n,Hangup() | ||
+ | |||
+ | # Chamadas para "teste" serão atendidas com um som de beep, seguido | ||
+ | # da reprodução do arquivo de som "hello-world", em seguida outro beep e | ||
+ | # enfim se encerra a chamada. | ||
+ | exten=>teste,1,Playback(beep) | ||
+ | same=>n,Wait(1) | ||
+ | same=>n,Playback(hello-world) | ||
+ | same=>n,Wait(1) | ||
+ | same=>n,Playback(beep) | ||
+ | same=>n,Hangup | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | A estrutura do plano de discagem é composta por ''extensões'' (um termo específico do Asterisk). Cada extensão identifica um número (ou usuário) que pode ser chamado, e como essa chamada deve ser processada. A sintaxe pode ser vista abaixo: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | exten=>identificador,prioridade,aplicação | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | * '''identificador''': o número ou usuário chamado | ||
+ | * '''prioridade''': a prioridade da extensão. Isso determina a ordem de execução das extensões que tratam do mesmo identificador. | ||
+ | * '''aplicação''': uma ação a ser realizada quando a extensão for processada. Por exemplo, a aplicação ''Dial'' determina que deve ser encaminhada a outro canal. | ||
+ | |||
+ | Como o processamento de uma chamada usualmente envolve uma sequência de extensões, existe uma sintaxe opcional para simplificar a declaração: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | exten=>identificador,prioridade,aplicação | ||
+ | same=>prioridade,aplicação | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | *'''same''': declara uma nova extensão com mesmo identificador da extensão imediatamente anterior | ||
+ | |||
+ | Por fim, a ''prioridade'' (que define a ordem com que as extensões são processadas) declarada com o valor ''n'' equivale à prioridade da extensão imediatamente anterior incrementada em uma unidade: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | exten=>101,1,Dial(SIP/101) | ||
+ | same=>n,Hangup; a prioridade aqui terá o valor 2 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | === Experimento: comunicação entre telefones IP ou softphones por meio de um PBX IP === | ||
+ | |||
+ | Para realizar esses exercícios você deve usar o Asterisk em uma máquina virtual. Para testar as chamadas, use um softphone em seu celular ou em um computador, e um telefone IP ou ATA. | ||
+ | |||
+ | |||
+ | 1. Criar os seguintes canais SIP: 100 e 101 (escolha usuários e senhas para autenticação) | ||
+ | |||
+ | 2. Crie um plano de discagem em que todos podem fazer chamadas para todos (isso é, 100 pode chamar 101, e vice-versa). | ||
+ | |||
+ | 3. Agora configure o softphone de forma que se registre no PBX Asterisk, usando uma das contas SIP criadas previamente. Faça o mesmo com o telefone IP ou ATA. | ||
+ | |||
+ | 4. A partir do softphone faça uma chamada para a conta do telefone IP. Verifique se o telefone IP acusou o recebimento de chamada. Caso isso não tenha ocorrido, verifique seu plano de discagem. Em seguida faça uma chamada em sentido contrário. | ||
+ | |||
+ | 5. Execute o comando ''rasterisk -vvv'' no computador do Asterisk. | ||
+ | |||
+ | 6. Usando o comando ''sip show peers'', visualize os estados dos canais SIP conhecidos pelo Asterisk. | ||
+ | |||
+ | 7. Refaça uma chamada entre softphone e telefone IP, e observe o que aparece na tela do ''rasterisk''. | ||
+ | |||
+ | 8. Será possível verificar que chamadas estão em andamento no Asterisk usando o ''rasterisk'' ? Pesquise como se pode fazer isso. | ||
+ | |||
+ | 9. Use o ''rasterisk'' para testar chamadas. Use o comando ''console dial canal_SIP@contexto'' para chamar um canal SIP (substitua ''canal_SIP'' pelo número a ser chamado). Ao final, execute ''console hangup''. | ||
+ | |||
+ | 10. Acrescente mais um canal SIP, editando o arquivo ''sip.conf''. Configure o softphone para usar esse novo canal (ou o telefone IP para se associar também a esse canal SIP). | ||
+ | |||
+ | 11. Teste chamadas entre os telefones usando esse novo número. | ||
+ | |||
+ | ==== Possíveis problemas ==== | ||
+ | |||
+ | # Em cada softphone ou telefone IP crie uma conta SIP, que deve ser identificada por ''ramal@IP_do_PBX'' (ex: se o PBX tiver IP 192.168.2.110, as contas de alunos podem ser 100@192.168.2.110 e 101@192.168.2.110). | ||
+ | # Após definir as contas, verifique se os telefones indicaram que elas estão disponíveis (''online''). Você pode fazer essa verificação também no próprio Asterisk. Neste caso execute o seguinte comando para acessar o console do Asterisk: <syntaxhighlight lang=bash> | ||
+ | sudo rasterisk -vvv | ||
+ | host*CLI> sip show peers | ||
+ | host*CLI> sip show peers | ||
+ | Name/username Host Dyn Nat ACL Port Status | ||
+ | 101/101 192.168.2.10 D 11270 OK (6 ms) | ||
+ | 102/102 192.168.2.210 D 63169 OK (12 ms) | ||
+ | 2 sip peers [Monitored: 2 online, 0 offline Unmonitored: 0 online, 0 offline] | ||
+ | </syntaxhighlight> | ||
+ | # Se algum dos telefones não aparecer como ''OK'' no console do Asterisk, verifique se o número de ramal e a senha configuradas no telefone são os mesmos declarados em ''/etc/asterisk/sip.conf''. Outro teste que se pode fazer é acessar o console do Asterisk, e depois tentar ativar as contas SIP nos telefones (i.e. colocá-las para indisponível ou ''offline'', e depois reativá-las). O Asterisk irá mostrar algumas linhas informativas sobre os registros dos telefones.. | ||
+ | # Se as contas SIP estão devidamente registradas no Asterisk, mas ainda assim as chamadas não são realizadas, o problema deve estar no plano de discagem. Neste caso, acesse o console do Asterisk e tente novamente fazer a chamada. Veja se o Asterisk informa na tela o motivo para a chamada não ser realizada. Em seguida, confira se seu plano de discagem (''/etc/asterisk/extensions.conf'') possui uma extensão que satisfaça a chamada que se deseja realizar. Isso é, se você estiver tentando chamar o ramal SIP 101@192.168.2.110, deve haver uma extensão assim: <syntaxhighlight lang=text> | ||
+ | exten=>101,1,Dial(SIP/101) | ||
+ | same=>n,Hangup | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===DICAS ASTERISK=== | ||
+ | |||
+ | Comandos válidos no CLI do Asterisk: | ||
+ | |||
+ | #Para entrar no CLI do Asterisk execute: <code>rasterisk -vvv</syntaxhighlight> | ||
+ | #Recarregar as configurações do arquivo sip.conf: <code> sip reload</syntaxhighlight> | ||
+ | #Recarregar as configurações do arquivo extensions.conf: <code> dialplan reload</syntaxhighlight> | ||
+ | #Ver canais SIP criados: <code> sip show peers</syntaxhighlight> | ||
+ | #Gerar uma ligação via console: <code>console dial canal_sip@extensão</syntaxhighlight> | ||
{{Collapse bottom | Aula 2}} | {{Collapse bottom | Aula 2}} |
Edição das 16h45min de 1 de fevereiro de 2017
Endereço encurtado: http://bit.ly/rmu20162
Redes Multimidia: Diário de Aula 2017-1
Professora: Simara Sonaglio
E-mail: simara.sonaglio@ifsc.edu.br
Encontros:
Atendimento paralelo:
Bibliografia
- Livros sobre Redes de Computadores (por ordem de preferência):
- KUROSE, James F. e ROSS, Keith W. Redes de computadores e a Internet, Uma abordagem Top-Down. 5a edição. Editora Addison Wesley SP, 2010.
- Sérgio Colcher, Antônio Tadeu Azevedo Gomes, e Anderson Oliveira da Silva. VoIP: Voz sobre IP. Campus, 1a edição, 2005.
- STALLINGS, W. Redes e sistemas de comunicação de dados. Editora Elsevier RJ, 2005.
- TANENBAUM, Andrew S. Redes de Computadores, tradução da quarta edição. Editora Campus RJ, 2003
- FOROUZAN, Behrouz. Comunicação de Dados e Redes de Computadores, 3a/4a edicão. Editora Bookman, 2004.
Softwares
Avaliações
Diário das aulas
13/02 - Apresentação da disciplina
Aula 1 |
---|
Apresentação da disciplina: conteúdo, bibliografia e avaliação, laboratório. |
14/02 - Etapa Asterisk: Introdução, plano de discagem e contas SIP
Aula 2 |
---|
Um PBX IP funciona como uma central telefônica, porém intermediando chamadas VoIP. Com isso, as chamadas são feitas de um telefone IP em direção ao PBX IP, que a encaminha ao telefone IP de destino de acordo com suas regras de discagem. A figura abaixo ilustra como funciona uma chamada VoIP típica através de um PBX IP.
PBX IP Asterisk
Características Básicas: faz tudo que um PABX pequeno e simples faz e pouco mais
Canais SIPCada telefone SIP deve ter seu identificador cadastrado no Asterisk. O identificador pode tanto ser um número, análogo a um ramal, ou uma string alfanumérica. No terminologia do Asterisk, cada telefone SIP é chamado de canal SIP, e deve estar declarado em /etc/asterisk/sip.conf: ; Canal 2000 (um exemplo)
[2000]
defaultuser=maria ; o nome do usuário para fins de autenticação
secret=kabrum
type=friend ; pode efetuar e receber chamadas
host=dynamic ; pode conectar-se a partir de qualquer endereço IP
insecure=port,invite ;
context=alunos ; o contexto do plano de discagem para chamadas originadas neste canal
disallow=all
allow=gsm ; habilita este codec para o João.
allow=alaw ; outro codec
allow=ulaw ; mais um codec
qualify=yes; monitora o UAC
; Canal 1000 (outro exemplo)
[1000]
defaultuser=joao ; o nome do usuário para fins de autenticação
secret=blabla
type=friend ; pode efetuar e receber chamadas
host=dynamic ; pode conectar-se a partir de qualquer endereço IP
insecure=port,invite ;
context=alunos ; o contexto no plano de discagem para chamadas originadas neste canal
disallow=all
allow=gsm ; habilita este codec
allow=alaw ; outro codec
allow=ulaw ; mais um codec
qualify=yes; monitora o UAC
Plano de discagemO plano de discagem define como cada chamada deve ser processada. As instruções de processamento residem no arquivo de configuração /etc/asterisk/extensions.conf. O fluxo de processamento de chamadas pode ser visto resumidamente abaixo:
[alunos]; o nome deste contexto
# Chamadas para o número 101 são feitas via SIP para o canal "maria"
exten=>101,1,Dial(SIP/maria)
same=>n,Hangup()
# Chamadas para "teste" serão atendidas com um som de beep, seguido
# da reprodução do arquivo de som "hello-world", em seguida outro beep e
# enfim se encerra a chamada.
exten=>teste,1,Playback(beep)
same=>n,Wait(1)
same=>n,Playback(hello-world)
same=>n,Wait(1)
same=>n,Playback(beep)
same=>n,Hangup
A estrutura do plano de discagem é composta por extensões (um termo específico do Asterisk). Cada extensão identifica um número (ou usuário) que pode ser chamado, e como essa chamada deve ser processada. A sintaxe pode ser vista abaixo: exten=>identificador,prioridade,aplicação
Como o processamento de uma chamada usualmente envolve uma sequência de extensões, existe uma sintaxe opcional para simplificar a declaração: exten=>identificador,prioridade,aplicação
same=>prioridade,aplicação
Por fim, a prioridade (que define a ordem com que as extensões são processadas) declarada com o valor n equivale à prioridade da extensão imediatamente anterior incrementada em uma unidade: exten=>101,1,Dial(SIP/101)
same=>n,Hangup; a prioridade aqui terá o valor 2
Experimento: comunicação entre telefones IP ou softphones por meio de um PBX IPPara realizar esses exercícios você deve usar o Asterisk em uma máquina virtual. Para testar as chamadas, use um softphone em seu celular ou em um computador, e um telefone IP ou ATA.
2. Crie um plano de discagem em que todos podem fazer chamadas para todos (isso é, 100 pode chamar 101, e vice-versa). 3. Agora configure o softphone de forma que se registre no PBX Asterisk, usando uma das contas SIP criadas previamente. Faça o mesmo com o telefone IP ou ATA. 4. A partir do softphone faça uma chamada para a conta do telefone IP. Verifique se o telefone IP acusou o recebimento de chamada. Caso isso não tenha ocorrido, verifique seu plano de discagem. Em seguida faça uma chamada em sentido contrário. 5. Execute o comando rasterisk -vvv no computador do Asterisk. 6. Usando o comando sip show peers, visualize os estados dos canais SIP conhecidos pelo Asterisk. 7. Refaça uma chamada entre softphone e telefone IP, e observe o que aparece na tela do rasterisk. 8. Será possível verificar que chamadas estão em andamento no Asterisk usando o rasterisk ? Pesquise como se pode fazer isso. 9. Use o rasterisk para testar chamadas. Use o comando console dial canal_SIP@contexto para chamar um canal SIP (substitua canal_SIP pelo número a ser chamado). Ao final, execute console hangup. 10. Acrescente mais um canal SIP, editando o arquivo sip.conf. Configure o softphone para usar esse novo canal (ou o telefone IP para se associar também a esse canal SIP). 11. Teste chamadas entre os telefones usando esse novo número. Possíveis problemas
DICAS ASTERISKComandos válidos no CLI do Asterisk:
|
20/02 - Etapa Asterisk: Caracterização de mídia
Aula 3 |
---|
|
21/02 - Etapa Asterisk: Compressão de dados (áudio e vídeo)
Aula 4 |
---|
|
06/03 - Etapa Asterisk: Transmissão de mídia
Aula 5 |
---|
|
7/03 - Etapa Asterisk: Estudo do protocolo SIP
Aula 6 |
---|
|
13/03 - Etapa Asterisk: Estudo do protocolo SIP e SDP
Aula 7 |
---|
|
14/03 - Etapa Asterisk: Estudo do protocolo RTP
Aula 8 |
---|
|
20/03 - Etapa Asterisk: Análise dos protocolos SIP, SDP e RTP utilizando o wireshark
Aula 9 |
---|
|
21/03 - Etapa Asterisk: Asterisk e NAT
Aula 10 |
---|
|
27/03 - Etapa Asterisk: Funções de PABX
Aula 11 |
---|
|
28/03 - Etapa Asterisk: Padrões de extensões e variáveis
Aula 12 |
---|
|
03/04 - Etapa Asterisk: Padrões de extensões e variáveis
Aula 13 |
---|
|
04/04 - Etapa Asterisk: URA
Aula 14 |
---|
|
10/04 - Etapa Asterisk: Interconexão de PABX utilizando SIP
Aula 15 |
---|
|
11/04 - Etapa Asterisk: Desenvolvimento do trabalho
Aula 16 |
---|
|
17/04 - Etapa Asterisk: Desenvolvimento do trabalho
Aula 17 |
---|
|
18/04 - Etapa Asterisk: Desenvolvimento do trabalho
Aula 18 |
---|
|
24/04 - Etapa Asterisk: Desenvolvimento do trabalho
Aula 19 |
---|
|
25/04 - Etapa Asterisk: Apresentação do trabalho
Aula 20 |
---|
|
02/05 - Etapa QoS: Introdução à Qualidade de Serviço
Aula 21 |
---|
|
08/05 - Etapa QoS: Conceitos básicos de QoS
Aula 22 |
---|
|
09/05 - Etapa QoS: QoS em roteador Linux
Aula 23 |
---|
|
15/05 - Etapa QoS: QoS em roteador Linux
Aula 24 |
---|
|
16/05 - Etapa QoS: Exercícios práticos
Aula 25 |
---|
|
22/05 - Etapa QoS: Desenvolvimento do trabalho (continuação Etapa Asterisk)
Aula 26 |
---|
|
23/05 - Etapa QoS: Desenvolvimento do trabalho (continuação Etapa Asterisk)
Aula 27 |
---|
|
29/05 - Etapa QoS: Desenvolvimento do trabalho (continuação Etapa Asterisk)
Aula 28 |
---|
|
30/05 - Etapa QoS: Apresentação do trabalho (continuação Etapa Asterisk)
Aula 29 |
---|
|
05/06 - Etapa Firewall: Introdução a Firewall
Aula 30 |
---|
|
06/06 - Etapa Firewall: Firewall com iptables
Aula 31 |
---|
|
12/06 - Etapa Firewall: Exercícios práticos
Aula 32 |
---|
|
13/06 - Etapa Firewall: Exercícios práticos
Aula 33 |
---|
|
19/06 - Etapa Firewall: Desenvolvimento do trabalho (continuação Etapa QoS)
Aula 34 |
---|
|
20/06 - Etapa Firewall: Desenvolvimento do trabalho (continuação Etapa QoS)
Aula 35 |
---|
|
26/06 - Etapa Firewall: Desenvolvimento do trabalho (continuação Etapa QoS)
Aula 36 |
---|
|
27/06 - Etapa Firewall: Apresentação do trabalho (continuação Etapa QoS)
Aula 37 |
---|
|
03/07 - Recuperação
Aula 38 |
---|
|
04/07 - Recuperação
Aula 39 |
---|
|