https://wiki.sj.ifsc.edu.br/api.php?action=feedcontributions&user=Matuzalem.m&feedformat=atomMediaWiki do Campus São José - Contribuições do(a) usuário(a) [pt-br]2024-03-29T06:48:31ZContribuições do(a) usuário(a)MediaWiki 1.35.9https://wiki.sj.ifsc.edu.br/index.php?title=Matuzalem_Muller&diff=178102Matuzalem Muller2021-08-13T16:07:13Z<p>Matuzalem.m: </p>
<hr />
<div>Ingressou na Instituição de Ensino em 2009, inicialmente no ensino médio. Após a conclusão do mesmo, ingressou na [http://wiki.sj.ifsc.edu.br/index.php/Curso_de_Engenharia_de_Telecomunica%C3%A7%C3%B5es Engenharia de Telecomunicações], concluindo o curso no segundo semestre de 2018.<br />
<br />
<br />
<br />
;Informações:Currículo Lattes: [http://buscatextual.cnpq.br/buscatextual/visualizacv.do?metodo=apresentar&id=K8158513U5 Matuzalém Muller dos Santos]<br />
<br />
LinkedIn: [https://www.linkedin.com/in/matuzalemmuller/pt Perfil]<br />
<br />
Email: matuzalem.santos{at}gmail.com<br />
<br />
==Projetos Participantes==<br />
{{collapse top|Bolsas de Extensão}}<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Programa%C3%A7%C3%A3o_visual_%2B_game_design_e_seus_recursos_pedag%C3%B3gicos Programação visual + game design e seus recursos pedagógicos]<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_2 Mulheres na Engenharia - Pagina do Bolsista]<br />
** [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_1_2015/1 Oficina 1]<br />
** [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 Oficina 2]<br />
** [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_3_2015/1 Oficina 3]<br />
** [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_4_2015/1 Oficina 4]<br />
** [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_5_2015/1 Oficina 5]<br />
** [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_6_2015/1 Oficina 6]<br />
{{collapse bottom|Bolsa de Extensão}}<br />
<br />
==Trabalhos do Curso==<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/Alarme_MIC29004-2014-1 Projeto Final de Microprocessadores: Simulador de Alarme de Loja]<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/Projetos_Finais_CIL29003#EQUIPE_3_-_Veloc.C3.ADmetro_e_Acelerador_Digital Projeto Final de Circuitos Lógicos: Velocímetro e Acelerador Digital]<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/RED29004-2014-1-Seminario1-VPN Seminário de Redes de Computadores I - VPN]<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/Seguran%C3%A7a_em_Redes_de_Computadores_-_RED29005 Seminário de Redes de Computadores II - Segurança em Rede de Computadores]<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto Projeto Integrador II - Sistema de Automatização de Sala de Aula]<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/Proposta_de_armazenamento_distribu%C3%ADdo_baseado_em_cont%C3%AAineres_em_infraestrutura_hiperconvergente TCC: Proposta de armazenamento distribuído baseado em contêineres em infraestrutura hiperconvergente]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Matuzalem_Muller&diff=178101Matuzalem Muller2021-08-13T16:06:44Z<p>Matuzalem.m: </p>
<hr />
<div>Ingressou na Instituição de Ensino em 2009, inicialmente no ensino médio. Após a conclusão do mesmo, ingressou na [http://wiki.sj.ifsc.edu.br/index.php/Curso_de_Engenharia_de_Telecomunica%C3%A7%C3%B5es Engenharia de Telecomunicações], concluindo o curso no segundo semestre de 2018.<br />
<br />
<br />
<br />
;Informações:<br />
Currículo Lattes: [http://buscatextual.cnpq.br/buscatextual/visualizacv.do?metodo=apresentar&id=K8158513U5 Matuzalém Muller dos Santos]<br />
<br />
LinkedIn: [https://www.linkedin.com/in/matuzalemmuller/pt Perfil]<br />
<br />
Email: matuzalem.santos{at}gmail.com''''''<br />
<br />
==Projetos Participantes==<br />
{{collapse top|Bolsas de Extensão}}<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Programa%C3%A7%C3%A3o_visual_%2B_game_design_e_seus_recursos_pedag%C3%B3gicos Programação visual + game design e seus recursos pedagógicos]<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_2 Mulheres na Engenharia - Pagina do Bolsista]<br />
** [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_1_2015/1 Oficina 1]<br />
** [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 Oficina 2]<br />
** [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_3_2015/1 Oficina 3]<br />
** [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_4_2015/1 Oficina 4]<br />
** [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_5_2015/1 Oficina 5]<br />
** [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_6_2015/1 Oficina 6]<br />
{{collapse bottom|Bolsa de Extensão}}<br />
<br />
==Trabalhos do Curso==<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/Alarme_MIC29004-2014-1 Projeto Final de Microprocessadores: Simulador de Alarme de Loja]<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/Projetos_Finais_CIL29003#EQUIPE_3_-_Veloc.C3.ADmetro_e_Acelerador_Digital Projeto Final de Circuitos Lógicos: Velocímetro e Acelerador Digital]<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/RED29004-2014-1-Seminario1-VPN Seminário de Redes de Computadores I - VPN]<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/Seguran%C3%A7a_em_Redes_de_Computadores_-_RED29005 Seminário de Redes de Computadores II - Segurança em Rede de Computadores]<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto Projeto Integrador II - Sistema de Automatização de Sala de Aula]<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/Proposta_de_armazenamento_distribu%C3%ADdo_baseado_em_cont%C3%AAineres_em_infraestrutura_hiperconvergente TCC: Proposta de armazenamento distribuído baseado em contêineres em infraestrutura hiperconvergente]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Proposta_de_armazenamento_distribu%C3%ADdo_baseado_em_cont%C3%AAineres_em_infraestrutura_hiperconvergente&diff=155263Proposta de armazenamento distribuído baseado em contêineres em infraestrutura hiperconvergente2019-03-09T18:47:14Z<p>Matuzalem.m: </p>
<hr />
<div>;Autor:<br />
[https://wiki.sj.ifsc.edu.br/index.php/Matuzalem_Muller Matuzalem Muller dos Santos]<br />
<br />
;Orientador: <br />
Prof. [[Ederson Torresini]]<br />
<br />
;Curso:<br />
Engenharia de Telecomunicações<br />
<br />
;Resumo:<br />
Infraestruturas de serviços baseadas em contêineres têm se popularizado nos últimos anos desde o lançamento da primeira versão estável do Kubernetes pela Google em 2014. Dentre os benefícios oferecidos por tais infraestruturas caracterizam-se a alta escalabilidade e facilidade no gerenciamento de serviços. Este trabalho propõe uma infraestrutura hiperconvergente baseada em contêineres. Para validação da proposta foi criado um cluster Kubernetes na Google Cloud Platform (GCP), onde o Rook, uma plataforma de armazenamento distribuído, foi utilizado para validar o gerenciamento de armazenamento na infraestrutura hiperconvergente. Para utilização do armazenamento foram utilizados um blog WordPress e uma base de dados MySQL.<br />
<br />
;Palavras chave: <br />
Nuvem Privada. Contêineres. Hiperconvergência de Infraestrutura.<br />
<br />
;Abstract:<br />
Container-based infrastructures became popular over the past few years since Google released Kubernetes in 2014. Among the advantages of container-based infrastructures are the immense scaling and easy management capabilities offered by this technology. This paper presents a hyper-converged infrastructure model based on containers. A Kubernetes cluster is implemented in the Google Cloud Platform to validate the model, and Rook (a storage orchestrator) is used to provide storage to applications from the cluster. A WordPress blog and a MySQL database are also implemented to use the storage orchestrated by Rook.<br />
<br />
;Keywords:<br />
Private cloud. Containers. Hyper-converged infrastructure.<br />
<br />
;Arquivos:<br />
Arquivos relacionados a trabalho, a monografia em pdf e também arquivos fontes e executáveis estão disponibilizados nos links abaixo:<br />
*[[Media:TCC_2_MatuzalemMullerDosSantos_Digital.pdf |Monografia.pdf]]<br />
<br />
[[Categoria:Trabalhos de Alunos]]<br />
[[Categoria:Projeto de Fim de Curso]]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Uma_Proposta_de_Sistema_de_Arquivos_Distribu%C3%ADdos_em_Nuvem_Privada_Multi-regi%C3%A3o_para_o_IFSC&diff=155262Uma Proposta de Sistema de Arquivos Distribuídos em Nuvem Privada Multi-região para o IFSC2019-03-09T18:45:11Z<p>Matuzalem.m: Redirecionando para Proposta de armazenamento distribuído baseado em contêineres em infraestrutura hiperconvergente</p>
<hr />
<div>#REDIRECT [[Proposta de armazenamento distribuído baseado em contêineres em infraestrutura hiperconvergente]]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Matuzalem_Muller&diff=155261Matuzalem Muller2019-03-09T18:43:45Z<p>Matuzalem.m: /* Trabalhos do Curso */</p>
<hr />
<div>Ingressou na Instituição de Ensino em 2009, inicialmente no ensino médio. Após a conclusão do mesmo, ingressou na [http://wiki.sj.ifsc.edu.br/index.php/Curso_de_Engenharia_de_Telecomunica%C3%A7%C3%B5es Engenharia de Telecomunicações], concluindo o curso no segundo semestre de 2018.<br />
<br />
;Informações:<br />
<br />
Currículo Lattes: [http://buscatextual.cnpq.br/buscatextual/visualizacv.do?metodo=apresentar&id=K8158513U5 Matuzalém Muller dos Santos]<br />
<br />
LinkedIn: [https://www.linkedin.com/in/matuzalemmuller/pt Perfil]<br />
<br />
Email: matuzalemifsc'''[at]'''gmail.com<br />
<br />
== Projetos Participantes ==<br />
{{collapse top|Bolsas de Extensão}}<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Programa%C3%A7%C3%A3o_visual_%2B_game_design_e_seus_recursos_pedag%C3%B3gicos Programação visual + game design e seus recursos pedagógicos]<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_2 Mulheres na Engenharia - Pagina do Bolsista]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_1_2015/1 Oficina 1]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 Oficina 2]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_3_2015/1 Oficina 3]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_4_2015/1 Oficina 4]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_5_2015/1 Oficina 5]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_6_2015/1 Oficina 6]<br />
{{collapse bottom|Bolsa de Extensão}}<br />
<br />
==Trabalhos do Curso==<br />
<br />
*[https://wiki.sj.ifsc.edu.br/index.php/Alarme_MIC29004-2014-1 Projeto Final de Microprocessadores: Simulador de Alarme de Loja]<br />
<br />
*[https://wiki.sj.ifsc.edu.br/index.php/Projetos_Finais_CIL29003#EQUIPE_3_-_Veloc.C3.ADmetro_e_Acelerador_Digital Projeto Final de Circuitos Lógicos: Velocímetro e Acelerador Digital]<br />
<br />
* [https://wiki.sj.ifsc.edu.br/index.php/RED29004-2014-1-Seminario1-VPN Seminário de Redes de Computadores I - VPN]<br />
<br />
*[https://wiki.sj.ifsc.edu.br/index.php/Seguran%C3%A7a_em_Redes_de_Computadores_-_RED29005 Seminário de Redes de Computadores II - Segurança em Rede de Computadores]<br />
<br />
*[https://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto Projeto Integrador II - Sistema de Automatização de Sala de Aula]<br />
<br />
*[https://wiki.sj.ifsc.edu.br/index.php/Proposta_de_armazenamento_distribu%C3%ADdo_baseado_em_cont%C3%AAineres_em_infraestrutura_hiperconvergente TCC: Proposta de armazenamento distribuído baseado em contêineres em infraestrutura hiperconvergente]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Proposta_de_armazenamento_distribu%C3%ADdo_baseado_em_cont%C3%AAineres_em_infraestrutura_hiperconvergente&diff=155260Proposta de armazenamento distribuído baseado em contêineres em infraestrutura hiperconvergente2019-03-09T18:42:25Z<p>Matuzalem.m: Criou página com ';Autor: Matuzalem Muller dos Santos ;Orientador: Prof. Ederson Torresini ;Curso: Engenharia de Telecomunicações ;Resumo: Infraestruturas de serviços baseadas em contê...'</p>
<hr />
<div>;Autor:<br />
Matuzalem Muller dos Santos<br />
<br />
;Orientador: <br />
Prof. [[Ederson Torresini]]<br />
<br />
;Curso:<br />
Engenharia de Telecomunicações<br />
<br />
;Resumo:<br />
Infraestruturas de serviços baseadas em contêineres têm se popularizado nos últimos anos desde o lançamento da primeira versão estável do Kubernetes pela Google em 2014. Dentre os benefícios oferecidos por tais infraestruturas caracterizam-se a alta escalabilidade e facilidade no gerenciamento de serviços. Este trabalho propõe uma infraestrutura hiperconvergente baseada em contêineres. Para validação da proposta foi criado um cluster Kubernetes na Google Cloud Platform (GCP), onde o Rook, uma plataforma de armazenamento distribuído, foi utilizado para validar o gerenciamento de armazenamento na infraestrutura hiperconvergente. Para utilização do armazenamento foram utilizados um blog WordPress e uma base de dados MySQL.<br />
<br />
;Palavras chave: <br />
Nuvem Privada. Contêineres. Hiperconvergência de Infraestrutura.<br />
<br />
;Abstract:<br />
Container-based infrastructures became popular over the past few years since Google released Kubernetes in 2014. Among the advantages of container-based infrastructures are the immense scaling and easy management capabilities offered by this technology. This paper presents a hyper-converged infrastructure model based on containers. A Kubernetes cluster is implemented in the Google Cloud Platform to validate the model, and Rook (a storage orchestrator) is used to provide storage to applications from the cluster. A WordPress blog and a MySQL database are also implemented to use the storage orchestrated by Rook.<br />
<br />
;Keywords:<br />
Private cloud. Containers. Hyper-converged infrastructure.<br />
<br />
;Arquivos:<br />
Arquivos relacionados a trabalho, a monografia em pdf e também arquivos fontes e executáveis estão disponibilizados nos links abaixo:<br />
*[[Media:TCC_2_MatuzalemMullerDosSantos_Digital.pdf |Monografia.pdf]]<br />
<br />
[[Categoria:Trabalhos de Alunos]]<br />
[[Categoria:Projeto de Fim de Curso]]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=TCC_da_Engenharia_de_Telecomunica%C3%A7%C3%B5es_-_conclu%C3%ADdos&diff=155259TCC da Engenharia de Telecomunicações - concluídos2019-03-09T18:42:09Z<p>Matuzalem.m: </p>
<hr />
<div><!-- <br />
Para cada TCC cadastrar os dados abaixo:<br />
<br />
{{ TCC2 | Titulo | Graduando | Orientador | Coorientador | Banca1, Banca2 e Banca3 | Data | Horário | Número }}<br />
<br />
Na página do TCC preencher os dados no modelo abaixo:<br />
<br />
;Resumo:<br />
<br />
;Palavras chave:<br />
<br />
;Abstract:<br />
<br />
;Keywords:<br />
<br />
== Arquivos ==<br />
;Monografia: [[Media: TCC290_KarolinaRocha.pdf | Monografia.pdf]]<br />
;<br />
[[Categoria:Trabalhos de Alunos]]<br />
[[Categoria:Projeto de Fim de Curso]]<br />
--><br />
<br />
Os TCCs estão disponíveis em http://biblioteca.ifsc.edu.br/ Campus São José.<br />
<br />
==Semestre 2018-2==<br />
<br />
{{ TCC2 | Analisador de Controle Remoto Utilizando RTL-SDR | MARCOS VINICIOS PINHO | Roberto Wanderley da Nóbrega | Ramon Mayor Martins | Diego da Silva de Medeiros, Marcos Moecke | 18/12/2018 | 8h10min | 028 }}<br />
<br />
{{ TCC2 | Implementação de um sistema ADS-B através de técnicas de Rádio Definido por Software | LUCAS LUCINDO VIEIRA | Roberto Wanderley da Nóbrega | Ramon Mayor Martins | Fábio Alexandre de Souza, Clayrton Monteiro Henrique | 17/12/2018 | 10h10min | 027 }}<br />
<br />
{{ TCC2 | Roteamento para Estender o Tempo de Vida de Redes de Sensores sem Fios Utilizando Redes Definidas por Software | ANDRE FELIPPE WEBER | Tiago Semprebom | Eraldo Silveira e Silva | Marcelo Maia Sobral, Carlos Barros Montez | 14/12/2018 | 10h30min | 026 }}<br />
<br />
{{ TCC2 | Desenvolvimento de um Sistema de Reconhecimento de Locutor Utilizando Aprendizado de Máquina | HENRIQUE HILLESHEIN | Mário de Noronha Neto | Rafael de Souza Toledo | Diego da Silva de Medeiros, Tiago Semprebom | 14/12/2018 | 9h15min | 025 }}<br />
<br />
{{ TCC2 | Mineração de dados usando inteligência artificial para análise de log de nuvem privada de contêineres | MARIA LUIZA THEISGES | Ederson Torresini | Clayrton Monteiro Henrique, Fernando Rodrigues Santos | Diego da Silva de Medeiros, Humberto José de Souza | 14/12/2018 | 7h30min | 024 }}<br />
<br />
{{ TCC2 | Proposta de armazenamento distribuído baseado em contêineres em infraestrutura hiperconvergente | MATUZALEM MULLER DOS SANTOS | Ederson Torresini | Jorge H. B. Casagrande | Emerson Ribeiro de Mello, Humberto José de Souza | 13/12/2018 | 10h30min | 023 }}<br />
<br />
{{ TCC2 | Métodos Híbridos para Gerenciamento de Projetos em Desenvolvimento de Software | NATAN MARTINS JORY | Clayrton Monteiro Henrique | | Ederson Torresini, Pedro Paulo Corrêa de Souza, Fernanda Dias de Oliveira da Rocha | 12/12/2018 | 10h | 022 }}<br />
<br />
{{ TCC2 | Projeto de um Subsistema de Telecomunicações para Nanossatélite em LEO | ELTON FERREIRA BROERING | Ramon Mayor Martins | | Roberto de Matos, Roberto Wanderley da Nóbrega, Rubem Toledo Bergamo | 10/12/2018 | 13h35min | 021 }}<br />
<br />
{{ TCC2 | Desenvolvimento de Software didático para análise de linhas de transmissão, baseado em Carta de Smith | PAULA CRISTINA GRANDO | Evanaska Maria Barbosa Nogueira | Diego da Silva de Medeiros | Clayrton Monteiro Henrique, Roberto Wanderley da Nóbrega, Saul Silva Caetano | 07/12/2018 | 13h10min | 020 }}<br />
<br />
{{ TCC2 | Analise de propagação de redes WLAN em ambientes indoor | MATEUS ARAUJO SILVA | Evanaska Maria Barbosa Nogueira | | Diego da Silva de Medeiros, Mario de Noronha Neto | 06/121/2018 | 10h | 019 }}<br />
<br />
{{ TCC2 | Análise do sinal de eletrocardiograma para detecção de cardiopatias | BRUNO MARCOS ESPINDOLA | Elen Macedo Lobato | | Diego da Silva de Medeiros, Ramon Mayor Martins | 30/11/2018 | 10h | 018 }}<br />
<br />
==Semestre 2018-1==<br />
<br />
{{ TCC2 | Implementação de Toolbox Octave de Técnicas de Sincronismo de Símbolo em Sistemas de Telecomunicações | GABRIEL COZER CANTU | Roberto Wanderley da Nóbrega | | Eraldo Silveira e Silva, Mário de Noronha Neto | 09/07/2018 | 13h30 | 017 }}<br />
<br />
{{ TCC2 | Utilização da tecnologia LoRaWAN para o monitoramento de dados ambientais | THIAGO WERNER | Mário de Noronha Neto | | Arliones Stevert Hoeller Junior, Ramon Mayor Martins, Rubem Toledo Bergamo | 09/07/2018 | 9h10 | 016 }}<br />
<br />
{{ TCC2 | Sistema Didático para Análise de Sinais no Domínio da Frequência: Implementação em FPGA | GUSTAVO PAULO MEDEIROS DA SILVA | Marcos Moecke | | Diego da Silva de Medeiros, Roberto de Matos | 06/07/2018 | 9h40 | 015 }}<br />
<br />
{{ TCC2 | Projeto de antenas Moxon-Yagi para comunicação com satélites de órbita baixa (LEO) | WALTER CARDOSO DE FREITAS JÚNIOR | Ramon Mayor Martins | | Rubem Toledo Bergamo, Evanaska Maria Barbosa Nogueira, Roberto Wanderley da Nóbrega | 04/07/2018 | 13h35 | 014 }}<br />
<br />
{{ TCC2 | Controle de Modulação e codificação adaptativo utilizando GNU Rádio | MARCUS VINICIUS BUNN | Roberto Wanderley da Nóbrega | | Mário de Noronha Neto, Ramon Mayor Martins | 02/07/2018 | 14h30 | 013 }}<br />
<br />
==Semestre 2017-2==<br />
<br />
{{ TCC2 | Mapeamento de Qualidade de Serviço em Redes IEEE 802.15.4 | THIAGO HENRIQUE BONOTTO DA SILVA | Tiago Semprebom | Eraldo Silveira e Silva | Marcelo Maia Sobral, Odilson Tadeu Valle | 20/12/2017 | 8h | 012 }}<br />
<br />
{{ TCC2 | Algoritmo de Identificação de Sinais Intermitentes no Espectro Radioelétrico | STEPHANY PADILHA GUIMARAES | Mario de Noronha Neto | Douglas Amorim Ferreira | Ramon Mayor Martins, Roberto Wanderley da Nóbrega | 19/12/2017 | 17h | 011 }}<br />
<br />
{{ TCC2 | Reconhecimento de Placas de Sinalização de Trânsito via Processamento Digital de Imagem de Aprendizado de Máquina | MATHIAS SILVA DA ROSA | Diego da Silva de Medeiros | Deise Monquelate Arndt | Ramon Mayor Martins, Marcos Moecke | 19/12/2017 | 09h30min | 010 }}<br />
<br />
{{ TCC2 | Localização Indoor Utilizando a Tecnologia LoRaWAN e Aprendizado de Máquina | GIULIO CRUZ DE OLIVEIRA | Mario de Noronha Neto | Arliones Stevert Hoeller Junior | Evanaska Maria Barbosa Nogueira, Maria Claudia de Almeida Castro, Richard Demo Souza | 18/12/2017 | 10h30min | 009 }}<br />
<br />
{{ TCC2 | Reconhecimento de Voz utilizando extração de Coeficientes Mel-Cepstrais e Redes Neurais Artificiais | ERNANI RODRIGUES DE S.THIAGO | Ramon Mayor Martins | | Elen Macedo Lobato, Diego da Silva de Medeiros, Cleber Jorge Amaral | 18/12/2017 | 9h20min | 008 }}<br />
<br />
{{ TCC2 | Redução de sensores de EEG e detecção de movimento motor através de Redes Neurais Artificiais | VINICIUS BANDEIRA | Ramon Mayor Martins | | Elen Macedo Lobato, Diego da Silva de Medeiros, Cleber Jorge Amaral | 15/12/2017 | 8h | 007 }}<br />
<br />
==Semestre 2017-1==<br />
<br />
{{ TCC2 | Detecção de vértebras em imagens médicas - Estudo de caso Pixeon | KAROLINE DA ROCHA | Marcos Moecke | | Diego da Silva de Medeiros, Ramon Mayor Martins | 11/08/2017 | 15h30min | 006 }}<br />
<br />
{{ TCC2 | Implantação de engenharia de tráfego com MPLS-TE em rede WAN | ANA LUIZA SCHARF | Marcelo Maia Sobral | | Odilson Tadeu Valle, Jorge H. B. Casagrande | 11/08/2017 | 13h30min | 005 }}<br />
<br />
{{ TCC2 | Estudo e Análise das Antenas utilizadas em RFID | TIAGO TEIXEIRA | Ramon Mayor Martins | | Rubem Toledo Bergamo, Clayrton M. Henrique | 10/08/2017 | 15h40min | 004 }}<br />
<br />
{{ TCC2 | Plataforma de desenvolvimento de aplicações IoT utilizando redes LoRaWAN | LEONAN DA SILVA SARAIVA | Arliones Stevert Hoeller Junior | | Tiago Semprebom, Eraldo Silveira e Silva | 06/07/2017 | 10h30min | 003 }}<br />
<br />
==Semestre 2016-2==<br />
<br />
{{ TCC2 | Redes LoRaWAN: implantação e desenvolvimento de aplicações | JEAN MICHEL DE SOUZA SANT'ANA | Prof. Me. Arliones Stevert Hoeller Junior | Prof. Dr. Mario de Noronha Neto | Prof. Dr. Richard Demo Souza, Prof. Dr. Odilson Tadeu Valle, Prof. Dr. Marcelo Maia Sobral | 03/03/2017 | 11h | 002 }}<br />
<br />
{{ TCC2 | Testes de desempenho de enlaces ponto a ponto da tecnologia LoRa | DANILO BEDAQUE | Prof. Dr. Mario de Noronha Neto | Prof. Dr. Richard Demo Souza | Prof. Dr. Fábio Alexandre de Souza, Prof. Me. Arliones Stevert Hoeller Junior, Prof. Me. Diego da Silva Medeiros | 03/03/2017 | 10h | 001 }}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Uma_Proposta_de_Sistema_de_Arquivos_Distribu%C3%ADdos_em_Nuvem_Privada_Multi-regi%C3%A3o_para_o_IFSC&diff=155258Uma Proposta de Sistema de Arquivos Distribuídos em Nuvem Privada Multi-região para o IFSC2019-03-09T18:41:14Z<p>Matuzalem.m: </p>
<hr />
<div>;Autor:<br />
Matuzalem Muller dos Santos<br />
<br />
;Orientador: <br />
Prof. [[Ederson Torresini]]<br />
<br />
;Curso:<br />
Engenharia de Telecomunicações<br />
<br />
;Resumo:<br />
Infraestruturas de serviços baseadas em contêineres têm se popularizado nos últimos anos desde o lançamento da primeira versão estável do Kubernetes pela Google em 2014. Dentre os benefícios oferecidos por tais infraestruturas caracterizam-se a alta escalabilidade e facilidade no gerenciamento de serviços. Este trabalho propõe uma infraestrutura hiperconvergente baseada em contêineres. Para validação da proposta foi criado um cluster Kubernetes na Google Cloud Platform (GCP), onde o Rook, uma plataforma de armazenamento distribuído, foi utilizado para validar o gerenciamento de armazenamento na infraestrutura hiperconvergente. Para utilização do armazenamento foram utilizados um blog WordPress e uma base de dados MySQL.<br />
<br />
;Palavras chave: <br />
Nuvem Privada. Contêineres. Hiperconvergência de Infraestrutura.<br />
<br />
;Abstract:<br />
Container-based infrastructures became popular over the past few years since Google released Kubernetes in 2014. Among the advantages of container-based infrastructures are the immense scaling and easy management capabilities offered by this technology. This paper presents a hyper-converged infrastructure model based on containers. A Kubernetes cluster is implemented in the Google Cloud Platform to validate the model, and Rook (a storage orchestrator) is used to provide storage to applications from the cluster. A WordPress blog and a MySQL database are also implemented to use the storage orchestrated by Rook.<br />
<br />
;Keywords:<br />
Private cloud. Containers. Hyper-converged infrastructure.<br />
<br />
;Arquivos:<br />
Arquivos relacionados a trabalho, a monografia em pdf e também arquivos fontes e executáveis estão disponibilizados nos links abaixo:<br />
*[[Media:TCC_2_MatuzalemMullerDosSantos_Digital.pdf |Monografia.pdf]]<br />
<br />
[[Categoria:Trabalhos de Alunos]]<br />
[[Categoria:Projeto de Fim de Curso]]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Arquivo:TCC_2_MatuzalemMullerDosSantos_Digital.pdf&diff=155257Arquivo:TCC 2 MatuzalemMullerDosSantos Digital.pdf2019-03-09T18:37:35Z<p>Matuzalem.m: </p>
<hr />
<div></div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Matuzalem_Muller&diff=155256Matuzalem Muller2019-03-09T18:34:24Z<p>Matuzalem.m: </p>
<hr />
<div>Ingressou na Instituição de Ensino em 2009, inicialmente no ensino médio. Após a conclusão do mesmo, ingressou na [http://wiki.sj.ifsc.edu.br/index.php/Curso_de_Engenharia_de_Telecomunica%C3%A7%C3%B5es Engenharia de Telecomunicações], concluindo o curso no segundo semestre de 2018.<br />
<br />
;Informações:<br />
<br />
Currículo Lattes: [http://buscatextual.cnpq.br/buscatextual/visualizacv.do?metodo=apresentar&id=K8158513U5 Matuzalém Muller dos Santos]<br />
<br />
LinkedIn: [https://www.linkedin.com/in/matuzalemmuller/pt Perfil]<br />
<br />
Email: matuzalemifsc'''[at]'''gmail.com<br />
<br />
== Projetos Participantes ==<br />
{{collapse top|Bolsas de Extensão}}<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Programa%C3%A7%C3%A3o_visual_%2B_game_design_e_seus_recursos_pedag%C3%B3gicos Programação visual + game design e seus recursos pedagógicos]<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_2 Mulheres na Engenharia - Pagina do Bolsista]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_1_2015/1 Oficina 1]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 Oficina 2]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_3_2015/1 Oficina 3]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_4_2015/1 Oficina 4]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_5_2015/1 Oficina 5]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_6_2015/1 Oficina 6]<br />
{{collapse bottom|Bolsa de Extensão}}<br />
<br />
==Trabalhos do Curso==<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Alarme_MIC29004-2014-1 Projeto Final de Microprocessadores: Simulador de Alarme de Loja]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projetos_Finais_CIL29003#EQUIPE_3_-_Veloc.C3.ADmetro_e_Acelerador_Digital Projeto Final de Circuitos Lógicos: Velocímetro e Acelerador Digital]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/index.php/RED29004-2014-1-Seminario1-VPN Seminário de Redes de Computadores I - VPN]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Seguran%C3%A7a_em_Redes_de_Computadores_-_RED29005 Seminário de Redes de Computadores II - Segurança em Rede de Computadores]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto Projeto Integrador II - Sistema de Automatização de Sala de Aula]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Uma_Proposta_de_Sistema_de_Arquivos_Distribu%C3%ADdos_em_Nuvem_Privada_Multi-regi%C3%A3o_para_o_IFSC&diff=145637Uma Proposta de Sistema de Arquivos Distribuídos em Nuvem Privada Multi-região para o IFSC2018-05-29T18:07:47Z<p>Matuzalem.m: </p>
<hr />
<div><center><br />
;Uma Proposta de Sistema de Arquivos Distribuídos em Nuvem Privada Multi-região para o IFSC<br />
<br />
:Matuzalem Muller dos Santos<br />
:Ederson Torresini, Me.<br />
:Trabalho realizado como parte das atividades da disciplina TCC29009<br />
:Estudante do Curso de Engenharia de Telecomunicações do Campus São José do IFSC e-mail: matuzalem.m [at] aluno.ifsc.edu.br <br />
:Professor do Departamento de Telecomunicações do Campus São José do IFSC e-mail: etorresini [at] ifsc.edu.br<br />
</center><br />
<br />
;Resumo:<br />
No decorrer da última década a utilização de nuvens públicas por empresas aumentou consideravelmente. Entretanto, nem todos podem migrar ou oferecer serviços de computação em nuvens públicas, como é o caso atual de diversos setores de órgãos governamentais brasileiros. Neste contexto, é preciso projetar sistemas que operem em nuvens privadas e ofereçam serviços com boa disponibilidade e redundância. Para tal, técnicas de virtualização e sistemas distribuídos são empregados nestas nuvens, garantindo que o sistema possa atender às necessidades dos órgãos. O armazenamento de arquivos é um dos pontos mais críticos destes sistemas, visto que as informações armazenadas são extremamente sensíveis e falhas no sistema de armazenamento podem ser catastróficas para serviços governamentais e privacidade das pessoas. Este trabalho tem por objetivo estudar tecnologias de armazenamento distribuído multi-região utilizando ''containers'' e propor uma solução para a nova infraestrutura de serviços e servidores sendo planejada pela CTIC do IFSC câmpus São José.<br />
<br />
<br />
;Palavras-chave: <br />
Nuvem Privada; ''IaaS''; Armazenamento Distribuído.<br />
<br />
;Resumo Expandido:<br />
*[[Media:TCC_ResumoExpandido_MatuzalemMullerDosSantos.pdf|Resumo Expandido]]<br />
<br />
[[Categoria: TCC]]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Arquivo:TCC_ResumoExpandido_MatuzalemMullerDosSantos.pdf&diff=145636Arquivo:TCC ResumoExpandido MatuzalemMullerDosSantos.pdf2018-05-29T18:07:05Z<p>Matuzalem.m: </p>
<hr />
<div></div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Uma_Proposta_de_Sistema_de_Arquivos_Distribu%C3%ADdos_em_Nuvem_Privada_Multi-regi%C3%A3o_para_o_IFSC&diff=145589Uma Proposta de Sistema de Arquivos Distribuídos em Nuvem Privada Multi-região para o IFSC2018-05-29T00:07:24Z<p>Matuzalem.m: </p>
<hr />
<div><center><br />
;Uma Proposta de Sistema de Arquivos Distribuídos em Nuvem Privada Multi-região para o IFSC<br />
<br />
:Matuzalem Muller dos Santos<br />
:Ederson Torresini, Me.<br />
:Trabalho realizado como parte das atividades da disciplina TCC29009<br />
:Estudante do Curso de Engenharia de Telecomunicações do Campus São José do IFSC e-mail: matuzalem.m [at] aluno.ifsc.edu.br <br />
:Professor do Departamento de Telecomunicações do Campus São José do IFSC e-mail: etorresini [at] ifsc.edu.br<br />
</center><br />
<br />
;Resumo:<br />
No decorrer da última década a utilização de nuvens públicas por empresas aumentou consideravelmente. Entretanto, nem todos podem migrar ou oferecer serviços de computação em nuvens públicas, como é o caso atual de diversos setores de órgãos governamentais brasileiros. Neste contexto, é preciso projetar sistemas que operem em nuvens privadas e ofereçam serviços com boa disponibilidade e redundância. Para tal, técnicas de virtualização e sistemas distribuídos são empregados nestas nuvens, garantindo que o sistema possa atender às necessidades dos órgãos. O armazenamento de arquivos é um dos pontos mais críticos destes sistemas, visto que as informações armazenadas são extremamente sensíveis e falhas no sistema de armazenamento podem ser catastróficas para serviços governamentais e privacidade das pessoas. Este trabalho tem por objetivo estudar tecnologias de armazenamento distribuído multi-região utilizando ''containers'' e propor uma solução para a nova infraestrutura de serviços e servidores sendo planejada pela CTIC do IFSC câmpus São José.<br />
<br />
<br />
;Palavras-chave: <br />
Nuvem Privada; ''IaaS''; Armazenamento Distribuído.<br />
<br />
;Resumo Expandido:<br />
*[[Media:TCC_ResumoEstendido_MatuzalemMullerDosSantos.pdf|Resumo Expandido]] (já no modelo de TCC - virá a ser substituído pelo arquivo do TCC completo no futuro)<br />
<br />
[[Categoria: TCC]]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Uma_Proposta_de_Sistema_de_Arquivos_Distribu%C3%ADdos_em_Nuvem_Privada_Multi-regi%C3%A3o_para_o_IFSC&diff=145588Uma Proposta de Sistema de Arquivos Distribuídos em Nuvem Privada Multi-região para o IFSC2018-05-29T00:05:57Z<p>Matuzalem.m: Criou página com '<center> ;Uma Proposta de Sistema de Arquivos Distribuídos em Nuvem Privada Multi-região para o IFSC :Matuzalem Muller dos Santos :Ederson Torresini, Me. :Trabalho realizado c...'</p>
<hr />
<div><center><br />
;Uma Proposta de Sistema de Arquivos Distribuídos em Nuvem Privada Multi-região para o IFSC<br />
<br />
:Matuzalem Muller dos Santos<br />
:Ederson Torresini, Me.<br />
:Trabalho realizado como parte das atividades da disciplina TCC29009<br />
:Estudante do Curso de Engenharia de Telecomunicações do Campus São José do IFSC e-mail: matuzalem.m [at] aluno.ifsc.edu.br <br />
:Professor do Departamento de Telecomunicações do Campus São José do IFSC e-mail: etorresini [at] gmail.com<br />
</center><br />
<br />
;Resumo:<br />
No decorrer da última década a utilização de nuvens públicas por empresas aumentou consideravelmente. Entretanto, nem todos podem migrar ou oferecer serviços de computação em nuvens públicas, como é o caso atual de diversos setores de órgãos governamentais brasileiros. Neste contexto, é preciso projetar sistemas que operem em nuvens privadas e ofereçam serviços com boa disponibilidade e redundância. Para tal, técnicas de virtualização e sistemas distribuídos são empregados nestas nuvens, garantindo que o sistema possa atender às necessidades dos órgãos. O armazenamento de arquivos é um dos pontos mais críticos destes sistemas, visto que as informações armazenadas são extremamente sensíveis e falhas no sistema de armazenamento podem ser catastróficas para serviços governamentais e privacidade das pessoas. Este trabalho tem por objetivo estudar tecnologias de armazenamento distribuído multi-região utilizando ''containers'' e propor uma solução para a nova infraestrutura de serviços e servidores sendo planejada pela CTIC do IFSC câmpus São José.<br />
<br />
<br />
;Palavras-chave: <br />
Nuvem Privada; ''IaaS''; Armazenamento Distribuído.<br />
<br />
;Resumo Expandido:<br />
*[[Media:TCC_ResumoEstendido_MatuzalemMullerDosSantos.pdf|Resumo Expandido]] (já no modelo de TCC - virá a ser substituído pelo arquivo do TCC completo no futuro)<br />
<br />
[[Categoria: TCC]]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Arquivo:TCC_ResumoEstendido_MatuzalemMullerDosSantos.pdf&diff=145586Arquivo:TCC ResumoEstendido MatuzalemMullerDosSantos.pdf2018-05-29T00:01:38Z<p>Matuzalem.m: </p>
<hr />
<div></div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Matuzalem_Muller&diff=130378Matuzalem Muller2017-05-26T13:16:58Z<p>Matuzalem.m: </p>
<hr />
<div>Ingressou na Instituição de Ensino em 2009, inicialmente no ensino médio. Após a conclusão do mesmo, ingressou na [http://wiki.sj.ifsc.edu.br/index.php/Curso_de_Engenharia_de_Telecomunica%C3%A7%C3%B5es Engenharia de Telecomunicações]. Participou do programa de intercâmbio [http://www.cienciasemfronteiras.gov.br/web/csf Ciência sem Fronteiras] na [http://www.ucsb.edu/ Universidade de Santa Barbara] de junho de 2015 à setembro de 2016.<br />
<br />
;Informações:<br />
<br />
Currículo Lattes: [http://buscatextual.cnpq.br/buscatextual/visualizacv.do?metodo=apresentar&id=K8158513U5 Matuzalém Muller dos Santos]<br />
<br />
LinkedIn: [https://www.linkedin.com/in/matuzalemmuller/pt Perfil]<br />
<br />
Email: matuzalemifsc'''[at]'''gmail.com<br />
<br />
== Projetos Participantes ==<br />
{{collapse top|Bolsas de Extensão}}<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Programa%C3%A7%C3%A3o_visual_%2B_game_design_e_seus_recursos_pedag%C3%B3gicos Programação visual + game design e seus recursos pedagógicos]<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_2 Mulheres na Engenharia - Pagina do Bolsista]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_1_2015/1 Oficina 1]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 Oficina 2]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_3_2015/1 Oficina 3]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_4_2015/1 Oficina 4]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_5_2015/1 Oficina 5]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_6_2015/1 Oficina 6]<br />
{{collapse bottom|Bolsa de Extensão}}<br />
<br />
==Trabalhos do Curso==<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Alarme_MIC29004-2014-1 Projeto Final de Microprocessadores: Simulador de Alarme de Loja]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projetos_Finais_CIL29003#EQUIPE_3_-_Veloc.C3.ADmetro_e_Acelerador_Digital Projeto Final de Circuitos Lógicos: Velocímetro e Acelerador Digital]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/index.php/RED29004-2014-1-Seminario1-VPN Seminário de Redes de Computadores I - VPN]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Seguran%C3%A7a_em_Redes_de_Computadores_-_RED29005 Seminário de Redes de Computadores II - Segurança em Rede de Computadores]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto Projeto Integrador II - Sistema de Automatização de Sala de Aula]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PSD29007-Engtelecom(2017-1)_-_Prof._Marcos_Moecke&diff=130377PSD29007-Engtelecom(2017-1) - Prof. Marcos Moecke2017-05-26T13:14:54Z<p>Matuzalem.m: /* ATUAL */</p>
<hr />
<div>==Registro on-line das aulas==<br />
<br />
===Unidade 1===<br />
;Aula 1 (10 Fev):<br />
*[[PSD-EngTel (Plano de Ensino) | Apresentação da disciplina]]<br />
<br />
*Revisão de Sinais e Sistemas no tempo discreto em Matlab:<br />
:* Resposta de sistemas LTI (Experimento 1.1)<br />
::* Relembrar o conceito de equação de diferenças de um sistema LTI discreto e resposta ao impulso.<br />
::* Resposta ao [https://pt.wikipedia.org/wiki/Delta_de_Kronecker delta de Kronecker] do sistema LTI discreto<br />
:: <math>a_0 y[n] + a_1 y[n-1] + a_2 y[n-2] + ... + a_N y[n-N] = b_0 x[n] + b_1 x[n-1] + b_2 x[n-2] + ... + b_M x[n-M]</math><br />
:: onde <math>a_0 = 1</math>, <math>a_1 = - 1/\alpha</math> e <math>b_1 = 1 </math> logo <math>y[n] = 1/\alpha . y[n-1] + x[n]</math><br />
<syntaxhighlight lang=matlab><br />
% Exemplos e Experimentos baseados no livro:<br />
% DINIZ, P. S. R., DA SILVA, E. A. B., e LIMA NETTO, S. Processamento Digital de Sinais: Projeto e Análise de Sistemas. 2. ed. Porto Alegre: Bookman, 2014. 976 p. ISBN 978-8582601235.<br />
%% Experimento 1.1<br />
alpha = 1.15; N = 256;<br />
x = [1 zeros(1,N)];<br />
y = filter(1,[1 -1/alpha],x);<br />
stem(y);<br />
<br />
</syntaxhighlight><br />
:* Amostragem de Sinais (Experimento 1.2)<br />
::* Relembrar teorema da amostragem. Efeito da amostragem abaixo da frequência de Nyquist. Aliasing.<br />
::* Notar que as amostras de um sinal <math>s_1(t) = cos (2\pi \times 3 t)</math> (3 Hz) e um sinal <math>s_2(t) = cos (2\pi \times 7 t)</math> (7 Hz) são idênticas quando amostrado com um sinal de 10 Hz. <br />
<br />
<syntaxhighlight lang=matlab><br />
% Exemplos e Experimentos baseados no livro:<br />
% DINIZ, P. S. R., DA SILVA, E. A. B., e LIMA NETTO, S. Processamento Digital de Sinais: Projeto e Análise de Sistemas. 2. ed. Porto Alegre: Bookman, 2014. 976 p. ISBN 978-8582601235.<br />
%% Experimento 1.2<br />
fs = 10; % frequencia (Hz) de amostragem dos sinais<br />
Ts = 1/fs; fase = 0;<br />
time = 0:Ts:(1-Ts);<br />
f1 = 3; % frequencia (Hz) do sinal s_1<br />
f2 = 7; % frequencia (Hz) do sinal s_2<br />
s_1 = cos(2*pi*f1*time+fase);<br />
s_2 = cos(2*pi*f2*time+fase);<br />
fsa = 1000; % frequência auxiliar de amostragem usada apenas para representação dos sinais originais<br />
Tsa = 1/fsa;<br />
time_aux = 0:Tsa:(1-Tsa);<br />
figure(1);<br />
stem(time,s_1,'ob');<br />
hold on;<br />
plot(time_aux, cos(2*pi*f1*time_aux+fase),'--k');<br />
stem(time,s_2,'+r');<br />
plot(time_aux, cos(2*pi*f2*time_aux+fase),'--m');<br />
hold off;<br />
legend('s_1 discreto','s_1 contínuo','s_2 discreto','s_2 contínuo')<br />
</syntaxhighlight><br />
<br />
:* Uso do Matlab: [http://www.mathworks.com/help/matlab/learn_matlab/help.html Help], F9 executa o código destacado no Help. [http://www.mathworks.com/help/matlab/learn_matlab/scripts.html Programação com scripts .m], [http://www.mathworks.com/help/matlab/matlab_prog/run-sections-of-programs.html?searchHighlight=script%20sections Execução de seções e variação de valores nos scripts], <br />
:* Ver no Matlab: [http://www.mathworks.com/help/matlab/ref/zeros.html zeros], [http://www.mathworks.com/help/matlab/ref/ones.html ones], [http://www.mathworks.com/help/matlab/ref/plot.html plot], [http://www.mathworks.com/help/matlab/ref/stem.html stem], [http://www.mathworks.com/help/matlab/ref/subplot.html subplot], [http://www.mathworks.com/help/matlab/ref/filter.html filter].<br />
:*[http://www.mathworks.com/help/matlab/learn_matlab/plots.html Uso de gráficos no Matlab]. <br />
<br />
:* Ver pag. 65 a 71 de <ref name="DINIZ2014"> DINIZ, P. S. R., DA SILVA, E. A. B., e LIMA NETTO, S. '''Processamento Digital de Sinais: Projeto e Análise de Sistemas'''. 2. ed. Porto Alegre: Bookman, 2014. 976 p. ISBN 978-8582601235 </ref><br />
:*Ver também [http://www.mathworks.com/help/releases/R2014a/pdf_doc/matlab/index.html PDF Documentation for MATLAB]. Principalmente [http://www.mathworks.com/help/releases/R2014a/pdf_doc/matlab/getstart.pdf MATLAB Primer].<br />
<br />
;Aula 2 (13 Fev)<br />
*Revisão de Sinais e Sistemas no tempo discreto em Matlab:<br />
:* Filtragem de Sinais (Experimentos 1.3, 2.1 e 2.2)<br />
:* Consulte a documentação do Matlab sobre <syntaxhighlight lang=matlab> roots, poly, linspace, logspace </syntaxhighlight><br />
:* Uso de [http://www.mathworks.com/help/matlab/ref/residue.html residue], [http://www.mathworks.com/help/signal/ref/residuez.html residuez], [http://www.mathworks.com/help/matlab/ref/pretty.html pretty], [http://www.mathworks.com/help/matlab/ref/latex.html latex], [http://www.mathworks.com/help/signal/ref/freqs.html freqs], [http://www.mathworks.com/help/signal/ref/freqz.html freqz], [http://www.mathworks.com/help/symbolic/syms.html syms], [http://www.mathworks.com/help/signal/ref/symfun.html symfun], [http://www.mathworks.com/help/signal/ref/zplane.html zplane].<br />
:* Ver também o [http://www.mathworks.com/help/matlab/ref/publish.html Publish] para a geração automática de relatórios em html, doc, pdf, latex ou ppt. Ver também [http://www.mathworks.com/help/matlab/matlab_prog/publishing-matlab-code.html Publishing MATLAB Code].<br />
:* Ver pag. 138 a 141 de <ref name="DINIZ2014"/><br />
{{collapse top | Variação do Experimento 2.2}}<br />
<syntaxhighlight lang=matlab><br />
% Exemplos e Experimentos baseados no livro:<br />
% DINIZ, P. S. R., DA SILVA, E. A. B., e LIMA NETTO, S. Processamento Digital de Sinais: Projeto e Análise de Sistemas. 2. ed. Porto Alegre: Bookman, 2014. 976 p. ISBN 978-8582601235.<br />
%% Experimento 2.2<br />
% Resposta em frequencia usando a função freqz<br />
N = 1;<br />
num = [1 0 0 0];<br />
den = poly([0.8 0.2])<br />
%den = [1 0.6 -0.16];<br />
% modo 1<br />
%[H,w]=freqz(num,den,[0:pi/100:N*pi-pi/100]);<br />
%plot(w/pi, abs(H));<br />
% modo 2<br />
%[H,w]=freqz(num,den);<br />
%plot(w/pi, abs(H));<br />
% modo 3<br />
%[H,w]=freqz(num, den, 'whole');<br />
%plot(w/pi, abs(H));<br />
% modo 4<br />
freqz(num, den, 'whole');<br />
figure(2);<br />
zplane(num,den);<br />
<br />
%% Resposta em frequencia substituindo z -> e^(jw)<br />
syms z<br />
Hf(z) = symfun(z^2/(z-0.2)/(z+0.8),z);<br />
pretty(Hf)<br />
latex(Hf)<br />
N = 1;<br />
w = [0:pi/100:N*pi-pi/100];<br />
plot(w/pi,abs(Hf(exp(1i*w))))<br />
%title(['$' latex(Hf) '$'],'interpreter','latex')<br />
text(0.2,2,['H(z) = ' '$$' latex(Hf) '$$'],'interpreter','latex')<br />
xlabel(['w/' '$$' '\pi' '$$'],'interpreter','latex')<br />
</syntaxhighlight><br />
#Verifique a diferença entre os tipos de plots comentados no código.<br />
#substitua o denominador de H(z) por dois polos em [-0.8 -0.8].<br />
#verifique o que ocorre se forem utilizados polos complexos conjugados [0.3-0.4i 0.3+0.4i 0.1]<br />
#verifique o que ocorre se forem utilizados polos complexos não conjugados [0.3-0.4i 0.3+0.8i]<br />
#verifique o que ocorre se os polos estiverem fora do circulo unitário [1.2 -0.2]. Interprete este resultado <br />
{{collapse bottom}}<br />
<br />
;Aula 3 (17 Fev):<br />
*Revisão de Sinais e Sistemas no tempo discreto em Matlab:<br />
:* Filtragem de Sinais<br />
{{collapse top | Variação do Experimento 3.1}}<br />
<syntaxhighlight lang=matlab><br />
%% Variação do Experimento 3.1 do livro:<br />
% DINIZ, P. S. R., DA SILVA, E. A. B., e LIMA NETTO, S. Processamento Digital de Sinais: Projeto e Análise de Sistemas. 2. ed. Porto Alegre: Bookman, 2014. 976 p. ISBN 978-8582601235.<br />
% FILE: Ex3_1.m<br />
% Exemplificando as possiveis formas de realizar a filtragem de um sinal x(n)<br />
<br />
<br />
clc; clear all; close all;<br />
%% Definindo valores iniciais<br />
Nh = 10; Nx = 20;<br />
%Nh = 400; Nx = 10000;<br />
x = ones(1,Nx);<br />
% A resposta ao inpulso de um sistema h(n) <br />
% no filtro FIR aos coeficientes b(n) = h(n) <br />
h = [1:Nh]; b = h;<br />
%% Filtrando o sinal e medindo tempos<br />
<br />
% Filtragem utilizando a convolução<br />
% NOTE: length(y) = length(x) + length(h) -1<br />
tic; % iniciar a contagem do tempo<br />
y1 = conv(x,h); <br />
t(1) = toc; % terminar acontagem e mostrar tempo no console<br />
<br />
% filtragem utilizando a equação recursiva<br />
% NOTE: length(y) = length(x)<br />
tic;<br />
y2 = filter(b,1,x);<br />
t(2) = toc;<br />
<br />
% filtragem utilizando a equação recursiva<br />
% aumentando o tamanho de x para que length(y3) = length(y1)<br />
x3 = [x zeros(1,length(h)-1)];<br />
tic;<br />
y3 = filter(h,1,x3); <br />
t(3) = toc;<br />
<br />
length_y = length(x) + length(h) - 1;<br />
<br />
% filtragem utilizando a FFT<br />
% a y = IFFT(FFT(x)*FFT(h))<br />
tic;<br />
X = fft(x,length_y);<br />
H = fft(h,length_y);<br />
Y4 = X.*H;<br />
y4 = ifft(Y4);<br />
t(4) = toc;<br />
<br />
% filtragem utilizando a função fftfilt<br />
% a y = IFFT(FFT(x)*FFT(h))<br />
<br />
tic<br />
y5 = fftfilt(h,x3);<br />
t(5) = toc;<br />
<br />
disp('Comprimento do vetor de saída length(y)')<br />
disp([' ' num2str([length(y1) length(y2) length(y3) length(y4) length(y5)])])<br />
disp('Tempo usado na filtragem em micro segundos')<br />
disp([' ' num2str(t*1e6) ' us'])<br />
<br />
%% Plotando o gráfico<br />
subplot(411);stem(y1);<br />
hold on;<br />
stem(y2,'xr');<br />
stem(y3,'+m');<br />
legend('y1', 'y2', 'y3')<br />
hold off<br />
subplot(412);stem(y1, 'ob');legend('y1')<br />
subplot(413);stem(y2, 'xr'); hold on; stem(zeros(size(y1)),'.w');hold off; legend('y2')<br />
subplot(414);stem(y3, '+m');legend('y3')<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
:* Análise de Sinais (Experimento 3.2) - Análise de um sistema h[n] correspondente a um filtro passa-faixa, utilizando um sinal de entrada x[n] senoidal (ou um sinal r[n] de ruído branco). Análise da entrada x[n] e saída y[n] usando a fft.<br />
{{collapse top | Variação do Experimento 3.2}}<br />
<syntaxhighlight lang=matlab><br />
%% Variação do Experimento 3.2 do livro:<br />
% DINIZ, P. S. R., DA SILVA, E. A. B., e LIMA NETTO, S. Processamento Digital de Sinais: Projeto e Análise de Sistemas. 2. ed. Porto Alegre: Bookman, 2014. 976 p. ISBN 978-8582601235.<br />
% FILE: Ex3_2.m<br />
<br />
% Análise de sinais no domínio da frequência <br />
fs = 200; % frequência de amostragem<br />
f_sinal = 10; A_sinal = 1; % freqüência e amplitude do sinal <br />
T = 1; % Duração do sinal<br />
k_noise = 0.2; % Intensidade do ruído <br />
snr = 0;<br />
<br />
time = 0 : 1/fs : (T-1/fs);<br />
L = length(time);<br />
freq = time * fs/T;<br />
<br />
% Sinal x(n) com amplitude A_sinal e frequencia de f_sinal (Hz) <br />
x = A_sinal*sin(2*pi*f_sinal.*time);<br />
<br />
% Adicionando um ruido com a função randn<br />
noise = k_noise*randn(1,fs*T);<br />
x1 = x + noise;<br />
<br />
% Adicionando um ruido com a função awgn<br />
x2 = awgn(x,snr);<br />
<br />
% Obtendo o sinal no domínio da frequencia<br />
X = abs(fft(x))/L;<br />
X1 = abs(fft(x1))/L;<br />
X2 = abs(fft(x2))/L;<br />
<br />
% Obtendo os plots dos sinais no dominio do tempo e domínio da frequencia<br />
figure(1);<br />
subplot(211);plot(time,x, 'b', time,x1, 'g', time, x2, 'r'); <br />
legend('x(n)', 'x(n)+rand', 'x(n)awgn', 'Location','south')<br />
xlabel('Tempo (seg)'); ylabel('Magnitude (linear)');<br />
subplot(212);plot(freq, (abs(X)), 'b'); hold on ;plot(freq, (abs(X1)),'g');plot(freq,(abs(X2)),'r'); <br />
legend('X(f)', 'X(f)+rand', 'X(f)+awgn', 'Location','south'); hold off;<br />
xlabel('Frequencia (Hz)'); ylabel('Magnitude (linear)');<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
:* Filtros Digitais ([https://owncloud.ifsc.edu.br/index.php/s/WWY2LWexts8PKDs Experimento 2.3])<br />
<br />
:* Consulte a documentação do Matlab sobre <syntaxhighlight lang=matlab> fft, ifft, fftshift, randn </syntaxhighlight><br />
:* Consulte a documentação do Matlab sobre <syntaxhighlight lang=matlab> plot, grid, subplot, hold, xlabel, ylabel, title, legend, xlim, ylim, log10, log </syntaxhighlight><br />
:* Consulte a documentação do Matlab sobre [https://www.mathworks.com/help/matlab/ref/text.html text], [http://www.mathworks.com/help/signal/ref/zp2tf.html zp2tf], [http://www.mathworks.com/help/signal/ref/tf2zp.html tf2zp], [http://www.mathworks.com/help/signal/ref/fftfilt.html fftfilt], [http://www.mathworks.com/help/matlab/ref/awgn.html awgn] <br />
:*Ver pag. 141 a 145 e 230 a 235 de <ref name="DINIZ2014"/><br />
<br />
;Aula 4 - 5 (20 - 24 Fev):<br />
*Revisão de Sinais e Sistemas no tempo discreto em Matlab:<br />
:* Filtros Digitais <br />
<syntaxhighlight lang=matlab><br />
%% Experimento 2.3 - Filtros Digitais<br />
% Exemplos e Experimentos baseados no livro:<br />
% DINIZ, P. S. R., DA SILVA, E. A. B., e LIMA NETTO, S. Processamento Digital de Sinais: Projeto e Análise de Sistemas. 2. ed. Porto Alegre: Bookman, 2014. 976 p. ISBN 978-8582601235.<br />
% FILE: Exp2_3.m<br />
<br />
%% 1º filtro<br />
p1 = 0.9*exp(1j*pi/4);<br />
Z = [1 -1 ]'; P = [p1 p1']';<br />
[num,den] = zp2tf(Z,P,1);<br />
[h,w] = freqz(num,den);<br />
figure(1); plot(w,abs(h)/max(abs(h)));<br />
figure(2); zplane(num,den);<br />
<br />
%% 2º filtro<br />
z1 = exp(1j*pi/8);<br />
z2 = exp(1j*3*pi/8);<br />
p1 = 0.9*exp(1j*pi/4);<br />
Z = [1 -1 z1 z1' z2 z2']';<br />
P = [p1 p1' p1 p1' p1 p1']';<br />
[num,den] = zp2tf(Z,P,1);<br />
[h,w] = freqz(num,den);<br />
figure(1); plot(w,abs(h)/max(abs(h)));<br />
figure(2); zplane(num,den);<br />
<br />
%% 3º filtro<br />
z1 = exp(1j*pi/8);<br />
z2 = exp(1j*3*pi/8);<br />
p1 = 0.99*exp(1j*pi/4);<br />
p2 = 0.9*exp(1j*pi/4 - 1j*pi/30);<br />
p3 = 0.9*exp(1j*pi/4 + 1j*pi/30);<br />
Z = [1 -1 z1 z1' z2 z2']';<br />
P = [p1 p1' p2 p2' p3 p3']';<br />
[num,den] = zp2tf(Z,P,1);<br />
[h,w] = freqz(num,den);<br />
figure(1); plot(w,abs(h)/max(abs(h)));<br />
figure(2); zplane(num,den);<br />
</syntaxhighlight><br />
<br />
:* Exercício - Sinal DTMF com ruído<br />
::* Verifique se o Matlab está reproduzindo corretamente o som.<br />
<syntaxhighlight lang=matlab><br />
%% Carregando o som<br />
clear, close, clc<br />
load handel;<br />
<br />
%% Reproduzindo o som <br />
sound(y,Fs)<br />
<br />
% Reproduzindo o som <br />
%soundsc(y,Fs)<br />
<br />
% Reproduzindo o som <br />
%player = audioplayer(y, Fs);<br />
%play(player);<br />
</syntaxhighlight><br />
::* Usando o Matlab (ou Audacity) para gerar um sinal [https://pt.wikipedia.org/wiki/DTMF DTMF] correspondente a um número N e adicionar um ruido ao sinal. Opcionalmente utilize um [[Media:DFMT EX1.ogg | sinal DTMF gravado]]<br />
::* Utilizar uma frequência de amostragem de 8000Hz de fazer a duração do sinal igual a 2 segundos.<br />
::* Para adicionar o ruído utilize a função y = [http://www.mathworks.com/help/comm/ref/awgn.html awgn](x,snr), ou y = x + nivel*[http://www.mathworks.com/help/matlab/ref/randn.html randn](n).<br />
<br />
::* Observe este sinal no domínio do tempo (DT) e domínio da frequência (DF).<br />
<syntaxhighlight lang=matlab><br />
%% Carregando o som<br />
clear, close, clc<br />
[y,Fs] = audioread('DTMF_8kHz.ogg');<br />
<br />
%% Reproduzindo o som <br />
sound(y,Fs)<br />
<br />
%% Visualizando o som no DT<br />
time = [0:length(y)-1]'/Fs;<br />
plot(time',y'); xlabel('segundos');<br />
xlim([0 time(end)]), ylim([-1 1]);<br />
<br />
%% Visualizando o som no DF<br />
Nfreq = length(y);<br />
freq = linspace(0,2*pi,Nfreq)'*Fs/pi/2;<br />
Y = fft(y,Nfreq)/Nfreq;<br />
plot(freq,abs(Y)); xlabel('Hertz');<br />
xlim([0 Fs/2]);<br />
</syntaxhighlight><br />
<br />
::* Filtrar o sinal resultante mantendo apenas a frequência da linha (ou coluna)<br />
::* Mostrar os sinais no domínio do tempo e da frequência. <br />
::: x1,X1 - soma das duas senoides.<br />
::: x2,X1 - soma de x1 com o ruído branco (gaussiano)<br />
::: y,Y - sinal filtrado.<br />
::* Para a filtragem:<br />
:::* faça a filtragem no domínio do tempo, usando a função [http://www.mathworks.com/help/matlab/ref/filter.html filter] posicionando o polo sobre a frequência que deseja passar, e coloque um zero sobre a frequência que deseja rejeitar. <br />
:::* faça a filtragem no domínio da frequência, convertendo o sinal x1 para DF usando X1 = fft(x1), Y = X1.*H, y = ifft(Y), onde H é um vetor de zeros e uns que indica as frequências que devem passar e quais devem ser rejeitadas.<br />
:VER (Experimento 3.1, Experimento 3.2, Experimento 2.3)<br />
<br />
;Aula (3 Mar):<br />
*1ª defesas de TCC do Curso de Engenharia de Telecomunicações.<br />
:* Alunos assistiram a defesa no auditório das 10:00 as 12:35<br />
<br />
===Unidade 2===<br />
<br />
;Aula 6 (6 Mar):<br />
*Filtros Analógicos:<br />
:* Função de transferência<br />
::<math> H(s) = \frac {c_0 + c_1 s + c_2 s^2 + ... + c_m s^m} {d_0 + d_1 s + d_2 s^2 + ... + d_n s^n}, m \le n</math><br />
<br />
:* Resposta em frequência: para obter a resposta em frequência é necessário avaliar <br />
::<math>H(j\omega) = H(s)\left|\begin{matrix}\\ s=j\omega \end{matrix}\right.</math><br />
<br />
::<math> H(j \omega) = \left | H(j \omega) \right | e^{j \phi(\omega)}</math><br />
<br />
::<math> \left | H(j \omega) \right |^2 = H(j \omega) H(-j \omega)</math><br />
<br />
::<math> e^{j \phi(\omega)} = \frac {H(j \omega)} {H(-j \omega)}</math><br />
:* O projeto de filtros analógicos é realizado em 2 etapas:<br />
# projeto de um filtro passa baixas (LP) protótipo normalizado <math> H(p) </math> com frequência de passagem <math> \Omega_s = 1 </math><br />
# transformação em frequência para o tipo de filtro (LP, HP, BP ou BS) <br />
::<math> H(s) = H(p)\left|\begin{matrix}\\ p=g(s) \end{matrix}\right. </math> <br />
<br />
;Aula 7 e 8 (10 e 13 Mar):<br />
* Projeto de filtros analógicos do tipo Butterworth<br />
:* A aproximação de magnitude de filtros analógicos pode ser realizado usando as aproximações de Butterworth, Chebyshev (tipo 1 ou 2) e Cauer.<br />
* Projeto de filtros analógicos do tipo Butterworth, considerando: <math> \omega_p </math> é a frequência de passagem do filtro LP, <math> A_p </math> é a atenuação em dB na frequência de passagem, <math> \omega_s </math> é a frequência de ''stopband'' do filtro, <math> A_s </math> é a atenuação em dB na frequência de ''stopband'', <math> \epsilon = \sqrt{10^{0.1A_s}-1 } </math>, <math> \Omega_s = \frac {\omega_s} {\omega_s} </math>, <math> \Omega_p = \frac {\omega_p} {\omega_s} = 1 </math> são as frequências de passagem e ''stopband'' do filtro protótipo. <br />
::*É necessário determinar a ordem <math> n </math> do filtro: <br />
<br />
::<math> n \ge \frac {\log[(10^{0.1A_s}-1)/(10^{0.1A_p}-1)]} {2 \log \Omega_s} </math><br />
<br />
::*Em seguida obter os polos do filtro: <br />
<br />
::<math> p_k = \epsilon^{(-1/n)} e^{\left[ j \frac{(2 k + n - 1)} {2 n} \pi \right]}, k = 1, 2, 3, ... n</math><br />
<br />
::* Em seguida é necessário obter a função de transferência:<br />
<br />
::<math> H(p)= \frac{1}{D(p)} </math>, onde <math> D(p)=\prod_{k-1}^{n} \left ( p-p_{k} \right ) </math><br />
<br />
::* No caso de um filtro LP é necessário ainda obter a função de transferência do filtro especificado <br />
<br />
::<math>H(s) = H(p)\left|\begin{matrix} \\ p=\frac{s}{\omega_p} \end{matrix}\right. </math><br />
<br />
:*Ver pag. 186 a 204 de <ref name="SHENOI2006"> SHENOI, B. A. '''Introduction to Digital Signal Processing and Filter Design'''. 1.ed. New Jersey: John Wiley-Interscience, 2006. 440 p. ISBN 978-0471464822 </ref><br />
<br />
;Aula 9 (17 Mar):<br />
* Projeto de filtros analógicos do tipo Chebyshev I.<br />
::*Determine a ordem mínima necessária:<br />
<br />
::<math> n \ge \frac {\cosh{-1} \sqrt{(10^{0.1A_s}-1)/(10^{0.1A_p}-1)}} {\cosh^{-1} \Omega_s} </math><br />
<br />
::*Em seguida obter os polos do filtro: <br />
<br />
::<math> p_k = -\sinh(\varphi_2) \sin(\theta_k)+ j \cosh(\varphi_2) \cos(\theta_k) \ \ \ \ \ k = 1, 2, 3, ... n</math>, onde <br />
::<math> \theta_k = \left ( \frac{(2k-1)\pi}{2n} \right ) </math><br />
::<math> \varphi_2 = \frac{1}{n} \sinh^{-1}\left (\frac{1}{\epsilon} \right ) </math><br />
<br />
:*Ver pag. 204 a 208 de <ref name="SHENOI2006"/><br />
<br />
;Aula 10 (20 Mar):<br />
*Filtros Analógicos: <br />
:* Uso das funções [http://www.mathworks.com/help/signal/ref/buttord.html buttord], [http://www.mathworks.com/help/signal/ref/butter.html butter], [http://www.mathworks.com/help/signal/ref/cheb1ord.html cheb1ord], [http://www.mathworks.com/help/signal/ref/cheby1.html cheby1], [http://www.mathworks.com/help/signal/ref/cheb2ord.html cheb2ord], [http://www.mathworks.com/help/signal/ref/cheby2.html cheby2], [http://www.mathworks.com/help/signal/ref/ellipord.html ellipord], [http://www.mathworks.com/help/signal/ref/ellip.html ellip] para o projeto de filtros analógicos com Matlab (é necessário usar o parâmetro ''''s'''').<br />
:* Ler '''Comparison of Analog IIR Lowpass Filters''' em [http://www.mathworks.com/help/signal/ref/ellip.html ellip]<br />
:* Uso das funções [http://www.mathworks.com/help/signal/ref/freqs.html freqs], "zplane", [http://www.mathworks.com/help/signal/ref/fvtool.html fvtool] na análise da resposta em frequência de filtros analógicos. <br />
<br />
*Exemplos de projeto de filtro passa-baixas com frequência de passagem de 16000 rad/s com atenuação máxima de 0.3 dB, frequência de rejeição de 20000 rad/s com atenuação mínima de 20 dB; e ganho em DC de 3 dB. <br />
<syntaxhighlight lang=matlab><br />
%% Projeto de filtro passa-baixas usando funções do Matlab <br />
%% Especificações do filtro <br />
Wp =16000; Ws = 20000; Ap = 0.3; As = 20; G0= 3;<br />
% Para analisar o filtro projetado, use fvtool(b,a) para observar plano s, resposta em magnitude, fase e atraso de grupo<br />
<br />
%% Butterworth<br />
[n,Wn] = buttord(Wp, Ws, Ap, As,'s')<br />
[b,a] = butter(n,Wn, 's');<br />
<br />
%% Chebyshev I<br />
n = cheb1ord(Wp, Ws, Ap, As,'s')<br />
[b,a] = cheby1(n,Ap, Wp, 's');<br />
<br />
%% Chebyshev II<br />
n = cheb2ord(Wp, Ws, Ap, As,'s')<br />
[b,a] = cheby2(n,As, Ws, 's');<br />
<br />
%% Elliptic - Cauer<br />
[n, Wn] = ellipord(Wp, Ws, Ap, As,'s')<br />
[b,a] = ellip(n,Ap,As, Wn, 's');<br />
</syntaxhighlight><br />
<br />
:* Transformação de frequência de filtros analógicos <br />
::(passa-baixas -> passa-baixas, passa-baixas -> passa-altas, passa-baixas -> passa-faixa, passa-baixas -> rejeita-faixa)<br />
::<math> \Omega_S = \omega_s/\omega_p</math><br />
:* Uso das funções [http://www.mathworks.com/help/matlab/ref/semilogx.html semilogx], [http://www.mathworks.com/help/matlab/ref/semilogy.html semilogy],[http://www.mathworks.com/help/matlab/ref/logspace.html logspace], [http://www.mathworks.com/help/matlab/ref/linspace.html linspace].<br />
:*Ver em [http://www.mathworks.com/help/signal/ug/iir-filter-design.html IIR Filter Design],<br />
::*Funções para projeto do filtro protótipo analógico passa-baixas: besselap, buttap, cheb1ap, cheb2ap, ellipap<br />
::*Funções de transformação de frequencia: lp2bp, lp2bs, lp2hp, lp2lp<br />
:*Ver pag. 208 a 218 de <ref name="SHENOI2006"/><br />
<br />
;Aula 11 (27 Mar):<br />
*Filtros Digitais: Filtros IIR: transformações do tempo contínuo no tempo discreto<br />
:*Transformação invariante ao impulso (pode ser usada apenas para filtros com forte atenuação em frequência altas, ex: passa-baixas e passa-faixa)<br />
:*Transformação bilinear (pode ser usada para todos tipos de filtro)<br />
:*Ver pag. 219 a 229 de <ref name="SHENOI2006"/><br />
:*Ver pag. 403 a 415 e 434 a 435 de <ref name="DINIZ2014"/><br />
<br />
;Aula 12 a 14 (31 Mar , 2 e 7 Abr):<br />
*Filtros Digitais: Filtros IIR: Uso do Matlab.<br />
::*Ver as funções de discretização usadas no Matlab: [http://www.mathworks.com/help/signal/ref/bilinear.html bilinear], [http://www.mathworks.com/help/signal/ref/impinvar.html impinvar]<br />
<!--<br />
f = 2;<br />
fs = 10;<br />
<br />
[b,a] = butter(6,2*pi*f,'s');<br />
figure(1);[h,w]=freqs(b,a,linspace(-5,5,1000)); plot(w,20*log10(abs(h)));<br />
<br />
[bz,az] = impinvar(b,a,fs);<br />
<br />
figure(2);freqz(bz,az,linspace(-5,5,1000),fs)<br />
<br />
figure(3);impz(bz,az,[],fs)<br />
[r,p] = residue(b,a);<br />
t = linspace(0,4,1000);<br />
clear h;<br />
h = real(r.'*exp(p*t)/fs);<br />
<br />
hold on<br />
plot(t,h)<br />
hold off<br />
--><br />
:* Ver em [http://www.mathworks.com/help/signal/ug/iir-filter-design.html IIR Filter Design]<br />
:* Uso das funções [http://www.mathworks.com/help/signal/ref/buttord.html buttord], [http://www.mathworks.com/help/signal/ref/butter.html butter], [http://www.mathworks.com/help/signal/ref/cheb1ord.html cheb1ord], [http://www.mathworks.com/help/signal/ref/cheby1.html cheby1], [http://www.mathworks.com/help/signal/ref/cheb2ord.html cheb2ord], [http://www.mathworks.com/help/signal/ref/cheby2.html cheby2], [http://www.mathworks.com/help/signal/ref/ellipord.html ellipord], [http://www.mathworks.com/help/signal/ref/ellip.html ellip] para o projeto de filtros IIR digitais (sem o parâmetro ''''s'''').<br />
::O projeto dos filtros digitais IIR baseados na transformada bilinear no Matlab é realizada em dois passos: (1) Determinação da ordem do filtro; (2) Determinação dos coeficientes do numerador <math> b(n) </math> e denominador <math> a(n) </math> de <math> H(z) </math> .<br />
<br />
:* Outros tipos de filtros IIR: [http://www.mathworks.com/help/signal/ref/yulewalk.html yulewalk], [https://www.mathworks.com/help/dsp/ref/iirnotch.html iirnotch], [https://www.mathworks.com/help/dsp/ref/iirpeak.html iirpeak], [https://www.mathworks.com/help/dsp/ref/iircomb.html iircomb],[http://www.mathworks.com/help/signal/ref/filtfilt.html filtfilt], [http://www.mathworks.com/help/signal/ref/maxflat.html maxflat], [http://www.mathworks.com/help/signal/ref/invfreqz.html invfreqz] e outros filtros de [http://www.mathworks.com/help/signal/ug/parametric-modeling.html modelagem paramétrica].<br />
<br />
===Unidade 3===<br />
;Aula 14 (10 Abr):<br />
*Filtros Digitais: Filtros FIR<br />
:*Filtros de fase linear: simétricos e antisimétricos (Tipo 1, 2, 3 e 4) <br />
:*Filtros de fase linear: propriedades (respostas em frequencia possíveis, distribuição dos zeros em simetria quadrantal)<br />
:*Ver pag. 249 a 256 de <ref name="SHENOI2006"/><br />
:*Ver [https://www.mathworks.com/help/signal/ug/fir-filter-design.html FIR Filter Design]<br />
<br />
;Aula 15 (17 Abr):<br />
:*Projeto de FILTRO IIR <br />
::*Atividade a distância, com laboratório liberado para uso dos alunos para a realização da AE2.<br />
<br />
;Aula 16 (24 Abr)<br />
*Filtros Digitais: Filtros FIR:<br />
:*Coeficientes da série de Fourier de filtros ideias: LP, HP, BP, BS<br />
::*Passa-baixas (''Low-pass'')<br />
::<math>c_\text{LP}(n) = \left \{ \begin{matrix} \frac{\omega_c}{\pi}; & \qquad n = 0 \\ \frac {\sin (\omega_c n)}{\pi n}; & \qquad \left | n \right | > 0 \end{matrix}\right. </math><br />
::*Passa-altas (''High-pass'')<br />
::<math>c_\text{HP}(n) = \left \{ \begin{matrix} 1-\frac{\omega_c}{\pi}; \qquad n = 0 \\ -\frac {\sin (\omega_c n)}{\pi n}; \qquad \left | n \right | > 0 \end{matrix}\right. </math><br />
::*Passa-faixa (''Band-pass'')<br />
::<math>c_\text{BP}(n) = \left \{ \begin{matrix} \frac{\omega_{c2}-\omega_{c1}}{\pi}; \qquad n = 0 \\ \frac {\sin (\omega_{c2} n)- \sin (\omega_{c1} n)}{\pi n}; \qquad \left | n \right | > 0 \end{matrix}\right. </math><br />
::*Rejeita-banda (''Band-stop'')<br />
::<math>c_\text{BS}(n) = \left \{ \begin{matrix} 1-\frac{\omega_{c2}-\omega_{c1}}{\pi}; \qquad n = 0 \\ -\frac {\sin (\omega_{c2} n)- \sin (\omega_{c1} n)}{\pi n}; \qquad \left | n \right | > 0 \end{matrix}\right. </math><br />
:*Janela retangular, fenômeno de Gibbs<br />
:*Estudar no Matlab as funções [http://www.mathworks.com/help/signal/ref/wintool.html wintool], [http://www.mathworks.com/help/signal/ref/wvtool.html wvtool], [http://www.mathworks.com/help/signal/ref/window.html window]<br />
<br />
:*Uso de funções de janelamento temporal no projeto de filtros digitais. <br />
:*Tipos de janelas temporais usadas no projeto de filtros digitais.<br />
::*Retangular<br />
::<math>w(n)=1; \qquad -M \le n \le M </math><br />
<br />
::*Bartlett<br />
::<math>w(n)= 1 - \frac{\left | n \right |}{M+1}; \qquad -M \le n \le M </math><br />
<br />
::*Hanning<br />
::<math>w(n) = 0.5 + 0.5 \cos \left( \frac{2\pi n}{2M+1} \right), -M \le n \le M</math><br />
<br />
::*Hamming<br />
::<math>w(n) = 0.54 + 0.46 \cos\left(\frac{2\pi n}{2M+1}\right); \qquad -M \le n \le M</math><br />
<br />
::*Blackman<br />
::<math>w(n) = 0.42 + 0.5 \cos\left(\frac{2\pi n}{2M+1}\right) + 0.08\cos\left(\frac{4\pi n}{2M+1}\right); \qquad -M \le n \le M</math><br />
* em todas as janelas <math>w\left ( n \right ) = 0 </math> quando <math> \left | n \right | \ge M</math><br />
::onde <math>M </math> é <math>N/2</math> para <math>N</math> par e <math>(N+1)/2</math> para <math>N</math> impar<br />
*Filtros Digitais: Filtros FIR<br />
*Projeto de filtro FIR utilizando janelas temporais<br />
*Uso de janelas fixas no Matlab : [http://www.mathworks.com/help/signal/ref/rectwin.html rect], [http://www.mathworks.com/help/signal/ref/triang.html triang], [http://www.mathworks.com/help/signal/ref/bartlett.html bartlett], [http://www.mathworks.com/help/signal/ref/hann.html, hann], [http://www.mathworks.com/help/signal/ref/hamming.html, hamming], [http://www.mathworks.com/help/signal/ref/blackman.html blackman], [http://www.mathworks.com/help/signal/ref/blackmanharris.html blackmanharris], [http://www.mathworks.com/help/signal/ref/nuttallwin.html nuttall].<br />
<syntaxhighlight lang=matlab><br />
L = 64; <br />
wvtool(rectwin(L), triang(L), bartlett(L), hann(L), hamming(L), blackman(L), blackmanharris(L), nuttallwin(L));<br />
</syntaxhighlight><br />
====Tabela 5.1====<br />
{| class="wikitable" border="1" cellpadding="3" cellspacing="0" style="text-align:center; font-size:100%" bgcolor="#efefef"<br />
! scope="col" width=25% align="center"| Janela<br />
! scope="col" width=10% align="center"| <math>A_{sl}</math><br />
! scope="col" width=10% align="center"| <math>A_{s}</math><br />
! scope="col" width=10% align="center"| <math>\Delta \omega</math><br />
{{tabFIRwindow | Retangular | 13.3| 20.33 | 0.92<math>\pi</math>/M }}<br />
{{tabFIRwindow | Triangular | 26.6| 27.41 | }}<br />
{{tabFIRwindow | Bartlett | 26.5| 27.48 | }}<br />
{{tabFIRwindow | Hann | 31.5| 44.03 | 3.11<math>\pi</math>/M}}<br />
{{tabFIRwindow | Bartlett-Hanning | 35.9| 40.77| }}<br />
{{tabFIRwindow | Hamming | 42.5| 54.08 | 3.32<math>\pi</math>/M}}<br />
{{tabFIRwindow | Bohman | 46.0| 51.84 | 7.01<math>\pi</math>/M}}<br />
{{tabFIRwindow | Parzen | 53.1| 56.89 |}}<br />
{{tabFIRwindow | Backman | 58.1| 75.25 | 5.56<math>\pi</math>/M}}<br />
{{tabFIRwindow | Flat Top | 88.0| 106.3| }}<br />
{{tabFIRwindow | Backman-Harris | 92.1| 108.8 |}}<br />
{{tabFIRwindow | Nutfall | 93.8| 109.7|}}<br />
|}<br />
:*Dados acima obtidos para um filtro passa baixas de ordem N = 64 com <math>\omega_{c} = 0.5 \pi</math> <br />
:*Ver pag. 256 a 265 de <ref name="SHENOI2006"/><br />
<br />
;Aula 16 (28 Abr)<br />
:* Adesão a Greve Geral<br />
<br />
;Aula 17 (5 Mai)<br />
*Filtros Digitais: Filtros FIR<br />
*Projeto de filtro FIR utilizando janelas temporais fixas.<br />
<br />
:* Exemplo de projeto<br />
Projetar um filtro passa baixas usando uma janela temporal fixa.<br />
wp = 0.2*pi; Ap = 0.2 dB; Gp = 0 dB<br />
ws = 0.3*pi; As = 60 dB;<br />
:: Use como uma estimativa inicial os valores da Tabela 5.1 pag. 268 <br />
::* PASSO 1 - Escolher o tipo de janela de acordo com a atenuação do lóbulo lateral Asl e As.<br />
::* PASSO 2 - Estimar a ordem N1 do filtro considerando os parâmetros Dw<br />
::* PASSO 3 - Calcule os coeficientes clp do filtro LP , calcule os valores da janela w e obtenha a resposta ao impulso do filtro h = clp * w.<br />
::* PASSO 4 - Verifique o valor real de Dwr = wAs-wAp, e faça a correção da ordem do filtro em função do desvio constatado. N2 = N*Dwr/Dw.<br />
::* PASSO 5 - Corrija o valor de projeto dos coeficientes Clp do filtro ideal, a janela e a resposta ao impulso.<br />
::* Repita o PASSO 3 até 5, até obter um filtro que atenda as especificações de Dw.<br />
::* PASSO 6 - Desloque a frequência de corte wc de modo a obter o valor correto de wp. wc2 = wp + (wp-wAp).<br />
:* Projeto de filtro FIR.<br />
::*Projete os dois filtros projetados anteriormente como IIR, utilizando 3 janelas diferentes. Compare os filtros obtidos com os filtros IIR.<br />
<br />
;Aula 18 (8 Mai)<br />
*Filtros Digitais: Filtros FIR<br />
*Projeto de filtro FIR utilizando janelas temporais<br />
:*Uso de janelas ajustáveis no Matlab: [http://www.mathworks.com/help/signal/ref/kaiser.html kaiser], [http://www.mathworks.com/help/signal/ref/chebwin.html chebyshev], [http://www.mathworks.com/help/signal/ref/gausswin.html gauss], [http://www.mathworks.com/help/signal/ref/tukeywin.html tukey], [http://www.mathworks.com/help/signal/ref/taylorwin.html taylor].<br />
<syntaxhighlight lang=matlab><br />
L = 64; <br />
r = 60; % Chebyshev e Tukey<br />
alpha = 3; % Gauss<br />
betha = 8; % Kaiser<br />
nbar = 10; % Taylor<br />
wvtool(kaiser(L,betha), chebwin(L,r), gausswin(L,alpha),tukeywin(L,r), taylorwin(L,nbar,-r));<br />
</syntaxhighlight><br />
Para a janela de Kaiser, a estimação do fator <math>\beta </math> e da ordem do filtro <math> N </math> são obtidos por:<br />
<br />
<math>\beta = \left \{ \begin{matrix} 0.1102 (\alpha-8.7), & \alpha > 50, \\ 0.5842 (\alpha- 21)^{0.4} + 0.07886 (\alpha- 21) , & 50 \ge \alpha \ge 21, \\ 0, & \alpha < 21. \end{matrix}\right.</math> <br />
<br />
<math> N = \frac {\alpha - 8} {2.285 \Delta \omega} + 1. </math><br />
<br />
:: onde <math> \alpha </math> é a atenuação do lóbulo lateral e <math> \Delta \omega </math> é a largura da banda de transição em rad/amostra.<br />
<br />
Utilizando o Matlab é possível estimar esses valores utilizando a função kaiserord. Exemplo da obtenção de um filtro passa baixa com <math> f_{pass} = 1000 Hz </math>, <math> f_{stop} = 1500 Hz </math>, <math> f_{amostragem} = 8000 Hz </math> atenuação de 40 dB na "stopband"<br />
<br />
<syntaxhighlight lang=matlab><br />
fsamp = 8000;<br />
fcuts = [1000 1500];<br />
mags = [1 0];<br />
devs = [0.01 0.01];<br />
[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,fsamp);<br />
</syntaxhighlight><br />
<br />
Com os parâmetros é possível projetar o filtro usando a função fir1, que utiliza o método da janela para o projeto do filtro.<br />
<br />
<syntaxhighlight lang=matlab><br />
h_fir = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale');<br />
[Hw,w] =freqz(h_fir);<br />
plot(w*fsamp/2/pi,20*log10(abs(Hw)))<br />
title(['Kaiser filter N = ' num2str(n)])<br />
%fvtool(h_fir,1)<br />
</syntaxhighlight><br />
:*Ver as funções [http://www.mathworks.com/help/signal/ref/fir1.html fir1], [http://www.mathworks.com/help/signal/ref/kaiserord.html kaiserord] do Matlab.<br />
:*Ver pag. 266 a 273 de <ref name="SHENOI2006"/><br />
;Aula 19 (12 Mai)<br />
*Filtros Digitais: Filtros FIR<br />
:* Uso das funções [http://www.mathworks.com/help/signal/ref/window.html window] e [http://www.mathworks.com/help/signal/ref/fir1.html fir1] do Matlab para projeto de filtro FIR<br />
%% Exemplo de Filtro <br />
wp1 = 0.1 \pi;<br />
ws1 = 0.2 \pi;<br />
ws2 = 0.6 \pi;<br />
wp2 = 0.8 \pi;<br />
Ap = 1 dB;<br />
Ar = 40 dB;<br />
</syntaxhighlight><br />
<br />
:*Filtro de Parks-McClellan. Funções [http://www.mathworks.com/help/signal/ref/firpm.html firpm] e [http://www.mathworks.com/help/signal/ref/firpmord.html firpmord].<br />
<br />
;Aula 20 (15 Mai):<br />
*Uso do [http://www.mathworks.com/help/signal/examples/introduction-to-the-filter-design-and-analysis-tool-fdatool.html] [http://www.mathworks.com/help/signal/ref/fdatool.html Fdatool] para projeto de filtro IIR, FIR equiripple e FIR com janela.<br />
<syntaxhighlight lang=matlab><br />
%% Exemplo de Filtro <br />
fp = 3000 Hz;<br />
fr = 4000 Hz;<br />
fs = 20000 Hz;<br />
Ap = 1 dB;<br />
Ar = 40 dB;<br />
</syntaxhighlight><br />
<br />
;Aula 21 (19 Mai):<br />
*Atraso de grupo em filtros IIR e FIR no Matlab<br />
:*O '''atraso de grupo''' de um filtro é a medida da atraso médio do filtro em função da frequência do sinal de entrada. Ele é obtido pela primeira derivada da resposta de fase do filtro. Se a resposta em frequencia é <math>H(e^{j \omega}) </math> , então o atraso de grupo é:<br />
::<math>\tau_g(\omega) =\frac {d \theta (\omega)} {d \omega}</math><br />
::onde <math>\tau_g(\omega) </math> é a fase de <math>H(e^{j \omega}) </math>.<br />
:*[http://www.mathworks.com/help/signal/ref/grpdelay.html Função para o cálculo do atraso de grupo (group delay) no Matlab]<br />
:*[http://www.mathworks.com/help/signal/ug/compensate-for-the-delay-introduced-by-a-filter-with-feedback.html Compensação do atraso introduzido pelo filtro IIR].<br />
:*[http://www.mathworks.com/help/signal/ref/filtfilt.html Filtragem digital com fase nula].<br />
:*[http://www.mathworks.com/help/signal/ug/compensate-for-the-delay-introduced-by-a-filter.html Compensação do atraso introduzido pelo filtro FIR].<br />
<br />
:*Um filtro sem distorção de fase (Não causal) pode ser obtido ao passar uma sequencia x(n) por um filtro H1, tomando a saída do filtro revertida e passando novamente pelo mesmo filtro H1. A saída do último filtro revertida corresponde ao sinal x(n) filtro com fase zero. O filtro obtido desta forma tem as seguintes características:<br />
::*A Distorção de fase nula<br />
::*A função de transferência do filtro é igual a magnitude ao quadrada da função de transferência original do filtro H1.<br />
::*A ordem do filtro é o dobro da ordem do filtro H1.<br />
:*Exemplo de aplicação a filtragem de um sinal ECG com ruído [[Arquivo:noisyecg.txt noisyecg.mat]]:<br />
<syntaxhighlight lang=matlab><br />
%% Carregando um sinal de ECG com ruído com duração de 4 segundos.<br />
load noisyecg.mat<br />
x = noisyECG_withTrend;<br />
fa = 500; %% 2000 amostras em 4 segundos => 500 amostras por segundo.<br />
t = [0:length(x)-1]*1/fa;<br />
plot(t,x);<br />
<br />
%% Projetando um filtro passa-baixa tipo IIR butter com f_passagem = 0.15 rad/s<br />
d = designfilt('lowpassiir', ...<br />
'PassbandFrequency',0.15,'StopbandFrequency',0.2, ...<br />
'PassbandRipple',1,'StopbandAttenuation',60, ...<br />
'DesignMethod','butter');<br />
freqz(d)<br />
<br />
%% Filtro de x revertido x e somando com x filtrado. OFF LINE<br />
y = flip(filter(d,flip(filter(d,x))));<br />
y1 = filter(d,x);<br />
<br />
figure(2);<br />
subplot(2,1,1)<br />
plot(t, [y y1])<br />
title('Filtered Waveforms')<br />
legend('Zero-phase Filtering','Conventional Filtering')<br />
<br />
subplot(2,1,2)<br />
plot(t, [x y])<br />
title('Original Waveform')<br />
legend('noisy ecg ','fitered ecg')<br />
</syntaxhighlight><br />
<br />
:*Verifique também o resultado da filtragem usando um filtro IIR (ellip, cheby1 ou cheby2) e filtros FIR (equiripple e de janela)<br />
<br />
<syntaxhighlight lang=matlab><br />
%% Projetando um filtro passa-baixa tipo FIR equiripple com f_passagem = 0.15 rad/s<br />
d = designfilt('lowpassfir', ...<br />
'PassbandFrequency',0.15,'StopbandFrequency',0.2, ...<br />
'PassbandRipple',1,'StopbandAttenuation',60, ...<br />
'DesignMethod','equiripple');<br />
<br />
y = flip(filter(d,flip(filter(d,x))));<br />
</syntaxhighlight><br />
*Note que nos filtros FIR de fase linear o procedimento mais simples é adiantar o sinal de acordo com o atraso de grupo (metade da ordem do filtro), devendo-se tomar cuidado para arredondar a meia amostra nos filtros de ordem impar.<br />
<br />
<syntaxhighlight lang=matlab><br />
y1 = filter(d,x);<br />
gd = grpdelay(d);<br />
gd1 = ceil(gd(1));<br />
y = [y1(gd1:end); zeros(gd1-1, 1)];<br />
</syntaxhighlight><br />
<br />
O cálculo do atraso de grupo pode ser realizado utilizando a função '''grpdelay''' ou diretamente pela definição da derivada do ângulo em relação a frequência:<br />
<br />
::<math>\tau_g(\omega) =\frac {d \theta (\omega)} {d \omega} = \lim_{\Delta_{\omega} \to 0} \frac{\theta(\omega+\Delta_{\omega}) - \theta(\omega)}{\Delta_{\omega}} </math><br />
<br />
<syntaxhighlight lang=matlab><br />
%% Calculo do atraso de grupo usando a função grpdelay<br />
[z,p,k] = butter(30,0.2);<br />
sos = zp2sos(z,p,k);<br />
[gd,w]=grpdelay(sos,128);<br />
figure(1)<br />
plot(w/pi,gd),grid on;<br />
</syntaxhighlight><br />
<br />
* Ler [http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=492552 Gustafsson, F. "Determining the initial states in forward-backward filtering." IEEE® Transactions on Signal Processing. Vol. 44, April 1996, pp. 988–992], artigo que propos um técnica de minimizaçao dos transientes de inicio e fim do sistema linear.<br />
<br />
===Unidade 4===<br />
<br />
;Aula 22 (22 Mai)<br />
<br />
*Realização de Filtros<br />
:* Realização de filtros FIR: Forma Direta.<br />
<center>[[Arquivo:FIR_FD_MathWorks.png |800 px]]</center><br />
<center> Figura 1 - Realização de filtros FIR na Forma Direta </center><br />
<br />
:* Realização de filtros FIR: Forma Transposta. A transposição consiste na inversão do fluxo de todos os sinais, substituição de nós de soma por derivações e as derivações por soma. A entrada e saída também devem ser invertidas. A realização da transposição não altera o sistema implementado.<br />
<br />
<center>[[Arquivo:FIR_FDT_MathWorks.png |800 px]]</center><br />
<center> Figura 2 - Realização de filtros FIR na Forma Transposta</center><br />
<br />
<center>[[Arquivo:FIR_FDT2_MathWorks.png |800 px]]</center><br />
<center> Figura 3 - Realização de filtros FIR na Forma Transposta</center><br />
<br />
:* Realização de filtros FIR de fase linear: simétrico tipo I e II e antissimétrico tipo III e IV.<br />
<br />
<center>[[Arquivo:FIR_Sym2_MathWorks.png |600 px]]</center><br />
<center> Figura 4 - Realização de filtros FIR de fase linear Simétrico I </center><br />
<br />
<center>[[Arquivo:FIR_Sym1_MathWorks.png |600 px]]</center><br />
<center> Figura 5 - Realização de filtros FIR de fase linear Simétrico II </center><br />
<br />
<center>[[Arquivo:FIR_AntiSym3_MathWorks.png |600 px]]</center><br />
<center> Figura 6 - Realização de filtros FIR de fase linear Antisimétrico III</center><br />
<br />
<center>[[Arquivo:FIR_AntiSym4_MathWorks.png |600 px]]</center><br />
<center> Figura 7 - Realização de filtros FIR de fase linear Antisimétrico IV</center><br />
:* Realização de Filtros FIR [http://www.mathworks.com/help/signal/ug/opening-fdatool.html usando o FDATool]<br />
<br />
<br />
<br />
:* Estudar [http://www.mathworks.com/help/simulink/slref/discretefirfilter.html estrutura de filtros disrcetos FIR no Matlab], [http://www.mathworks.com/help/dsp/ref/filterrealizationwizard.html Filter Realization Wizard - Reference], [http://www.mathworks.com/help/dsp/ug/filter-realization-wizard.html Filter Realization Wizard - User Guide].<br />
:*Ver pag. 303 a 312 de <ref name="SHENOI2006"/>.<br />
<br />
====ATUAL====<br />
;Aula 23 (26 Mai)<br />
<br />
:* Realização de Filtros usando o comando [http://www.mathworks.com/help/dsp/ref/realizemdl.html realizemdl] do MatLab <br />
<syntaxhighlight lang=matlab><br />
<br />
Fs = 30000; % Sampling Frequency<br />
Fpass = 12000; % Passband Frequency<br />
Fstop = 13000; % Stopband Frequency<br />
Dpass = 0.01; % Passband Ripple<br />
Dstop = 0.01; % Stopband Attenuation<br />
flag = 'scale'; % Sampling Flag<br />
<br />
% Calculate the order from the parameters using KAISERORD.<br />
[N,Wn,BETA,TYPE] = kaiserord([Fpass Fstop]/(Fs/2), [1 0], [Dstop Dpass]);<br />
<br />
% Calculate the coefficients using the FIR1 function.<br />
b = fir1(N, Wn, TYPE, kaiser(N+1, BETA), flag);<br />
<br />
hFIR = dsp.FIRFilter;<br />
hFIR.Numerator = b;<br />
<br />
% Para definir diretamente os coeficientes<br />
realizemdl(hFIR)<br />
<br />
% Para definir os coeficientes através de uma matriz de entrada<br />
realizemdl(hFIR,'MapCoeffsToPorts','on'); <br />
</syntaxhighlight><br />
<br />
* Realização de filtros FIR: Cascata, Polifase<br />
:*Vantagens do uso de filtro Polifase: <br />
::1) Quando o sinal será subamostrado (downsampling) de "D" amostras após a filtragem, a complexidade da implementação é reduzida de "D" vezes, pois apenas uma das "fases" precisa ser implementada.<br />
::2) Para reduzir o harware a ser implementado, é possível implementar apenas uma das "fases" do filtro e trocar "D" vezes os coeficientes.<br />
::* Ver [http://www.mathworks.com/help/dsp/ref/polyphase.html polyphase], [http://www.mathworks.com/help/dsp/ref/mfilt.firdecim.html mfilt.firdecim], [http://www.mathworks.com/help/dsp/ref/dsp.firdecimator-class.html dsp.FIRDecimator]<br />
:* Realização de filtros IIR de 2ª ordem: Forma Direta I e II, e Forma Transposta I e II.<br />
:<math> H(z) = \frac{Y(z)}{X(z)}, H(z) = \frac{b_0 z^2 + b_1 z^1 + b_2}{z^2 + a_1 z^1 + a_2}, H(z) = \frac{b_0 + b_1 z^{-1} + b_2 z^{-2}}{1 + a_1 z^{-1} + a_2 z^{-2}} </math><br />
::* Separando H(z) em dois blocos <math>\ H(z) = H_1(z) H_2(z) </math>, e obtendo o sinal intermediário W(z) ou Y(z) dependendo da ordem dos blocos. <br />
<center>[[Arquivo:H1_H2_MathWorks.png |600 px]]</center><br />
<center> Figura 7 - Separação do filtro IIR H(z) em H1(z) e H2(z)</center><br />
<br />
: Com o ordenamento dos blocos <math>\ H_1(z) </math> e <math>\ H_2(z) </math> em ordem direta teremos a Forma Direta I:<br />
:<math> H_1(z) = \frac{W(z)}{X(z)} = b_0 + b_1 z^{-1} + b_2 z^{-2} </math><br />
:<math> H_2(z) = \frac{Y(z)}{W(z)} = \frac{1}{1 + a_1 z^{-1} + a_2 z^{-2}} </math> <br />
:Podemos obter a realização de <math>\ H_1(z) </math> na forma direta.<br />
:<math>\ W(z) = (b_0 + b_1 z^{-1} + b_2 z^{-2})X(z) </math><br />
:Para obter a realização de <math>\ H_2(z) </math> , é necessário reescrever a saída <math>\ Y(z) </math> em função de <math>\ W(z) </math> e das saídas anteriores <math>\ Y(z) z^{-1} </math> e <math>\ Y(z) z^{-2} </math>:<br />
:<math>\ Y(z) = \frac{W(z)}{1 + a_1 z^{-1} + a_2 z^{-2}} </math> <br />
:<math>\ Y(z)({1 + a_1 z^{-1} + a_2 z^{-2}}) = W(z) </math><br />
:<math>\ Y(z) = W(z) - a_1 Y(z) z^{-1} - a_2 Y(z) z^{-2} </math><br />
<center>[[Arquivo:IIR_FD1_MathWorks.png |600 px]]</center><br />
<center> Figura 8 - Realização de filtros IIR na Forma Direta I</center><br />
<br />
: Com o ordenamento dos blocos <math>\ H_2(z) </math> e <math>\ H_1(z) </math> em ordem reversa teremos a Forma Direta II:<br />
:<math> H_2(z) = \frac{V(z)}{X(z)} = \frac{1}{1 + a_1 z^{-1} + a_2 z^{-2}} </math> <br />
:<math>\ V(z) = X(z) - a_1 V(z) z^{-1} - a_2 V(z) z^{-2} </math><br />
<br />
:<math> H_1(z) = \frac{Y(z)}{V(z)} = b_0 + b_1 z^{-1} + b_2 z^{-2} </math><br />
:<math>\ Y(z) = (b_0 + b_1 z^{-1} + b_2 z^{-2})V(z) </math><br />
<br />
<center>[[Arquivo:IIR_FD2a_MathWorks.png |600 px]]</center><br />
<center> Figura 9 - Realização de filtros IIR na Forma Direta II</center><br />
<br />
:Considerando que os sinais no centro são idênticos podemos simplificar e obter a Forma Direta II (Canônica):<br />
<center>[[Arquivo:IIR_FD2b_MathWorks.png |600 px]]</center><br />
<center> Figura 10 - Realização de filtros IIR na Forma Direta II Canônica</center><br />
<br />
:Considerando as regras de transposição podemos obter a forma transposta I e II. A transposição consiste na inversão do fluxo de todos os sinais, substituição de nós de soma por derivações e as derivações por soma. A entrada e saída também devem ser invertidas. A realização da transposição não altera o sistema implementado.<br />
<br />
<center>[[Arquivo:IIR_FT1_MathWorks.png |600 px]]</center><br />
<center> Figura 11 - Realização de filtros IIR na Forma Transposta I</center><br />
<br />
<center>[[Arquivo:IIR_FT2_MathWorks.png |600 px]]</center><br />
<center> Figura 12 - Realização de filtros IIR na Forma Transposta II</center><br />
<br />
:* Realização de filtros IIR de ordem maior que 2: Forma Direta I e II, Transposta I e II, Cascata, Paralela<br />
::*Os filtros IIR de ordem superior a 2 podem ser implementados nas FD I ou II e na FT I ou II. No entanto nessa configuração tendem a ficar instáveis ao terem os coeficientes quantizados, e também terem uma significativa alteração da resposta em frequência. Para reduzir esses problemas uma possível solução é a decomposição em filtros de 2ª ordem para serem associados na forma em Cascata ou Paralela. <br />
:* Ver [http://www.mathworks.com/help/dsp/ref/biquadfilter.html Biquad Filter]<br />
:* Ver funções do Matlab: [http://www.mathworks.com/help/matlab/ref/roots.html roots], [http://www.mathworks.com/help/matlab/ref/poly.html poly], [http://www.mathworks.com/help/signal/ref/residuez.html residuez], [http://www.mathworks.com/help/signal/ref/tf2zp.html tf2zp], [http://www.mathworks.com/help/signal/ref/zp2tf.html zp2tf], [http://www.mathworks.com/help/signal/ref/zp2sos.html zp2sos], [http://www.mathworks.com/help/signal/ref/tf2sos.html tf2sos], [http://www.mathworks.com/help/signal/ref/tf2latc.html tf2latc].<br />
:* Implementar o exercício 6.3: Forma direta I, Forma direta II, Cascata.<br />
:* Implementar o exercício 6.13: Forma direta I, Cascata e Paralela.<br />
:*Ver pag. 313 a de 353 <ref name="SHENOI2006"/>.<br />
:*Ver pag. 469 a 474 do Lathi <ref name="Lathi2007"> LATHI, Bhagwandas P. '''Sinais e Sistemas Lineares'''. 2. ed. Porto Alegre: Artmed-Bookman, 2007. 856 p. ISBN 978-8560031139 </ref><br />
*Filtros Digitais: Ferramentas do Matlab para projeto<br />
:*[http://www.mathworks.com/help/signal/ug/practical-introduction-to-digital-filter-design.html Practical Introduction to Digital Filter Design]<br />
:*[http://www.mathworks.com/help/signal/ug/filter-design-gallery.html Filter Design Gallery]<br />
:*Função para projeto de filtros - [http://www.mathworks.com/help/signal/ref/designfilt.html designfilt]<br />
<!--<br />
;Aula 23 ()<br />
*Filtros Digitais: Utilização de filtros FIR<br />
:*Utilizar o [http://audacityteam.org/ Audacity] para gerar sinais de teste. Gere os seguintes sinais e analise seus [http://manual.audacityteam.org/o/man/spectrogram_view.html espectrogramas]:<br />
* Um sinal [https://en.wikipedia.org/wiki/Dual-tone_multi-frequency_signaling DTMF] com duração de 1 segundo com frequência de amostragem de 8 kHz, correspondente aos dígitos 1234567890 ('Dtmf.wav').<br />
* Um sinal contendo ruído branco com duração de 5 segundo com frequência de amostragem de 8 kHz ('RuidoBranco.wav').<br />
* Um sinal onda quadra com duração de 2 segundo com frequência de amostragem de 8 kHz e período de 2 ms ('Quadrada.wav').<br />
Utilize o Matlab para gerar o seguinte sinal:<br />
* Um sinal de varredura de Cosseno entre 0 Hz e 4 kHz com duração de 1 segundo.<br />
<syntaxhighlight lang=matlab><br />
Fs = 8000;<br />
t = 0:1/Fs:1-1/Fs;<br />
x = chirp(t,0,1,4000);<br />
spectrogram(x, blackman(128), 120, 200, Fs,'yaxis')<br />
audiowrite('Chirp0-4kHz.wav',x,Fs)<br />
sound(x,Fs) % Atenção remova o fone de ouvido antes de realizar este procedimento.<br />
</syntaxhighlight> <br />
<br />
Utilizar o Matlab para projetar os seguintes filtros FIR e transmitir os sinais obtidos acima. Em todos os filtros considere a frequência de amostragem como 8 kHz, atenuação máxima na banda de passagem de 0,5 dB, e as bandas de transição como 400 Hz. Use a janela de Kaiser.<br />
* Filtro passa-baixas com fc = 1,5 kHz e atenuação de 60 dB na rejeição;<br />
* Filtro passa-altas com fc = 2,5 kHz e atenuação de 30 dB na rejeição;<br />
* Filtro passa faixa com fc1 = 1,5 kHz e fc2 = 2,5 kHz e atenuação de 80 dB na rejeição;<br />
* Filtro rejeita faixa com fc1 = 1,9 kHz e fc2 = 2,1 kHz e atenuação de 80 dB na rejeição;<br />
<br />
Após obter os filtros, transmita cada um dos sinais gerados no Audacity através do filtro e verifique o resultado obtido analisando os sinal obtidos comparando o espectrograma com a resposta em magnitude do filtro.<br />
<br />
<syntaxhighlight lang=matlab><br />
[x, Fs] = audioread('Chirp0-4kHz.wav'); % Leitura do sinal<br />
t = (0:length(x)-1)/Fs; % Vetor de tempo<br />
b = fir1(48,[2000 2100]/Fs); % Filtro Hamming com ordem 48 passa faixa<br />
<br />
sound(x,Fs) % Atenção remova o fone de ouvido antes de realizar este procedimento.<br />
y = filter(b,1,x);<br />
sound(y,Fs) % Atenção remova o fone de ouvido antes de realizar este procedimento.<br />
subplot(311); spectrogram(x, blackman(128), 100, 200, Fs)<br />
subplot(312); spectrogram(y, blackman(128), 100, 200, Fs)<br />
[Hw, w] = freqz(b,1,2000);<br />
subplot(313); plot(w/pi*Fs/2,20*log10(abs(Hw))); ylim([-100,0]);<br />
<br />
</syntaxhighlight><br />
<br />
:*Ver as funções [http://www.mathworks.com/help/matlab/ref/audioread.html audioread], [http://www.mathworks.com/help/matlab/ref/audiowrite.html audiowrite], [http://www.mathworks.com/help/signal/ref/chirp.html chirp], [http://www.mathworks.com/help/signal/ref/spectrogram.html spectrogram], [http://www.mathworks.com/help/matlab/ref/filter.html filter] do Matlab.<br />
;Aula 24 e 25(31 Out e 3 Nov):<br />
* Projeto de um receptor DTMF.<br />
:* cada aluno deverá projetar dois discriminadores de frequências correspondente a duas linhas e duas colunas do sistema DTMF.<br />
:* As especificações do discriminador de frequência, mostrado na figura, são:<br />
<center> [[Arquivo:DiscriminadorDTMF.png]]</center><br />
::* A frequência de amostragem ''f_s'' do sinal de entrada é de 8 kHz.<br />
::* Os filtros passa banda (BP) deverão ter, inicialmente, uma largura de banda ''BW' correspondente a 10% da frequência central ''f_0''.<br />
::* Os filtros passa baixa (LP) deverão ter, inicialmente, uma freqüência de passagem ''f_p'' de 100 Hz.<br />
::* O circuito retificador deve se implementado pela função '''abs'''.<br />
::* Neste projeto o sinal de entrada terá uma frequência de amostragem do sinal de de 44.100 Hz. Recomenda-se que antes de realizar todas as filtragens indicadas no diagrama, se faça uma filtragem passa-baixa com um filtro de 2 polos do tipo Butterworth ou Chebychev 1, com fc = 0.5*44.100/11 ~ 2kHz, seguido de uma subamostragem para a nova frequência de ~ 4kHz.<br />
<br />
Ver as especificações DTMF em: <br />
* [http://www.etsi.org/deliver/etsi_es/201200_201299/20123501/01.01.01_50/es_20123501v010101m.pdf ETSI ES 201 235-1 - Specification of Dual Tone Multi-Frequency (DTMF) Transmitters and Receivers; Part 1: General]<br />
* [http://www.etsi.org/deliver/etsi_es/201200_201299/20123502/01.01.01_60/es_20123502v010101p.pdf ETSI ES 201 235-2 - Specification of Dual Tone Multi-Frequency (DTMF) Transmitters and Receivers; Part 2: Transmitters]<br />
* [http://www.etsi.org/deliver/etsi_es/201200_201299/20123503/01.01.01_50/es_20123503v010101m.pdf ETSI ES 201 235-3 - Specification of Dual Tone Multi-Frequency (DTMF) Transmitters and Receivers; Part 3: Receivers]<br />
* [http://www.etsi.org/deliver/etsi_es/201200_201299/20123504/01.01.01_50/es_20123504v010101m.pdf ETSI ES 201 235-4 - Specification of Dual Tone Multi-Frequency (DTMF) Transmitters and Receivers; Part 4: Receivers for use in Terminal Equipment for end-to-end signalling]<br />
<br />
;Aula 26 ():<br />
*Atraso de grupo em filtros IIR e FIR no Matlab}}<br />
:*O '''atraso de grupo''' de um filtro é a medida da atraso médio do filtro em função da frequência do sinal de entrada. Ele é obtido pela primeira derivada da resposta de fase do filtro. Se a resposta em frequencia é <math>H(e^{j \omega}) </math> , então o atraso de grupo é:<br />
::<math>\tau_g(\omega) =\frac {d \theta (\omega)} {d \omega}</math><br />
::onde <math>\tau_g(\omega) </math> é a fase de <math>H(e^{j \omega}) </math>.<br />
:*[http://www.mathworks.com/help/signal/ref/grpdelay.html Função para o cálculo do atraso de grupo (group delay) no Matlab]<br />
:*[http://www.mathworks.com/help/signal/ug/compensate-for-the-delay-introduced-by-a-filter-with-feedback.html Compensação do atraso introduzido pelo filtro IIR].<br />
:*[http://www.mathworks.com/help/signal/ref/filtfilt.html Filtragem digital com fase nula].<br />
:*[http://www.mathworks.com/help/signal/ug/compensate-for-the-delay-introduced-by-a-filter.html Compensação do atraso introduzido pelo filtro FIR].<br />
<br />
:*Um filtro sem distorção de fase (Não causal) pode ser obtido ao passar uma sequencia x(n) por um filtro H1, tomando a saída do filtro revertida e passando novamente pelo mesmo filtro H1. A saída do último filtro revertida corresponde ao sinal x(n) filtro com fase zero. O filtro obtido desta forma tem as seguintes características:<br />
::*A Distorção de fase nula<br />
::*A função de transferência do filtro é igual a magnitude ao quadrada da função de transferência original do filtro H1.<br />
::*A ordem do filtro é o dobro da ordem do filtro H1.<br />
:*Exemplo de aplicação a filtragem de um sinal ECG com ruído [[Arquivo:noisyecg.txt noisyecg.mat]]:<br />
<syntaxhighlight lang=matlab><br />
%% Carregando um sinal de ECG com ruído com duração de 4 segundos.<br />
load noisyecg.mat<br />
x = noisyECG_withTrend;<br />
fa = 500; %% 2000 amostras em 4 segundos => 500 amostras por segundo.<br />
t = [0:length(x)-1]*1/fa;<br />
plot(t,x);<br />
<br />
%% Projetando um filtro passa-baixa tipo IIR butter com f_passagem = 0.15 rad/s<br />
d = designfilt('lowpassiir', ...<br />
'PassbandFrequency',0.15,'StopbandFrequency',0.2, ...<br />
'PassbandRipple',1,'StopbandAttenuation',60, ...<br />
'DesignMethod','butter');<br />
freqz(d)<br />
<br />
%% Filtro de x revertido x e somando com x filtrado. OFF LINE<br />
y = flip(filter(d,flip(filter(d,x))));<br />
y1 = filter(d,x);<br />
<br />
figure(2);<br />
subplot(2,1,1)<br />
plot(t, [y y1])<br />
title('Filtered Waveforms')<br />
legend('Zero-phase Filtering','Conventional Filtering')<br />
<br />
subplot(2,1,2)<br />
plot(t, [x y])<br />
title('Original Waveform')<br />
legend('noisy ecg ','fitered ecg')<br />
</syntaxhighlight><br />
<br />
:*Verifique também o resultado da filtragem usando um filtro IIR (ellip, cheby1 ou cheby2) e filtros FIR (equiripple e de janela)<br />
<br />
<syntaxhighlight lang=matlab><br />
%% Projetando um filtro passa-baixa tipo FIR equiripple com f_passagem = 0.15 rad/s<br />
d = designfilt('lowpassfir', ...<br />
'PassbandFrequency',0.15,'StopbandFrequency',0.2, ...<br />
'PassbandRipple',1,'StopbandAttenuation',60, ...<br />
'DesignMethod','equiripple');<br />
<br />
y = flip(filter(d,flip(filter(d,x))));<br />
</syntaxhighlight><br />
*Note que nos filtros FIR de fase linear o procedimento mais simples é adiantar o sinal de acordo com o atraso de grupo (metade da ordem do filtro), devendo-se tomar cuidado para arredondar a meia amostra nos filtros de ordem impar.<br />
<br />
<syntaxhighlight lang=matlab><br />
y1 = filter(d,x);<br />
gd = grpdelay(d);<br />
gd1 = ceil(gd(1));<br />
y = [y1(gd1:end); zeros(gd1-1, 1)];<br />
</syntaxhighlight><br />
<br />
O cálculo do atraso de grupo pode ser realizado utilizando a função '''grpdelay''' ou diretamente pela definição da derivada do ângulo em relação a frequência:<br />
<br />
::<math>\tau_g(\omega) =\frac {d \theta (\omega)} {d \omega} = \lim_{\Delta_{\omega} \to 0} \frac{\theta(\omega+\Delta_{\omega}) - \theta(\omega)}{\Delta_{\omega}} </math><br />
<br />
<syntaxhighlight lang=matlab><br />
%% Calculo do atraso de grupo <br />
% Método 1 - uso da função grpdelay<br />
[z,p,k] = butter(30,0.2);<br />
sos = zp2sos(z,p,k);<br />
[gd,w]=grpdelay(sos,128);<br />
figure(1)<br />
plot(w/pi,gd),grid on;<br />
% Método 2 - derivada obtida por aproximação discreta<br />
% calculo a cada par de pontos (w2-w1)/delta_w<br />
[h,w] = freqz(sos);<br />
a = unwrap(angle(h));<br />
hold on; plot(w/pi,a,'g');<br />
delta_w = pi/length(a);<br />
plot(w(1:end-1)/pi+delta_w/2,-(a(2:end)-a(1:end-1))/delta_w,'r');<br />
</syntaxhighlight><br />
<br />
* Ler [http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=492552 Gustafsson, F. "Determining the initial states in forward-backward filtering." IEEE® Transactions on Signal Processing. Vol. 44, April 1996, pp. 988–992], artigo que propos um técnica de minimizaçao dos transientes de inicio e fim do sistema linear.<br />
<br />
<!--<br />
;Aula 24 (9 Jun):<br />
*Projeto de filtros Passa-Tudo para equalizar a fase (atraso de grupo) de filtros IIR.<br />
:* Projetar filtros Passa-tudo que equalizam a fase na faixa de passagem do filtro<br />
:* Ver funções [http://www.mathworks.com/help/signal/ref/isallpass.html isallpass], [http://www.mathworks.com/help/dsp/ref/iirgrpdelay.html iirgrpdelay], [http://www.mathworks.com/help/matlab/ref/conv.html conv].<br />
:* Estudar os quatro exemplos de [http://jp.mathworks.com/help/releases/R13sp2/pdf_doc/filterdesign/filterdesign.pdf] pag.2-56 a 2-63.<br />
:* Obter o filtro cascata através da multiplicação dos polinômios do numerador e denominador.<br />
:* Ler: Lang, M.; Laakso, T.I., [http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=275662 "Simple and robust method for the design of allpass filters using least-squares phase error criterion,"] Circuits and Systems II: Analog and Digital Signal Processing, IEEE Transactions on , vol.41, no.1, pp.40,48, Jan 1994 <br />
*Filtros de fase mínima.<br />
:*Ver [http://www.mathworks.com/help/signal/ref/isminphase.html fase mínima],<br />
<br />
;Aula 25 (14 Jun):<br />
*Ponto Fixo e Ponto Flutuante<br />
:*[https://www.mathworks.com/help/fixedpoint/ug/floating-point-numbers.html Floating-Point Numbers]<br />
:*[https://www.mathworks.com/help/fixedpoint/fixed-point-basics-2.html Fixed-Point Basics]<br />
:*[https://www.mathworks.com/help/fixedpoint/ug/precision-and-range.html Precision and Range]<br />
*Aritmética Binária<br />
:*[https://www.mathworks.com/help/fixedpoint/ug/arithmetic-operations.html Arithmetic operations]<br />
::*Modulo Arithmetic<br />
::*Casting<br />
*Fixed-point in MATLAB<br />
::*[https://www.mathworks.com/help/fixedpoint/ref/fi.html fi]<br />
::*[https://www.mathworks.com/help/fixedpoint/ref/bin.html bin], [https://www.mathworks.com/help/fixedpoint/ref/oct.html oct], [https://www.mathworks.com/help/fixedpoint/ref/hex.html hex]<br />
::*[https://www.mathworks.com/help/fixedpoint/ref/dec.html dec]<br />
*Quantização do Filtro Digital<br />
:*[https://www.mathworks.com/help/signal/ref/design.html design]<br />
:*[https://www.mathworks.com/help/dsp/ug/fixed-point-filter-design-1.html Fixed-Point Filter Design]<br />
<syntaxhighlight lang=matlab><br />
filtSpecs = fdesign.lowpass('Fp,Fst,Ap,Ast',0.2,0.25,0.5,40);<br />
%% Design IIR butterworth filter<br />
Hiir = design(filtSpecs,'butter','MatchExactly','passband');<br />
Hiir<br />
Hiir.Arithmetic = 'fixed';<br />
Hiir<br />
%get(Hiir)<br />
%% Design FIR equiripple filter<br />
Hfir = design(filtSpecs,'equiripple')<br />
Hfir<br />
Hfir.Arithmetic = 'fixed';<br />
Hfir<br />
</syntaxhighlight><br />
:*[https://www.mathworks.com/help/signal/ref/dfilt.html dfilt], [https://www.mathworks.com/help/signal/ref/dfilt.cascade.html cascade], [https://www.mathworks.com/help/signal/ref/dfilt.parallel.html parallel]<br />
:*[https://www.mathworks.com/help/dsp/ref/fixed-point-filter-properties.html Fixed-Point Filter Properties]<br />
:*[https://www.mathworks.com/help/dsp/ug/use-fdatool-with-dsp-system-toolbox-software.html Access the Quantization Features of FDATool].<br />
<br />
Ver mais em:<br />
:*[https://www.mathworks.com/help/fixedpoint/fixed-point-basics.html Fixed-Point Basics in MATLAB]<br />
:*[https://www.mathworks.com/help/fixedpoint/ref/_bp7g699.html Glossary]<br />
--><br />
<br />
==Avaliações==<br />
* Entrega dos diversos trabalhos ao longo do semestre.<br />
* Projeto Final. O projeto é avaliado nos quesitos: 1) Implementação do Sistema, 2) Documentação, 3) Avaliação Global do aluno no projeto.<br />
<br />
===Atividades extra===<br />
Neste tópico serão listadas as atividades extras que os alunos da disciplina deverão realizar ao longo do curso. <br />
<br />
{{collapse top | AE1 - Revisão de Sinais e Sistemas (prazo 03/Mar/2017 as 23h59)}}<br />
:* No Experimento 1.2 <br />
# Varie o valor da frequência de amostragem de 6 até 20 Hz e observe:<br />
# Em qual frequência deixa de ocorrer recobrimento do sinal 2.<br />
# O que ocorre quando a frequência é 6, 7, 14 Hz? Explique<br />
# Qual deveria ser a frequência do sinal f_2 para que as amostras tomadas sejam coincidentes como o sinal f_1 para uma frequência de amostragem f_s? Reescreva a equação e verifique no Matlab. <br />
<br />
:* No Experimento 2.2 <br />
#Verifique a diferença entre os tipos de plots comentados no código.<br />
#substitua o denominador de H(z) por dois polos em [-0.8 -0.8].<br />
#verifique o que ocorre se forem utilizados polos complexos conjugados [0.3-0.4i 0.3+0.4i 0.1]<br />
#verifique o que ocorre se forem utilizados polos complexos não conjugados [0.3-0.4i 0.3+0.8i]<br />
#verifique o que ocorre se os polos estiverem fora do circulo unitário [1.2 -0.2]. Interprete este resultado <br />
<br />
:* No Experimento 3.1 <br />
# Utilizando Nh = 10 e Nx = 20, execute a filtragem pelo menos 3 vezes em seguida e anote os tempos.<br />
# Anote o tamanho dos sinais de saída y, e analise os plots.<br />
# Aumente o tamanho do filtro (Nh) e o tamanho do sinal de entrada (Nx) e execute a filtragem pelo menos 3 vezes em seguida e anote os tempos.<br />
# Anote o tamanho dos sinais de saída y.<br />
# Explique os resultados obtidos. <br />
<br />
:* No Experimento 3.2<br />
# Acrescente um subplot para mostrar o sinal no domínio da frequência com a magnitude em dB 20*log10(abs(X)). <br />
# Limite a escala da magnitude entre -100 e 1 dB usando ylim.<br />
# Insira em todos os plots e subplot, títulos, legendas e labels para os eixos X e Y, <br />
# Posicione o texto "F Hz" para indicar o pico nos gráficos 2 e 3, conforme mostrado na figura abaixo.<br />
<center>[[Arquivo:DTxDF_sinal_noise.png]] <br><br />
Figura 1 - Análise no domínio da frequência do sinal <math> x(t) = A sin (2 \pi f t) </math><br />
</center><br />
# Varie o valor de k entre 0 e 2 (com passo de 0.1) e analise o sinal no domínio do tempo e no domínio da frequência.<br />
# Varie o valor de snr entre 100 e 1 e analise o sinal no domínio do tempo e no domínio da frequência.<br />
# Utilize k = 0.3 e snr = 40 e varia a frequência do sinal entre 0 até 200 Hz (com passo de 10 Hz). Interprete os resultados obtidos.<br />
<br />
:* Utilizando o espectro de frequência (Exp3.2) repita as medições feitas com o processo de amostragem (Exp1.2)<br />
# Qual conclusão que você chega em relação a amostragem de sinais utilizando para a frequência de amostragem valores acima e abaixo do dobro da frequencia de Nyquist. <br />
# Para analisar o espectro talvez seja conveniente mudar a amplitude dos sinais de entrada.<br />
<br />
:* Faça um relatório (em pdf) incluindo as principais figuras obtidas e as respostas e conclusões para o email "moecke at ifsc.edu.br" com o Assunto: '''PSD29007 - AE1 - Revisão de Sinais e Sistemas'''.<br />
{{collapse bottom}}<br />
{{collapse top | AE2 - Projeto de Filtros Digitais IIR (Entrega e prazos ver Moodle)}}<br />
Esta avaliação visa verificar se você conhece a metodologia de projeto de filtros digitais IIR: (a) projeto de um filtro protótipo analógico passa-baixas H(p); (b) transformação em frequência do filtro H(p) -> H(s), obtendo o filtro LP, HP, BP, BS, conforme o tipo de filtro desejado; (c) transformação do filtro analógico em filtro digital H(s) -> H(z) utilizando a transformação "Bilinear" ou pela transformação "Invariante ao Impulso". Nesta avaliação é solicitado que cada equipe realize o projeto de dois filtros.<br />
<br />
{| class="wikitable" border="1" cellpadding="3" cellspacing="0" style="text-align:left; font-size:100%" bgcolor="#efefef"<br />
! scope="col" width=10% align="left"| Equipe<br />
! scope="col" width=45% align="center"| Filtro 1<br />
! scope="col" width=45% align="center"| Filtro 2<br />
|-<br />
| Equipe 1 <br />
| LP - (f1 = 30 kHz; f2 = 50 kHz, fa = 200 kHz, Gp = 10 dB, Ap = 1 dB, As = 50 dB)<br />
| BS - (f1 = 30 kHz; f2 = 32 kHz, f3 = 33 kHz; f4 = 35 kHz, fa = 100 kHz) <br />
|-<br />
| Equipe 2<br />
| HP - (f1 = 30 kHz; f2 = 50 kHz, fa = 300 kHz, Gp = 2 dB, Ap = 0.2 dB, As = 40 dB)<br />
| BP - (f1 = 30 kHz; f2 = 32 kHz, f3 = 33 kHz; f4 = 35 kHz, fa = 200 kHz) <br />
|-<br />
| Equipe 3 <br />
| HP - (f1 = 10 kHz; f2 = 14 kHz, fa = 50 kHz, Gp = -10 dB, Ap = 1 dB, As = 45 dB)<br />
| BS - (f1 = 10 kHz; f2 = 20 kHz, f3 = 30 kHz; f4 = 50 kHz, fa = 200 kHz) <br />
|-<br />
| Equipe 4 <br />
| LP - (f1 = 10 kHz; f2 = 14 kHz, fa = 44 kHz, Gp = 5 dB, Ap = 2 dB, As = 60 dB)<br />
| BP - (f1 = 30 kHz; f2 = 100 kHz, f3 = 200 kHz; f4 = 220 kHz, fa = 500 kHz) <br />
|-<br />
| Equipe 5 <br />
| HP - (f1 = 50 MHz; f2 = 120 MHz, fa = 500 MHz, Gp = 12 dB, Ap = 0.1 dB, As = 80 dB)<br />
| BS - (f1 = 50 kHz; f2 = 100 kHz, f3 = 180 kHz; f4 = 220 kHz, fa = 500 kHz) <br />
|-<br />
| Equipe 6 <br />
| LP - (f1 = 120 kHz; f2 = 200 kHz, fa = 500 kHz, Gp = -5 dB, Ap = 0.3 dB, As = 50 dB)<br />
| BS - (f1 = 60 kHz; f2 = 100 kHz, f3 = 150 kHz; f4 = 220 kHz, fa = 1 MHz)<br />
|-<br />
| Equipe 7 <br />
| HP - (f1 = 120 kHz; f2 = 160 kHz, fa = 400 kHz, Gp = 1 dB, Ap = 0.5 dB, As = 60 dB)<br />
| BP - (f1 = 6 kHz; f2 = 8.2 kHz, f3 = 14 kHz; f4 = 20 kHz, fa = 200 kHz<br />
|}<br />
<br />
:onde: <br />
:: LP (''Low Pass'')- Passa Baixa, HP (''High Pass'')- Passa Altas, BP (''Band Pass'')- Passa Faixa, BS (''Band Stop'')- Rejeita Faixa<br />
:: <math> f_N </math> - são as "N" frequência de especificação do filtro dadas em Hertz (kHz ou MHz); f_a é a frequência de amostragem dos sinais e do sistema.<br />
:: <math> f_p </math> - frequência de passagem; <math> f_r </math> - frequência de rejeição, <math> A_p </math> - Atenuação máxima na banda de passagem (dB), <math> A_r </math> - Atenuação mínima na banda de rejeição (dB), <math> G_p </math> - Ganho médio na banda de passagem (dB).<br />
:: No 1º filtro os valores das frequência de passagem e rejeição são: para LP <math> f_p = f_1 </math>, <math> f_r = f_2 </math>, para HP <math> f_r = f_1 </math>, <math> f_p = f_2 </math>. Os valores de ganhos e atenuações estão indicados na tabela. <br />
:: No 2º filtro os valores das frequência de passagem e rejeição são: para BP <math> f_{p1} = f_2 </math> e <math> f_{p2} = f_3 </math>, <math> f_{r1} = f_1 </math> e <math> f_{r2} = f_4 </math>, para BS <math> f_{p1} = f_1 </math> e <math> f_{p2} = f_4 </math>, <math> f_{r1} = f_2 </math> e <math> f_{r2} = f_3 </math>. No segundo filtro os valores de ganhos e atenuações são de Gp = 0 dB, Ap = 1 dB, As = 40 dB.<br />
:*Um dos filtros deve ser realizado utilizando a aproximação de Butterworth ou Chebyshev tipo 1 (devendo ser todos os calculados efetuados a partir das equações), enquanto o outro filtro deve ser feito utilizando a aproximação de Chebyshev tipo 2 ou Euler (podendo ser calculada a função H(p) a partir das funções do Matlab.<br />
:* Para ambos filtros deve indicada a ordem do filtro, o valor de polos e zeros, e as equações de H(p), H(s), H(z).<br />
:* Deve ser apresentado de forma gráfica a resposta em frequência dos filtros (ganho em dB e fase) dos filtros (a) protótipo H(p), (b) Filtro analógico H(s) e Filtro digital H(z). Para mostrar que os filtros atendem a especificação. <br />
:* No caso do filtro H(z) também deve ser mostrado o atraso de grupo (ver função [https://www.mathworks.com/help/signal/ref/grpdelay.html grpdelay] do Matlab)<br />
:* Apresente o diagrama dos pólos e zeros dos filtros H(p), H(s) e H(z)<br />
:* Utilize a mesma escala em dB para os 3 gráficos de cada filtro. Nas abcissas utilize uma escala em Hz (kHz ou MHz). Utilize uma mascara com cor diferenciada para indicar claramente a especificação do filtro, e crie um segundo gráfico mostrando claramente a banda de passagem conforme ilustrado nas figuras abaixo:<br />
[[Arquivo:KaiserFIR.png| 600 px | Resposta em frequência - Ganho em dB ]] [[Arquivo:KaiserFIRZoom.png |600 px | Detalhe da banda de passagem da resposta em frequência - Ganho em dB]]<br />
<br />
:* Escreva um relatório técnico em PDF mostrando os resultados obtidos e comentando os resultados obtidos. Não é necessário apresentar a teoria utilizado para o projeto, mas todos os cálculos e metodologia utilizada devem estar documentados.<br />
::* O "Publish" pode ser utilizado, mas o arquivo entregue deve ser PDF.<br />
:* Envie o relatório em pdf e os arquivos ".m" utilizados na plataforma [http://moodlenovo.sj.ifsc.edu.br/mod/assign/view.php?id=2431 Moodle].<br />
{{collapse bottom}}<br />
<br />
{{collapse top | expand = true | AE3 - Projeto de Filtros Digitais FIR (Entrega e prazos ver Moodle)}}<br />
Esta avaliação visa verificar se você conhece a metodologia de projeto de filtros digitais FIR: (a) Projeto de filtros com Janela Fixas e Ajustáveis; (b) Projeto de filtros com o algoritmo de Parks-McCleallan; Nesta avaliação é solicitado que cada equipe realize os mesmo dois projeto de filtros da atividade AE2. <br />
:*O primeiro filtro deve ser realizado utilizando uma janela fixa calculando os valores dos coeficientes da série de Fourier, os valores do vetor da janela podem ser obtidos usando as funções do Matlab. O filtro também deve ser projetado usando uma das janelas ajustáveis.<br />
:*O segundo filtro deve ser realizado utilizando uma janela fixa e uma ajustável, podendo ser utilizado diretamente funções do Matlab que projetem o filtro. Neste filtro também deve ser feito o projeto usando o algoritmo de Parks-McCleallan.<br />
:* Para ambos filtros deve indicada a ordem do filtro, o valor de polos e zeros. Procure obter em cada caso a menor ordem que possibilite ter uma resposta de frequência que atende a sua especificação.<br />
:* Deve ser apresentado de forma gráfica a resposta em frequência dos filtros (ganho em dB e fase e atraso de grupo) dos Filtro digital H(z). <br />
:* Apresente o diagrama dos pólos e zeros do filtro H(z)<br />
:* Utilize a mesma escala em dB para os 2 (ou 3 filtros). Nas abcissas utilize uma escala em Hz (kHz ou MHz). Utilize uma mascara com cor diferenciada para indicar claramente a especificação do filtro, e crie um segundo gráfico mostrando claramente a banda de passagem conforme ilustrado nas figuras da atividade AE2.<br />
:* Escreva um relatório técnico em PDF mostrando os resultados obtidos e comentando os resultados obtidos. Não é necessário apresentar a teoria utilizado para o projeto, mas todos os cálculos e metodologia utilizada devem estar documentados.<br />
::* O "Publish" pode ser utilizado, mas o arquivo entregue deve ser PDF.<br />
:* Envie o relatório em pdf e os arquivos ".m" utilizados na plataforma [http://moodlenovo.sj.ifsc.edu.br/mod/assign/view.php?id=2757].<br />
{{collapse bottom}}<br />
<br />
==Referências Bibliográficas==<br />
<references/><br />
<br />
{{ENGTELECO}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Matuzalem_Muller&diff=96335Matuzalem Muller2015-11-09T05:34:06Z<p>Matuzalem.m: </p>
<hr />
<div>Ingressou na Instituição de Ensino em 2009, inicialmente no ensino médio. Após a conclusão do mesmo, ingressou na [http://wiki.sj.ifsc.edu.br/index.php/Curso_de_Engenharia_de_Telecomunica%C3%A7%C3%B5es Engenharia de Telecomunicações]. Atualmente participa do programa de intercâmbio [http://www.cienciasemfronteiras.gov.br/web/csf Ciência sem Fronteiras] na [http://www.ucsb.edu/ Universidade de Santa Barbara].<br />
<br />
;Informações:<br />
<br />
Currículo Lattes: [http://buscatextual.cnpq.br/buscatextual/visualizacv.do?metodo=apresentar&id=K8158513U5 Matuzalém Muller dos Santos]<br />
<br />
LinkedIn: [https://www.linkedin.com/in/matuzalemmuller/pt Perfil]<br />
<br />
Email: matuzalemifsc'''[at]'''gmail.com<br />
<br />
== Projetos Participantes ==<br />
{{collapse top|Bolsas de Extensão}}<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Programa%C3%A7%C3%A3o_visual_%2B_game_design_e_seus_recursos_pedag%C3%B3gicos Programação visual + game design e seus recursos pedagógicos]<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_2 Mulheres na Engenharia - Pagina do Bolsista]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_1_2015/1 Oficina 1]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 Oficina 2]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_3_2015/1 Oficina 3]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_4_2015/1 Oficina 4]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_5_2015/1 Oficina 5]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_6_2015/1 Oficina 6]<br />
{{collapse bottom|Bolsa de Extensão}}<br />
<br />
==Trabalhos do Curso==<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Alarme_MIC29004-2014-1 Projeto Final de Microprocessadores: Simulador de Alarme de Loja]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projetos_Finais_CIL29003#EQUIPE_3_-_Veloc.C3.ADmetro_e_Acelerador_Digital Projeto Final de Circuitos Lógicos: Velocímetro e Acelerador Digital]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/index.php/RED29004-2014-1-Seminario1-VPN Seminário de Redes de Computadores I - VPN]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Seguran%C3%A7a_em_Redes_de_Computadores_-_RED29005 Seminário de Redes de Computadores II - Segurança em Rede de Computadores]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto Projeto Integrador II - Sistema de Automatização de Sala de Aula]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Matuzalem_Muller&diff=90838Matuzalem Muller2015-06-24T02:13:36Z<p>Matuzalem.m: </p>
<hr />
<div>Ingressou na Instituição de Ensino em 2009, inicialmente no ensino médio. Após a conclusão do mesmo, ingressou na [http://wiki.sj.ifsc.edu.br/index.php/Curso_de_Engenharia_de_Telecomunica%C3%A7%C3%B5es Engenharia de Telecomunicações]. Atualmente participa do programa de intercâmbio [http://www.cienciasemfronteiras.gov.br/web/csf Ciência sem Fronteiras] na [http://www.ucsb.edu/ Universidade de Santa Barbara].<br />
<br />
;Informações:<br />
<br />
Currículo Lattes: [http://buscatextual.cnpq.br/buscatextual/visualizacv.do?metodo=apresentar&id=K8158513U5 Matuzalém Muller dos Santos]<br />
<br />
Email: matuzalemifsc'''[at]'''gmail.com<br />
<br />
== Projetos Participantes ==<br />
{{collapse top|Bolsas de Extensão}}<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Programa%C3%A7%C3%A3o_visual_%2B_game_design_e_seus_recursos_pedag%C3%B3gicos Programação visual + game design e seus recursos pedagógicos]<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_2 Mulheres na Engenharia - Pagina do Bolsista]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_1_2015/1 Oficina 1]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 Oficina 2]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_3_2015/1 Oficina 3]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_4_2015/1 Oficina 4]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_5_2015/1 Oficina 5]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_6_2015/1 Oficina 6]<br />
{{collapse bottom|Bolsa de Extensão}}<br />
<br />
==Trabalhos do Curso==<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Alarme_MIC29004-2014-1 Projeto Final de Microprocessadores: Simulador de Alarme de Loja]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projetos_Finais_CIL29003#EQUIPE_3_-_Veloc.C3.ADmetro_e_Acelerador_Digital Projeto Final de Circuitos Lógicos: Velocímetro e Acelerador Digital]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/index.php/RED29004-2014-1-Seminario1-VPN Seminário de Redes de Computadores I - VPN]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Seguran%C3%A7a_em_Redes_de_Computadores_-_RED29005 Seminário de Redes de Computadores II - Segurança em Rede de Computadores]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto Projeto Integrador II - Sistema de Automatização de Sala de Aula]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=90404PJI29006-2015-1-Wiki do Projeto2015-06-14T22:21:15Z<p>Matuzalem.m: /* API Web-Service a ser implementado na Raspberry Pi B+ */</p>
<hr />
<div>__NOTOC__<br />
=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
===Casos de Uso===<br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
====Estudo da Raspberry Pi B+====<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"nome":"arquivo1.pdf","numeroPaginas":2},{"nome":"arquivo2.opt","numeroPaginas":33}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|-<br />
|@GET || <font color=darkred>/projetar/ligarProjetor</font> || <center> - </center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Liga o projetor<br />
|-<br />
|@GET || <font color=darkred>/projetar/desligarProjetor</font> || <center> - </center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Desliga o projetor<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
Visualizador de [http://pt.wikipedia.org/wiki/Portable_document_format PDF's].<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
Linguagem de programação utilizada na implementação do web service.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
Gerenciador de extensões python.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
Pacote python para desenvolvedores.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
Framework utilizado na implementação de web services.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
Para autenticação via HTTP.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
Fornece informações sobre as interfaces de conexão.<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
==== 8. Extensão [https://pypi.python.org/pypi/Flask-Cors/1.10.3 Cors] do Flask ====<br />
Devido a '''[https://pt.wikipedia.org/wiki/Pol%C3%ADtica_de_mesma_origem política de mesma origem] (same origin policy)''', configurada como padrão nos servidores, qualquer requisição feita de diferentes domínios é bloqueada pelos navegadores, isto impede que ataques de [https://pt.wikipedia.org/wiki/Cross-site_scripting Cross-domain] sejam feitos. A habilitação da extensão '''[https://pt.wikipedia.org/wiki/Cross-origin_resource_sharing CORS] (cross-origin resource sharing)''' cria um caminho para que estas requisições sejam feitas de uma maneira mais segura, sem que todas as requisições deste tipo sejam habilitadas. Para habilitar os CORS é necessário primeiramente instalar a biblioteca para o suporte do CORS no servidor.<br />
<br />
<code> $ pip install -U flask-cors </syntaxhighlight><br />
<br />
Depois é necessário apenas a importação da biblioteca e inserir o código para habilitar o CORS nos recursos do servidor.<br />
<br />
<syntaxhighlight lang=python><br />
from flask.ext.cors import CORS<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
</syntaxhighlight><br />
<br />
====9. Instalação do cec-utils, que utiliza a biblioteca [https://github.com/Pulse-Eight/libcec libcec] ====<br />
Para envio de comandos para dispositivos conectados via [http://www.infowester.com/hdmi.php HDMI]<br />
<br />
<syntaxhighlight lang=bash> sudo apt-get install cec-utils </syntaxhighlight><br />
<br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Junho de 2015"<br />
__date__ = "$11/06/2015 01:09:22$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, caso insira manualmente o ip do servidor e descartavel, desde que comente as linhas de codigo equivalentes<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
from flask.ext.cors import CORS # habilita troca de informacoes cross domain<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
<br />
# Este servidor foi desenvolvido considerando a estrutura /root/User para o armazenamento de pdfs na raspberry<br />
#####################[DEVE SER PREENCHIDO]############################<br />
usuario = 'User' # usuario conectado a raspberry<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
######################################################################<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/ e o numero de paginas de cada arquivo<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['numeroPaginas'] = subprocess.check_output("/usr/bin/pdfinfo "+path+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)[:-1] # [:-1] remove o ultimo elemento do vetor, no caso \n <br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
############################ Auxiliares ##############################<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
######################### Metodos do XPDF ############################<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
###################### OBTEM THUMB ########################## <br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
caminhoArquivo = pastaUsuario+'thumbs/'+'erro.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
<br />
###########COMANDOS DE CONTROLE DE PROJECAO##################<br />
############OS COMANDOS NAO ESTAO FUNCIONAIS########################## <br />
# curl -i http://localhost:5000/projetar/ligarProjetor<br />
# Retrocede uma pagina<br />
#@app.route('/projetar/ligarProjetor, methods=['GET'])<br />
#def liga_projetor():<br />
# subprocess.call(['echo "standby 0" | cec-client -s'])<br />
# return jsonify({'resultado': True}), 200<br />
<br />
# curl -i http://localhost:5000/projetar/desligarProjetor<br />
# Retrocede uma pagina<br />
#@app.route('/projetar/desligarProjetor, methods=['GET'])<br />
#def desliga_projetor():<br />
# subprocess.call(['echo "on 0" | cec-client -s'])<br />
# return jsonify({'resultado': True}), 200<br />
###############################################################<br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
############################################################## <br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=90401PJI29006-2015-1-Wiki do Projeto2015-06-14T21:45:49Z<p>Matuzalem.m: /* Implementação do Web Service na Raspberry */</p>
<hr />
<div>__NOTOC__<br />
=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
===Casos de Uso===<br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
====Estudo da Raspberry Pi B+====<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
Visualizador de [http://pt.wikipedia.org/wiki/Portable_document_format PDF's].<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
Linguagem de programação utilizada na implementação do web service.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
Gerenciador de extensões python.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
Pacote python para desenvolvedores.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
Framework utilizado na implementação de web services.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
Para autenticação via HTTP.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
Fornece informações sobre as interfaces de conexão.<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
==== 8. Extensão [https://pypi.python.org/pypi/Flask-Cors/1.10.3 Cors] do Flask ====<br />
Devido a '''[https://pt.wikipedia.org/wiki/Pol%C3%ADtica_de_mesma_origem política de mesma origem] (same origin policy)''', configurada como padrão nos servidores, qualquer requisição feita de diferentes domínios é bloqueada pelos navegadores, isto impede que ataques de [https://pt.wikipedia.org/wiki/Cross-site_scripting Cross-domain] sejam feitos. A habilitação da extensão '''[https://pt.wikipedia.org/wiki/Cross-origin_resource_sharing CORS] (cross-origin resource sharing)''' cria um caminho para que estas requisições sejam feitas de uma maneira mais segura, sem que todas as requisições deste tipo sejam habilitadas. Para habilitar os CORS é necessário primeiramente instalar a biblioteca para o suporte do CORS no servidor.<br />
<br />
<code> $ pip install -U flask-cors </syntaxhighlight><br />
<br />
Depois é necessário apenas a importação da biblioteca e inserir o código para habilitar o CORS nos recursos do servidor.<br />
<br />
<syntaxhighlight lang=python><br />
from flask.ext.cors import CORS<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
</syntaxhighlight><br />
<br />
====9. Instalação do cec-utils, que utiliza a biblioteca [https://github.com/Pulse-Eight/libcec libcec] ====<br />
Para envio de comandos para dispositivos conectados via [http://www.infowester.com/hdmi.php HDMI]<br />
<br />
<syntaxhighlight lang=bash> sudo apt-get install cec-utils </syntaxhighlight><br />
<br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Junho de 2015"<br />
__date__ = "$11/06/2015 01:09:22$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, caso insira manualmente o ip do servidor e descartavel, desde que comente as linhas de codigo equivalentes<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
from flask.ext.cors import CORS # habilita troca de informacoes cross domain<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
<br />
# Este servidor foi desenvolvido considerando a estrutura /root/User para o armazenamento de pdfs na raspberry<br />
#####################[DEVE SER PREENCHIDO]############################<br />
usuario = 'User' # usuario conectado a raspberry<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
######################################################################<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/ e o numero de paginas de cada arquivo<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['numeroPaginas'] = subprocess.check_output("/usr/bin/pdfinfo "+path+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)[:-1] # [:-1] remove o ultimo elemento do vetor, no caso \n <br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
############################ Auxiliares ##############################<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
######################### Metodos do XPDF ############################<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
###################### OBTEM THUMB ########################## <br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
caminhoArquivo = pastaUsuario+'thumbs/'+'erro.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
<br />
###########COMANDOS DE CONTROLE DE PROJECAO##################<br />
############OS COMANDOS NAO ESTAO FUNCIONAIS########################## <br />
# curl -i http://localhost:5000/projetar/ligarProjetor<br />
# Retrocede uma pagina<br />
#@app.route('/projetar/ligarProjetor, methods=['GET'])<br />
#def liga_projetor():<br />
# subprocess.call(['echo "standby 0" | cec-client -s'])<br />
# return jsonify({'resultado': True}), 200<br />
<br />
# curl -i http://localhost:5000/projetar/desligarProjetor<br />
# Retrocede uma pagina<br />
#@app.route('/projetar/desligarProjetor, methods=['GET'])<br />
#def desliga_projetor():<br />
# subprocess.call(['echo "on 0" | cec-client -s'])<br />
# return jsonify({'resultado': True}), 200<br />
###############################################################<br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
############################################################## <br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=90400PJI29006-2015-1-Wiki do Projeto2015-06-14T21:18:17Z<p>Matuzalem.m: /* Implementação do Web Service na Raspberry */</p>
<hr />
<div>__NOTOC__<br />
=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
===Casos de Uso===<br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
====Estudo da Raspberry Pi B+====<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
Visualizador de [http://pt.wikipedia.org/wiki/Portable_document_format PDF's].<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
Linguagem de programação utilizada na implementação do web service.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
Gerenciador de extensões python.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
Pacote python para desenvolvedores.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
Framework utilizado na implementação de web services.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
Para autenticação via HTTP.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
Fornece informações sobre as interfaces de conexão.<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
==== 8. Extensão [https://pypi.python.org/pypi/Flask-Cors/1.10.3 Cors] do Flask ====<br />
Devido a '''[https://pt.wikipedia.org/wiki/Pol%C3%ADtica_de_mesma_origem política de mesma origem] (same origin policy)''', configurada como padrão nos servidores, qualquer requisição feita de diferentes domínios é bloqueada pelos navegadores, isto impede que ataques de [https://pt.wikipedia.org/wiki/Cross-site_scripting Cross-domain] sejam feitos. A habilitação da extensão '''[https://pt.wikipedia.org/wiki/Cross-origin_resource_sharing CORS] (cross-origin resource sharing)''' cria um caminho para que estas requisições sejam feitas de uma maneira mais segura, sem que todas as requisições deste tipo sejam habilitadas. Para habilitar os CORS é necessário primeiramente instalar a biblioteca para o suporte do CORS no servidor.<br />
<br />
<code> $ pip install -U flask-cors </syntaxhighlight><br />
<br />
Depois é necessário apenas a importação da biblioteca e inserir o código para habilitar o CORS nos recursos do servidor.<br />
<br />
<syntaxhighlight lang=python><br />
from flask.ext.cors import CORS<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
</syntaxhighlight><br />
<br />
====9. Instalação do cec-utils, que utiliza a biblioteca [https://github.com/Pulse-Eight/libcec libcec] ====<br />
Para envio de comandos para dispositivos conectados via [http://www.infowester.com/hdmi.php HDMI]<br />
<br />
<syntaxhighlight lang=bash> sudo apt-get install cec-utils </syntaxhighlight><br />
<br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Junho de 2015"<br />
__date__ = "$11/06/2015 01:09:22$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, caso insira manualmente o ip do servidor e descartavel, desde que comente as linhas de codigo equivalentes<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
from flask.ext.cors import CORS # habilita troca de informacoes cross domain<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
<br />
# Este servidor foi desenvolvido considerando a estrutura /root/User para o armazenamento de pdfs na raspberry<br />
#####################[DEVE SER PREENCHIDO]############################<br />
usuario = 'User' # usuario conectado a raspberry<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
######################################################################<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/ e o numero de paginas de cada arquivo<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['numeroPaginas'] = subprocess.check_output("/usr/bin/pdfinfo "+path+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)[:-1] # [:-1] remove o ultimo elemento do vetor, no caso \n <br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
############################ Auxiliares ##############################<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
######################### Metodos do XPDF ############################<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
###################### OBTEM THUMB ########################## <br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
caminhoArquivo = pastaUsuario+'thumbs/'+'erro.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
<br />
###########COMANDOS DE CONTROLE DE PROJECAO##################<br />
############OS COMANDOS NAO ESTAO FUNCIONAIS########################## <br />
# curl -i http://localhost:5000/projetar/ligarProjetor<br />
# Retrocede uma pagina<br />
#@app.route('/projetar/ligarProjetor, methods=['GET'])<br />
#def retrocede_pagina():<br />
# subprocess.call(['echo "standby 0" | cec-client -s'])<br />
# return jsonify({'resultado': True}), 200<br />
<br />
# curl -i http://localhost:5000/projetar/desligarProjetor<br />
# Retrocede uma pagina<br />
#@app.route('/projetar/desligarProjetor, methods=['GET'])<br />
#def retrocede_pagina():<br />
# subprocess.call(['echo "on 0" | cec-client -s'])<br />
# return jsonify({'resultado': True}), 200<br />
###############################################################<br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
############################################################## <br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=90247PJI29006-2015-1-Wiki do Projeto2015-06-11T13:17:33Z<p>Matuzalem.m: /* Implementação do Web Service na Raspberry */</p>
<hr />
<div>__NOTOC__<br />
=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
===Casos de Uso===<br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
====Estudo da Raspberry Pi B+====<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
Visualizador de [http://pt.wikipedia.org/wiki/Portable_document_format PDF's].<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
Linguagem de programação utilizada na implementação do web service.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
Gerenciador de extensões python.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
Pacote python para desenvolvedores.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
Framework utilizado na implementação de web services.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
Para autenticação via HTTP.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
Fornece informações sobre as interfaces de conexão.<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
==== 8. Extensão [https://pypi.python.org/pypi/Flask-Cors/1.10.3 Cors] do Flask ====<br />
Devido a '''[https://pt.wikipedia.org/wiki/Pol%C3%ADtica_de_mesma_origem política de mesma origem] (same origin policy)''', configurada como padrão nos servidores, qualquer requisição feita de diferentes domínios é bloqueada pelos navegadores, isto impede que ataques de [https://pt.wikipedia.org/wiki/Cross-site_scripting Cross-domain] sejam feitos. A habilitação da extensão '''[https://pt.wikipedia.org/wiki/Cross-origin_resource_sharing CORS] (cross-origin resource sharing)''' cria um caminho para que estas requisições sejam feitas de uma maneira mais segura, sem que todas as requisições deste tipo sejam habilitadas. Para habilitar os CORS é necessário primeiramente instalar a biblioteca para o suporte do CORS no servidor.<br />
<br />
<code> $ pip install -U flask-cors </syntaxhighlight><br />
<br />
Depois é necessário apenas a importação da biblioteca e inserir o código para habilitar o CORS nos recursos do servidor.<br />
<br />
<syntaxhighlight lang=python><br />
from flask.ext.cors import CORS<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Junho de 2015"<br />
__date__ = "$11/06/2015 01:09:22$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, caso insira manualmente o ip do servidor e descartavel, desde que comente as linhas de codigo equivalentes<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
from flask.ext.cors import CORS # habilita troca de informacoes cross domain<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
<br />
# Este servidor foi desenvolvido considerando a estrutura /root/User para o armazenamento de pdfs na raspberry<br />
#####################[DEVE SER PREENCHIDO]############################<br />
usuario = 'User' # usuario conectado a raspberry<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
######################################################################<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/ e o numero de paginas de cada arquivo<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['numeroPaginas'] = subprocess.check_output("/usr/bin/pdfinfo "+path+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)[:-1] # [:-1] remove o ultimo elemento do vetor, no caso \n <br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
############################ Auxiliares ##############################<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
######################### Metodos do XPDF ############################<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
###################### OBTEM THUMB ########################## <br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
caminhoArquivo = pastaUsuario+'thumbs/'+'erro.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
<br />
############################################################## <br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
############################################################## <br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=90237PJI29006-2015-1-Wiki do Projeto2015-06-11T04:13:46Z<p>Matuzalem.m: /* Implementação do Web Service na Raspberry */</p>
<hr />
<div>__NOTOC__<br />
=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
===Casos de Uso===<br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
====Estudo da Raspberry Pi B+====<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
Visualizador de [http://pt.wikipedia.org/wiki/Portable_document_format PDF's].<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
Linguagem de programação utilizada na implementação do web service.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
Gerenciador de extensões python.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
Pacote python para desenvolvedores.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
Framework utilizado na implementação de web services.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
Para autenticação via HTTP.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
Fornece informações sobre as interfaces de conexão.<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
==== 8. Extensão [https://pypi.python.org/pypi/Flask-Cors/1.10.3 Cors] do Flask ====<br />
Devido a '''[https://pt.wikipedia.org/wiki/Pol%C3%ADtica_de_mesma_origem política de mesma origem] (same origin policy)''', configurada como padrão nos servidores, qualquer requisição feita de diferentes domínios é bloqueada pelos navegadores, isto impede que ataques de [https://pt.wikipedia.org/wiki/Cross-site_scripting Cross-domain] sejam feitos. A habilitação da extensão '''[https://pt.wikipedia.org/wiki/Cross-origin_resource_sharing CORS] (cross-origin resource sharing)''' cria um caminho para que estas requisições sejam feitas de uma maneira mais segura, sem que todas as requisições deste tipo sejam habilitadas. Para habilitar os CORS é necessário primeiramente instalar a biblioteca para o suporte do CORS no servidor.<br />
<br />
<code> $ pip install -U flask-cors </syntaxhighlight><br />
<br />
Depois é necessário apenas a importação da biblioteca e inserir o código para habilitar o CORS nos recursos do servidor.<br />
<br />
<syntaxhighlight lang=python><br />
from flask.ext.cors import CORS<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Junho de 2015"<br />
__date__ = "$11/06/2015 01:09:22$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, caso insira manualmente o ip do servidor e descartavel, desde que comente as linhas de codigo equivalentes<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
from flask.ext.cors import CORS # habilita troca de informações cross domain<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
<br />
# Este servidor foi desenvolvido considerando a estrutura /root/User para o armazenamento de pdfs na raspberry<br />
#####################[DEVE SER PREENCHIDO]############################<br />
usuario = 'User' # usuario conectado a raspberry<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
######################################################################<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/ e o numero de paginas de cada arquivo<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['numeroPaginas'] = subprocess.check_output("/usr/bin/pdfinfo "+path+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)[:-1] # [:-1] remove o ultimo elemento do vetor, no caso \n <br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
############################ Auxiliares ##############################<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
######################### Metodos do XPDF ############################<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
###################### OBTEM THUMB ########################## <br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
caminhoArquivo = pastaUsuario+'thumbs/'+'erro.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
<br />
############################################################## <br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
############################################################## <br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=90236PJI29006-2015-1-Wiki do Projeto2015-06-11T04:11:58Z<p>Matuzalem.m: /* Implementação do Web Service na Raspberry */</p>
<hr />
<div>__NOTOC__<br />
=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
===Casos de Uso===<br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
====Estudo da Raspberry Pi B+====<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
Visualizador de [http://pt.wikipedia.org/wiki/Portable_document_format PDF's].<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
Linguagem de programação utilizada na implementação do web service.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
Gerenciador de extensões python.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
Pacote python para desenvolvedores.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
Framework utilizado na implementação de web services.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
Para autenticação via HTTP.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
Fornece informações sobre as interfaces de conexão.<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
==== 8. Extensão [https://pypi.python.org/pypi/Flask-Cors/1.10.3 Cors] do Flask ====<br />
Devido a '''[https://pt.wikipedia.org/wiki/Pol%C3%ADtica_de_mesma_origem política de mesma origem] (same origin policy)''', configurada como padrão nos servidores, qualquer requisição feita de diferentes domínios é bloqueada pelos navegadores, isto impede que ataques de [https://pt.wikipedia.org/wiki/Cross-site_scripting Cross-domain] sejam feitos. A habilitação da extensão '''[https://pt.wikipedia.org/wiki/Cross-origin_resource_sharing CORS] (cross-origin resource sharing)''' cria um caminho para que estas requisições sejam feitas de uma maneira mais segura, sem que todas as requisições deste tipo sejam habilitadas. Para habilitar os CORS é necessário primeiramente instalar a biblioteca para o suporte do CORS no servidor.<br />
<br />
<code> $ pip install -U flask-cors </syntaxhighlight><br />
<br />
Depois é necessário apenas a importação da biblioteca e inserir o código para habilitar o CORS nos recursos do servidor.<br />
<br />
<syntaxhighlight lang=python><br />
from flask.ext.cors import CORS<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Maio de 2015"<br />
__date__ = "$11/06/2015 01:09:22$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, caso insira manualmente o ip do servidor e descartavel, desde que comente as linhas de codigo equivalentes<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
from flask.ext.cors import CORS # habilita troca de informações cross domain<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
<br />
# Este servidor foi desenvolvido considerando a estrutura /root/User para o armazenamento de pdfs na raspberry<br />
#####################[DEVE SER PREENCHIDO]############################<br />
usuario = 'User' # usuario conectado a raspberry<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
######################################################################<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/ e o numero de paginas de cada arquivo<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['numeroPaginas'] = subprocess.check_output("/usr/bin/pdfinfo "+path+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)[:-1] # [:-1] remove o ultimo elemento do vetor, no caso \n <br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
############################ Auxiliares ##############################<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
######################### Metodos do XPDF ############################<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
###################### OBTEM THUMB ########################## <br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
caminhoArquivo = pastaUsuario+'thumbs/'+'erro.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
<br />
############################################################## <br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
############################################################## <br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Caf%C3%A9_com_Linux&diff=89742Café com Linux2015-06-02T14:07:07Z<p>Matuzalem.m: </p>
<hr />
<div>== Projeto ==<br />
<br />
A idéia do evento surgiu em 2014 em uma das reuniões sobre o [[Curso de Engenharia de Telecomunicações]] do Instituto Federal de Santa Catarina ([http://www.ifsc.edu.br/ IFSC]). Basicamente são encontros para trocar-se idéias, conversar e trocar experiências sobre [http://pt.wikipedia.org/wiki/Linux Linux], além de tomar um cafezinho.<br />
<br />
Tudo informal, apenas encontrando-se na cantina e ajudando as pessoas que tiverem dúvidas, e também aprendendo coisas novas com outros.<br />
<br />
A primeira reunião foi marcada para ser um encontro entre usuários de Linux interessados em aprender mais e compartilhar experiências com outros usuários. Ela rendeu uma conversa muito interessante e foram debatidos formas de aumentar a abrangência da ideia e atrair mais pessoas para os encontros.<br />
<br />
Surgiu então a ideia de unir a ideia inicial de simples encontros para conversar com mini-palestras de 45~60 minutos ministradas pelos próprios usuários, sobre temas de interesse comum. Essas mini palestras seriam ministradas pelos próprios usuários do grupo, alunos ou professores. Os palestrantes são voluntários que não precisam ter vínculos com a instituição ou com qualquer outra organização, apenas boa vontade de querer repassar seus conhecimentos para outros usuários.<br />
<br />
Após as palestras seriam mantidos grupos de conversa para compartilhar ideias e experiências sobre Linux e Software Livre, podendo assim incentivar não-usuários a utilizarem Linux, e outros softwares livres, além de participarem de edições futuras do evento.<br />
<br />
O tipo de encontro teve como inspiração um grupo de usuários de software livre com encontros semelhantes da Universidade Federal de Santa Catarina ([http://ufsc.br/ UFSC]) o [http://www.softwarelivre.ufsc.br/doku.php GUFSC].<br />
<br />
----<br />
<br />
== Objetivos ==<br />
<br />
* Ajudar e incentivar a comunidade acadêmica e externa a utilizar Linux e softwares livres;<br />
<br />
* Tornar os participantes autodidatas tanto na utilização de softwares livres e demais tecnologias quanto no cotidiano;<br />
<br />
* Fornecer palestras e oficinas de interesse dos participantes que incentivem cada vez mais novos adeptos ao projeto;<br />
<br />
* Buscar estabelecer uma comunidade de usuários de software livre e de desenvolvedores, que possam contribuir em projetos de software livre criados pelos próprios usuários, com o objetivo de suprir necessidades dos usuários ou até da própria comunidade acadêmica;<br />
<br />
* Promover ou participar de eventos de software livre.<br />
<br />
----<br />
<br />
== Atas dos encontros ==<br />
<br />
{{collapse top | bg=lightgreen | expand=true | [https://www.facebook.com/events/558482957624175/ 5º Encontro] - ( 11/06/2015 - 19:00h - IFSC - SJ ) - Palestra/Mini-Curso Tracing do Kernel }}<br />
<br />
* Ministrante: Daniel Bristot de Oliveira<br />
<br />
Daniel Bristot é Engenheiro de software na Red Hat, e doutorando no DAS UFSC. Perde sua vida com o kernel do Linux e tempo real.<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top | [https://www.facebook.com/events/893905697314793/ 4º Encontro] - ( 21/05/2015 - 18:30h - IFSC - SJ ) - Mini-Curso [https://www.python.org/ Python] }}<br />
<br />
* Ministrante: [[Roberto Wanderley da Nóbrega]]<br />
<br />
* [[Media:CafeComLinux2015-Python.pdf|Slides]]<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top | [https://www.facebook.com/events/529159953891375/ 3º Encontro] - ( 15/04/2015 - 19:00h - IFSC - SJ ) - Coffee with maddog: Things you should know }}<br />
<br />
Palestra ministrado por [http://en.wikipedia.org/wiki/Jon_Hall_%28programmer%29 Jon "maddog" Hall]. Será feito um bate-papo com maddog (em inglês) sobre Linux e outras coisas que você deveria saber sobre software livre.<br />
<br />
* Ministrante: John "maddog" Hall<br />
<br />
* [https://www.youtube.com/watch?v=U5E9m6fBN8Y Link para video do streaming do evento]<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top | [https://www.facebook.com/events/1615525052014106/ 2º Encontro] - ( 26/03/2015 - 18:30h - IFSC - SJ ) - Mini-Curso [http://www.latex-project.org/ LaTeX]}}<br />
<br />
Após uma breve apresentação do projeto e do ministrante do curso, o mesmo teve início. Abaixo estão informações/materiais citados/utilizados na ocasião e outros links úteis.<br />
<br />
* Ministrante: [[Leonan Saraiva]]<br />
<br />
* [https://www.dropbox.com/s/r6xxwoabs87g59k/Latex.pdf?dl=0 Slides]<br />
<br />
* [https://www.dropbox.com/sh/rd1q6lwiwjtkard/AABzUSflvkup4ERfDZBWMRSOa?dl=0 Modelos]<br />
<br />
* [http://tele.sj.ifsc.edu.br/~mello/livros/latex/ Modelos] do professor [Emerson Mello] e [http://200.135.233.26:3000/project/54750cb57ae8187440d60acd outros]<br />
<br />
* [http://200.135.233.26:3000 ShareLaTeX do IFSC]. Intruções para uso [[Uso do ShareLaTeX na IFSC-CLOUD| aqui]].<br />
<br />
* [https://pt.sharelatex.com/ ShareLaTeX Oficial]. Possui imitações de compartilhamento e bibliotecas adicionais inclusas. [https://pt.sharelatex.com/learn Documentação] (em inglês).<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top | [https://www.facebook.com/events/1475628689353350/ 1º Encontro] - ( 11/03/2015 - 19:00h - IFSC - SJ ) - Reunião Inicial }}<br />
<br />
Primeiro encontro do grupo, foi feita uma roda de discussão e conversa sobre Linux e Software livre e discutidas ideias e rumos para o projeto. Foram discutidas formas de atrair e tornar os próximos encontros ainda mais interessantes.<br />
<br />
Foram levantadas várias ideias para os próximos encontros e mini-palestras e definido que os encontros seriam quinzenais.<br />
<br />
Também foi definido que no próximo encontro seria ministrada um mini-curso sobre LaTeX pelo aluno Leonan Saraiva.<br />
<br />
{{collapse bottom}}<br />
<br />
== Banco de Ideias para os próximo Mini-Cursos e Palestras ==<br />
<br />
* Força-tarefa de instalação de distribuições, não apenas limitando-se a instalar os sistemas, mas a '''ensinar''' o processo.<br />
<br />
* [http://pt.wikipedia.org/wiki/LaTeX LaTeX] ✔<br />
<br />
* [https://www.python.org/ Python] ✔<br />
<br />
* [http://pt.wikipedia.org/wiki/Git Git]<br />
<br />
* [http://pt.wikipedia.org/wiki/Shell_script Shell Script]<br />
<br />
* Mini-curso de desenvolvimento embarcado com [http://www.embarcados.com.br/intel-galileo/ Galileo]<br />
<br />
== Links Interessantes ==<br />
<br />
*[http://www.softwarelivre.ufsc.br/doku.php GUFSC]<br />
*[https://www.gnu.org/philosophy/free-sw.pt-br.html O que é o Software Livre?]<br />
*[http://www.fsf.org/about/what-is-free-software What is Free Software]<br />
*[https://www.youtube.com/watch?v=9hIQjrMHTv4 History of the Internet]<br />
*[https://www.youtube.com/watch?v=dU1xS07N-FA Code Starts]<br />
*[https://www.ieee.org/index.html IEEE]<br />
*[http://en.wikipedia.org/wiki/Linux_distribution Linux Distribution]<br />
*[http://distrowatch.com/dwres.php?resource=major Top Ten Distributions]<br />
*[http://wiki.linuxquestions.org/wiki/Linux_software_equivalent_to_Windows_software Linux software equivalent to Windows software]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89580PJI29006-2015-1-Wiki do Projeto2015-05-28T13:15:43Z<p>Matuzalem.m: /* Implementação do Web Service na Raspberry */</p>
<hr />
<div>__NOTOC__<br />
=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
===Casos de Uso===<br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
====Estudo da Raspberry Pi B+====<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
Visualizador de [http://pt.wikipedia.org/wiki/Portable_document_format PDF's].<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
Linguagem de programação utilizada na implementação do web service.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
Gerenciador de extensões python.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
Pacote python para desenvolvedores.<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
Framework utilizado na implementação de web services.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
Para autenticação via HTTP.<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
Fornece informações sobre as interfaces de conexão.<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
==== 8. Extensão [https://pypi.python.org/pypi/Flask-Cors/1.10.3 Cors] do Flask ====<br />
Devido a '''[https://pt.wikipedia.org/wiki/Pol%C3%ADtica_de_mesma_origem política de mesma origem] (same origin policy)''', configurada como padrão nos servidores, qualquer requisição feita de diferentes domínios é bloqueada pelos navegadores, isto impede que ataques de [https://pt.wikipedia.org/wiki/Cross-site_scripting Cross-domain] sejam feitos. A habilitação da extensão '''[https://pt.wikipedia.org/wiki/Cross-origin_resource_sharing CORS] (cross-origin resource sharing)''' cria um caminho para que estas requisições sejam feitas de uma maneira mais segura, sem que todas as requisições deste tipo sejam habilitadas. Para habilitar os CORS é necessário primeiramente instalar a biblioteca para o suporte do CORS no servidor.<br />
<br />
<code> $ pip install -U flask-cors </syntaxhighlight><br />
<br />
Depois é necessário apenas a importação da biblioteca e inserir o código para habilitar o CORS nos recursos do servidor.<br />
<br />
<syntaxhighlight lang=python><br />
from flask.ext.cors import CORS<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Maio de 2015"<br />
__date__ = "$24/05/2015 14:35:46$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, necessario instalar<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
from flask.ext.cors import CORS<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
cors = CORS(app)<br />
<br />
# Este servidor foi desenvolvido considerando a estrutura /root/User para o armazenamento de pdfs na raspberry<br />
#####################[DEVE SER PREENCHIDO]############################<br />
usuario = 'User' # usuario conectado a raspberry<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
######################################################################<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['tamanho'] = size<br />
linha['caminho'] = root<br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
############################ Auxiliares ##############################<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
######################### Metodos do XPDF ############################<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
###################### OBTEM THUMB ########################## <br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
return jsonify({'resultado':False}), 404<br />
<br />
############################################################## <br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
############################################################## <br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89497PJI29006-2015-1-Wiki do Projeto2015-05-25T23:49:55Z<p>Matuzalem.m: /* Implementação do Web Service na Raspberry */</p>
<hr />
<div>__NOTOC__<br />
=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
===Casos de Uso===<br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
====Estudo da Raspberry Pi B+====<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Maio de 2015"<br />
__date__ = "$24/05/2015 14:35:46$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, necessario instalar<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
<br />
# Este servidor foi desenvolvido considerando a estrutura /root/User para o armazenamento de pdfs na raspberry<br />
#####################[DEVE SER PREENCHIDO]############################<br />
usuario = 'User' # usuario conectado a raspberry<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
######################################################################<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['tamanho'] = size<br />
linha['caminho'] = root<br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
############################ Auxiliares ##############################<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
######################### Metodos do XPDF ############################<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf.real','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
###################### OBTEM THUMB ########################## <br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
return jsonify({'resultado':False}), 404<br />
<br />
############################################################## <br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
############################################################## <br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89496PJI29006-2015-1-Wiki do Projeto2015-05-25T23:19:01Z<p>Matuzalem.m: /* Implementação do Web Service na Raspberry */</p>
<hr />
<div>__NOTOC__<br />
=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
===Casos de Uso===<br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
====Estudo da Raspberry Pi B+====<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Maio de 2015"<br />
__date__ = "$24/05/2015 14:35:46$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, necessario instalar<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
<br />
# Este servidor foi desenvolvido considerando a estrutura /root/User para o armazenamento de pdfs na raspberry<br />
#####################[DEVE SER PREENCHIDO]############################<br />
usuario = 'User' # usuario conectado a raspberry<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
######################################################################<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['tamanho'] = size<br />
linha['caminho'] = root<br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
############################ Auxiliares ##############################<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
######################### Metodos do XPDF ############################<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
###################### OBTEM THUMB ########################## <br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
return jsonify({'resultado':False}), 404<br />
<br />
############################################################## <br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
############################################################## <br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89459PJI29006-2015-1-Wiki do Projeto2015-05-24T18:48:00Z<p>Matuzalem.m: </p>
<hr />
<div>__NOTOC__<br />
=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
===Casos de Uso===<br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
====Estudo da Raspberry Pi B+====<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Maio de 2015"<br />
__date__ = "$24/05/2015 14:35:46$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, necessario instalar<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
<br />
usuario = 'User' # usuario conectado a raspberry<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['tamanho'] = size<br />
linha['caminho'] = root<br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
#### Auxiliares ###<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
############# Como invocar o XPDF ##########################<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
return jsonify({'resultado':False}), 404<br />
<br />
##############################################################<br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO (raspberry)<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89458PJI29006-2015-1-Wiki do Projeto2015-05-24T18:35:32Z<p>Matuzalem.m: /* Casos de Uso */</p>
<hr />
<div>=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
===Casos de Uso===<br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
====Estudo da Raspberry Pi B+====<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Maio de 2015"<br />
__date__ = "$24/05/2015 14:35:46$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, necessario instalar<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
<br />
usuario = 'User' # usuario conectado a raspberry<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['tamanho'] = size<br />
linha['caminho'] = root<br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
#### Auxiliares ###<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
############# Como invocar o XPDF ##########################<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
# subprocess.Popen(['xpdf','-fullscreen','-remote','projetor',local])<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
return jsonify({'resultado':False}), 404<br />
<br />
##############################################################<br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO (raspberry)<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Matuzalem_Muller&diff=89457Matuzalem Muller2015-05-24T18:26:19Z<p>Matuzalem.m: /* Trabalhos do Curso */</p>
<hr />
<div>Ingressou na Instituição de Ensino em 2009, inicialmente no ensino médio. Após a conclusão do mesmo, ingressou na [http://wiki.sj.ifsc.edu.br/index.php/Curso_de_Engenharia_de_Telecomunica%C3%A7%C3%B5es Engenharia de Telecomunicações], a qual está cursando atualmente [http://wiki.sj.ifsc.edu.br/index.php/Engenharia_de_Telecomunica%C3%A7%C3%B5es_6%C2%AA_Fase (6º período)].<br />
<br />
;Informações:<br />
<br />
Currículo Lattes: [http://buscatextual.cnpq.br/buscatextual/visualizacv.do?metodo=apresentar&id=K8158513U5 Matuzalém Muller dos Santos]<br />
<br />
Email: matuzalemifsc'''[at]'''gmail.com<br />
<br />
== Projetos Participantes ==<br />
{{collapse top|Bolsas de Extensão}}<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Programa%C3%A7%C3%A3o_visual_%2B_game_design_e_seus_recursos_pedag%C3%B3gicos Programação visual + game design e seus recursos pedagógicos]<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_2 Mulheres na Engenharia - Pagina do Bolsista]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_1_2015/1 Oficina 1]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 Oficina 2]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_3_2015/1 Oficina 3]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_4_2015/1 Oficina 4]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_5_2015/1 Oficina 5]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_6_2015/1 Oficina 6]<br />
{{collapse bottom|Bolsa de Extensão}}<br />
<br />
==Trabalhos do Curso==<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Alarme_MIC29004-2014-1 Projeto Final de Microprocessadores: Simulador de Alarme de Loja]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projetos_Finais_CIL29003#EQUIPE_3_-_Veloc.C3.ADmetro_e_Acelerador_Digital Projeto Final de Circuitos Lógicos: Velocímetro e Acelerador Digital]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/index.php/RED29004-2014-1-Seminario1-VPN Seminário de Redes de Computadores I - VPN]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Seguran%C3%A7a_em_Redes_de_Computadores_-_RED29005 Seminário de Redes de Computadores II - Segurança em Rede de Computadores]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto Projeto Integrador II - Sistema de Automatização de Sala de Aula]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89456PJI29006-2015-1-Wiki do Projeto2015-05-24T18:23:59Z<p>Matuzalem.m: /* Sistema de Automatização de Sala de Aula */</p>
<hr />
<div>=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
===Casos de Uso===<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
====Estudo da Raspberry Pi B+====<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Maio de 2015"<br />
__date__ = "$24/05/2015 14:35:46$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, necessario instalar<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
<br />
usuario = 'User' # usuario conectado a raspberry<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['tamanho'] = size<br />
linha['caminho'] = root<br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
#### Auxiliares ###<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
############# Como invocar o XPDF ##########################<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
# subprocess.Popen(['xpdf','-fullscreen','-remote','projetor',local])<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
return jsonify({'resultado':False}), 404<br />
<br />
##############################################################<br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO (raspberry)<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89455PJI29006-2015-1-Wiki do Projeto2015-05-24T18:14:50Z<p>Matuzalem.m: /* Desenvolvimento */</p>
<hr />
<div>=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
<br />
===Casos de Uso===<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
{{collapse top | Ciclo 1}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
{{collapse bottom | Ciclo 1}}<br />
{{collapse top | Ciclo 2}}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
{{collapse bottom | Ciclo 2}}<br />
{{collapse top | Ciclos Posteriores / Implementações adicionais }}<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
{{collapse bottom | Ciclos Posteriores / Implementações adicionais }}<br />
<br />
=== Estudo das Tecnologias ===<br />
====Sincronização de Diretórios Utilizando Rsync====<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
====Exibição de PDF com xpdf em Virtual Display====<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
===Estudo da Raspberry Pi B+===<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API's de implementação===<br />
====API Web-Service a ser implementado na Raspberry Pi B+====<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
====API Web-Service a ser implementado no GUI====<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Maio de 2015"<br />
__date__ = "$24/05/2015 14:35:46$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, necessario instalar<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
<br />
usuario = 'User' # usuario conectado a raspberry<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['tamanho'] = size<br />
linha['caminho'] = root<br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
#### Auxiliares ###<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
############# Como invocar o XPDF ##########################<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
# subprocess.Popen(['xpdf','-fullscreen','-remote','projetor',local])<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
return jsonify({'resultado':False}), 404<br />
<br />
##############################################################<br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO (raspberry)<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89454PJI29006-2015-1-Wiki do Projeto2015-05-24T17:58:23Z<p>Matuzalem.m: /* Implementação do Web Service na Raspberry */</p>
<hr />
<div>=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
<br />
===Casos de Uso===<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
==== Ciclo 1 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
<br />
==== Ciclo 2 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
<br />
==== Ciclos posteriores ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
<br />
<br />
===Sincronização de Diretórios Utilizando Rsync===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
===Exibição de PDF com xpdf em Virtual Display===<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
===Estudo da Raspberry Pi B+===<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API Web-Service a ser implementado na Raspberry Pi B+===<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
===API Web-Service a ser implementado no GUI===<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamado ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Maio de 2015"<br />
__date__ = "$24/05/2015 14:35:46$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, necessario instalar<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
<br />
usuario = 'User' # usuario conectado a raspberry<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['tamanho'] = size<br />
linha['caminho'] = root<br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
#### Auxiliares ###<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
############# Como invocar o XPDF ##########################<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
# subprocess.Popen(['xpdf','-fullscreen','-remote','projetor',local])<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
return jsonify({'resultado':False}), 404<br />
<br />
##############################################################<br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO (raspberry)<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=bash> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89453PJI29006-2015-1-Wiki do Projeto2015-05-24T17:48:13Z<p>Matuzalem.m: /* Implementação do Web Service na Raspberry */</p>
<hr />
<div>=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
<br />
===Casos de Uso===<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
==== Ciclo 1 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
<br />
==== Ciclo 2 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
<br />
==== Ciclos posteriores ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
<br />
<br />
===Sincronização de Diretórios Utilizando Rsync===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
===Exibição de PDF com xpdf em Virtual Display===<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
===Estudo da Raspberry Pi B+===<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API Web-Service a ser implementado na Raspberry Pi B+===<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
===API Web-Service a ser implementado no GUI===<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 2. [https://www.python.org/ Python]====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 3. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
==== 4. [https://mail.python.org/mailman/listinfo/python-dev Python-dev] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-dev </syntaxhighlight><br />
==== 5. Framework [http://flask.pocoo.org/ Flask] ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask </syntaxhighlight><br />
==== 6. Extensão [https://flask-httpauth.readthedocs.org/en/latest/ HTTPAuth] do Flask ====<br />
<syntaxhighlight lang=bash> $ sudo pip install flask-httpauth </syntaxhighlight><br />
==== 7. Extensão [https://pypi.python.org/pypi/netifaces netifaces] para Python ====<br />
<syntaxhighlight lang=bash> $ wget https://pypi.python.org/packages/source/n/netifaces/netifaces-0.10.4.tar.gz<br />
$ tar xvzf netifaces-0.10.4.tar.gz<br />
$ cd netifaces-0.10.4<br />
$ python setup.py install </syntaxhighlight><br />
{{collapse bottom | Instalação dos componentes necessários}}<br />
<br />
{{collapse top | Implementação do Web Service}}<br />
<br />
*Assume-se que o diretório dos usuários estará localizado no diretório do usuário '''root''' da raspberry (/root), e que no diretório de cada usuário haverá um diretório chamada ''thumbs'', que conterá todas as miniaturas necessárias para exibição no dispositivo móvel.<br />
<br />
<syntaxhighlight lang=python><br />
#!/usr/bin/python<br />
<br />
__author__ = "Matuzalem - Projeto Integrador II - Engenharia de Telecomunicacoes - Maio de 2015"<br />
__date__ = "$24/05/2015 14:35:46$"<br />
<br />
import sys<br />
import netifaces # para capturar a interface do servidor automaticamente, necessario instalar<br />
from flask import Flask, jsonify<br />
from flask import abort<br />
from flask import make_response<br />
from flask import request<br />
from flask import url_for<br />
from flask import send_file # enviar arquivos thumbs pela rede<br />
from flask.ext.httpauth import HTTPBasicAuth<br />
auth = HTTPBasicAuth()<br />
<br />
import subprocess<br />
import os<br />
<br />
app = Flask(__name__)<br />
<br />
usuario = 'User' # usuario conectado a raspberry<br />
caminho = "" # diretorio onde esta localizado o diretorio do usuario<br />
pastaUsuario = "" # diretorio usuario<br />
numeroPaginas="" # numero de paginas do arquivo<br />
paginaAtual="" # pagina atual do arquivo<br />
<br />
interface='lo' # interface em que o servidor funcionara, para obter o ip automaticamente<br />
porta=5000 # porta em que o servidor ouvira<br />
<br />
### Como listar arquivos em diretorio e seus subdiretorios ###<br />
<br />
# curl -i http://localhost:5000/projetar<br />
# Lista os arquivos do tipo pdf em /root/{usuario}/<br />
@app.route('/projetar', methods=['GET'])<br />
def obtem_arquivos():<br />
lista = []<br />
#https://docs.python.org/2/library/os.html<br />
for root, dirs, files in os.walk(caminho+usuario+'/'):<br />
for nome in files:<br />
if nome.endswith(".pdf"):<br />
path = os.path.join(root, nome)<br />
size = os.stat(path).st_size # in bytes<br />
linha = {}<br />
linha['tamanho'] = size<br />
linha['caminho'] = root<br />
linha['nome'] = nome<br />
lista.append(linha)<br />
return jsonify({'arquivos': lista}), 200<br />
<br />
<br />
#### Auxiliares ###<br />
<br />
# verifica se um arquivo existe em um determinado diretorio<br />
def verifica_existencia(diretorio, arquivo):<br />
if (os.path.exists(diretorio+arquivo) == True):<br />
return True<br />
else:<br />
return False<br />
<br />
############# Como invocar o XPDF ##########################<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}<br />
# Abre um pdf<br />
@app.route('/projetar/<arquivo>', methods=['GET'])<br />
def abre_pdf(arquivo):<br />
# Chamada de processo nao bloqueante - fica em background<br />
local = pastaUsuario+arquivo<br />
if (verifica_existencia(pastaUsuario,arquivo) == True):<br />
p1 = os.spawnlp(os.P_NOWAIT,"xpdf","/usr/bin/xpdf","-fullscreen","-remote", arquivo, local)<br />
# /usr/bin/pdfinfo /root/User/arquivo.pdf | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'<br />
# verifica o numero de paginas do pdf<br />
global numeroPaginas<br />
global paginaAtual<br />
numeroPaginas = subprocess.check_output("/usr/bin/pdfinfo "+local+" | grep -oP '(?<=Pages: )[ A-Za-z0-9]*'", shell=True)<br />
paginaAtual = 1<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar o arquivo '+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
# subprocess.Popen(['xpdf','-fullscreen','-remote','projetor',local])<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/avancarProjecao<br />
# Avanca uma pagina<br />
@app.route('/projetar/<arquivo>/avancarProjecao', methods=['GET'])<br />
def avanca_pagina(arquivo):<br />
comando = 'nextPage'<br />
global paginaAtual<br />
if(int(paginaAtual) < int(numeroPaginas)):<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
paginaAtual = paginaAtual + 1<br />
p = subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual+1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/retrocederProjecao<br />
# Retrocede uma pagina<br />
@app.route('/projetar/<arquivo>/retrocederProjecao', methods=['GET'])<br />
def retrocede_pagina(arquivo):<br />
if(int(paginaAtual) > 1):<br />
comando = 'prevPage'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(paginaAtual-1)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/saltarProjecao/{numPagina}<br />
# Avanca para uma pagina do pdf, se a pagina nao existir retorna um codigo de erro<br />
@app.route('/projetar/<arquivo>/saltarProjecao/<int:pagina>', methods=['GET'])<br />
def salta_paginas(arquivo,pagina):<br />
global paginaAtual<br />
if(pagina <= int(numeroPaginas) and (int(pagina) > 0)):<br />
comando = 'gotoPage('+str(pagina)+')'<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec',comando])<br />
paginaAtual = pagina<br />
return jsonify({'resultado': True}), 200<br />
else:<br />
print 'Usuario '+usuario+' tentou acessar a pagina '+str(pagina)+' do pdf '+pastaUsuario+arquivo+' inexistente!'<br />
return jsonify({'resultado': False}), 404<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/fechar<br />
# Fechar projecao<br />
@app.route('/projetar/<arquivo>/fechar', methods=['GET'])<br />
def fechar_projecao(arquivo):<br />
comando = 'quit'<br />
global paginaAtual<br />
global numeroPaginas<br />
paginaAtual = numeroPaginas = ""<br />
# chamada de processo bloqueante, porem o xpdf termina logo apos a execucao<br />
subprocess.call(['xpdf','-remote',arquivo,'-exec', comando])<br />
return jsonify({'resultado': True}), 200<br />
<br />
<br />
# curl -i http://localhost:5000/projetar/{arquivo.pdf}/obterThumb/{thumb}<br />
# Retorna um thumb do tipo jpg identificado por {arquivo}-{thumb}.jpg<br />
@app.route('/projetar/<arquivo>/obterThumb/<int:thumb>', methods=['GET'])<br />
def obter_thumb(arquivo, thumb):<br />
if((thumb < int(numeroPaginas)) & (thumb >= 0)):<br />
fileName, fileExtension = os.path.splitext(arquivo)<br />
caminhoArquivo = pastaUsuario+'thumbs/'+fileName+'-'+(str(thumb))+'.jpg'<br />
return send_file(caminhoArquivo, mimetype='image/jpg')<br />
else:<br />
return jsonify({'resultado':False}), 404<br />
<br />
##############################################################<br />
<br />
@app.errorhandler(404) ## Tratamento de erro<br />
def not_found(error):<br />
return make_response(jsonify({'Erro': 'Recurso nao encontrado!'}), 404)<br />
<br />
<br />
if __name__ == "__main__":<br />
print "Servidor no ar!"<br />
caminho = os.path.expanduser('~')+'/' # obtem o diretorio do usuario do SO (raspberry)<br />
pastaUsuario = caminho+usuario+'/' # obtem o diretorio do usuario conectado (User)<br />
ip = netifaces.ifaddresses(interface)[2][0]['addr'] # obtem o ip referente a interface<br />
app.run(debug=True,host=ip,port=porta)<br />
</syntaxhighlight><br />
<br />
*Considerando a instalação correta dos componentes e que o arquivo seja salvo com o nome <font color=darkred> servidor.py </font> basta executar o web service com o comando:<br />
<syntaxhighlight lang=python> python servidor.py </syntaxhighlight><br />
<br />
{{collapse bottom | Implementação do Web Service}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89452PJI29006-2015-1-Wiki do Projeto2015-05-24T14:47:28Z<p>Matuzalem.m: /* Implementação do Web Service na Raspberry */</p>
<hr />
<div>=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
<br />
===Casos de Uso===<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
==== Ciclo 1 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
<br />
==== Ciclo 2 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
<br />
==== Ciclos posteriores ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
<br />
<br />
===Sincronização de Diretórios Utilizando Rsync===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
===Exibição de PDF com xpdf em Virtual Display===<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
===Estudo da Raspberry Pi B+===<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API Web-Service a ser implementado na Raspberry Pi B+===<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
===API Web-Service a ser implementado no GUI===<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
=== Implementação do Web Service na Raspberry ===<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
==== 1. [http://www.x.org/wiki/ Xorg] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xorg </syntaxhighlight><br />
==== 2. [http://www.foolabs.com/xpdf/ Xpdf] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install xpdf </syntaxhighlight><br />
==== 3. [https://www.python.org/ Python]====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python </syntaxhighlight><br />
==== 4. [https://pypi.python.org/pypi/pip Python-pip] ====<br />
<syntaxhighlight lang=bash> $ sudo apt-get install python-pip </syntaxhighlight><br />
{{collapse bottom | Instalação dos componentes necessários}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89451PJI29006-2015-1-Wiki do Projeto2015-05-24T14:36:18Z<p>Matuzalem.m: /* API Web-Service a ser implementado no GUI */</p>
<hr />
<div>=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
<br />
===Casos de Uso===<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
==== Ciclo 1 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
<br />
==== Ciclo 2 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
<br />
==== Ciclos posteriores ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
<br />
<br />
===Sincronização de Diretórios Utilizando Rsync===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
===Exibição de PDF com xpdf em Virtual Display===<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
===Estudo da Raspberry Pi B+===<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API Web-Service a ser implementado na Raspberry Pi B+===<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
===API Web-Service a ser implementado no GUI===<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}<br />
<br />
== Implementação do Web Service na Raspberry ==<br />
<br />
{{collapse top | Instalação dos componentes necessários}}<br />
{{collapse bottom | Instalação dos componentes necessários}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89450PJI29006-2015-1-Wiki do Projeto2015-05-24T14:34:11Z<p>Matuzalem.m: /* Exibição de PDF com xpdf em Virtual Display */</p>
<hr />
<div>=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
<br />
===Casos de Uso===<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
==== Ciclo 1 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
<br />
==== Ciclo 2 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
<br />
==== Ciclos posteriores ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
<br />
<br />
===Sincronização de Diretórios Utilizando Rsync===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
===Exibição de PDF com xpdf em Virtual Display===<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução obsoleta, substituida pelo Web Service}}<br />
<br />
===Estudo da Raspberry Pi B+===<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API Web-Service a ser implementado na Raspberry Pi B+===<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
===API Web-Service a ser implementado no GUI===<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89449PJI29006-2015-1-Wiki do Projeto2015-05-24T14:31:57Z<p>Matuzalem.m: /* API Web-Service a ser implementado na Raspberry Pi B+ */</p>
<hr />
<div>=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
<br />
===Casos de Uso===<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
==== Ciclo 1 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
<br />
==== Ciclo 2 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
<br />
==== Ciclos posteriores ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
<br />
<br />
===Sincronização de Diretórios Utilizando Rsync===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
===Exibição de PDF com xpdf em Virtual Display===<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução atual}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução atual}}<br />
<br />
===Estudo da Raspberry Pi B+===<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API Web-Service a ser implementado na Raspberry Pi B+===<br />
<br />
{{collapse top | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno em Sucesso<br />
!scope="col"| Retorno em Fracasso<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || <center> [{"caminho":"/root/usuario/", "nome":"arquivo1.pdf","tamanho":12345},{caminho:"/root/usuario/","nome":"arquivo2.opt","tamanho":54321}] </center> || <center> [{'resultado': False}] </center> || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| <center> [{"thumb":arquivo-1.jpg}] </center> || <center> [{'resultado': False}] </center> || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <center> [{'resultado': True}] </center> || <center> [{'resultado': False}] </center>|| Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado na Raspberry Pi B+}}<br />
<br />
===API Web-Service a ser implementado no GUI===<br />
<br />
{{collapse top | API Web-Service a ser implementado no GUI}}<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@POST || /auth || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /change_passwd || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|-<br />
|@POST || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /auth/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /arquivos/{user} || <syntaxhighlight lang=java> String nomeDoUsuário </syntaxhighlight> || <syntaxhighlight lang=java> Lista listaDeArquivos </syntaxhighlight>|| Caso o usuário exista, então o servidor retorna uma lista com todos os arquivos do usuário. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
|-<br />
|@DELETE || /arquivos/{nome} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@DELETE || /deletar/{user}|| <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@GET || /salas || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<br />
|-<br />
|}<br />
<br />
{{collapse bottom | API Web-Service a ser implementado no GUI}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Matuzalem_Muller&diff=89107Matuzalem Muller2015-05-16T01:56:47Z<p>Matuzalem.m: </p>
<hr />
<div>Ingressou na Instituição de Ensino em 2009, inicialmente no ensino médio. Após a conclusão do mesmo, ingressou na [http://wiki.sj.ifsc.edu.br/index.php/Curso_de_Engenharia_de_Telecomunica%C3%A7%C3%B5es Engenharia de Telecomunicações], a qual está cursando atualmente [http://wiki.sj.ifsc.edu.br/index.php/Engenharia_de_Telecomunica%C3%A7%C3%B5es_6%C2%AA_Fase (6º período)].<br />
<br />
;Informações:<br />
<br />
Currículo Lattes: [http://buscatextual.cnpq.br/buscatextual/visualizacv.do?metodo=apresentar&id=K8158513U5 Matuzalém Muller dos Santos]<br />
<br />
Email: matuzalemifsc'''[at]'''gmail.com<br />
<br />
== Projetos Participantes ==<br />
{{collapse top|Bolsas de Extensão}}<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Programa%C3%A7%C3%A3o_visual_%2B_game_design_e_seus_recursos_pedag%C3%B3gicos Programação visual + game design e seus recursos pedagógicos]<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_2 Mulheres na Engenharia - Pagina do Bolsista]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_1_2015/1 Oficina 1]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 Oficina 2]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_3_2015/1 Oficina 3]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_4_2015/1 Oficina 4]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_5_2015/1 Oficina 5]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_6_2015/1 Oficina 6]<br />
{{collapse bottom|Bolsa de Extensão}}<br />
<br />
==Trabalhos do Curso==<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Alarme_MIC29004-2014-1 Projeto Final de Microprocessadores: Simulador de Alarme de Loja]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/index.php/RED29004-2014-1-Seminario1-VPN Seminário de Redes de Computadores I - VPN]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projetos_Finais_CIL29003#EQUIPE_3_-_Veloc.C3.ADmetro_e_Acelerador_Digital Projeto Final de Circuitos Lógicos: Velocímetro e Acelerador Digital]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Seguran%C3%A7a_em_Redes_de_Computadores_-_RED29005 Seminário de Redes de Computadores II - Segurança em Rede de Computadores]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Aproex_03/2014_-_Bolsista_2&diff=89106Projeto Aproex 03/2014 - Bolsista 22015-05-16T01:49:51Z<p>Matuzalem.m: </p>
<hr />
<div>__NOTOC__<br />
== Projeto ==<br />
<br />
* Link Curto para esta página: http://goo.gl/EX6xEy<br />
* [http://wiki.sj.ifsc.edu.br/index.php/APROEX_%C2%AD_No_03/2014:_Mulheres_na_Engenharia:_quebrando_paradigmas Mulheres na Engenharia: Quebrando Paradigmas]<br />
* Página do outro bolsista: [http://wiki.sj.ifsc.edu.br/index.php/Matheus_Fabro Matheus Fabro] (página da bolsista que ocupava a vaga anteriormente: [http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_1 Flávia Barbosa]).<br />
* Período: 2014/2 - 2015/1<br />
* Reportagens sobre o projeto:<br />
**http://www.sj.ifsc.edu.br/index.php/component/content/article/599<br />
**http://www.sj.ifsc.edu.br/index.php/component/content/article/707-2015-05-13-15-57-00<br />
<br />
== Bolsista ==<br />
<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Usu%C3%A1rio:Matuzalem.m Matuzalem Muller]<br />
*<font color=darkred>'''O bolsista desvinculou-se do projeto no dia 15 de maio de 2015 devido ao ingresso no programa de intercâmbio [http://www.cienciasemfronteiras.gov.br/web/csf Ciência sem Fronteiras], portanto os relatórios de atividades não serão mais atualizados, bem como atividades do projeto!'''</font> (Obtenha mais informações sobre as atividades realizadas na página do bolsista [http://wiki.sj.ifsc.edu.br/index.php/Matheus_Fabro Matheus]).<br />
<br />
====Horários de Trabalho====<br />
<br />
* <strike> Terça e Quinta: 07h30 - 09h20 </strike><br />
<br />
==== Descrição ====<br />
<font color=darkred>'''Última atualização'''</font>: 15 de maio de 2015.<br />
<br />
O objetivo geral do projeto é o despertar vocacional de alunas do ensino médio para carreiras da engenharia, em particular da área das Telecomunicações.<br />
<br />
Em 2014, os bolsistas realizaram oficinas com utilização da ferramenta de programação [https://scratch.mit.edu/ Scratch] com os alunos do colégio municipal [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek], descritas no cronograma de atividades de [http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_2#Semestre_2014/2 2014]. Apesar da natureza do projeto, os bolsistas realizaram as oficinas com todos os alunos das turmas envolvidas. Também foram realizadas palestras pelos professores [http://wiki.sj.ifsc.edu.br/index.php/Usu%C3%A1rio:Eraldo_Silveira_e_Silva Eraldo], [http://wiki.sj.ifsc.edu.br/index.php/Diego_da_Silva_de_Medeiros Diego] e Maria Collares, além de uma visita ao campus do IFSC-SJ.<br />
<br />
Em 2015, foi dada continuidade aos trabalhos iniciados em 2014 com os alunos do colégio [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek] e do próprio campus do [http://www.sj.ifsc.edu.br/ IFSC São José], com outras ferramentas auxiliares. Utilizou-se principalmente o kit [http://www.lego.com/en-us/mindstorms/products/31313-mindstorms-ev3 EV3], juntamente com seu [http://www.lego.com/en-gb/mindstorms/downloads/download-software software de programação]. Pensa-se ainda em realizar atividades de visita a museus virtuais e discussões em mesas redondas com os alunos sobre o tema Mulheres na Engenharia.<br />
<br />
Vídeos de utilização do kit EV3 explorando suas potencialidades abaixo:<br />
<br />
<center>{{#ev:youtube|n15i-OjXync#!|320}} {{#ev:youtube|IggY-NaLsG4|320}} </center><br />
<br />
== Atividades ==<br />
<br />
=== Semestre 2014/2 ===<br />
<br />
{{collapse top|Cronograma}}<br />
<br />
==== Semana 1 ==== <br />
* Reunião com definição de metas e atividades do projeto<br />
<br />
==== Semana 2 ====<br />
* Estudo da [http://www.picocricket.com/picoboard.html picoboard], com desenvolvimento de um [https://docs.google.com/file/d/0B-2O6TZsN1ybdlhFUFlhMWwtbTA/edit programa teste] para compreender as funcionalidades da mesma<br />
* Visita ao laboratório de informática do colégio [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek], para análise dos computadores e viabilidade de oficinas<br />
* Reunião com definição de metas e atividades para a semana seguinte, e discussão sobre o planejamento de oficinas.<br />
<br />
==== Semana 3 ====<br />
* Foram recolhidos sete computadores do colégio [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek], e entregues ao setor de manutenção do IFSC-SJ.<br />
<br />
==== Semana 4 ====<br />
* Os bolsistas desenvolveram possíveis temas para a serem trabalhados nas oficinas ministradas no [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek]<br />
* Reunião com definição de metas e atividades para a semana seguinte, e discussão sobre o planejamento de oficinas<br />
<br />
==== Semana 5 ====<br />
* Definição do projeto final: Controle de Acesso<br />
* Os bolsistas planejaram como/quando poderiam ser ministradas as oficinas, pensando na organização das oficinas voltadas ao projeto final <br />
** Possíveis datas de oficinas (todos os dias são quintas feiras): 30/10, 13/10, 27/10, 11/12.<br />
** Planejamento de oficinas:<br />
*** ''Oficina 1'': Apresentação do software e elaboração de um programa juntamente/dinamicamente com os alunos. ([https://docs.google.com/file/d/0B-2O6TZsN1ybN050djBnU3pYYVE/edit Programa Proposto])<br />
*** ''Oficina 2'': O objetivo será, sobretudo, trabalhar com variáveis e lógica programacional, conceitos importantes a serem abordados para o projeto final<br />
*** ''Oficina 3'': De acordo com o rendimento da turma e melhor esclarecimento de como será concebido o projeto final (Controle de Acesso), esta oficina ainda não possui um objetivo definido. Pensa-se em utilizar as [http://www.picocricket.com/picoboard.html picoboards], mas caso a turma ainda apresente dificuldades em utilizar o software e deficiências em conceitos iniciais (especialmente a utilização e importância de variáveis no programa), será ministrada uma oficina com o mesmo objetivo da anterior<br />
*** ''Oficina 4'': Elaboração no estilo "competição" do projeto final, encerrando as oficinas no segundo semestre de 2014<br />
<br />
==== Semana 6, 7 e 8 ====<br />
* Manutenção dos computadores, juntamente com os funcionários da manutenção do IFSC-SJ<br />
** A manutenção demorou a ser realizada pois o bolsista encontrava-se atarefado com atividades curriculares<br />
<br />
==== Semana 9 ====<br />
* Os computadores foram entregues ao [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek], e foram obtidos mais 10 computadores para manutenção<br />
<br />
==== Semana 10 ====<br />
* Manutenção dos computadores, juntamente com os funcionários da manutenção do IFSC-SJ<br />
<br />
==== Semana 11 ====<br />
* Os computadores foram entregues ao [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek], completando a revitalização do laboratório de informática<br />
* Foi ministrada a primeira oficina para a turma de alunos, tendo como base um [https://docs.google.com/file/d/0B-2O6TZsN1ybN050djBnU3pYYVE/edit programa] desenvolvido em um projeto de extensão [http://wiki.sj.ifsc.edu.br/index.php/Programa%C3%A7%C3%A3o_visual_%2B_game_design_e_seus_recursos_pedag%C3%B3gicos anterior]. Os alunos apresentaram entusiasmo ao decorrer da oficina, mas pela limitação física do ambiente e o número elevado de alunos, em certos pontos da oficina se dispersaram. Três alunas apresentaram interesse claro no projeto, conversando com o bolsista sobre o curso.<br />
<br />
==== Semana 12 ====<br />
* Foi realizada a primeira reunião geral do projeto, com todos os integrantes do mesmo. Foi decidido que é inviável o desenvolvimento de um projeto final de magnitude anteriormente planejada, e que o número de oficinas ministrado este semestre será limitado a três, tendo sido uma já ministrada. Também foi discutido o planejamento para o gasto da verba do projeto.<br />
* Na quarta-feira os alunos visitaram o campi [http://www.sj.ifsc.edu.br/ São José], no qual foram promovidas paletras e demais atividades. O bolsista não pode participar pois encontrava-se ocupado com atividades acadêmicas.<br />
* Na quinta-feira o bolsista ministrou uma oficina para os alunos, no período matutino. Foram utilizadas 3 aulas, desenvolvendo um jogo disponível neste [https://docs.google.com/file/d/0B-2O6TZsN1ybc1QzdXhfeW1fajQ/edit link].<br />
<br />
==== Semana 13 ====<br />
* Na segunda-feira houve a última reunião do semestre, para discutir o encerramento das atividades, e planejar as atividades do próximo semestre.<br />
* Na quarta-feira o bolsista realizou uma dinâmica com os alunos, que consistia na resolução de problemas lógicos clássicos. Os alunos participaram ativamente da dinâmica, e foram entregues premiações aos melhores colocados.<br />
** Integrantes das equipes:<br />
*** Equipe 1: João Victor Machado e Vitor Araújo (1º Colocado)<br />
*** Equipe 2: Narieli, Renan e Cristielen (2º Colocado)<br />
*** Equipe 3: Marcelly, Victor, Raul e Murilo (3º Colocado)<br />
*** Equipe 4: Sara Helena, Salomão Nascimento, Lucas Pacheco e Guilherme Evandro<br />
*** Equipe 5: Matheus dos Santos e Arilino Oliveira<br />
*** Equipe 6: Christian e Leonardo<br />
<br />
[[Arquivo:Premiacao JK.jpg|350px|center]]<br />
<center>''Premiação entregue as equipes - Chocolates''</center><br />
<br />
==== Semana 14 ====<br />
* Atividades do semestre encerradas<br />
{{collapse bottom|Cronograma}}<br />
<br />
=== Semestre 2015/1 ===<br />
<br />
{{collapse top |Cronograma}}<br />
==== Semana 1 ====<br />
* Na quarta-feira houve uma reunião com definição de metas e atividades do projeto para o semestre 2015/1, e discussão sobre a admissão de outro bolsista.<br />
** EDIT: Bolsista escolhido: Matheus Fabro.<br />
<br />
==== Semana 2 ====<br />
* Na terça e quinta-feira os bolsistas exploraram o uso do kit Mindstorm [http://www.lego.com/en-us/mindstorms/products/31313-mindstorms-ev3 EV3], emprestado pelo professor [http://wiki.sj.ifsc.edu.br/index.php/Diego_da_Silva_de_Medeiros Diego]. Também estudaram alternativas para sua programação, concentrando-se no uso de programação simples através de blocos lógicos, achando os softwares [http://www.lejos.org/ LeJOS], [http://enchanting.robotclub.ab.ca/tiki-index.php Enchanting] (módulo para programação do kit em Scratch) e [http://snap.berkeley.edu/snapsource/snap.html Snap!]. Também foi explorada a utilização de aplicativos android preexistentes, como o [https://play.google.com/store/apps/details?id=com.lego.mindstorms.robotcommander Mindstorm Commander]. Vídeo de teste do aplicativo com o kit EV3 abaixo:<br />
<br />
{{collapse top|Vídeo}}<br />
<center>{{#ev:youtube|n15i-OjXync#!}} </center><br />
{{collapse bottom|Vídeo}}<br />
<br />
* Na quinta-feira houve uma reunião para discussão das funcionabilidades do kit [http://www.lego.com/en-us/mindstorms/products/31313-mindstorms-ev3 EV3] e seu método de programação.<br />
<br />
==== Semana 3 ====<br />
* Na terça-feira o Kit foi montado na formação [http://www.lego.com/en-gb/mindstorms/build-a-robot/ev3rstorm EV3RSTORM], e foram realizados testes com o aplicativo android [https://play.google.com/store/apps/details?id=com.lego.mindstorms.robotcommander Mindstorm Commander].<br />
* Na quinta-feira os bolsistas iniciaram os estudos de programação do Kit EV3, com a utilização do software [http://www.lego.com/en-gb/mindstorms/downloads/download-software Lego Mindstorms EV3 Software]. Também houve uma breve reunião com o coordenador (Eraldo), com discussão da logística de oficinas para o ano.<br />
<br />
==== Semana 4 ====<br />
* Na terça-feira os bolsistas concentraram-se na programação do robô [http://www.lego.com/en-gb/mindstorms/build-a-robot/ev3rstorm EV3RSTORM], visando as futuras oficinas a serem ministradas.<br />
* Na quinta-feira os bolsistas dedicaram-se a construção de uma "mão" para o [http://www.lego.com/en-gb/mindstorms/build-a-robot/ev3rstorm EV3RSTORM], resultado demonstrado no vídeo abaixo.<br />
<br />
{{collapse top|Vídeo}}<br />
<center>{{#ev:youtube|TR3YdggB3sE}} </center><br />
{{collapse bottom|Vídeo}}<br />
<br />
==== Semana 5 ====<br />
* Nos encontros desta semana os bolsistas dedicaram-se ao desenvolvimento de programas a serem utilizados nas oficinas. Nenhum programa chegou a ser definido como modelo, mas surgiram ideias como a exposta abaixo: <br />
<br />
{{collapse top|Vídeo}}<br />
<center>{{#ev:youtube|IggY-NaLsG4}} </center><br />
{{collapse bottom|Vídeo}}<br />
<br />
==== Semana 6 ====<br />
<br />
* Na terça-feira os bolsistas concentram-se em desenvolver uma metodologia a ser utilizada quinta-feira, data da primeira oficina do semestre a ser ministrada para a 6ª fase do curso Integrado de Técnico em Telecomunicações do IFSC.<br />
<br />
* Quinta-feira foi dada a primeira oficina, relatada neste [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_1_2015/1 link].<br />
<br />
==== Semana 7 ====<br />
<br />
* Terça-feira foi ministrada uma oficina, relatada neste [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 link]. Na sequência é apresentado um vídeo com a execução de um programa elaborado por um dos alunos.<br />
<br />
{{collapse top|Vídeo}}<br />
<center>{{#ev:youtube|Jx0sYgwDqWQ}} </center><br />
{{collapse bottom|Vídeo}}<br />
<br />
==== Semana 8 ====<br />
<br />
* Terça-feira foi ministrada uma oficina para os alunos da [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR EEB Juscelino Kubitschek], relatada neste [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 link]. O IFSC foi responsável pela locomoção dos estudantes, e os bolsistas acompanharam os alunos no trajeto.<br />
<br />
==== Semana 9 ====<br />
<br />
* Quinta-feira foi discutido o planejamento para realização das futuras oficinas e desenvolvimento de atividades de encerramento do projeto. Abaixo segue um planejamento preliminar das atividades a serem realizadas ate o fim do projeto:<br />
**28/04 - Oficina com alunos do terceiro ano da Escola JK;<br />
**30/04 - Oficina com alunos do integrado do IFSC-SJ;<br />
**05/05 - Oficina com alunos do terceiro ano da Escola JK;<br />
**07/05 - Oficina preparatória para o Desafio Final Mindstorm, com alunos da Eng. Telecom;<br />
**12 ou 14/05 - Oficina preparatória Desafio Final Mindstorm, com alunos da Eng. Telecom;<br />
**19/05 - Oficina Final com os alunos do terceiro ano da Escola JK;<br />
**21/05 - Primeira Oficina do Desafio Final Mindstorm;<br />
**26/05 à 29/05 - Oficinas do Desafio Final Mindstorm, datas a combinar com os alunos;<br />
**01/06 à 05/06 - Oficinas do Desafio Final Mindstorm, datas a combinar com os alunos;<br />
**08/06 à 12/06 - Competição Desafio Final Mindstorm;<br />
**'''OBS'''.: Cronograma sujeito a alterações.<br />
<br />
==== Semana 10 ====<br />
* Quinta-feira foi realizada uma reunião para demonstrar ao professor Eraldo as funcionalidades do kit Mindstorm, assim como sua programação. Também foram discutidas as próximas oficinas a serem ministradas, e propostas de projetos referentes ao Desafio Final.<br />
<br />
==== Semana 11 ====<br />
<br />
* Quinta-feira foi ministrada uma oficina, relatada neste [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_4_2015/1 link]. Na sequência é apresentado um vídeo com a execução de um programa elaborado por uma das duplas de alunos.<br />
<br />
{{collapse top|Vídeo}}<br />
<center>{{#ev:youtube|Xt2p2hrtS8I}} </center><br />
{{collapse bottom|Vídeo}}<br />
<br />
==== Semana 12 ====<br />
<br />
* Quinta-feira foi ministrada uma oficina, relatada neste [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_5_2015/1 link].<br />
<br />
==== Semana 13 ====<br />
<br />
* Terça-feira foi ministrada uma oficina, relatada neste [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_6_2015/1 link]<br />
<br />
==== <center> <font color=darkred>'''Atividades encerradas!''' </font> </center> ====<br />
<br />
{{collapse bottom|Cronograma}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Matuzalem_Muller&diff=89105Matuzalem Muller2015-05-16T01:26:41Z<p>Matuzalem.m: /* Projetos Participantes */</p>
<hr />
<div>Ingressou na Instituição de Ensino em 2009, inicialmente no ensino médio. Após a conclusão do mesmo, ingressou na [http://wiki.sj.ifsc.edu.br/index.php/Curso_de_Engenharia_de_Telecomunica%C3%A7%C3%B5es Engenharia de Telecomunicações], a qual está cursando atualmente [http://wiki.sj.ifsc.edu.br/index.php/Engenharia_de_Telecomunica%C3%A7%C3%B5es_6%C2%AA_Fase (6º período)].<br />
<br />
;Informações:<br />
<br />
Currículo Lattes: [http://buscatextual.cnpq.br/buscatextual/visualizacv.do?metodo=apresentar&id=K8158513U5 Matuzalém Muller dos Santos]<br />
<br />
Email: matuzalemifsc'''[at]'''gmail.com<br />
<br />
== Projetos Participantes ==<br />
{{collapse top|expand = 1|Bolsas de Extensão}}<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Programa%C3%A7%C3%A3o_visual_%2B_game_design_e_seus_recursos_pedag%C3%B3gicos Programação visual + game design e seus recursos pedagógicos]<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_2 Mulheres na Engenharia - Pagina do Bolsista]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_1_2015/1 Oficina 1]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 Oficina 2]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_3_2015/1 Oficina 3]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_4_2015/1 Oficina 4]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_5_2015/1 Oficina 5]<br />
**[http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_6_2015/1 Oficina 6]<br />
{{collapse bottom|Bolsa de Extensão}}<br />
<br />
==Trabalhos do Curso==<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Alarme_MIC29004-2014-1 Projeto Final de Microprocessadores: Simulador de Alarme de Loja]<br />
<br />
* [http://wiki.sj.ifsc.edu.br/index.php/RED29004-2014-1-Seminario1-VPN Seminário de Redes de Computadores I - VPN]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Projetos_Finais_CIL29003#EQUIPE_3_-_Veloc.C3.ADmetro_e_Acelerador_Digital Projeto Final de Circuitos Lógicos: Velocímetro e Acelerador Digital]<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Seguran%C3%A7a_em_Redes_de_Computadores_-_RED29005 Seminário de Redes de Computadores II - Segurança em Rede de Computadores]</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Mulheres_na_Engenharia_-_Oficina_6_2015/1&diff=89104Mulheres na Engenharia - Oficina 6 2015/12015-05-16T01:26:15Z<p>Matuzalem.m: </p>
<hr />
<div>__NOTOC__<br />
== Descrição ==<br />
<br />
Página referente à Oficina 6 do projeto [http://wiki.sj.ifsc.edu.br/index.php/APROEX_%C2%AD_No_03/2014:_Mulheres_na_Engenharia:_quebrando_paradigmas Mulheres na Engenharia], ministrada no dia 12 de maio de 2015. <br />
<br />
'''Destaque em''': http://www.sj.ifsc.edu.br/index.php/component/content/article/707-2015-05-13-15-57-00<br />
<br />
== Ministrantes da Oficina ==<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Matuzalem_Muller Matuzalem Muller]<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Matheus_Fabro Matheus Fabro]<br />
<br />
== Coordenador do Projeto ==<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Usu%C3%A1rio:Eraldo_Silveira_e_Silva Eraldo Silveira e Silva]<br />
<br />
== Horário da Oficina ==<br />
<br />
* Terça-feira (12/05/2015) - 8:30am às 10:00am<br />
<br />
== Objetivos da Oficina ==<br />
<br />
O objetivo da oficina com os robôs Lego Mindstorms foi incentivar os alunos a programação, raciocínio lógico e trabalho em equipe.<br />
A oficina foi realizada no Laboratório de Redes II, no Instituto Federal de Santa Catarina(IFSC), com alunos do terceiro ano do ensino médio da [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR EEB Juscelino Kubitschek].<br />
<br />
== Descrição da Oficina ==<br />
<br />
Inicialmente foi feita uma introdução ao projeto em si, com explicação dos objetivos do mesmo e atividades realizadas até o presente momento. Adicionalmente foi explicado o funcionamento do [http://www.lego.com/en-us/mindstorms/downloads/download-software software de programação] do kit [http://www.lego.com/en-us/mindstorms/downloads/download-software EV3 Mindstorm], com auxílio de uma apresentação disponível em [http://wiki.sj.ifsc.edu.br/images/c/c9/Slide.odp slides].<br />
<br />
Após a oficina, o professor Eraldo motivou os alunos a entrar no curso, falando sobre a organização do mesmo e explicando aos alunos as possibilidades de carreira de egressos da [http://wiki.sj.ifsc.edu.br/index.php/Curso_de_Engenharia_de_Telecomunica%C3%A7%C3%B5es Engenharia de Telecomunicações]. Complementarmente, falou sobre a organização do campus e as atividades internas, referentes a projetos de pesquisa e extensão, e sobre o auxílio estudantil.<br />
<br />
== Metodologia ==<br />
<br />
Após a apresentação inicial do projeto os monitores auxiliaram os alunos no desenvolvimento de programas a sua livre escolha, utilizando principalmente os sensores sonoros e de movimentação. Após a atividade, o professor Eraldo conversou com os alunos sobre o curso e a instituição.<br />
<br />
== Resultado ==<br />
<br />
Os alunos trabalharam de forma organizada e sempre demonstrando grande interesse no decorrer da atividade, não apresentando dificuldades em trabalhar com o [http://www.lego.com/en-us/mindstorms/downloads/download-software software de programação]. Os alunos gostaram da atividade, aparentando estarem motivados a participar ativamente do projeto.<br />
<br />
<center>[[Arquivo:11234974 934978909879264 8861045915433421407 n.jpg | 400px]] </center><br />
<br />
<center> ''Foto da oficina realizada'' </center></div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Projeto_Aproex_03/2014_-_Bolsista_2&diff=89103Projeto Aproex 03/2014 - Bolsista 22015-05-16T01:25:03Z<p>Matuzalem.m: /* Semana 11 */</p>
<hr />
<div>__NOTOC__<br />
== Projeto ==<br />
<br />
* Link Curto para esta página: http://goo.gl/EX6xEy<br />
* [http://wiki.sj.ifsc.edu.br/index.php/APROEX_%C2%AD_No_03/2014:_Mulheres_na_Engenharia:_quebrando_paradigmas Mulheres na Engenharia: Quebrando Paradigmas]<br />
* Página do outro bolsista: [http://wiki.sj.ifsc.edu.br/index.php/Matheus_Fabro Matheus Fabro] (página da bolsista que ocupava a vaga anteriormente: [http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_1 Flávia Barbosa]).<br />
* Período: 2014/2 - 2015/1<br />
* Reportagem sobre o projeto: http://www.sj.ifsc.edu.br/index.php/component/content/article/599<br />
<br />
== Bolsista ==<br />
<br />
* [http://wiki.sj.ifsc.edu.br/index.php/Usu%C3%A1rio:Matuzalem.m Matuzalem Muller]<br />
<br />
====Horários de Trabalho====<br />
<br />
* Segunda e Terça: 07h30 - 09h20<br />
<br />
==== Descrição ====<br />
;Seção sujeita a mudanças, atualizada em 01/03/2015.<br />
<br />
O objetivo geral do projeto é o despertar vocacional de alunas do ensino médio para carreiras da engenharia, em particular da área das Telecomunicações.<br />
<br />
Em 2014, os bolsistas realizaram oficinas com utilização da ferramenta de programação [https://scratch.mit.edu/ Scratch] com os alunos do colégio municipal [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek], descritas no cronograma de atividades de [http://wiki.sj.ifsc.edu.br/index.php/Projeto_Aproex_03/2014_-_Bolsista_2#Semestre_2014/2 2014]. Apesar da natureza do projeto, os bolsistas realizaram as oficinas com todos os alunos das turmas envolvidas. Também foram realizadas palestras pelos professores [http://wiki.sj.ifsc.edu.br/index.php/Usu%C3%A1rio:Eraldo_Silveira_e_Silva Eraldo], [http://wiki.sj.ifsc.edu.br/index.php/Diego_da_Silva_de_Medeiros Diego] e Maria Collares, além de uma visita ao campus do IFSC-SJ.<br />
<br />
Em 2015, planeja-se continuar os trabalhos iniciados em 2014 com os alunos do colégio [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek], com outras ferramentas auxiliares. Além do Scratch, pensa-se utilizar as placas [http://makeymakey.com/ Makey Makey] e [http://www.picocricket.com/picoboard.html Picoboard] e kits educacionais Mindstorm [http://www.lego.com/en-us/mindstorms/products/31313-mindstorms-ev3 EV3].<br />
<br />
Planeja-se que com as placas os alunos obtenham afinidade com a lógica programacional, para que posteriormente tenham facilidade na utilização do kit EV3.<br />
<br />
Vídeos de utilização do kit EV3 explorando suas potencialidades abaixo:<br />
<br />
<center>{{#ev:youtube|n15i-OjXync#!|320}} {{#ev:youtube|IggY-NaLsG4|320}} </center><br />
<br />
== Atividades ==<br />
<br />
=== Semestre 2014/2 ===<br />
<br />
{{collapse top|Cronograma}}<br />
<br />
==== Semana 1 ==== <br />
* Reunião com definição de metas e atividades do projeto<br />
<br />
==== Semana 2 ====<br />
* Estudo da [http://www.picocricket.com/picoboard.html picoboard], com desenvolvimento de um [https://docs.google.com/file/d/0B-2O6TZsN1ybdlhFUFlhMWwtbTA/edit programa teste] para compreender as funcionalidades da mesma<br />
* Visita ao laboratório de informática do colégio [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek], para análise dos computadores e viabilidade de oficinas<br />
* Reunião com definição de metas e atividades para a semana seguinte, e discussão sobre o planejamento de oficinas.<br />
<br />
==== Semana 3 ====<br />
* Foram recolhidos sete computadores do colégio [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek], e entregues ao setor de manutenção do IFSC-SJ.<br />
<br />
==== Semana 4 ====<br />
* Os bolsistas desenvolveram possíveis temas para a serem trabalhados nas oficinas ministradas no [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek]<br />
* Reunião com definição de metas e atividades para a semana seguinte, e discussão sobre o planejamento de oficinas<br />
<br />
==== Semana 5 ====<br />
* Definição do projeto final: Controle de Acesso<br />
* Os bolsistas planejaram como/quando poderiam ser ministradas as oficinas, pensando na organização das oficinas voltadas ao projeto final <br />
** Possíveis datas de oficinas (todos os dias são quintas feiras): 30/10, 13/10, 27/10, 11/12.<br />
** Planejamento de oficinas:<br />
*** ''Oficina 1'': Apresentação do software e elaboração de um programa juntamente/dinamicamente com os alunos. ([https://docs.google.com/file/d/0B-2O6TZsN1ybN050djBnU3pYYVE/edit Programa Proposto])<br />
*** ''Oficina 2'': O objetivo será, sobretudo, trabalhar com variáveis e lógica programacional, conceitos importantes a serem abordados para o projeto final<br />
*** ''Oficina 3'': De acordo com o rendimento da turma e melhor esclarecimento de como será concebido o projeto final (Controle de Acesso), esta oficina ainda não possui um objetivo definido. Pensa-se em utilizar as [http://www.picocricket.com/picoboard.html picoboards], mas caso a turma ainda apresente dificuldades em utilizar o software e deficiências em conceitos iniciais (especialmente a utilização e importância de variáveis no programa), será ministrada uma oficina com o mesmo objetivo da anterior<br />
*** ''Oficina 4'': Elaboração no estilo "competição" do projeto final, encerrando as oficinas no segundo semestre de 2014<br />
<br />
==== Semana 6, 7 e 8 ====<br />
* Manutenção dos computadores, juntamente com os funcionários da manutenção do IFSC-SJ<br />
** A manutenção demorou a ser realizada pois o bolsista encontrava-se atarefado com atividades curriculares<br />
<br />
==== Semana 9 ====<br />
* Os computadores foram entregues ao [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek], e foram obtidos mais 10 computadores para manutenção<br />
<br />
==== Semana 10 ====<br />
* Manutenção dos computadores, juntamente com os funcionários da manutenção do IFSC-SJ<br />
<br />
==== Semana 11 ====<br />
* Os computadores foram entregues ao [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR Juscelino Kubitschek], completando a revitalização do laboratório de informática<br />
* Foi ministrada a primeira oficina para a turma de alunos, tendo como base um [https://docs.google.com/file/d/0B-2O6TZsN1ybN050djBnU3pYYVE/edit programa] desenvolvido em um projeto de extensão [http://wiki.sj.ifsc.edu.br/index.php/Programa%C3%A7%C3%A3o_visual_%2B_game_design_e_seus_recursos_pedag%C3%B3gicos anterior]. Os alunos apresentaram entusiasmo ao decorrer da oficina, mas pela limitação física do ambiente e o número elevado de alunos, em certos pontos da oficina se dispersaram. Três alunas apresentaram interesse claro no projeto, conversando com o bolsista sobre o curso.<br />
<br />
==== Semana 12 ====<br />
* Foi realizada a primeira reunião geral do projeto, com todos os integrantes do mesmo. Foi decidido que é inviável o desenvolvimento de um projeto final de magnitude anteriormente planejada, e que o número de oficinas ministrado este semestre será limitado a três, tendo sido uma já ministrada. Também foi discutido o planejamento para o gasto da verba do projeto.<br />
* Na quarta-feira os alunos visitaram o campi [http://www.sj.ifsc.edu.br/ São José], no qual foram promovidas paletras e demais atividades. O bolsista não pode participar pois encontrava-se ocupado com atividades acadêmicas.<br />
* Na quinta-feira o bolsista ministrou uma oficina para os alunos, no período matutino. Foram utilizadas 3 aulas, desenvolvendo um jogo disponível neste [https://docs.google.com/file/d/0B-2O6TZsN1ybc1QzdXhfeW1fajQ/edit link].<br />
<br />
==== Semana 13 ====<br />
* Na segunda-feira houve a última reunião do semestre, para discutir o encerramento das atividades, e planejar as atividades do próximo semestre.<br />
* Na quarta-feira o bolsista realizou uma dinâmica com os alunos, que consistia na resolução de problemas lógicos clássicos. Os alunos participaram ativamente da dinâmica, e foram entregues premiações aos melhores colocados.<br />
** Integrantes das equipes:<br />
*** Equipe 1: João Victor Machado e Vitor Araújo (1º Colocado)<br />
*** Equipe 2: Narieli, Renan e Cristielen (2º Colocado)<br />
*** Equipe 3: Marcelly, Victor, Raul e Murilo (3º Colocado)<br />
*** Equipe 4: Sara Helena, Salomão Nascimento, Lucas Pacheco e Guilherme Evandro<br />
*** Equipe 5: Matheus dos Santos e Arilino Oliveira<br />
*** Equipe 6: Christian e Leonardo<br />
<br />
[[Arquivo:Premiacao JK.jpg|350px|center]]<br />
<center>''Premiação entregue as equipes - Chocolates''</center><br />
<br />
==== Semana 14 ====<br />
* Atividades do semestre encerradas<br />
{{collapse bottom|Cronograma}}<br />
<br />
=== Semestre 2015/1 ===<br />
<br />
{{collapse top| expand = 1 |Cronograma}}<br />
==== Semana 1 ====<br />
* Na quarta-feira houve uma reunião com definição de metas e atividades do projeto para o semestre 2015/1, e discussão sobre a admissão de outro bolsista.<br />
** EDIT: Bolsista escolhido: Matheus Fabro.<br />
<br />
==== Semana 2 ====<br />
* Na terça e quinta-feira os bolsistas exploraram o uso do kit Mindstorm [http://www.lego.com/en-us/mindstorms/products/31313-mindstorms-ev3 EV3], emprestado pelo professor [http://wiki.sj.ifsc.edu.br/index.php/Diego_da_Silva_de_Medeiros Diego]. Também estudaram alternativas para sua programação, concentrando-se no uso de programação simples através de blocos lógicos, achando os softwares [http://www.lejos.org/ LeJOS], [http://enchanting.robotclub.ab.ca/tiki-index.php Enchanting] (módulo para programação do kit em Scratch) e [http://snap.berkeley.edu/snapsource/snap.html Snap!]. Também foi explorada a utilização de aplicativos android preexistentes, como o [https://play.google.com/store/apps/details?id=com.lego.mindstorms.robotcommander Mindstorm Commander]. Vídeo de teste do aplicativo com o kit EV3 abaixo:<br />
<br />
{{collapse top|Vídeo}}<br />
<center>{{#ev:youtube|n15i-OjXync#!}} </center><br />
{{collapse bottom|Vídeo}}<br />
<br />
* Na quinta-feira houve uma reunião para discussão das funcionabilidades do kit [http://www.lego.com/en-us/mindstorms/products/31313-mindstorms-ev3 EV3] e seu método de programação.<br />
<br />
==== Semana 3 ====<br />
* Na terça-feira o Kit foi montado na formação [http://www.lego.com/en-gb/mindstorms/build-a-robot/ev3rstorm EV3RSTORM], e foram realizados testes com o aplicativo android [https://play.google.com/store/apps/details?id=com.lego.mindstorms.robotcommander Mindstorm Commander].<br />
* Na quinta-feira os bolsistas iniciaram os estudos de programação do Kit EV3, com a utilização do software [http://www.lego.com/en-gb/mindstorms/downloads/download-software Lego Mindstorms EV3 Software]. Também houve uma breve reunião com o coordenador (Eraldo), com discussão da logística de oficinas para o ano.<br />
<br />
==== Semana 4 ====<br />
* Na terça-feira os bolsistas concentraram-se na programação do robô [http://www.lego.com/en-gb/mindstorms/build-a-robot/ev3rstorm EV3RSTORM], visando as futuras oficinas a serem ministradas.<br />
* Na quinta-feira os bolsistas dedicaram-se a construção de uma "mão" para o [http://www.lego.com/en-gb/mindstorms/build-a-robot/ev3rstorm EV3RSTORM], resultado demonstrado no vídeo abaixo.<br />
<br />
{{collapse top|Vídeo}}<br />
<center>{{#ev:youtube|TR3YdggB3sE}} </center><br />
{{collapse bottom|Vídeo}}<br />
<br />
==== Semana 5 ====<br />
* Nos encontros desta semana os bolsistas dedicaram-se ao desenvolvimento de programas a serem utilizados nas oficinas. Nenhum programa chegou a ser definido como modelo, mas surgiram ideias como a exposta abaixo: <br />
<br />
{{collapse top|Vídeo}}<br />
<center>{{#ev:youtube|IggY-NaLsG4}} </center><br />
{{collapse bottom|Vídeo}}<br />
<br />
==== Semana 6 ====<br />
<br />
* Na terça-feira os bolsistas concentram-se em desenvolver uma metodologia a ser utilizada quinta-feira, data da primeira oficina do semestre a ser ministrada para a 6ª fase do curso Integrado de Técnico em Telecomunicações do IFSC.<br />
<br />
* Quinta-feira foi dada a primeira oficina, relatada neste [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_1_2015/1 link].<br />
<br />
==== Semana 7 ====<br />
<br />
* Terça-feira foi ministrada uma oficina, relatada neste [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 link]. Na sequência é apresentado um vídeo com a execução de um programa elaborado por um dos alunos.<br />
<br />
{{collapse top|Vídeo}}<br />
<center>{{#ev:youtube|Jx0sYgwDqWQ}} </center><br />
{{collapse bottom|Vídeo}}<br />
<br />
==== Semana 8 ====<br />
<br />
* Terça-feira foi ministrada uma oficina para os alunos da [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR EEB Juscelino Kubitschek], relatada neste [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_2_2015/1 link]. O IFSC foi responsável pela locomoção dos estudantes, e os bolsistas acompanharam os alunos no trajeto.<br />
<br />
==== Semana 9 ====<br />
<br />
* Quinta-feira foi discutido o planejamento para realização das futuras oficinas e desenvolvimento de atividades de encerramento do projeto. Abaixo segue um planejamento preliminar das atividades a serem realizadas ate o fim do projeto:<br />
**28/04 - Oficina com alunos do terceiro ano da Escola JK;<br />
**30/04 - Oficina com alunos do integrado do IFSC-SJ;<br />
**05/05 - Oficina com alunos do terceiro ano da Escola JK;<br />
**07/05 - Oficina preparatória para o Desafio Final Mindstorm, com alunos da Eng. Telecom;<br />
**12 ou 14/05 - Oficina preparatória Desafio Final Mindstorm, com alunos da Eng. Telecom;<br />
**19/05 - Oficina Final com os alunos do terceiro ano da Escola JK;<br />
**21/05 - Primeira Oficina do Desafio Final Mindstorm;<br />
**26/05 à 29/05 - Oficinas do Desafio Final Mindstorm, datas a combinar com os alunos;<br />
**01/06 à 05/06 - Oficinas do Desafio Final Mindstorm, datas a combinar com os alunos;<br />
**08/06 à 12/06 - Competição Desafio Final Mindstorm;<br />
**'''OBS'''.: Cronograma sujeito a alterações.<br />
<br />
==== Semana 10 ====<br />
* Quinta-feira foi realizada uma reunião para demonstrar ao professor Eraldo as funcionalidades do kit Mindstorm, assim como sua programação. Também foram discutidas as próximas oficinas a serem ministradas, e propostas de projetos referentes ao Desafio Final.<br />
<br />
==== Semana 11 ====<br />
<br />
* Quinta-feira foi ministrada uma oficina, relatada neste [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_4_2015/1 link]. Na sequência é apresentado um vídeo com a execução de um programa elaborado por uma das duplas de alunos.<br />
<br />
{{collapse top|Vídeo}}<br />
<center>{{#ev:youtube|Xt2p2hrtS8I}} </center><br />
{{collapse bottom|Vídeo}}<br />
<br />
==== Semana 12 ====<br />
<br />
* Quinta-feira foi ministrada uma oficina, relatada neste [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_5_2015/1 link].<br />
<br />
==== Semana 13 ====<br />
<br />
* Terça-feira foi ministrada uma oficina, relatada neste [http://wiki.sj.ifsc.edu.br/index.php/Mulheres_na_Engenharia_-_Oficina_6_2015/1 link]<br />
<br />
{{collapse bottom|Cronograma}}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Mulheres_na_Engenharia_-_Oficina_6_2015/1&diff=89102Mulheres na Engenharia - Oficina 6 2015/12015-05-16T01:24:57Z<p>Matuzalem.m: Criou página com '__NOTOC__ == Descrição == Página referente à Oficina 6 do projeto [http://wiki.sj.ifsc.edu.br/index.php/APROEX_%C2%AD_No_03/2014:_Mulheres_na_Engenharia:_quebrando_para...'</p>
<hr />
<div>__NOTOC__<br />
== Descrição ==<br />
<br />
Página referente à Oficina 6 do projeto [http://wiki.sj.ifsc.edu.br/index.php/APROEX_%C2%AD_No_03/2014:_Mulheres_na_Engenharia:_quebrando_paradigmas Mulheres na Engenharia], ministrada no dia 12 de maio de 2015. <br />
<br />
== Ministrantes da Oficina ==<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Matuzalem_Muller Matuzalem Muller]<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Matheus_Fabro Matheus Fabro]<br />
<br />
== Coordenador do Projeto ==<br />
<br />
*[http://wiki.sj.ifsc.edu.br/index.php/Usu%C3%A1rio:Eraldo_Silveira_e_Silva Eraldo Silveira e Silva]<br />
<br />
== Horário da Oficina ==<br />
<br />
* Terça-feira (12/05/2015) - 8:30am às 10:00am<br />
<br />
== Objetivos da Oficina ==<br />
<br />
O objetivo da oficina com os robôs Lego Mindstorms foi incentivar os alunos a programação, raciocínio lógico e trabalho em equipe.<br />
A oficina foi realizada no Laboratório de Redes II, no Instituto Federal de Santa Catarina(IFSC), com alunos do terceiro ano do ensino médio da [https://plus.google.com/104302685380341586986/about?gl=br&hl=pt-BR EEB Juscelino Kubitschek].<br />
<br />
== Descrição da Oficina ==<br />
<br />
Inicialmente foi feita uma introdução ao projeto em si, com explicação dos objetivos do mesmo e atividades realizadas até o presente momento. Adicionalmente foi explicado o funcionamento do [http://www.lego.com/en-us/mindstorms/downloads/download-software software de programação] do kit [http://www.lego.com/en-us/mindstorms/downloads/download-software EV3 Mindstorm], com auxílio de uma apresentação disponível em [http://wiki.sj.ifsc.edu.br/images/c/c9/Slide.odp slides].<br />
<br />
Após a oficina, o professor Eraldo motivou os alunos a entrar no curso, falando sobre a organização do mesmo e explicando aos alunos as possibilidades de carreira de egressos da [http://wiki.sj.ifsc.edu.br/index.php/Curso_de_Engenharia_de_Telecomunica%C3%A7%C3%B5es Engenharia de Telecomunicações]. Complementarmente, falou sobre a organização do campus e as atividades internas, referentes a projetos de pesquisa e extensão, e sobre o auxílio estudantil.<br />
<br />
== Metodologia ==<br />
<br />
Após a apresentação inicial do projeto os monitores auxiliaram os alunos no desenvolvimento de programas a sua livre escolha, utilizando principalmente os sensores sonoros e de movimentação. Após a atividade, o professor Eraldo conversou com os alunos sobre o curso e a instituição.<br />
<br />
== Resultado ==<br />
<br />
Os alunos trabalharam de forma organizada e sempre demonstrando grande interesse no decorrer da atividade, não apresentando dificuldades em trabalhar com o [http://www.lego.com/en-us/mindstorms/downloads/download-software software de programação]. Os alunos gostaram da atividade, aparentando estarem motivados a participar ativamente do projeto.<br />
<br />
<center>[[Arquivo:11234974 934978909879264 8861045915433421407 n.jpg | 400px]] </center><br />
<br />
<center> ''Foto da oficina realizada'' </center></div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=Arquivo:11234974_934978909879264_8861045915433421407_n.jpg&diff=89101Arquivo:11234974 934978909879264 8861045915433421407 n.jpg2015-05-16T01:23:31Z<p>Matuzalem.m: </p>
<hr />
<div></div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=88771PJI29006-2015-1-Wiki do Projeto2015-05-11T10:26:35Z<p>Matuzalem.m: /* API Web-Service a ser implementado na Raspberry Pi B+ */</p>
<hr />
<div>=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
<br />
===Casos de Uso===<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
==== Ciclo 1 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
<br />
==== Ciclo 2 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
<br />
==== Ciclos posteriores ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
<br />
<br />
===Sincronização de Diretórios Utilizando Rsync===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
===Exibição de PDF com xpdf em Virtual Display===<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução atual}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução atual}}<br />
<br />
===Estudo da Raspberry Pi B+===<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API Web-Service a ser implementado na Raspberry Pi B+===<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || [{"NomeDoArquivo":arquivo1.pdf,"TamanhoArquivo1":12345,"NumeroDePaginas":12},{"nomeDoArquivo":arquivo2.opt,"TamanhoDoArquivo":54321,"NumeroDePaginas":26}] || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumb/{''thumb''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumb </syntaxhighlight>|| [{"NomeDoArquivo":arquivo.pdf,"thumb":thumb1.jpg} || Retorna um determinado thumb (identificado por ''thumb'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
<br />
{{collapse top | Descrição das URI do GUI}}<br />
<br />
=== Descrição das URI do GUI ===<br />
<br />
<br />
1) Criar usuário.<br />
<br />
2) Excluir usuário (só ele mesmo pode ser auto excluir).<br />
<br />
3) Remover arquivo. <br />
<br />
4) Agendar sala.<br />
<br />
5) Cria subpasta para usuário.<br />
<br />
6) Excluir subpasta para usuário.<br />
<br />
7) Upload de arquivo.<br />
<br />
<br />
{{collapse bottom | Descrição das URI do GUI}}<br />
<br />
===API Web-Service a ser implementado no GUI===<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /tmp/{usuario} || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@DELETE || /tmp/{usuario} || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /abrir/{arquivo} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@POST || /tmp/usuario/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /tmp/usuario/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /tmp/usuario/{arquivo} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
<br />
|}<br />
<br />
===API Web-Service a ser implementado no Celular===<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /tmp/{usuario} || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /cfg/pass/senha || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=88770PJI29006-2015-1-Wiki do Projeto2015-05-11T09:51:52Z<p>Matuzalem.m: /* API Web-Service a ser implementado na Raspberry Pi B+ */</p>
<hr />
<div>=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
<br />
===Casos de Uso===<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
==== Ciclo 1 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
<br />
==== Ciclo 2 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
<br />
==== Ciclos posteriores ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
<br />
<br />
===Sincronização de Diretórios Utilizando Rsync===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
===Exibição de PDF com xpdf em Virtual Display===<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução atual}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução atual}}<br />
<br />
===Estudo da Raspberry Pi B+===<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API Web-Service a ser implementado na Raspberry Pi B+===<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || [{"NomeDoArquivo":arquivo1.pdf,"TamanhoArquivo1":12345,"NumeroDePaginas":12},{"nomeDoArquivo":arquivo2.opt,"TamanhoDoArquivo":54321,"NumeroDePaginas":26}] || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumbs/{''thumbInicial''}/{''numeroDeThumbs''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int thumbInicial<br />
int numThumbs </syntaxhighlight>|| [{"NomeDoArquivo":arquivo.pdf,"thumb":thumb1.jpg},{"NomeDoArquivo":arquivo.pdf,"thumb":thumb2.jpg}] || Retorna uma quantidade de Thumbs (determinada por ''numero de Thumbs'') a partir de um determinado thumb (identificado por ''thumbInicial'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
<br />
{{collapse top | Descrição das URI do GUI}}<br />
<br />
=== Descrição das URI do GUI ===<br />
<br />
<br />
1) Criar usuário.<br />
<br />
2) Excluir usuário (só ele mesmo pode ser auto excluir).<br />
<br />
3) Remover arquivo. <br />
<br />
4) Agendar sala.<br />
<br />
5) Cria subpasta para usuário.<br />
<br />
6) Excluir subpasta para usuário.<br />
<br />
7) Upload de arquivo.<br />
<br />
<br />
{{collapse bottom | Descrição das URI do GUI}}<br />
<br />
===API Web-Service a ser implementado no GUI===<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /tmp/{usuario} || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@DELETE || /tmp/{usuario} || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /abrir/{arquivo} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@POST || /tmp/usuario/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /tmp/usuario/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /tmp/usuario/{arquivo} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
<br />
|}<br />
<br />
===API Web-Service a ser implementado no Celular===<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /tmp/{usuario} || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /cfg/pass/senha || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|}</div>Matuzalem.mhttps://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=88758PJI29006-2015-1-Wiki do Projeto2015-05-10T01:55:50Z<p>Matuzalem.m: /* API Web-Service a ser implementado na Raspberry Pi B+ */</p>
<hr />
<div>=Sistema de Automatização de Sala de Aula=<br />
<br />
Esta página contém a documentação do projeto de uma Sala de Aula Inteligente, desenvolvido no contexto da disciplina de Projeto Integrador II da Engenharia de Telecomunicações do IFSC, no semestre 2015.1. Detalhes de execução do projeto podem ser encontrados nos links abaixo.<br />
<br />
* [https://dotproject.sj.ifsc.edu.br/?m=projects&a=view&project_id=14 Sistema de Gerenciamento de Projetos (dotProject)]<br />
* [http://pending... Repositório de Documentos (GIT)]<br />
<br />
<br />
<br />
==Descrição==<br />
<br />
O projeto consiste no desenvolvimento de um sistema de automatização de sala de aula, controlando o sistema de iluminação (lâmpadas), projeção e refrigeração (ar condicionado) do ambiente, a partir de um dispositivo móvel. Adicionalmente, propõe-se que o Sistema implemente um controle de acesso à sala, podendo ser efetuado através de um sistema de controle de acesso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2014-2-Wiki_do_Projeto preexistente].<br />
<br />
==Análise==<br />
<br />
===Levantamento de Requisitos===<br />
<br />
====Funcionais:====<br />
<br />
{{collapse top| Requisitos Funcionais}}<br />
<br />
'''RF01'''. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor;<br />
<br />
*'''RF01.1'''. O dispositivo móvel deve controlar o projetor (liga/desliga); <br />
*'''RF01.2'''. Carregar arquivo independente da extensão;<br />
*'''RF01.3'''. Manipular arquivos; <br />
*'''RF01.4'''. Passar slides para frente ou para trás;<br />
*'''RF01.5'''. Selecionar slide específico;<br />
*'''RF01.6'''. Congelar projetor;<br />
*'''RF01.7'''. Mudar dispositivo que irá carregar e controlar os slides;<br />
*'''RF01.8'''. Compartilhar slides com outros dispositivos da mesma rede.<br />
*'''RF01.9'''. Utilizar zoom e barra de rolagem.<br />
<br />
'''RF02'''. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas);<br />
<br />
*'''RF02.1'''. Fechar/Abrir cortinas;<br />
*'''RF02.2'''. Ligar/Apagar lâmpadas individualmente;<br />
*'''RF02.3'''. Mudar modo de operação;<br />
*'''RF02.4'''. Dimerizar lâmpadas;<br />
*'''RF02.5'''. Integração com sensor de presença e timer;<br />
*'''RF02.6'''. Notificar problemas com lâmpadas;<br />
<br />
'''RF03'''. O dispositivo móvel deve controlar a climatização do ambiente<br />
<br />
*'''RF03.1'''. Ligar/desligar ar condicionado;<br />
*'''RF03.2'''. Aumentar/diminuir a temperatura;<br />
*'''RF03.3'''. Mudar modo de operação do ar condicionado;<br />
*'''RF03.4'''. Abrir/fechar as janelas;<br />
*'''RF03.5'''. Ligar/desligar os ventiladores/exaustores;<br />
*'''RF03.6'''. Ativar Swing do ar condicionado;<br />
*'''RF03.7'''. Ligar/desligar aquecedores;<br />
*'''RF03.8'''. Aumentar/diminuir temperatura dos aquecedores.<br />
<br />
'''RF04'''. O Sistema deve implementar um controle da acesso ao meio (sala);<br />
<br />
'''RF05'''. O sistema deve implementar um gerenciador de apresentações<br />
<br />
*'''RF05.1'''. Carregar arquivos;<br />
*'''RF05.2'''. Indentificar salas e horários;<br />
*'''RF05.3'''. Verificar conflitos de agendamento;<br />
*'''RF05.4'''. Autenticar usuário;<br />
*'''RF05.5'''. Organizar arquivos em grupos (disciplina);<br />
*'''RF05.6'''. Importar/Exportar agendamentos;<br />
*'''RF05.7'''. Gerenciar cotas para arquivos;<br />
*'''RF05.8'''. Compartilhar arquivos com outros usuários;<br />
*'''RF05.9'''. Manipular arquivos.<br />
{{collapse bottom}}<br />
<br />
====Não-funcionais====<br />
<br />
{{collapse top| Requisitos Não-Funcionais}}<br />
'''RNF01'''. Aunteticação: Apenas usuários com permissão podem acessar o Sistema;<br />
<br />
'''RNF02'''. Integridade: Usuário não pode editar arquivos de outros usuários e uma sala inteligente poderá ser comandada por um único por vez;<br />
<br />
'''RNF03'''. Desempenho e Eficiência: O Sistema possui um tempo de resposta máximo para cada instrução; <br />
<br />
'''RNF04'''. Conectividade: O Sistema deve utilizar a infra-estrutura de redes já disponível no campus;<br />
<br />
'''RNF05'''. Usabilidade: A interface do Sistema deve ser intuitiva;<br />
<br />
'''RNF06'''. Restrição de Custo: O projeto possui um orçamento de no máximo U$ 100,00 (cem dólares americanos);<br />
<br />
'''RNF07'''. Escalabilidade: O Sistema deve possuir a capacidade de expandir o número de salas inteligentes de uma maneira simples.<br />
<br />
'''RNF08'''. Portabilidade: Ausência de dependências de implementações específicas de tecnologias.<br />
{{collapse bottom}}<br />
<br />
===Atores===<br />
<br />
{{collapse top| Atores}}<br />
1. Projetor: Sistema de Terceiro que projeta os arquivos. <br />
<br />
2. Ar-condicionado: Sistema de Terceiro que tem por função controlar a climatização do ambiente. <br />
<br />
3. Usuário: Indivíduo que tem permissão para controlar as funcionalidades do sistema.<br />
<br />
4. Sensor de presença: Sistema de terceiro que detecta a presença de algum indivíduo no ambiente.<br />
<br />
5. Ventilador: Sistema de terceiro que ventila o ambiente.<br />
<br />
6. Lâmpada: Sistema de terceiro utilizado para iluminação do ambiente.<br />
<br />
7. Banco de dados: Servidor para armazenar os dados e arquivos (slides) dos usuários.<br />
<br />
8. Aquecedores: Sistema de terceiro que possui a mesma funcionalidade do 2º ator, porém só eleva a temperatura do ambiente.<br />
<br />
9. Temporizador: Sistema de terceiro utilizado para iniciar ou encerar um evento. <br />
<br />
10. Cortinas: Sistema de terceiro utilizado para adequar a iluminação do ambiente.<br />
<br />
11. Controle de acesso ao meio: Sistema de terceiro utilizado para permitir o acesso ao ambiente.<br />
{{collapse bottom}}<br />
<br />
<br />
===Casos de Uso===<br />
<br />
<center>[[Arquivo:caso_de_uso.png| 650px]]</center><br />
<br />
{{collapse top| Descrição dos Casos de Uso}}<br />
<br />
====CSU01====<br />
<br />
'''Cadastrar Projetor''' <br />
<br />
'''Sumário:''' Usuário cadastra o projetor que a sala possui.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O sistema solicita que o usuário cadastre o dispositivo de projeção.<br />
<br />
2. O usuário informa qual o dispositivo que pertence a sala.<br />
<br />
3. O usuário nomeia o dispositivo de projeção<br />
<br />
4. O sistema cadastra o dispositivo informado pelo usuário.<br />
<br />
5. O usuário configura o dispositivo para cadastrar uma configuração ''default''.<br />
<br />
6. O sistema ajusta as funcionalidades do dispositivo configurado pelo usuário.<br />
<br />
'''Pós-condições:''' Dispositivo de projeção cadastrado e pronto para ser utilizado.<br />
<br />
====CSU02====<br />
<br />
'''Carregar Arquivo para Projetor'''<br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será carregado do banco de dados para o projetor.<br />
<br />
'''Ator Primário:''' Usuário<br />
<br />
'''Atores Secundários:''' Banco de dados<br />
<br />
'''Precondições:''' Usuário ter sido autenticado e ter cadastrado dispositivo de projeção.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário seleciona no banco de dados qual o arquivo que será carregado, com auxílio de um dispositivo móvel.<br />
<br />
2. O banco de dados envia para o projetor o arquivo que será exibido.<br />
<br />
'''Fluxo Alternativo (1):''' Arquivo não existe.<br />
<br />
a. O banco de dados envia uma mensagem para o usuário informando que o arquivo não existe e o usuário deve escolher outro arquivo ou carregar outro arquivo no banco de dados.<br />
<br />
'''Fluxo Alternativo (2):''' Mudar de dispositivo que irá carregar o arquivo.<br />
<br />
a. O usuário se autentica em outro dispositivo para carregar o arquivo<br />
<br />
'''Pós-condições:''' Arquivo carregado e sendo exibido pelo dispositivo de projeção<br />
<br />
====CSU03====<br />
<br />
'''Compartilhar Arquivo''' <br />
<br />
'''Sumário:''' Usuário seleciona o arquivo que será compartilhado com outros usuários que assistem à apresentação.<br />
<br />
'''Ator Primário:''' Bando de dados <br />
<br />
'''Atores Secundários:''' Outros usuários<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O banco dados disponibiliza o QR code do arquivo para os usuários.<br />
<br />
2. Os outros usuários escaneam o QR code (utilizando um aplicativo próprio para isso) do arquivo e fazem download.<br />
<br />
'''Fluxo Exceção (1):''' Sem acesso ao banco de dados.<br />
<br />
a. O ''download'' poderá ser fornecido em outro momento quando o bancos de dados estiver disponível.<br />
<br />
'''Pós-condições:''' Arquivo compartilhado com todos os usuários autenticados.<br />
<br />
====CSU04====<br />
<br />
'''Controlar Projetor''' <br />
<br />
'''Sumário:''' Usuário utiliza o sistema para controlar o projetor.<br />
<br />
'''Ator Primário:''' Usuário <br />
<br />
'''Atores Secundários:''' Projetor<br />
<br />
'''Precondições:''' Usuário ter sido autenticado, ter cadastrado dispositivo de projeção e ter carregado o arquivo.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o projetor seja ligado, com auxílio do dispositivo móvel.<br />
<br />
2. O sistema configura o projetor de acordo com as solicitações do usuário realizadas no CSU01.<br />
<br />
3. O usuário pode passar para frente ou para trás os slides.<br />
<br />
4. O usuário seleciona um slide específico.<br />
<br />
5. O usuário congela a projeção de slides.<br />
<br />
6. O usuário utiliza a barra de rolagem ou zoom para melhorar a visualização do slide.<br />
<br />
'''Fluxo Exceção (1):''' Lâmpada do projetor queimada.<br />
<br />
a. O sistema envia uma mensagem ao usuário informando que deve trocar a lâmpada do projetor.<br />
<br />
'''Fluxo Alternativo (1):''' Mudar dispositivo que irá controlar o dispositivo de projeção.<br />
<br />
a. Usuário se autentica em outro dispositivo e passa à manipular o arquivo no novo dispositivo, sem a necessidade de voltar aos casos de uso, CSU01, ou CSU02, ou ainda CSU03.<br />
<br />
'''Fluxo Alternativo (2):''' Manipular arquivos.<br />
<br />
a. Usuario seleciona outro arquivo à ser projetado, o sistema deve executar o CSU02.<br />
<br />
'''Pós-condições:''' Projetor ligado e funcionando de acordo como o usuário solicitou<br />
<br />
<br />
<center>[[Arquivo:ana4.png| 650px]]</center><br />
<br />
<br />
====CSU05====<br />
<br />
'''Cadastro da sala e dos modos de operação'''<br />
<br />
'''Sumario''': usuário cadastrar os modos de operação de cada sala.<br />
<br />
'''Ator principal''': usuário.<br />
<br />
'''Ator secundário''': banco de dados<br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema.<br />
<br />
'''Fluxo Principal'''.<br />
<br />
1. O sistema pede para cadastrar as lâmpadas e cortinas da sala.<br />
<br />
2. Usuário informa os números de cortinas e lâmpadas.<br />
<br />
3. Usuário cadastra as características de cada lâmpada.<br />
<br />
4. Usuário nomeia cada lâmpada e cortina.<br />
<br />
5.O sistema pede para cadastra os modos de operação de iluminação: cinema, aula e apresentação.<br />
<br />
6. Usuário seleciona um modo para cadastrar.<br />
<br />
7. Usuário indica quais lâmpadas ficaram acesa.<br />
<br />
8.Usuário indica qual é a intensidade das lâmpadas acesa, caso se a lâmpada possui essa característica. .<br />
<br />
9. Usuário indica em qual modo as cortinas devem ficar: aberta, fechada ou automática(as cortinas mudam sua inclinação a cada 15min, para aproveitar a luz natural).<br />
<br />
10.Informações dos modos de operação são armazenado no banco de dados.<br />
<br />
====CSU06====<br />
<br />
'''Iluminação da sala'''<br />
<br />
'''Sumario:''' usuário deseja selecionar um modo de operação. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' lâmpadas, cortinas e banco de dados . <br />
<br />
'''Precondições:''' o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1. O sistema apresenta os quatro modos de operação de iluminação: cinema, aula , apresentação e o manual. <br />
<br />
2. Usuário seleciona uma das opções.<br />
<br />
3. O sistema ajusta cortinas e lâmpadas conforme o modo desejado.<br />
<br />
4. Quando a aula acabar, o sistema deve executar caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07].<br />
<br />
'''Fluxo Alternativo (2):''' Modo de operação manual. <br />
<br />
a. Executar modo o caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU08 CSU08].<br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
'''Fluxo de Exceção (3)''': Lâmpada queimada. <br />
<br />
Caso alguma lâmpada queime, ocorre uma notificação para o sistema, para que possam substitui-la.<br />
<br />
====CSU07====<br />
<br />
<br />
'''Desligando a iluminação''' <br />
<br />
'''Sumario: '''desligando todas as luzes. <br />
<br />
'''Ator principal:''' usuário. <br />
<br />
'''Ator secundário:''' temporizador, sensor de presença, cortinas e lâmpadas. <br />
<br />
'''Precondições:''' o sensor de presença e temporiozador já devem estar cadastrada no sistema. <br />
<br />
'''Fluxo Principal''' <br />
<br />
1.Após o término da aula, o sistema liga um temporizador por um determinado tempo. <br />
<br />
2.Após de passar esse tempo o sensor de presença é ativado. <br />
<br />
3.Sensor de presença não detecta a presença de uma pessoa na sala, assim toda iluminação da sala é desligada e as cortinas fechadas. <br />
<br />
'''Fluxo Alternativo (3)''': Ainda há pessoas na sala. <br />
<br />
a. Temporizador fica acionando o sensor de presença até que não haja ninguém na sala .<br />
<br />
====CSU08====<br />
<br />
'''Iluminação da sala no modo manual''' <br />
<br />
'''Sumario''':usuário seleciona modo operação manual.<br />
<br />
'''Ator principal''': usuário. <br />
<br />
'''Ator secundário''' :lâmpadas e cortinas. <br />
<br />
'''Precondições''': o usuário já teve estar autentificado pelo sistema, as cortinas e as lâmpadas já devem estar cadastrada no sistema e usuário seleciona modo operação manual. <br />
<br />
'''Fluxo Principal'''<br />
<br />
1. Sistema apresenta todas as lâmpadas da sala. <br />
<br />
2. O usuário seleciona as lâmpadas que ele deseja acender. <br />
<br />
3. O usuário seleciona as lâmpadas que ele deseja ajustar a sua intensidade, caso a lâmpada possui essa característica. <br />
<br />
4. O usuário decide se quer abrir/fechar as cortinas da sala ou elas ficarem mo moto automático(as cortinas mudam sua inclinação a cada 15 minutos, para aproveitar a luz natural). <br />
<br />
5. Execute caso de uso [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU07 CSU07]. <br />
<br />
'''Fluxo de Exceção (2):''' Lâmpada queimada. <br />
<br />
a.Caso alguma lampada queime, ocorre uma notificação para o sistema, para que possam substitui-la <br />
<br />
'''Fluxo Alternativo (2):''' Alteração para override. <br />
<br />
a. O usuário liga ou desliga as lâmpadas pelo interruptor. <br />
<br />
b. O usuário ajusta a posição da cortina conforme sua escolha de forma manual <br />
<br />
<br />
<br />
<center>[[Arquivo:pj17.png| 650px]]</center><br />
<br />
====CSU09====<br />
<br />
'''Climatizar'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado, ventilador e aquecedor.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O sistema apresenta os aparelho de climatização disponíveis.<br />
<br />
2. O usuário escolhe um dos aparelhos.<br />
<br />
3. O usuário conforme sua escolha vai para um dos casos de uso, [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU11 CSU11], [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU12 CSU12] ou [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU13 CSU13].<br />
<br />
4. O sistema ajustas todas as funcionalidades dos aparelhos que o usuário escolheu.<br />
<br />
5. O sistema continua funcionando normalmente. <br />
<br />
<br />
'''Fluxo de Alternativo''' (5): Desativação<br />
<br />
a. O usuário solicitou ao sistema o desligamento do dispositivo de climatização.<br />
b. O sistema desliga o dispositivo.<br />
<br />
'''Pós-condições''': Aparelhos de climatização ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU10====<br />
<br />
'''Cadastrar Aparelhos'''<br />
<br />
'''Sumário''': Usuário cadastra o número de aparelhos que a sala possui.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário informa ao sistema quantos aparelhos de climatização terão na sala, como o número de ventiladores, ar condicionados e aquecedores.<br />
<br />
2. O sistema cadastra todos os aparelhos informados pelo usuário e informa as características funcionais de cada aparelho.<br />
<br />
3. O sistema salva as informações e as funcionalidades dos aparelhos são armazenadas no banco de dados.<br />
<br />
<br />
<br />
'''Pós-condições''': Aparelhos de climatização cadastrados e prontos para serem usados.<br />
<br />
====CSU11====<br />
<br />
'''Controlar Aquecedores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Aquecedores e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que o aquecedor seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o aquecedor com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do aquecedor.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Aquecedor ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU12====<br />
<br />
'''Controlar Ar Condionados'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ar condicionado e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal'''<br />
<br />
1. O usuário solicita que o ar condicionado seja ligado, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga o ar condicionado com uma temperatura padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas e portas sejam fechadas.<br />
<br />
4. O sistema disponibiliza ao usuários os modos de operação, como ventilação, aquecimento, ativar swing ou modo turbo.<br />
<br />
5. O usuário seleciona um dos modos de operação.<br />
<br />
6. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, override. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da temperatura do aparelho.<br />
<br />
a. O usuário escolhe uma temperatura do ar condicionado.<br />
b. O sistema altera a temperatura do aparelho. <br />
<br />
'''Pós-condições''': Ar condicionado ligado e funcionando conforme o usuário solicitou.<br />
<br />
====CSU013====<br />
<br />
'''Controlar Ventiladores'''<br />
<br />
'''Sumário''': Usuário utiliza o sistema para ajustar a temperatura da sala.<br />
<br />
'''Ator Primário''' : Usuário.<br />
<br />
'''Ator Secundário''': Ventilador e banco de dados.<br />
<br />
'''Pré-condições''': Usuário esta autenticado no sistema e os aparelhos cadastrados no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário solicita que os ventiladores sejam ligados, com o auxílio do dispositivo móvel.<br />
<br />
2. O sistema liga os ventiladores com uma velocidade padrão, essa que vai ser cadastrada nas configurações padrão que estarão armazenada no banco de dados.<br />
<br />
3. O sistema solicita que as janelas se abram.<br />
<br />
4. O usuário volta para [http://wiki.sj.ifsc.edu.br/index.php/PJI29006-2015-1-Wiki_do_Projeto#CSU09 CSU09].<br />
<br />
'''Fluxo Alternativo''' (1): Alteração no modo de controle do sistema.<br />
<br />
a. O usuário pode ligar os dispositivos de climatização do modo convencional, ou seja, ouverride. <br />
<br />
'''Fluxo Alternativo''' (2): Alteração da velocidade do aparelho.<br />
<br />
a. O usuário solicita que a velocidade dos ventiladores sejam aumentadas. <br />
<br />
<br />
'''Pós-condições''': Ventiladores ligados e funcionando conforme o usuário solicitou.<br />
<br />
<br />
<br />
<center>[[Arquivo:UseCase_Diagram_System2.png| 650px]]</center><br />
<br />
====CSU014====<br />
<br />
'''Carregar Arquivo para o Banco de Dados'''<br />
<br />
'''Sumário''': Usuário utiliza o banco de dados para armazenar o arquivo.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator Secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário carrega o arquivo no sistema.<br />
<br />
2. O arquivo é armazenado no Banco de Dados.<br />
<br />
'''Fluxo de Exceção''': Se o limite de armazenamento do usuário for atingido o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
====CSU015====<br />
<br />
'''Autenticar Usuário'''<br />
<br />
'''Sumário''': Autenticação do usuário no Sistema.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário conecta-se ao sistema.<br />
<br />
2. O usuário fornece suas credenciais.<br />
<br />
3. O sistema verifica se as credenciais são válidas, comparando-as com as guardadas no Banco de Dados.<br />
<br />
4. O sistema confirma as credenciais do usuário.<br />
<br />
'''Fluxo de Exceção''': As credenciais podem ser inválidas e o sistema pode negar o acesso do usuário.<br />
<br />
====CSU016====<br />
'''Agendar Salas'''<br />
<br />
'''Sumário''': Usuário agenda uma sala para utilização posterior.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário identifica salas e horários.<br />
<br />
2. O usuário seleciona um horário e sala disponíveis.<br />
<br />
3. O usuário confirma o(s) agendamento(s).<br />
<br />
'''Fluxo Alternativo''' (1): O usuário pode utilizar a interface apenas para identificar as salas e horários disponíveis/agendadas.<br />
<br />
'''Fluxo Alternativo''' (2): O usuário pode exportar/importar agendamentos e realocá-los na agenda de salas.<br />
<br />
'''Fluxo de Exceção''': Se o horário e sala selecionados estiverem ocupados o sistema emitirá um aviso sobre a impossibilidade de agendamento.<br />
<br />
====CSU017====<br />
'''Manipular Arquivos no Banco de Dados'''<br />
<br />
'''Sumário''': O usuário pode manipular arquivos e diretórios no Banco de Dados.<br />
<br />
'''Ator primário''': Usuário.<br />
<br />
'''Ator secundário''': Banco de Dados.<br />
<br />
'''Pré-condição''': Usuário está autenticado no sistema.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O usuário seleciona o arquivo ou diretório.<br />
<br />
2. O usuário seleciona a operação que deseja realizar com ele (excluir, copiar, mover, compartilhar).<br />
<br />
'''Fluxo de Exceção''' (1): Caso o usuário copie um arquivo e o limite de armazenamento do usuário for atingido, o sistema emitirá uma aviso sobre a impossibilidade de armazenar o arquivo.<br />
<br />
'''Fluxo de Exceção''' (2): Se o usuário tentar compartilhar um arquivo com um usuário inexistente, o sistema emitirá uma aviso sobre a impossibilidade de compartilhar o arquivo devido a inexistência do usuário selecionado.<br />
<br />
====CSU018====<br />
'''Carregar Arquivos para o Projetor'''<br />
<br />
'''Sumário''': O temporizador define com base em agendamentos prévios realizados pelo usuário quando carregar o arquivo para o projetor.<br />
<br />
'''Ator primário''': Temporizador.<br />
<br />
'''Atores secundários''': Projetor, Banco de Dados e Usuário.<br />
<br />
'''Pré-condição''': Agendamento prévio realizado pelo usuário.<br />
<br />
'''Fluxo Principal''':<br />
<br />
1. O temporizador verifica que há um arquivo a ser carregado para um projetor.<br />
<br />
2. O temporizador carrega o arquivo do banco de dados para o projetor.<br />
<br />
{{collapse bottom}}<br />
<br />
<br />
===Modelo de Domínio===<br />
<br />
<center>[[Arquivo:Modelo_de_Dominio2.jpg| 800px]]</center><br />
<br />
'''Arquivo''': [https://docs.google.com/file/d/0B-2O6TZsN1ybbU1pQWtOUDB2TEU/edit Diagrama no Astah].<br />
<br />
==Desenvolvimento==<br />
<br />
===Plano de Desenvolvimento===<br />
<br />
A execução do projeto, dentro da disciplina de Projeto Integrador II de 2015.1, consistirá de 2 ciclos de desenvolvimentos. Ao final de cada ciclo, os conjuntos de requisitos funcionais abaixo devem ser satisfeitos:<br />
<br />
==== Ciclo 1 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.1. O dispositivo móvel deve controlar o projetor (liga/desliga);<br />
** RF01.3. Manipular arquivos;<br />
** RF01.4. Passar slides para frente ou para trás;<br />
** RF01.5. Selecionar slide específico;<br />
*** A partir do número do slide<br />
<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.1. Carregar arquivos<br />
** RF05.2. Indentificar salas e horários<br />
** RF05.4. Autenticar usuário<br />
*** A partir de arquivo de usuário e senha<br />
<br />
==== Ciclo 2 ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.2. Carregar arquivo independente da extensão<br />
** RF01.6. Congelar projetor<br />
** RF01.7. Mudar dispositivo que irá carregar e controlar os slides<br />
** RF01.8. Compartilhar slides com outros dispositivos da mesma rede<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.6. Notificar problemas com lâmpadas<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.3. Verificar conflitos de agendamento<br />
** RF05.4. Autenticar usuário<br />
*** completo<br />
** RF05.9. Manipular arquivos<br />
<br />
==== Ciclos posteriores ====<br />
<br />
* RF01. O dispositivo móvel deve controlar a projeção de arquivos pelo projetor<br />
** RF01.5. Selecionar slide específico<br />
*** A partir de lista de slides ou Thumbs<br />
** RF01.9. Utilizar zoom e barra de rolagem<br />
* RF02. O dispositivo móvel deve controlar a iluminação da sala (controle de iluminação das lâmpadas)<br />
** RF02.1. Fechar/Abrir cortinas<br />
** RF02.2. Ligar/Apagar lâmpadas individualmente<br />
** RF02.3. Mudar modo de operação<br />
** RF02.4. Dimerizar lâmpadas<br />
** RF02.5. Integração com sensor de presença e timer<br />
* RF03. O dispositivo móvel deve controlar a climatização do ambiente<br />
** RF03.1. Ligar/desligar ar condicionado<br />
** RF03.2. Aumentar/diminuir a temperatura<br />
** RF03.3. Mudar modo de operação do ar condicionado<br />
** RF03.4. Abrir/fechar as janelas<br />
** RF03.5. Ligar/desligar os ventiladores/exaustores<br />
** RF03.6. Ativar Swing do ar condicionado<br />
** RF03.7. Ligar/desligar aquecedores<br />
** RF03.8. Aumentar/diminuir temperatura dos aquecedores<br />
* RF04. O Sistema deve implementar um controle da acesso ao meio (sala)<br />
* RF05. O sistema deve implementar um gerenciador de apresentações<br />
** RF05.5. Organizar arquivos em grupos (disciplina)<br />
** RF05.6. Importar/Exportar agendamentos<br />
** RF05.7. Gerenciar cotas para arquivos<br />
** RF05.8. Compartilhar arquivos com outros usuários<br />
<br />
<br />
===Sincronização de Diretórios Utilizando Rsync===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [1] - Solução Obsoleta }}<br />
<br />
1. Primeiramente no servidor e no cliente tem que estar instalado a ferramenta rsync. Caso não esteja:<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
2. Também no servidor deve estar instalado o servidor ssh<br />
<syntaxhighlight lang=text><br />
<br />
$ sudo apt-get install openssh-server<br />
<br />
<br />
</syntaxhighlight><br />
<br />
3. Crie o arquivo /etc/rsyncd.conf configuração para rsync. <br />
<br />
* A seguir tem um exemplo da configuração do arquivo rsyncd.conf para nosso projeto:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
# limitar o acesso aonde os usuários podem enviar arquivos<br />
use chroot = yes<br />
# número máximo de conexões<br />
max connections = 2<br />
# hosts (ips) que podem ser conectar ao servidor rsync<br />
hosts allow = 192.168.1.0/255.255.255.0<br />
timeout = 600<br />
# ignorar arquivos que não podem ser lidos<br />
ignore nonreadable = yes<br />
# usuários que podem operações de send e recv.<br />
auth users = karol<br />
# arquivo com os usuários e senhas <br />
secrets file = /etc/rsyncd.secrets<br />
# não há nenhuma restrição para manipular os arquivos e pastas <br />
uid = root<br />
gid = root<br />
dont compress = *<br />
# ativar o log de send e recv<br />
transfer logging = yes<br />
# formato do arquivo de log de transferência<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
log file = /etc/log/rsyncd.log<br />
# pastas que não serão mostradas ao adim e usuários do servidor<br />
exclude = lost+found/<br />
#pid file = /var/run/rsyncd.pid<br />
<br />
[backup]<br />
<br />
path = /home/karol/raiz<br />
read only = no<br />
comment = diretório do projetor <br />
<br />
</syntaxhighlight><br />
<br />
4. Criar /etc/rsyncd.secrets para a senha do usuário. Usuário deve ser o mesmo que o anterior, com a senha usada para fazer login na máquina remota como o usuário indicado.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ Sudo gedit /etc/rsyncd.secrets <br />
user: password<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Um exemplo do que foi feito:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsync.secrets<br />
# Usuários e senhas que se conectarão ao servidor<br />
# Formato:<br />
# <usuario>:<senha><br />
karol:karol0802<br />
<br />
</syntaxhighlight><br />
<br />
5. Criar /etc/rsyncd.log onde esse irá gravar: <br />
<br />
<syntaxhighlight lang=text><br />
%t: o tempo que foi feito o download.<br />
%h: o nome do host.<br />
%a: o ip do servidor remoto.<br />
%o: qual foi a operação que o cliente realizou (send, receive, delete).<br />
%f: nome do arquivo.<br />
%L: qual será o symlink => hardlink.<br />
%l: tamanho do arquivo em bytes.<br />
%b: número de bytes realmente transmitidos.<br />
<br />
<br />
</syntaxhighlight><br />
6. Transferindo arquivos com rsync:<br />
<br />
* Upload para o servidor:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_origem/ user@hostname:/path_destino/<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/backup/ karol@192.168.1.7:/home/karol/raiz/equipamentos/projetor/projetor1/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Download do servidor para o cliente:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /path_destino/ user@hostname:/path_origem/<br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático:<br />
<syntaxhighlight lang=text><br />
<br />
$ rsync -LCravzp /home/karol/raiz/equipamentos/projetor/projetor1/ karol@192.168.1.7:/home/karol/backup/ <br />
<br />
<br />
</syntaxhighlight><br />
<br />
* Explicação das flags:<br />
<syntaxhighlight lang=text><br />
-L: transforma link simbólico de origem em um hard link no destino.<br />
-C: auto-ignora arquivos idênticos.<br />
-r: recursividade, faz ele buscar arquivos nas subpastas.<br />
-a: indica que estarão sendo copiados arquivos.<br />
-v: modo verboso, mais informações da cópia.<br />
-z: comprime os arquivos durante a cópia.<br />
-p: indicador de progresso de cópia<br />
</syntaxhighlight><br />
<br />
7. Para criar um link simbólico da pasta do usuário para um projetor deve executar o seguinte comando.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /path_origem/arquivo /path_destino/ nome_do_link_simbolico<br />
<br />
</syntaxhighlight><br />
<br />
* Exemplo prático: <br />
<br />
<syntaxhighlight lang=text><br />
<br />
$ ln -s /home/karol/raiz/usuarios/ana/redes/lista.pdf /home/karol/raiz/equipamentos/projetor/projetor1/sb_lista.pdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync [2] - Solução Atual}}<br />
{{collapse top| Exemplo da Estrutura de Diretórios no Servidor}}<br />
<br />
<center>[[Arquivo:dire1.png| 650px]]</center><br />
<br />
{{collapse bottom}}<br />
{{collapse top|Sincronização de Relógio - NTP}}<br />
{{collapse top|Instalar NTP daemon}}<br />
<syntaxhighlight lang=text><br />
# sudo apt-get install ntp<br />
</syntaxhighlight><br />
'''Observação''': Cliente e servidor devem instalar o ntp.<br />
{{collapse bottom}}<br />
{{collapse top|Configurando NTP daemon - Servidor NTP}}<br />
<br />
'''1.'''Escolher servidores [http://www.pool.ntp.org/zone/br NTP].<br />
<syntaxhighlight lang=text><br />
server 3.br.pool.ntp.org<br />
server 1.south-america.pool.ntp.org<br />
server 0.south-america.pool.ntp.org<br />
</syntaxhighlight><br />
<br />
'''2.''' Arquivo de configuração do servidores NTP<br />
<br />
*Abrir o arquivo de configuração do Servidor NTP e substituir pela configuração abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Configuração'''<br />
<syntaxhighlight lang=text><br />
# For more information about this file, see the man pages<br />
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).<br />
<br />
driftfile /var/lib/ntp/drift<br />
<br />
# Permit time synchronization with our time source, but do not<br />
# permit the source to query or modify the service on this system.<br />
restrict default nomodify notrap nopeer noquery<br />
<br />
# Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
<br />
# Hosts on local network are less restricted.<br />
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br />
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap # permite que somente clientes da mesma subrede sincronizem com o servidor<br />
<br />
# Use public servers from the pool.ntp.org project.<br />
# Please consider joining the pool (http://www.pool.ntp.org/join.html).<br />
#server 0.fedora.pool.ntp.org iburst<br />
#server 1.fedora.pool.ntp.org iburst<br />
#server 2.fedora.pool.ntp.org iburst<br />
#server 3.fedora.pool.ntp.org iburst<br />
<br />
server 3.br.pool.ntp.org # NTP server on Brazil<br />
server 1.south-america.pool.ntp.org # NTP server on Brazil<br />
server 0.south-america.pool.ntp.org # NTP server on Brazil<br />
<br />
# Enable public key cryptography.<br />
#crypto<br />
<br />
includefile /etc/ntp/crypto/pw<br />
<br />
# Key file containing the keys and key identifiers used when operating<br />
# with symmetric key cryptography. <br />
keys /etc/ntp/keys<br />
<br />
# Specify the key identifiers which are trusted.<br />
#trustedkey 4 8 42<br />
<br />
# Specify the key identifier to use with the ntpdc utility.<br />
#requestkey 8<br />
<br />
# Specify the key identifier to use with the ntpq utility.<br />
#controlkey 8<br />
<br />
# Enable writing of statistics records.<br />
#statistics clockstats cryptostats loopstats peerstats<br />
<br />
# Disable the monitoring facility to prevent amplification attacks using ntpdc<br />
# monlist command when default restrict does not include the noquery flag. See<br />
# CVE-2013-5211 for more details.<br />
# Note: Monitoring will not be disabled with the limited restriction flag.<br />
disable monitor<br />
<br />
logfile /var/log/ntp.log - log file for NTP server<br />
</syntaxhighlight><br />
<br />
'''3.''' Configurar o '''Firewall'''<br />
<syntaxhighlight lang=text><br />
# firewall-cmd --add-service=ntp --permanent<br />
# firewall-cmd --reload<br />
</syntaxhighlight><br />
'''4.''' Iniciar servidor NTP<br />
<syntaxhighlight lang=text><br />
# systemctl start ntpd<br />
# systemctl enable ntpd<br />
# systemctl status ntpd<br />
</syntaxhighlight><br />
'''5.'''Configurar para iniciar quando o servidor reiniciar<br />
<syntaxhighlight lang=text><br />
# chkconfig ntpd on<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse top|Configurar Cliente NTP}}<br />
'''1.''' Arquivo de configuração do Cliente NTP<br />
<br />
*Abrir o arquivo de configuração do Cliente NTP e inserir o código abaixo:<br />
<syntaxhighlight lang=text><br />
# /etc/ntp.conf<br />
</syntaxhighlight><br />
<br />
*'''Código'''<br />
<syntaxhighlight lang=text><br />
server 192.168.0.103<br />
</syntaxhighlight><br />
'''2''' Comando para sincronização dos relógios entre o cliente e servidor <br />
<code><br />
# ntpdate [IP-SERVIDOR]<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Arquivo de Configuração do Rsync}}<br />
'''1'''. Edita o arquivo /etc/rsyncd.conf com a configuração logo baixo para o rsync.<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/rsyncd: configuration file for rsync daemon mode<br />
<br />
# configuration:<br />
<br />
max connections = 4<br />
timeout = 600<br />
uid = root<br />
gid = root<br />
#motd file = /srv/webba/conf/rsyncd.motd<br />
secrets file = /srv/webba/conf/rsyncd.secrets<br />
log file = /srv/webba/conf/log/rsyncd.log<br />
exclude = lost+found/<br />
<br />
[session-rasp1]<br />
<br />
path = /srv/webba//equipamentos/projetor<br />
use chroot = yes <br />
read only = no<br />
auth users = session-rasp1<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 1<br />
<br />
[session-rasp2]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp2<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 2 <br />
<br />
[session-rasp3]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes <br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp3<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 3<br />
<br />
[session-rasp4]<br />
<br />
path = /srv/webba//equipamentos/projeto<br />
use chroot = yes <br />
read only = no<br />
dont compress = *<br />
transfer logging = yes<br />
log format = %t: host %h (%a) %o %f %L (%l bytes). Total %b bytes.<br />
auth users = session-rasp4<br />
hosts allow = 192.168.0.0/255.255.255.0<br />
ignore nonreadable = yes <br />
comment = diretório da sala 4<br />
<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse top| Scripts para Teste}}<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# Dando permissão para só o root acessar o arquivo de senhas #<br />
##############################################################<br />
<br />
chown root /srv/webba/cfg/rsyncd.secrets<br />
<br />
################################################################<br />
#Subindo o daemon para o cliente poder iniciar a sincronização #<br />
################################################################<br />
<br />
rsync --daemon --config=/etc/rsyncd.conf --port=873<br />
<br />
echo " Servidor disponível para iniciar sincronização! " <br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 2. Script para o cliente}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
##############################################################<br />
# VARIAVEIS DO SISTEMA #<br />
##############################################################<br />
<br />
#modelo de execução -> /caminho_para_script/b_rynsc.sh server module user dest<br />
<br />
if [ $# -lt 3 ]; then<br />
echo "Passagem de argumentos incorreta!"<br />
exit 1<br />
fi<br />
<br />
# $0 é o próprio script<br />
<br />
# IP ou Hostname do servidor de backup<br />
server=$1<br />
<br />
#Módulo referente ao cliente<br />
module=$2<br />
<br />
#Usuário deste módulo<br />
user=$3<br />
<br />
#Destino de Sincronização<br />
dest="$4"<br />
<br />
#Servidor de Sincronização<br />
src="$user@$server::$module/"<br />
<br />
#Execução do rsync<br />
rsync='/usr/bin/rsync -LCPravzp --delete'<br />
<br />
# Arquivos de Log<br />
log=/srv/webba/cfg/log/`date +%Y-%m-%d`.log<br />
<br />
##############################################################<br />
# SINCRONIZAÇÃO #<br />
##############################################################<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
echo "---------------------- Iniciando o Sincronismo ----------------------" >> $log<br />
date "+Sistema de Sincronismo iniciado em %d-%m-%Y as %H:%M" >> $log<br />
<br />
$rsync $src $dest >> $log<br />
<br />
date "+Sistema de sincronismo terminado em %d-%m-%Y as %H:%M" >> $log<br />
echo " ---------------------- Fim do Sincronismo --------------------------" >> $log<br />
echo "Sincronismo concluido com sucesso - Por Favor consultar os arquivos de Logs" >> $log<br />
<br />
echo " " >> $log<br />
echo " " >> $log<br />
<br />
exit<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 3. Script para criação do ''symlinks''}}<br />
<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
<br />
#ordem dos parâmetros: usuário, pasta, arquivo e projetor<br />
<br />
user=$1<br />
pasta=$2<br />
arq=$3<br />
proj=$4 <br />
<br />
origem="/home/heisenberg/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
date=`date +%Y-%m-%d:%H:%M:%S` <br />
echo $date<br />
<br />
destino="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${arq}_${date}"<br />
<br />
<br />
<br />
#echo $destino<br />
<br />
<br />
file="$destino"<br />
<br />
if [ -f "$file" ]<br />
then<br />
<br />
#echo "$file Arquivo já exisistente, remomeação automatica."<br />
<br />
destino2="/home/heisenberg/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}_${date}" <br />
<br />
if [ -f "$destino2" ];<br />
then<br />
<br />
echo " Arquivo já exisistente ";<br />
<br />
<br />
else<br />
<br />
#echo "Arquivo renomeado e criado ";<br />
ln -s $origem $destino2 <br />
find -L /home/heisenbergl/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete <br />
<br />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
find -L /home/heisenberg/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi <br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|4. Script para remoção de todos os link simbólicos que estão dentro do projetor}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top| 5. Script para remoção dos ''hard links'' que estão na central da sala}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
find /S001/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse top|5. Script para Sincronização do Tempo - NTP}}<br />
<syntaxhighlight lang=text><br />
#!/bin/bash<br />
##############################################################<br />
# Sistema de Sincronização de Diretórios #<br />
# Autor............: Guilherme, Karoline e Ana Luiza #<br />
# Data Criacao.....: 26/03/2015 #<br />
# Versao...........: 1.0.0 #<br />
##############################################################<br />
<br />
#ntpdate [IP-SERVIDOR]<br />
<br />
ntpdate 200.135.233.8<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|Plano de Sincronização}}<br />
<br />
<center>[[Arquivo:pla1.png| 650px]]</center><br />
<br />
'''OBS'''.: O restante dos horários o usuário estará permitido para realizar upload de arquivos para o servidor e de forçar sincronizações.<br />
{{collapse bottom}}<br />
<br />
{{ collapse top|Crontab}}<br />
<br />
{{ collapse top|Sintaxe}}<br />
<br />
Dentro do arquivo que se abre após o comando existe uma sintaxe conforme a seguir<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm hh dd MM ss script<br />
<br />
</syntaxhighlight><br />
<br />
Onde<br />
<br />
<syntaxhighlight lang=text><br />
<br />
mm = minuto(0-59)<br />
hh = hora(0-23)<br />
dd = dia(1-31)<br />
MM = mes(1-12)<br />
ss = dia_da_semana(0-6)<br />
script = comando a ser executado.<br />
Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado. <br />
No caso de dia da semana funciona também as três primeiras letras <br />
(em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)<br />
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se <br />
importar com o campo em questão.<br />
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo<br />
é o - (hifen).<br />
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a<br />
lista é a , (vírgula).<br />
Obs 5: Qualquer texto colocado após o programa que será executado será<br />
considerado comentário e não será interpretado pelo cron<br />
<br />
</syntaxhighlight><br />
<br />
<br />
{{collapse bottom}} <br />
{{collapse top|Configurar '''Crontab'''}}<br />
{{collapse top|Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /srv/webba/cfd/script/remove_symlink.sh<br />
#<br />
<br />
<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
{{collapse top|Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><br />
#Configurando o cliente<br />
# /etc/crontab: system-wide crontab<br />
# Unlike any other crontab you don't have to run the `crontab'<br />
# command to install the new version when you edit this file<br />
# and files in /etc/cron.d. These files also have username fields,<br />
# that none of the other crontabs do.<br />
<br />
SHELL=/bin/sh<br />
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br />
<br />
# m h dom mon dow user command<br />
17 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
00 23 * * 1-5 root sh /s001/cfg/script/remove_hardlink.sh<br />
30 5 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 7 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 9 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 13 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 15 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
10 18 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh<br />
25 20 1-5 * * root sh /s001/cfg/script/cliente_rsync.sh <br />
*/1 * * * * root / sh /s001/cfg/script/ntp.sh <br />
#<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
{{collapse top|SSH - Par de Chaves}}<br />
Par de chaves do SSH são criptograficamente seguras e são utilizadas para autenticar um cliente num servidor. Cada par consiste em numa chave pública e em uma chave privada.<br />
<br />
<center>[[Arquivo:ssh.png| 400px]]</center><br />
<br />
'''1. '''Primeiro passo é gerar um par de chaves de SSH no computador local (no caso o cliente)<br />
<syntaxhighlight lang=text><br />
$ ssh-keygen<br />
</syntaxhighlight><br />
<br />
'''2.'''Seleciona um local aonde as chaves serão geradas. Por padrão, as chaves serão armazenadas em ~/.ssh. A chave privada será id_rsa e a chave pública id_rsa.pub<br />
<syntaxhighlight lang=text><br />
$ Enter file in which to save the key (/home/username/.ssh/id_rsa):<br />
</syntaxhighlight><br />
<br />
'''3.'''Isso é uma senha opicional que pode ser usada para criptografar a chave privada<br />
<syntaxhighlight lang=text><br />
$ Created directory '/home/username/.ssh'.<br />
$ Enter passphrase (empty for no passphrase):<br />
$ Enter same passphrase again:<br />
</syntaxhighlight><br />
<br />
'''4.'''Para enviar a chave pública para o servidor remoto<br />
<syntaxhighlight lang=text><br />
$ ssh-copy-id username@remote_host<br />
</syntaxhighlight><br />
<br />
'''5.'''Disabilitar Autenticação por Senha no Servidor<br />
*Acessar o arquivo abaixo<br />
<br />
<syntaxhighlight lang=text><br />
$ sudo vi /etc/ssh/sshd_config<br />
</syntaxhighlight><br />
<br />
*Editar a linha que contém PasswordAuthentication, isso irá a sua capacidade de se autenticar através de senhas.<br />
<br />
<syntaxhighlight lang=text><br />
PasswordAuthentication no<br />
</syntaxhighlight> <br />
{{collapse bottom}}<br />
{{collapse bottom}}<br />
<br />
===Exibição de PDF com xpdf em Virtual Display===<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos para o mesmo através de outro terminal.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | 1. Instalação do xpdf}}<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
{{collapse bottom | 1. Instalação do xpdf}}<br />
<br />
{{collapse top | 2. Permissão de acesso ao startx}}<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
{{collapse bottom | 2. Permissão de acesso ao startx}}<br />
<br />
{{collapse top | 3. Virtual Display}}<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /usr/bin/gnome-terminal -x ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''gnome-terminal -x''' é o processo que deseja-se abrir em modo gráfico e '''loop.sh''' é um script que será explicado no item 4<br />
<br />
{{collapse bottom | 3. Virtual Display}}<br />
<br />
{{collapse top | 4. Inicialização do terminal remoto}}<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
{{collapse bottom | 4. Inicialização do terminal remoto}}<br />
<br />
{{collapse top | 5. Envio de comandos para o terminal remoto}}<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf -fullscreen -remote servidor slide.pdf" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''gnome-terminal -x''' refere-se a abrir uma nova instância do terminal em /dev/tty8, '''xpdf -fullscreen -remote servidor''' refere-se a abrir o xpdf em modo fullscreen e como um servidor (de nome servidor) que pode receber comandos externos, e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do gnome-terminal), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "gnome-terminal -x xpdf.real -remote servidor -exec nextPage" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página pdf do arquivo.<br />
<br />
{{collapse bottom | 5. Envio de comandos para o terminal remoto}}<br />
<br />
{{collapse top | 6. Finalizar execução do terminal remoto}}<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom | 6. Finalizar execução do terminal remoto}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [1] - Solução obsoleta, substituída por [2]}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+AltF8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+AltF7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto utiliza-se o comando '''echo''', e direciona-se sua saída para o arquivo pipe, como é demonstrado a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/slide.pdf &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''slide.pdf''' é um exemplo de slide que pode ser aberto.<br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do comando a seguir, por exemplo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando torna-se '''xpdf.real''' para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta e o comando '''-exec nextPage''' infere na projeção da próxima página do arquivo.<br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [2] - Solução obsoleta, substituída por [3]l}}<br />
<br />
{{collapse top | Exibição de PDF com xpdf em Virtual Display [3] - Solução atual}}<br />
<br />
Como parte do ''Detalhamento da Especificação'' referente ao Ciclo 1 de desenvolvimento foi estudada a projeção de processos que utilizem interface gráfica em um virtual display, com ênfase na exibição de arquivos PDF através do visualizador [http://www.foolabs.com/xpdf/ xpdf] e envio de comandos através de um terminal para uma sessão remota da aplicação.<br />
<br />
'''Procedimentos realizados com uma instalação normal do Ubuntu 64bits (versões Gnome e padrão [http://releases.ubuntu.com/12.04/ 12.04] e [http://releases.ubuntu.com/14.04/ 14.04]), e com a instalação dos pacotes referentes ao [http://linux.die.net/man/1/xpdf xpdf]. Os procedimentos também foram testados em uma placa [http://www.raspberrypi.org/products/model-b-plus/ Raspberry Pi B+], utilizando a distribuição [https://minibianpi.wordpress.com/ Minibian] e instalando os pacotes referentes ao [ftp://www.x.org/pub/X11R6.8.0/doc/Xorg.1.html Xorg] e [http://linux.die.net/man/1/xpdf xpdf]'''.<br />
<br />
{{collapse top | Procedimentos realizados no Ubuntu}}<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
Instalação do xpdf, visualizador de PDF's que pretende-se utilizar no projeto:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Permissão de acesso ao startx====<br />
<br />
Permissão para que um usuário comum tenha acesso à projeção no virtual display tty8 com o [http://www.x.org/archive/X11R7.5/doc/man/man1/startx.1.html startx] (Opcional, mas caso esta instrução não seja seguida o usuário terá que executar a maioria dos comandos como administrador ['''sudo'''])<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ sudo chmod 555 /usr/bin/startx<br />
<br />
</syntaxhighlight><br />
<br />
Onde o código 555 refere-se ao acesso de todos os usuários para execução e escrita do arquivo.<br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty8'', acessado através do comando ''Ctrl+Alt+F8''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty8 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir:<br />
<br />
=====Passar slide===== <br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados no Ubuntu}}<br />
<br />
{{collapse top| Procedimentos realizados na Raspberry Pi}}<br />
<br />
'''A conta padrão para acesso na distribuição Minibian possui permissões de superusuário, portanto não houve preocupação com relação a permissionamento de ações do usuário. Em outra etapa do projeto tal limitação deverá ser estudada/resolvida'''. (Login: root, Password: raspberry).<br />
<br />
'''Assuma que os scripts executáveis e os arquivos a serem projetados estejam na pasta pessoal do usuário!'''<br />
<br />
====1. Instalação do xpdf====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
====2. Instalação do Xorg====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
====3. Virtual Display====<br />
<br />
O virtual display refere-se ao dispositivo ''/dev/tty7'', acessado através do comando ''Ctrl+Alt+F7''.<br />
<br />
Para exibir um processo com interface gráfica no virtual display deve-se utilizar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ startx ${HOME}/terminal.sh -- :1 &<br />
<br />
</syntaxhighlight><br />
<br />
Onde startx refere-se à aplicação que faz a inicialização do servidor xorg, :1 refere-se ao virtual display /dev/tty7 e '''terminal.sh''' é um script shell com o conteúdo a seguir:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
env DISPLAY=:1 /bin/bash ${HOME}/loop.sh<br />
<br />
</syntaxhighlight><br />
<br />
'''/bin/bash''' é o processo que receberá as instruções a serem executadas na exibição do PDF, e '''loop.sh''' é um script que será explicado no tópico abaixo<br />
<br />
====4. Inicialização do terminal remoto====<br />
<br />
O arquivo '''loop.sh''' possui o seguinte código:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
while :<br />
<br />
do mkfifo ${HOME}/pipe<br />
eval $(cat pipe)<br />
rm ${HOME}/pipe<br />
done<br />
<br />
</syntaxhighlight><br />
<br />
Seu funcionamento é simples, ele cria um [http://pt.wikipedia.org/wiki/Pipe_nomeado arquivo pipe] para a troca de mensagens entre o terminal local (onde serão dados os comandos) e o remoto (executando em /dev/tty8).<br />
<br />
Após a criação do arquivo o terminal remoto monitora o arquivo, a espera de alguma modificação a ser feita pelo terminal local. Quando o terminal local modifica o arquivo (com a adição de um comando), o terminal remoto toma como um comando o que foi escrito no arquivo pipe, e o executa. Após isso, ele exclui o arquivo e recria-o para a obtenção de um comando posterior.<br />
<br />
====5. Envio de comandos para o terminal remoto====<br />
<br />
Para o envio de comandos para o terminal remoto executa-se os scripts que serão descritos no próximo tópico.<br />
<br />
=====Abrir um pdf=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./xpdf.sh slide.pdf &<br />
<br />
</syntaxhighlight><br />
<br />
Com o xpdf aberto e o terminal disponível para receber comandos (pois a abertura do xpdf é executada por outra instância do '''bash'''), é possível manipular a apresentação de slides, podendo passar para o próximo slide, com a execução do script a seguir, por exemplo:<br />
<br />
=====Passar slide=====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ ./nextPage.sh &<br />
<br />
</syntaxhighlight><br />
<br />
====6. Finalizar execução do terminal remoto====<br />
<br />
Para finalizar a execução no virtual display basta escrever no arquivo pipe a instrução '''exit''', que será interpretada como um comando pelo terminal remoto, como segue abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ echo "exit" > ${HOME}/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Antes de finalizar a sessão no shell deve-se garantir que as outras aplicações que executam remotamente (como o xpdf) tenham sido finalizadas!'''<br />
<br />
{{collapse bottom| Procedimentos realizados na Raspberry Pi}}<br />
<br />
{{collapse top | Scrits dos Comandos}}<br />
<br />
====1. Abrir PDF====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf -fullscreen -remote servidor ${HOME}/$1 &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
Onde o comando '''/bin/bash''' refere-se a abrir uma nova instância do processo para executar a aplicação desejada (xpdf), e '''${HOME}/$1''' é o caminho referente ao pdf passado como parâmetro ($1) ao script.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec nextPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====3. Pular para slide anterior ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec prevPage &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====4. Saltar slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash <br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec gotoPage\($1\) &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
====5. Fechar Xpdf ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
echo "/bin/bash -c 'xpdf.real -remote servidor -exec quit &'" > $HOME/pipe<br />
<br />
</syntaxhighlight><br />
<br />
'''Note''' que o comando '''xpdf.real''' é usado para manipular os slides, o parâmetro '''-remote servidor''' refere-se a sessão aberta.<br />
<br />
{{collapse bottom | Scrits dos Comandos}}<br />
<br />
{{collapse bottom | Exibição de PDF com xpdf em Virtual Display [3] - Solução atual}}<br />
<br />
===Estudo da Raspberry Pi B+===<br />
<br />
{{collapse top | Auto Login}}<br />
<br />
Para realizar login automático basta editar o arquivo '''inittab''' em '''etc''':<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ vim /etc/inittab<br />
<br />
</syntaxhighlight><br />
<br />
Comente a linha:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
# 1:2345:respawn:/sbin/getty 115200 tty1<br />
<br />
</syntaxhighlight><br />
<br />
E insira logo abaixo da mesma:<br />
<br />
<syntaxhighlight lang=text><br />
<br />
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1<br />
<br />
</syntaxhighlight><br />
<br />
Onde '''pi''' é o nome do usuário que deseja iniciar a sessão automaticamente.<br />
<br />
* Procedimento extraído de: http://raspisimon.no-ip.org/rpi_autologin.php<br />
<br />
{{collapse bottom | Auto Login}}<br />
<br />
{{collapse top | Expansão do sistema de arquivos no SD}}<br />
<br />
Algumas distribuições raspberry não utilizam completamente o espaço de armazenamento do cartão SD, havendo um espaço livre que pode ser "anexado" ao sistema de arquivos da distribuição. Para realizar a expansão há diversos procedimentos, mas a que destaca-se pela facilidade é a instalação do '''raspi-config''', que possui comandos para configuração/personalização do sistema. Para a instalação da aplicação em um sistema derivado do Debian (como o [https://minibianpi.wordpress.com/ Minibian]), basta executar o seguinte comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install raspi-config<br />
<br />
</syntaxhighlight><br />
<br />
A ferramenta oferece opções de configuração referentes a idioma, interface do teclado, expansão do sistema de arquivos, gerenciamento da frequência do clock, entre outros.<br />
<br />
Para expandir o sistema de arquivos basta apenas selecionar a opção '''Expand Filesystem''' e confirmar a operação.<br />
<br />
* Procedimento extraído de: http://www.htpcguides.com/lightweight-raspbian-distro-minibian-initial-setup/<br />
<br />
O sistema também pode ser redimensionado utilizando um editor de partições, como o [http://gparted.org/display-doc.php?name=man-page gparted]<br />
<br />
{{collapse bottom | Expansão do sistema de arquivos no SD}}<br />
<br />
{{collapse top | Instalação do Xorg}}<br />
<br />
Para a instalação do Xorg basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xorg<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do Xorg}}<br />
<br />
{{collapse top | Instalação do xpdf}}<br />
<br />
Para a instalação do xpdf basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install xpdf<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do xpdf}}<br />
<br />
{{collapse top | Instalação do rsync}}<br />
<br />
Para a instalação do Rsync basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install rsync<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do rsync}}<br />
<br />
{{collapse top | Instalação do openssh-server}}<br />
<br />
Para a instalação do openssh-server basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install openssh-server<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do openssh-server}}<br />
<br />
{{collapse top | Instalação do python 2.7}}<br />
<br />
Para instalação do python 2.7 basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python 2.7}}<br />
<br />
{{collapse top | Instalação do python pip}}<br />
<br />
Para instalação do python pib basta executar o comando abaixo:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install python-pip<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Instalação do crontab}}<br />
<br />
O Crontab já está presente na distribuição utilizada (minibian), mas caso seja necessário instalar em algum sistema:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ apt-get install cron<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom | Instalação do python pib}}<br />
<br />
{{collapse top | Criação de usuário}}<br />
<br />
Para criar um usuário basta executar o comando:<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
$ adduser user<br />
<br />
</syntaxhighlight><br />
<br />
Onde ''user'' refere-se ao nome de usuário que deseja-se criar.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=27&t=37324<br />
<br />
{{collapse bottom | Criação de usuário}}<br />
<br />
{{collapse top | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
* Cenário: Ubuntu conectado em rede Wireless, e raspberry não possui um roteador/ponto de rede para conexão.<br />
<br />
* Procedimento: Conectar o cabo de rede na porta ethernet da raspberry e do computador. Ir até a opção Edit Connections, no Network Manager do Ubuntu. Selecionar a rede que foi estabelecida na aba Wired, escolher a opção Edit e ir até a aba IpV4 Settings. Nesta aba, selecionar a opção Shared to Other Computers. Fechar a janela de configuração, e reiniar a raspberry, caso seja necessário.<br />
<br />
* Procedimento extraído de: http://www.raspberrypi.org/forums/viewtopic.php?f=26&t=6997<br />
<br />
{{collapse bottom | Utilizar internet na raspberry através de rede via Ubuntu}}<br />
<br />
===API Web-Service a ser implementado na Raspberry Pi B+===<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@GET || /projetar || <center>-</center> || [{"NomeDoArquivo":arquivo1.pdf,"TamanhoArquivo1":12345,"NumeroDePaginas":12},{"nomeDoArquivo":arquivo2.opt,"TamanhoDoArquivo":54321,"NumeroDePaginas":26}] || Retorna os arquivos aos quais o usuário tem acesso e informações sobre os mesmos<br />
|-<br />
|@GET || /projetar/{''arquivo''} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Inicia a projeção do ''arquivo'' solicitado pelo usuário<br />
|-<br />
|@GET || /projetar/{''arquivo''}/avancarProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Faz a projeção da apresentação avançar um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/retrocederProjecao || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Faz a projeção da apresentação retroceder um slide de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/saltarProjecao/{''numeroPagina''}|| <syntaxhighlight lang=java> String nomeDoArquivo<br />
int numeroPagina </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Vai a uma determinada página de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/fechar || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Fecha a apresentação de ''arquivo''<br />
|-<br />
|@GET || /projetar/{''arquivo''}/obterThumbs/{''numeroDeThumbs''} || <syntaxhighlight lang=java>String nomeDoArquivo<br />
int numThumbs </syntaxhighlight> || [{"NomeDoArquivo":arquivo.pdf,"thumb":thumb1.jpg},{"NomeDoArquivo":arquivo.pdf,"thumb":thumb2.jpg}] || Retorna um uma quantidade de Thumbs (determinada por ''numero de Thumbs'') referente ao ''arquivo''<br />
|-<br />
|@GET || /sincronizacao/forcaSincronizacao || <center>-</center> || <syntaxhighlight lang=java> int ret </syntaxhighlight> || Força uma sincronização com o servidor de arquivos<br />
|}<br />
<br />
<br />
{{collapse top | Descrição das URI do GUI}}<br />
<br />
=== Descrição das URI do GUI ===<br />
<br />
<br />
1) Criar usuário.<br />
<br />
2) Excluir usuário (só ele mesmo pode ser auto excluir).<br />
<br />
3) Remover arquivo. <br />
<br />
4) Agendar sala.<br />
<br />
5) Cria subpasta para usuário.<br />
<br />
6) Excluir subpasta para usuário.<br />
<br />
7) Upload de arquivo.<br />
<br />
<br />
{{collapse bottom | Descrição das URI do GUI}}<br />
<br />
===API Web-Service a ser implementado no GUI===<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /tmp/{usuario} || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Caso seja possível criar o usúario, o servidor retorna a confirmação. Caso não mande os dados corretamente, retorna que não foi possível criar um usuário.<br />
|-<br />
|@DELETE || /tmp/{usuario} || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se for o próprio usuário que deseja se remover, então o servidor retorna uma confirmação, informando que foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /abrir/{arquivo} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Se o arquivo existir, então o servidor retorna uma confirmação,informando que foi removido arquivo foi removido com sucesso. Caso contrário servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /agendamento/{sala} || <syntaxhighlight lang=java> String sala </syntaxhighlight> <syntaxhighlight lang=java> String arquivo </syntaxhighlight> <syntaxhighlight lang=java> Timestamp </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight> || Se o usuário informar corretamente: a sala, arquivo, data, então o servidor retorna uma confirmação, informando que foi feito com sucesso, caso contrário informa que não foi possível agendar a aula.<br />
|-<br />
|@POST || /tmp/usuario/{pasta} || <syntaxhighlight lang=java> String nomeDaPasta </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível criar a subpasta, então o servidor retorna uma confirmação, informando que a pasta foi criada. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@DELETE || /tmp/usuario/{pasta} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso a pasta exista, então o servidor retorna uma confirmação, informando que a pasta foi excluida. Caso contrário o servidor, avisa que não foi possível.<br />
|-<br />
|@POST || /tmp/usuario/{arquivo} || <syntaxhighlight lang=java> String nomeDoArquivo </syntaxhighlight> || <syntaxhighlight lang=java> int resposta </syntaxhighlight>|| Caso seja possível fazer upload do arquivo, então o servidor retorna uma confirmação, informando que o arquivo foi colocado corretamente na pasta do usuário. Caso contrário o servidor, avisa que ocorreu um erro durante o upload do arquivo.<br />
<br />
|}<br />
<br />
===API Web-Service a ser implementado no Celular===<br />
<br />
{| class="wikitable"<br />
!scope="col"| Método<br />
!scope="col"| URI<br />
!scope="col"| Parâmetros<br />
!scope="col"| Retorno (Json)<br />
!scope="col"| Descrição<br />
<br />
|-<br />
|@POST || /tmp/{usuario} || <syntaxhighlight lang=java> String usuario </syntaxhighlight> <syntaxhighlight lang=java> String senha </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight>|| Retorna acesso permitido, caso os dados que o usuário tenha enviado, estiverem corretos, caso contrário acesso é negado.<br />
|-<br />
|@PUT || /cfg/pass/senha || <syntaxhighlight lang=java> String usuário </syntaxhighlight> <syntaxhighlight lang=java> String senha_atual </syntaxhighlight> <syntaxhighlight lang=java> String senha_nova </syntaxhighlight> || <syntaxhighlight lang=java> boolean resposta </syntaxhighlight> || Retorna se foi possível alterar a senha do usuário, caso contrário a senha antiga permanece.<br />
|}</div>Matuzalem.m