https://wiki.sj.ifsc.edu.br/api.php?action=feedcontributions&user=Ana.ls1994&feedformat=atomMediaWiki do Campus São José - Contribuições do(a) usuário(a) [pt-br]2024-03-29T07:02:21ZContribuições do(a) usuário(a)MediaWiki 1.35.9https://wiki.sj.ifsc.edu.br/index.php?title=MPLS-TE_na_Redes_da_Eletrosul_-_Centrais_El%C3%A9tricas_S.A.&diff=123775MPLS-TE na Redes da Eletrosul - Centrais Elétricas S.A.2016-12-22T11:20:02Z<p>Ana.ls1994: /* RESUMO ESTENDIDO */</p>
<hr />
<div>__toc__<br />
<br />
=TCC-Ana Luiza Scharf=<br />
<br />
Autor: '''Ana Luiza Scharf'''<br />
<br />
Orientador: '''Marcelo Maia Sobral'''<br />
<br />
Curso: Engenharia de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
analuscharf@gmail.com<br />
<br />
==RESUMO ESTENDIDO==<br />
<br />
<br />
O presente trabalho é um estudo de caso da rede da Eletrosul - Centrais Elétricas S.A,em que será realizado um laboratório de testes sobre a tecnologia ''Multiprotocol LabelSwitching''(MPLS) com engenharia de tráfego (''Traffic Engineering''(TE)), MPLS-TE, e oferecer níveis de garantias de serviço (''Quality of Service''(QoS)) para os diversos tipos de tráfego. O objetivo desse laboratório é verificar se a utilização dessa tecnologia melhora os seguintes aspectos da metro Ethernet da Eletrosul, tais quais: otimizar a operação e manutenção da rede, maior controle dos tipos de tráfegos e aumentar a robustez à falha de enlace.<br />
<br />
Uma das principais necessidades é melhorar a robustez de falha de enlace. O MPLS é uma tecnologia de comutação de pacotes através de rótulos (''label''), que possibilita encontrar caminhos alternativos até o seu destino, caso ocorra falha de enlace. Além disso, é possível combiná-lo com mecanismos de QoS, para classificar e marcar pacotes que transitam pela rede e também fornecer formas de priorização para os diferentes serviços. Por fim, a engenharia de tráfego fornece meios de controlar os tráfegos da rede, a fim de evitar congestionamento e o desperdício dos seus recursos.<br />
<br />
O laboratório de testes será implantado na Eletrosul e simulará uma parte da sua topologia para averiguar o funcionamento dessas técnicas. Mais especificamente, por meio dele deve-se verificar se tais técnicas realmente são capazes de melhorar certos aspectos da rede da Eletrosul. Com isso, pode-se avaliar se é vantajoso implementar MPLS-TE com QoS em toda sua infraestrutura<br />
<br />
== APRESENTAÇÃO DO TCC==<br />
<br />
A seguir a o link com os seguintes conteúdos:<br />
<br />
*Objeto de estudo: <br />
*Problema de pesquisa; <br />
*Objetivo Geral;<br />
*Objetivo Específico;<br />
*Estrutura do Marco Teórico;<br />
*Principais Fontes;<br />
*Cronograma;<br />
*Dificuldades;<br />
*Referências.<br />
<br />
[https://www.dropbox.com/home/TCC1 Apresentação: proposta do TCC]<br />
<br />
<br />
== CRONOGRAMA ==<br />
<br />
<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses| Etapas |Ago/2016|Set/2016|Out/2016|Nov/2016|Dez/2016|Jan/2017|Fev/2017|Mar/2017|Abr/2017|Maio/2017|Jun/2017}}<br />
{{cronogramaX-item | Formulação do tema |1 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Revisão Bibliográfica I |0 |1 |1 |1 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Modelagem |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Implantação |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 }}<br />
{{cronogramaX-item | Experimentos |0 |0 |0 |0 |0 |0 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Avaliação dos resultados |0 |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Relato e conclusões |0 |0 |0 |0 |0 |1 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Revisão da tese |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 }}<br />
|}<br />
<br />
<br />
<br />
==REFERÊNCIAS BIBLIOGRÁFICAS==<br />
<br />
<br />
'''1.''' D. Awduche, J. Malcolm,J. Agogbua, M O’Dell e J. McManus. “RFC<br />
2702: Requirements for Traffic Engineering Over MPLS ”.Setembro 1999<br />
<br />
'''2.''' D. Awduche, A. Chiu,A. Elwalid, I. Widjaja e X. Xiao. “RFC 3272:<br />
Overview and Principles of Internet Traffic Engineering ”. May 2002<br />
<br />
'''3.''' Muckai K Girish,Bei Zhou e Jian-Qiang Hu, “Formulation of the<br />
Traffic Engineering Problems in MPLS Based IP Networks”, pp.<br />
214–219,2000.<br />
<br />
'''4.''' Ina Minei e Julian Lucek, “MPLS-Enabled Aplications: Emerging<br />
Developments and New Tecnologies”, pp. 214–219,2006.<br />
<br />
'''5.''' E. Rosen, A. Viswanathan e R. Callon, M O’Dell e J. McManus. “RFC<br />
3031: Multiprotocol Label Switching Architecture ”.January 2001<br />
<br />
'''6.''' Bruce Davie e Yakov Rekhter, “MPLS: Tecnology and<br />
Applications”,2000.<br />
<br />
'''7.''' K. Kompella e Y. Rekhter. “RFC 4206: Label Switched Paths (LSP)<br />
Hierarchy with Generalized Multi-Protocol Label Switching (GMPLS)<br />
Traffic Engineering (TE)”.Setembro 2005<br />
<br />
'''8.'''L. Andersson, I. Minei e B. Thomas. “RFC 5036: LDP Specification ”.<br />
October 2007<br />
<br />
'''9.''' Y. Rekhter, T. Li e S. Hares . “RFC 4271: A Border Gateway<br />
Protocol 4 (BGP-4) ”. January 2006<br />
<br />
'''10.''' D. Katz, K. Kompella e D. Yeung. “RFC 3630: Traffic Engineering<br />
(TE) Extensions to OSPF Version 2 ”. September 2003<br />
<br />
'''11.''' S. Kini e W. Lu. “RFC 6138: LDP IGP Synchronization for<br />
Broadcast Networks ”. February 2011<br />
<br />
'''12.''' R. Braden, L. Zhang, S. Berson, S. Herzog e S. Jamin “RFC 2205:<br />
Resource ReSerVation Protocol (RSVP)s ”. Septmber 1997<br />
<br />
'''13.''' D. Awduche, L. Berger, D. Gan, T. Li, V. Srinivasan e G. Swallow<br />
“RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels ”.<br />
December 2001<br />
<br />
'''14.''' J. Korhonen, M. Arumaithurai e A. Lior. “RFC 5777: Traffic<br />
Classification and Quality of Service (QoS) Attributes for Diameter ”,<br />
February 2010<br />
<br />
'''15.''' R. Braden, D. Clark e S. Shenker . “RFC 1633: Integrated Services<br />
in the Internet Architecture: an Overview ”. June 1994<br />
<br />
'''16.''' F. Le Faucheur, L. Wu, S. Davari, P. Vaananen, R. Krishnan, P.<br />
Cheval e J. Heinanen . “RFC 3270: Multi-Protocol Label Switching<br />
(MPLS) Support of Differentiated Service ”. May 2002<br />
<br />
'''17.''' L. Andersson e R. Asat. “RFC 5462: Multiprotocol Label Switching<br />
(MPLS) Label Stack Entry: ”EXP”Field Renamed to ”Traffic Class”Field<br />
”. February 200 <br />
<br />
'''18.''' J. Babiarz e F.Baker “RFC 4594: Configuration Guidelines for<br />
DiffServ Service Classes”. August 2006<br />
<br />
'''19.''' F. Le Faucheur e W. Lai “RFC 3564: Requirements for Support of<br />
Differentiated Services-aware MPLS Traffic Engineering ”, July 2003<br />
<br />
'''20.''' J. Heinanen, F. Baker, W. Weiss e J. Wroclawski “RFC 2597:<br />
Assured Forwarding PHB Group”. June 1999<br />
<br />
'''21.''' An Expedited Forwarding PHB (Per-Hop Behavior) “RFC 3246: An<br />
Expedited Forwarding PHB (Per-Hop Behavior)”. March 2002<br />
<br />
'''22.''' Cisco IOS Quality of Service Solutions Configuration Guide, Release<br />
12.2. Disponível em: http:<br />
//www.cisco.com/c/en/us/td/docs/ios/122/qos/configuration/guide/fqo</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=MPLS-TE_na_Redes_da_Eletrosul_-_Centrais_El%C3%A9tricas_S.A.&diff=123697MPLS-TE na Redes da Eletrosul - Centrais Elétricas S.A.2016-12-20T10:14:15Z<p>Ana.ls1994: </p>
<hr />
<div>__toc__<br />
<br />
=TCC-Ana Luiza Scharf=<br />
<br />
Autor: '''Ana Luiza Scharf'''<br />
<br />
Orientador: '''Marcelo Maia Sobral'''<br />
<br />
Curso: Engenharia de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
analuscharf@gmail.com<br />
<br />
==RESUMO ESTENDIDO==<br />
<br />
<br />
O presente trabalho é um estudo de caso da rede da Eletrosul - Centrais Elétricas S.A,em que será realizado um laboratório de testes sobre a tecnologia ''Multiprotocol LabelSwitching''(MPLS) com engenharia de tráfego (''Traffic Engineering''(TE)), MPLS-TE, e oferecer níveis de garantias de serviço (''Quality of Service''(QoS)) para os diversos tipos de tráfego. O objetivo desse laboratório é verificar se a utilização dessa tecnologia resolve os déficits atuais do metro Ethernet da Eletrosul, tais quais: subutilização da rede, ausência do controle dos tipos de tráfegos e vulnerabilidade da rede em relação à falha de enlace.<br />
<br />
Uma das principais necessidades é solucionar a vulnerabilidade de falha de enlace, um problema recorrente na rede da Eletrosul. O MPLS é uma tecnologia de comutação de pacotes através de rótulos (''label''), que possibilita encontrar caminhos alternativos até o seu destino, caso ocorra falha de enlace. Além disso, é possível combiná-lo com mecanismos de QoS, para classificar e marcar pacotes que transitam pela rede e também fornecer formas de priorização para os diferentes serviços. Por fim, a engenharia de tráfego fornece meios de controlar os tráfegos da rede, a fim de evitar congestionamento e o desperdício dos seus recursos.<br />
<br />
O laboratório de testes será implantado na Eletrosul e simulará uma parte da sua topologia para averiguar o funcionamento dessas técnicas. Mais especificamente, por meio dele deve-se verificar se tais técnicas realmente são capazes de solucionar as deficiências atuais da rede da Eletrosul. Com isso, pode-se avaliar se é vantajoso implementar MPLS-TE com QoS em toda sua infraestrutura<br />
<br />
== APRESENTAÇÃO DO TCC==<br />
<br />
A seguir a o link com os seguintes conteúdos:<br />
<br />
*Objeto de estudo: <br />
*Problema de pesquisa; <br />
*Objetivo Geral;<br />
*Objetivo Específico;<br />
*Estrutura do Marco Teórico;<br />
*Principais Fontes;<br />
*Cronograma;<br />
*Dificuldades;<br />
*Referências.<br />
<br />
[https://www.dropbox.com/home/TCC1 Apresentação: proposta do TCC]<br />
<br />
<br />
== CRONOGRAMA ==<br />
<br />
<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses| Etapas |Ago/2016|Set/2016|Out/2016|Nov/2016|Dez/2016|Jan/2017|Fev/2017|Mar/2017|Abr/2017|Maio/2017|Jun/2017}}<br />
{{cronogramaX-item | Formulação do tema |1 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Revisão Bibliográfica I |0 |1 |1 |1 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Modelagem |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Implantação |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 }}<br />
{{cronogramaX-item | Experimentos |0 |0 |0 |0 |0 |0 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Avaliação dos resultados |0 |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Relato e conclusões |0 |0 |0 |0 |0 |1 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Revisão da tese |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 }}<br />
|}<br />
<br />
<br />
<br />
==REFERÊNCIAS BIBLIOGRÁFICAS==<br />
<br />
<br />
'''1.''' D. Awduche, J. Malcolm,J. Agogbua, M O’Dell e J. McManus. “RFC<br />
2702: Requirements for Traffic Engineering Over MPLS ”.Setembro 1999<br />
<br />
'''2.''' D. Awduche, A. Chiu,A. Elwalid, I. Widjaja e X. Xiao. “RFC 3272:<br />
Overview and Principles of Internet Traffic Engineering ”. May 2002<br />
<br />
'''3.''' Muckai K Girish,Bei Zhou e Jian-Qiang Hu, “Formulation of the<br />
Traffic Engineering Problems in MPLS Based IP Networks”, pp.<br />
214–219,2000.<br />
<br />
'''4.''' Ina Minei e Julian Lucek, “MPLS-Enabled Aplications: Emerging<br />
Developments and New Tecnologies”, pp. 214–219,2006.<br />
<br />
'''5.''' E. Rosen, A. Viswanathan e R. Callon, M O’Dell e J. McManus. “RFC<br />
3031: Multiprotocol Label Switching Architecture ”.January 2001<br />
<br />
'''6.''' Bruce Davie e Yakov Rekhter, “MPLS: Tecnology and<br />
Applications”,2000.<br />
<br />
'''7.''' K. Kompella e Y. Rekhter. “RFC 4206: Label Switched Paths (LSP)<br />
Hierarchy with Generalized Multi-Protocol Label Switching (GMPLS)<br />
Traffic Engineering (TE)”.Setembro 2005<br />
<br />
'''8.'''L. Andersson, I. Minei e B. Thomas. “RFC 5036: LDP Specification ”.<br />
October 2007<br />
<br />
'''9.''' Y. Rekhter, T. Li e S. Hares . “RFC 4271: A Border Gateway<br />
Protocol 4 (BGP-4) ”. January 2006<br />
<br />
'''10.''' D. Katz, K. Kompella e D. Yeung. “RFC 3630: Traffic Engineering<br />
(TE) Extensions to OSPF Version 2 ”. September 2003<br />
<br />
'''11.''' S. Kini e W. Lu. “RFC 6138: LDP IGP Synchronization for<br />
Broadcast Networks ”. February 2011<br />
<br />
'''12.''' R. Braden, L. Zhang, S. Berson, S. Herzog e S. Jamin “RFC 2205:<br />
Resource ReSerVation Protocol (RSVP)s ”. Septmber 1997<br />
<br />
'''13.''' D. Awduche, L. Berger, D. Gan, T. Li, V. Srinivasan e G. Swallow<br />
“RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels ”.<br />
December 2001<br />
<br />
'''14.''' J. Korhonen, M. Arumaithurai e A. Lior. “RFC 5777: Traffic<br />
Classification and Quality of Service (QoS) Attributes for Diameter ”,<br />
February 2010<br />
<br />
'''15.''' R. Braden, D. Clark e S. Shenker . “RFC 1633: Integrated Services<br />
in the Internet Architecture: an Overview ”. June 1994<br />
<br />
'''16.''' F. Le Faucheur, L. Wu, S. Davari, P. Vaananen, R. Krishnan, P.<br />
Cheval e J. Heinanen . “RFC 3270: Multi-Protocol Label Switching<br />
(MPLS) Support of Differentiated Service ”. May 2002<br />
<br />
'''17.''' L. Andersson e R. Asat. “RFC 5462: Multiprotocol Label Switching<br />
(MPLS) Label Stack Entry: ”EXP”Field Renamed to ”Traffic Class”Field<br />
”. February 200 <br />
<br />
'''18.''' J. Babiarz e F.Baker “RFC 4594: Configuration Guidelines for<br />
DiffServ Service Classes”. August 2006<br />
<br />
'''19.''' F. Le Faucheur e W. Lai “RFC 3564: Requirements for Support of<br />
Differentiated Services-aware MPLS Traffic Engineering ”, July 2003<br />
<br />
'''20.''' J. Heinanen, F. Baker, W. Weiss e J. Wroclawski “RFC 2597:<br />
Assured Forwarding PHB Group”. June 1999<br />
<br />
'''21.''' An Expedited Forwarding PHB (Per-Hop Behavior) “RFC 3246: An<br />
Expedited Forwarding PHB (Per-Hop Behavior)”. March 2002<br />
<br />
'''22.''' Cisco IOS Quality of Service Solutions Configuration Guide, Release<br />
12.2. Disponível em: http:<br />
//www.cisco.com/c/en/us/td/docs/ios/122/qos/configuration/guide/fqo</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-item&diff=123696Predefinição:CronogramaX-item2016-12-20T10:12:46Z<p>Ana.ls1994: </p>
<hr />
<div>| align="left" | {{{1}}}<br />
| align="center" | {{#switch:{{{2}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{3}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{4}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{5}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{6}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{7}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{8}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{9}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{10}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{11}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{12}}} |1=X |0=}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-item&diff=123695Predefinição:CronogramaX-item2016-12-20T10:12:11Z<p>Ana.ls1994: </p>
<hr />
<div>| align="left" | {{{1}}}<br />
| align="center" | {{#switch:{{{2}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{3}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{4}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{5}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{6}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{7}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{8}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{9}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{10}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{11}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{12}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{13}}} |1=X |0=}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-meses&diff=123694Predefinição:CronogramaX-meses2016-12-20T10:11:25Z<p>Ana.ls1994: </p>
<hr />
<div>! scope="col" width=50% style="text-align:left"| {{{1}}}<br />
! scope="col" width=8% | {{{2}}}<br />
! scope="col" width=8% | {{{3}}}<br />
! scope="col" width=8% | {{{4}}}<br />
! scope="col" width=8% | {{{5}}}<br />
! scope="col" width=8% | {{{6}}}<br />
! scope="col" width=8% | {{{7}}}<br />
! scope="col" width=8% | {{{8}}}<br />
! scope="col" width=8% | {{{9}}}<br />
! scope="col" width=8% | {{{10}}}<br />
! scope="col" width=8% | {{{11}}}<br />
! scope="col" width=8% | {{{12}}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-meses&diff=123693Predefinição:CronogramaX-meses2016-12-20T10:10:27Z<p>Ana.ls1994: </p>
<hr />
<div>! scope="col" width=50% style="text-align:left"| {{{1}}}<br />
! scope="col" width=8% | {{{2}}}<br />
! scope="col" width=8% | {{{3}}}<br />
! scope="col" width=8% | {{{4}}}<br />
! scope="col" width=8% | {{{5}}}<br />
! scope="col" width=8% | {{{6}}}<br />
! scope="col" width=8% | {{{7}}}<br />
! scope="col" width=8% | {{{8}}}<br />
! scope="col" width=8% | {{{9}}}<br />
! scope="col" width=8% | {{{10}}<br />
! scope="col" width=8% | {{11}}}<br />
! scope="col" width=8% | {{{12}}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-meses&diff=123692Predefinição:CronogramaX-meses2016-12-20T10:09:54Z<p>Ana.ls1994: </p>
<hr />
<div>! scope="col" width=50% style="text-align:left"| {{{1}}}<br />
! scope="col" width=8% | {{{2}}}<br />
! scope="col" width=8% | {{{3}}}<br />
! scope="col" width=8% | {{{4}}}<br />
! scope="col" width=8% | {{{5}}}<br />
! scope="col" width=8% | {{{6}}}<br />
! scope="col" width=8% | {{{7}}}<br />
! scope="col" width=8% | {{{8}}}<br />
! scope="col" width=8% | {{{9}}}<br />
! scope="col" width=8% | {{{10}}}<br />
! scope="col" width=8% | {{11}}}<br />
! scope="col" width=8% | {{{12}}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-meses&diff=123691Predefinição:CronogramaX-meses2016-12-20T10:09:17Z<p>Ana.ls1994: </p>
<hr />
<div>! scope="col" width=50% style="text-align:left"| {{{1}}}<br />
! scope="col" width=8% | {{{2}}}<br />
! scope="col" width=8% | {{{3}}}<br />
! scope="col" width=8% | {{{4}}}<br />
! scope="col" width=8% | {{{5}}}<br />
! scope="col" width=8% | {{{6}}}<br />
! scope="col" width=8% | {{{7}}}<br />
! scope="col" width=8% | {{{8}}}<br />
! scope="col" width=8% | {{{9}}}<br />
! scope="col" width=8% | {{{10}}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-item&diff=123690Predefinição:CronogramaX-item2016-12-20T10:08:37Z<p>Ana.ls1994: </p>
<hr />
<div>| align="left" | {{{1}}}<br />
| align="center" | {{#switch:{{{2}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{3}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{4}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{5}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{6}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{7}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{8}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{9}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{10}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{11}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{12}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{13}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{14}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{15}}} |1=X |0=}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-meses&diff=123689Predefinição:CronogramaX-meses2016-12-20T10:06:58Z<p>Ana.ls1994: </p>
<hr />
<div>! scope="col" width=50% style="text-align:left"| {{{1}}}<br />
! scope="col" width=8% | {{{2}}}<br />
! scope="col" width=8% | {{{3}}}<br />
! scope="col" width=8% | {{{4}}}<br />
! scope="col" width=8% | {{{5}}}<br />
! scope="col" width=8% | {{{6}}}<br />
! scope="col" width=8% | {{{7}}}<br />
! scope="col" width=8% | {{{8}}}<br />
! scope="col" width=8% | {{{9}}}<br />
! scope="col" width=8% | {{{10}}}<br />
! scope="col" width=8% | {{{11}}}<br />
! scope="col" width=8% | {{{12}}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=MPLS-TE_na_Redes_da_Eletrosul_-_Centrais_El%C3%A9tricas_S.A.&diff=123688MPLS-TE na Redes da Eletrosul - Centrais Elétricas S.A.2016-12-20T10:05:25Z<p>Ana.ls1994: /* RESUMO ESTENDIDO */</p>
<hr />
<div>__toc__<br />
<br />
=TCC-Ana Luiza Scharf=<br />
<br />
Autor: '''Ana Luiza Scharf'''<br />
<br />
Orientador: '''Marcelo Maia Sobral'''<br />
<br />
Curso: Engenharia de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
analuscharf@gmail.com<br />
<br />
==RESUMO ESTENDIDO==<br />
<br />
<br />
O presente trabalho é um estudo de caso da rede da Eletrosul - Centrais Elétricas S.A,em que será realizado um laboratório de testes sobre a tecnologia ''Multiprotocol LabelSwitching''(MPLS) com engenharia de tráfego (''Traffic Engineering''(TE)), MPLS-TE, e oferecer níveis de garantias de serviço (''Quality of Service''(QoS)) para os diversos tipos de tráfego. O objetivo desse laboratório é verificar se a utilização dessa tecnologia resolve os déficits atuais do metro Ethernet da Eletrosul, tais quais: subutilização da rede, ausência do controle dos tipos de tráfegos e vulnerabilidade da rede em relação à falha de enlace.<br />
<br />
Uma das principais necessidades é solucionar a vulnerabilidade de falha de enlace, um problema recorrente na rede da Eletrosul. O MPLS é uma tecnologia de comutação de pacotes através de rótulos (''label''), que possibilita encontrar caminhos alternativos até o seu destino, caso ocorra falha de enlace. Além disso, é possível combiná-lo com mecanismos de QoS, para classificar e marcar pacotes que transitam pela rede e também fornecer formas de priorização para os diferentes serviços. Por fim, a engenharia de tráfego fornece meios de controlar os tráfegos da rede, a fim de evitar congestionamento e o desperdício dos seus recursos.<br />
<br />
O laboratório de testes será implantado na Eletrosul e simulará uma parte da sua topologia para averiguar o funcionamento dessas técnicas. Mais especificamente, por meio dele deve-se verificar se tais técnicas realmente são capazes de solucionar as deficiências atuais da rede da Eletrosul. Com isso, pode-se avaliar se é vantajoso implementar MPLS-TE com QoS em toda sua infraestrutura<br />
<br />
== APRESENTAÇÃO DO TCC==<br />
<br />
A seguir a o link com os seguintes conteúdos:<br />
<br />
*Objeto de estudo: <br />
*Problema de pesquisa; <br />
*Objetivo Geral;<br />
*Objetivo Específico;<br />
*Estrutura do Marco Teórico;<br />
*Principais Fontes;<br />
*Cronograma;<br />
*Dificuldades;<br />
*Referências.<br />
<br />
[https://www.dropbox.com/home/TCC1 Apresentação: proposta do TCC]<br />
<br />
==REFERÊNCIAS BIBLIOGRÁFICAS==<br />
<br />
<br />
'''1.''' D. Awduche, J. Malcolm,J. Agogbua, M O’Dell e J. McManus. “RFC<br />
2702: Requirements for Traffic Engineering Over MPLS ”.Setembro 1999<br />
<br />
'''2.''' D. Awduche, A. Chiu,A. Elwalid, I. Widjaja e X. Xiao. “RFC 3272:<br />
Overview and Principles of Internet Traffic Engineering ”. May 2002<br />
<br />
'''3.''' Muckai K Girish,Bei Zhou e Jian-Qiang Hu, “Formulation of the<br />
Traffic Engineering Problems in MPLS Based IP Networks”, pp.<br />
214–219,2000.<br />
<br />
'''4.''' Ina Minei e Julian Lucek, “MPLS-Enabled Aplications: Emerging<br />
Developments and New Tecnologies”, pp. 214–219,2006.<br />
<br />
'''5.''' E. Rosen, A. Viswanathan e R. Callon, M O’Dell e J. McManus. “RFC<br />
3031: Multiprotocol Label Switching Architecture ”.January 2001<br />
<br />
'''6.''' Bruce Davie e Yakov Rekhter, “MPLS: Tecnology and<br />
Applications”,2000.<br />
<br />
'''7.''' K. Kompella e Y. Rekhter. “RFC 4206: Label Switched Paths (LSP)<br />
Hierarchy with Generalized Multi-Protocol Label Switching (GMPLS)<br />
Traffic Engineering (TE)”.Setembro 2005<br />
<br />
'''8.'''L. Andersson, I. Minei e B. Thomas. “RFC 5036: LDP Specification ”.<br />
October 2007<br />
<br />
'''9.''' Y. Rekhter, T. Li e S. Hares . “RFC 4271: A Border Gateway<br />
Protocol 4 (BGP-4) ”. January 2006<br />
<br />
'''10.''' D. Katz, K. Kompella e D. Yeung. “RFC 3630: Traffic Engineering<br />
(TE) Extensions to OSPF Version 2 ”. September 2003<br />
<br />
'''11.''' S. Kini e W. Lu. “RFC 6138: LDP IGP Synchronization for<br />
Broadcast Networks ”. February 2011<br />
<br />
'''12.''' R. Braden, L. Zhang, S. Berson, S. Herzog e S. Jamin “RFC 2205:<br />
Resource ReSerVation Protocol (RSVP)s ”. Septmber 1997<br />
<br />
'''13.''' D. Awduche, L. Berger, D. Gan, T. Li, V. Srinivasan e G. Swallow<br />
“RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels ”.<br />
December 2001<br />
<br />
'''14.''' J. Korhonen, M. Arumaithurai e A. Lior. “RFC 5777: Traffic<br />
Classification and Quality of Service (QoS) Attributes for Diameter ”,<br />
February 2010<br />
<br />
'''15.''' R. Braden, D. Clark e S. Shenker . “RFC 1633: Integrated Services<br />
in the Internet Architecture: an Overview ”. June 1994<br />
<br />
'''16.''' F. Le Faucheur, L. Wu, S. Davari, P. Vaananen, R. Krishnan, P.<br />
Cheval e J. Heinanen . “RFC 3270: Multi-Protocol Label Switching<br />
(MPLS) Support of Differentiated Service ”. May 2002<br />
<br />
'''17.''' L. Andersson e R. Asat. “RFC 5462: Multiprotocol Label Switching<br />
(MPLS) Label Stack Entry: ”EXP”Field Renamed to ”Traffic Class”Field<br />
”. February 200 <br />
<br />
'''18.''' J. Babiarz e F.Baker “RFC 4594: Configuration Guidelines for<br />
DiffServ Service Classes”. August 2006<br />
<br />
'''19.''' F. Le Faucheur e W. Lai “RFC 3564: Requirements for Support of<br />
Differentiated Services-aware MPLS Traffic Engineering ”, July 2003<br />
<br />
'''20.''' J. Heinanen, F. Baker, W. Weiss e J. Wroclawski “RFC 2597:<br />
Assured Forwarding PHB Group”. June 1999<br />
<br />
'''21.''' An Expedited Forwarding PHB (Per-Hop Behavior) “RFC 3246: An<br />
Expedited Forwarding PHB (Per-Hop Behavior)”. March 2002<br />
<br />
'''22.''' Cisco IOS Quality of Service Solutions Configuration Guide, Release<br />
12.2. Disponível em: http:<br />
//www.cisco.com/c/en/us/td/docs/ios/122/qos/configuration/guide/fqo<br />
<br />
== CRONOGRAMA ==<br />
<br />
<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses| Etapas |Ago/2016|Set/2016|Out/2016|Nov/2016|Dez/2016|Jan/2017|Fev/2017|Mar/2017|Abr/2017|Maio/2017|Jun/2017}}<br />
{{cronogramaX-item | Formulação do tema |1 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Revisão Bibliográfica I |0 |1 |1 |1 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Modelagem |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Implantação |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 }}<br />
{{cronogramaX-item | Experimentos |0 |0 |0 |0 |0 |0 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Avaliação dos resultados |0 |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Relato e conclusões |0 |0 |0 |0 |0 |1 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Revisão da tese |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 }}<br />
|}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=TCC_da_Engenharia_de_Telecomunica%C3%A7%C3%B5es_-_em_andamento&diff=123288TCC da Engenharia de Telecomunicações - em andamento2016-12-15T02:26:20Z<p>Ana.ls1994: /* TCC 1 */</p>
<hr />
<div>__toc__<br />
<br />
=TCC 1=<br />
<br />
{{InicioTabTCC}}<br />
<!-- Para cada projeto de TCC use o template {{TabTCC1| TITULO | ALUNO | ORIENTADOR | COORIENTADOR | INICIO | STATUS |PARECER DO ORIENTADOR | PARECER DA COORDENÇÃO }} --><br />
<br />
<!-- <br />
Para o professor dar o parecer basta entrar no último campo e inserir <br />
~~~~ (4 vezes til) será convertido em sua assinatura com data e hora (Marcos Moecke 16h23min de 2 de maio de 2012 (BRT))<br />
~~~ (3 vezes til) será convertido em sua assinatura (Marcos Moecke)<br />
~~~~~ (5 vezes til) será convertido em data e hora (16h23min de 2 de maio de 2012 (BRT))<br />
--> <br />
<br />
{{TabTCC1|Plataforma de Desenvolvimento de Aplicações da Internet das Coisas com redes LoraWAN| Leonan da Silva Saraiva | Prof.Arliones Hoeller | | 2016-2|TCC I | }}<br />
<br />
{{TabTCC1|Processamento de Imagens Médicas - Estudo de Caso Pixeon| Karoline da Rocha | Prof.Marcos Moecke | | 2016-2|TCC I | }}<br />
<br />
<br />
{{TabTCC1|MPLS-TE na Redes da Eletrosul - Centrais Elétricas S.A. | Ana Luíza Scharf | Prof.Marcelo Maia Sobral | | 2016-2|TCC I | }}<br />
<br />
<br />
{{TabTCC1| Reconhecimento de Palavra com Redes Neurais Artificiais e Transformada Wavelet | Ernani Santiago | Prof.Ramon Mayor Martins | | 2016-2|TCC I | }}<br />
<br />
<br />
{{TabTCC1| Estudo e Análise das Antenas utilizadas em RFID | Tiago Teixeira | Prof.Ramon Mayor Martins | | 2016-2|TCC I | }}<br />
<br />
{{FimTabTCC}}<br />
<br />
=TCC 2=<br />
{{InicioTabTCC}}<br />
<br />
{{TabTCC1| XXX | XXX | XXX | | 2015-2 | XXX | Aluno cumprindo as atividades; comparecendo aos encontros --[[Usuário:Roberto.nobrega|Roberto Nóbrega]] 12h40min de 6 de abril de 2016 (BRT) | }}<br />
<br />
{{FimTabTCC}}<br />
<br />
=Sugestões de TCC=<br />
{{InicioTabTCC}}<br />
<br />
{{TabTCC1| | | | | | | }}<br />
<br />
<br />
{{FimTabTCC}}<br />
<br />
<br />
*[[Brainstorming de temas para projeto final de curso]]<br />
<br />
<!-- <br />
*[[ Projetos Finais do CST em Sistemas de Telecomunicações - Cancelados | Projetos Cancelados]]<br />
*[[ Projetos Finais do CST em Sistemas de Telecomunicações - em Execução | Projetos em Execução]]<br />
--></div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=MPLS-TE_na_Redes_da_Eletrosul_-_Centrais_El%C3%A9tricas_S.A.&diff=123287MPLS-TE na Redes da Eletrosul - Centrais Elétricas S.A.2016-12-15T02:25:23Z<p>Ana.ls1994: /* RESUMO ESTENDIDO */</p>
<hr />
<div>__toc__<br />
<br />
=TCC-Ana Luiza Scharf=<br />
<br />
Autor: '''Ana Luiza Scharf'''<br />
<br />
Orientador: '''Marcelo Maia Sobral'''<br />
<br />
Curso: Engenharia de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
analuscharf@gmail.com<br />
<br />
==RESUMO ESTENDIDO==<br />
<br />
<br />
O presente trabalho é um estudo de caso da rede da Eletricas - Centrais Elétricas S.A. Onde realizará um laboratório de testes sobre a técnica de MPLS juntamente empregada com a engenharia de tráfego, MPLS-TE, e oferecer níveis de garantias de serviço (QoS) para os diversos tipos de serviços. O objetivo desse laboratório é verificar-se a utilização dessas técnicas são suficientes para resolver os déficits atuais da metro Ethernet da Eletrosul, tais quais: subutilização da rede, ausência do controle dos tipos de tráfegos e vulnerabilidade da rede em relação a falha de enlace.<br />
<br />
<br />
O desejo da Eletrosul em empregar o MPLS, é para solucionar a vulnerabilidade de falha de enlace, um problema recorrente na sua rede. O MPLS é uma técnica de comutação de pacotes através de rótulos (''label''), que permite encontrar caminhos alternativos até o seu destino, caso ocorra falha de enlace. O mecanismo de QoS, permite classificar e marcar os tráfegos que transitam pela rede e também fornecer formas de priorização para os serviços que tem uma prioridade maior. A engenharia de tráfego fornece meios de controlar os tráfegos da rede, evitando congestionamento e o desperdício dos recursos dela.<br />
<br />
<br />
O laboratório de testes que acontecerá na Eletrosul, simulará uma parte da sua topologia para averiguar o funcionamento dessas técnicas. Além de verificar se elas realmente fornecem os benefícios que elas possuem e se são capazes de solucionar as atuais deficiências da rede da Eletrosul. Para mais tarde, seja implementado o MPLS-TE com QoS em toda infraestrutura.<br />
<br />
== APRESENTAÇÃO DO TCC==<br />
<br />
A seguir a o link com os seguintes conteúdos:<br />
<br />
*Objeto de estudo: <br />
*Problema de pesquisa; <br />
*Objetivo Geral;<br />
*Objetivo Específico;<br />
*Estrutura do Marco Teórico;<br />
*Principais Fontes;<br />
*Cronograma;<br />
*Dificuldades;<br />
*Referências.<br />
<br />
[https://www.dropbox.com/home/TCC1 Apresentação: proposta do TCC]<br />
<br />
==REFERÊNCIAS BIBLIOGRÁFICAS==<br />
<br />
<br />
'''1.''' D. Awduche, J. Malcolm,J. Agogbua, M O’Dell e J. McManus. “RFC<br />
2702: Requirements for Traffic Engineering Over MPLS ”.Setembro 1999<br />
<br />
'''2.''' D. Awduche, A. Chiu,A. Elwalid, I. Widjaja e X. Xiao. “RFC 3272:<br />
Overview and Principles of Internet Traffic Engineering ”. May 2002<br />
<br />
'''3.''' Muckai K Girish,Bei Zhou e Jian-Qiang Hu, “Formulation of the<br />
Traffic Engineering Problems in MPLS Based IP Networks”, pp.<br />
214–219,2000.<br />
<br />
'''4.''' Ina Minei e Julian Lucek, “MPLS-Enabled Aplications: Emerging<br />
Developments and New Tecnologies”, pp. 214–219,2006.<br />
<br />
'''5.''' E. Rosen, A. Viswanathan e R. Callon, M O’Dell e J. McManus. “RFC<br />
3031: Multiprotocol Label Switching Architecture ”.January 2001<br />
<br />
'''6.''' Bruce Davie e Yakov Rekhter, “MPLS: Tecnology and<br />
Applications”,2000.<br />
<br />
'''7.''' K. Kompella e Y. Rekhter. “RFC 4206: Label Switched Paths (LSP)<br />
Hierarchy with Generalized Multi-Protocol Label Switching (GMPLS)<br />
Traffic Engineering (TE)”.Setembro 2005<br />
<br />
'''8.'''L. Andersson, I. Minei e B. Thomas. “RFC 5036: LDP Specification ”.<br />
October 2007<br />
<br />
'''9.''' Y. Rekhter, T. Li e S. Hares . “RFC 4271: A Border Gateway<br />
Protocol 4 (BGP-4) ”. January 2006<br />
<br />
'''10.''' D. Katz, K. Kompella e D. Yeung. “RFC 3630: Traffic Engineering<br />
(TE) Extensions to OSPF Version 2 ”. September 2003<br />
<br />
'''11.''' S. Kini e W. Lu. “RFC 6138: LDP IGP Synchronization for<br />
Broadcast Networks ”. February 2011<br />
<br />
'''12.''' R. Braden, L. Zhang, S. Berson, S. Herzog e S. Jamin “RFC 2205:<br />
Resource ReSerVation Protocol (RSVP)s ”. Septmber 1997<br />
<br />
'''13.''' D. Awduche, L. Berger, D. Gan, T. Li, V. Srinivasan e G. Swallow<br />
“RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels ”.<br />
December 2001<br />
<br />
'''14.''' J. Korhonen, M. Arumaithurai e A. Lior. “RFC 5777: Traffic<br />
Classification and Quality of Service (QoS) Attributes for Diameter ”,<br />
February 2010<br />
<br />
'''15.''' R. Braden, D. Clark e S. Shenker . “RFC 1633: Integrated Services<br />
in the Internet Architecture: an Overview ”. June 1994<br />
<br />
'''16.''' F. Le Faucheur, L. Wu, S. Davari, P. Vaananen, R. Krishnan, P.<br />
Cheval e J. Heinanen . “RFC 3270: Multi-Protocol Label Switching<br />
(MPLS) Support of Differentiated Service ”. May 2002<br />
<br />
'''17.''' L. Andersson e R. Asat. “RFC 5462: Multiprotocol Label Switching<br />
(MPLS) Label Stack Entry: ”EXP”Field Renamed to ”Traffic Class”Field<br />
”. February 200 <br />
<br />
'''18.''' J. Babiarz e F.Baker “RFC 4594: Configuration Guidelines for<br />
DiffServ Service Classes”. August 2006<br />
<br />
'''19.''' F. Le Faucheur e W. Lai “RFC 3564: Requirements for Support of<br />
Differentiated Services-aware MPLS Traffic Engineering ”, July 2003<br />
<br />
'''20.''' J. Heinanen, F. Baker, W. Weiss e J. Wroclawski “RFC 2597:<br />
Assured Forwarding PHB Group”. June 1999<br />
<br />
'''21.''' An Expedited Forwarding PHB (Per-Hop Behavior) “RFC 3246: An<br />
Expedited Forwarding PHB (Per-Hop Behavior)”. March 2002<br />
<br />
'''22.''' Cisco IOS Quality of Service Solutions Configuration Guide, Release<br />
12.2. Disponível em: http:<br />
//www.cisco.com/c/en/us/td/docs/ios/122/qos/configuration/guide/fqo<br />
<br />
== CRONOGRAMA ==<br />
<br />
<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses| Etapas |Ago/2016|Set/2016|Out/2016|Nov/2016|Dez/2016|Jan/2017|Fev/2017|Mar/2017|Abr/2017|Maio/2017|Jun/2017}}<br />
{{cronogramaX-item | Formulação do tema |1 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Revisão Bibliográfica I |0 |1 |1 |1 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Modelagem |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Implantação |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 }}<br />
{{cronogramaX-item | Experimentos |0 |0 |0 |0 |0 |0 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Avaliação dos resultados |0 |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Relato e conclusões |0 |0 |0 |0 |0 |1 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Revisão da tese |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 }}<br />
|}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=MPLS-TE_na_Redes_da_Eletrosul_-_Centrais_El%C3%A9tricas_S.A.&diff=123286MPLS-TE na Redes da Eletrosul - Centrais Elétricas S.A.2016-12-15T02:24:30Z<p>Ana.ls1994: /* REFERÊNCIAS BIBLIOGRÁFICAS */</p>
<hr />
<div>__toc__<br />
<br />
=TCC-Ana Luiza Scharf=<br />
<br />
Autor: '''Ana Luiza Scharf'''<br />
<br />
Orientador: '''Marcelo Maia Sobral'''<br />
<br />
Curso: Engenharia de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
analuscharf@gmail.com<br />
<br />
==RESUMO ESTENDIDO==<br />
<br />
<br />
O presente trabalho é um estudo de caso da rede da Eletricas - Centrais Elétricas S.A. Onde realizará um laboratório de testes sobre a técnica de MPLS juntamente empregada com a engenharia de tráfego, MPLS-TE, e oferecer níveis de garantias de serviço (QoS) para os diversos tipos de serviços. O objetivo desse laboratório é verificar-se a utilização dessas técnicas são suficientes para resolver os déficits atuais da metro Ethernet da Eletrosul, tais quais: subutilização da rede, ausência do controle dos tipos de tráfegos e vulnerabilidade da rede em relação a falha de enlace.<br />
<br />
<br />
O desejo da Eletrosul em empregar o MPLS, é para solucionar a vulnerabilidade de falha de enlace, um problema recorrente na sua rede. O MPLS é uma técnica de comutação de pacotes através de rótulos (label), que permite encontrar caminhos alternativos até o seu destino, caso ocorra falha de enlace. O mecanismo de QoS, permite classificar e marcar os tráfegos que transitam pela rede e também fornecer formas de priorização para os serviços que tem uma prioridade maior. A engenharia de tráfego fornece meios de controlar os tráfegos da rede, evitando congestionamento e o desperdício dos recursos dela.<br />
<br />
<br />
O laboratório de testes que acontecerá na Eletrosul, simulará uma parte da sua topologia para averiguar o funcionamento dessas técnicas. Além de verificar se elas realmente fornecem os benefícios que elas possuem e se são capazes de solucionar as atuais deficiências da rede da Eletrosul. Para mais tarde, seja implementado o MPLS-TE com QoS em toda infraestrutura.<br />
<br />
<br />
== APRESENTAÇÃO DO TCC==<br />
<br />
A seguir a o link com os seguintes conteúdos:<br />
<br />
*Objeto de estudo: <br />
*Problema de pesquisa; <br />
*Objetivo Geral;<br />
*Objetivo Específico;<br />
*Estrutura do Marco Teórico;<br />
*Principais Fontes;<br />
*Cronograma;<br />
*Dificuldades;<br />
*Referências.<br />
<br />
[https://www.dropbox.com/home/TCC1 Apresentação: proposta do TCC]<br />
<br />
==REFERÊNCIAS BIBLIOGRÁFICAS==<br />
<br />
<br />
'''1.''' D. Awduche, J. Malcolm,J. Agogbua, M O’Dell e J. McManus. “RFC<br />
2702: Requirements for Traffic Engineering Over MPLS ”.Setembro 1999<br />
<br />
'''2.''' D. Awduche, A. Chiu,A. Elwalid, I. Widjaja e X. Xiao. “RFC 3272:<br />
Overview and Principles of Internet Traffic Engineering ”. May 2002<br />
<br />
'''3.''' Muckai K Girish,Bei Zhou e Jian-Qiang Hu, “Formulation of the<br />
Traffic Engineering Problems in MPLS Based IP Networks”, pp.<br />
214–219,2000.<br />
<br />
'''4.''' Ina Minei e Julian Lucek, “MPLS-Enabled Aplications: Emerging<br />
Developments and New Tecnologies”, pp. 214–219,2006.<br />
<br />
'''5.''' E. Rosen, A. Viswanathan e R. Callon, M O’Dell e J. McManus. “RFC<br />
3031: Multiprotocol Label Switching Architecture ”.January 2001<br />
<br />
'''6.''' Bruce Davie e Yakov Rekhter, “MPLS: Tecnology and<br />
Applications”,2000.<br />
<br />
'''7.''' K. Kompella e Y. Rekhter. “RFC 4206: Label Switched Paths (LSP)<br />
Hierarchy with Generalized Multi-Protocol Label Switching (GMPLS)<br />
Traffic Engineering (TE)”.Setembro 2005<br />
<br />
'''8.'''L. Andersson, I. Minei e B. Thomas. “RFC 5036: LDP Specification ”.<br />
October 2007<br />
<br />
'''9.''' Y. Rekhter, T. Li e S. Hares . “RFC 4271: A Border Gateway<br />
Protocol 4 (BGP-4) ”. January 2006<br />
<br />
'''10.''' D. Katz, K. Kompella e D. Yeung. “RFC 3630: Traffic Engineering<br />
(TE) Extensions to OSPF Version 2 ”. September 2003<br />
<br />
'''11.''' S. Kini e W. Lu. “RFC 6138: LDP IGP Synchronization for<br />
Broadcast Networks ”. February 2011<br />
<br />
'''12.''' R. Braden, L. Zhang, S. Berson, S. Herzog e S. Jamin “RFC 2205:<br />
Resource ReSerVation Protocol (RSVP)s ”. Septmber 1997<br />
<br />
'''13.''' D. Awduche, L. Berger, D. Gan, T. Li, V. Srinivasan e G. Swallow<br />
“RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels ”.<br />
December 2001<br />
<br />
'''14.''' J. Korhonen, M. Arumaithurai e A. Lior. “RFC 5777: Traffic<br />
Classification and Quality of Service (QoS) Attributes for Diameter ”,<br />
February 2010<br />
<br />
'''15.''' R. Braden, D. Clark e S. Shenker . “RFC 1633: Integrated Services<br />
in the Internet Architecture: an Overview ”. June 1994<br />
<br />
'''16.''' F. Le Faucheur, L. Wu, S. Davari, P. Vaananen, R. Krishnan, P.<br />
Cheval e J. Heinanen . “RFC 3270: Multi-Protocol Label Switching<br />
(MPLS) Support of Differentiated Service ”. May 2002<br />
<br />
'''17.''' L. Andersson e R. Asat. “RFC 5462: Multiprotocol Label Switching<br />
(MPLS) Label Stack Entry: ”EXP”Field Renamed to ”Traffic Class”Field<br />
”. February 200 <br />
<br />
'''18.''' J. Babiarz e F.Baker “RFC 4594: Configuration Guidelines for<br />
DiffServ Service Classes”. August 2006<br />
<br />
'''19.''' F. Le Faucheur e W. Lai “RFC 3564: Requirements for Support of<br />
Differentiated Services-aware MPLS Traffic Engineering ”, July 2003<br />
<br />
'''20.''' J. Heinanen, F. Baker, W. Weiss e J. Wroclawski “RFC 2597:<br />
Assured Forwarding PHB Group”. June 1999<br />
<br />
'''21.''' An Expedited Forwarding PHB (Per-Hop Behavior) “RFC 3246: An<br />
Expedited Forwarding PHB (Per-Hop Behavior)”. March 2002<br />
<br />
'''22.''' Cisco IOS Quality of Service Solutions Configuration Guide, Release<br />
12.2. Disponível em: http:<br />
//www.cisco.com/c/en/us/td/docs/ios/122/qos/configuration/guide/fqo<br />
<br />
== CRONOGRAMA ==<br />
<br />
<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses| Etapas |Ago/2016|Set/2016|Out/2016|Nov/2016|Dez/2016|Jan/2017|Fev/2017|Mar/2017|Abr/2017|Maio/2017|Jun/2017}}<br />
{{cronogramaX-item | Formulação do tema |1 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Revisão Bibliográfica I |0 |1 |1 |1 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Modelagem |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Implantação |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 }}<br />
{{cronogramaX-item | Experimentos |0 |0 |0 |0 |0 |0 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Avaliação dos resultados |0 |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Relato e conclusões |0 |0 |0 |0 |0 |1 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Revisão da tese |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 }}<br />
|}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=MPLS-TE_na_Redes_da_Eletrosul_-_Centrais_El%C3%A9tricas_S.A.&diff=123285MPLS-TE na Redes da Eletrosul - Centrais Elétricas S.A.2016-12-15T02:24:02Z<p>Ana.ls1994: /* REFERÊNCIAS BIBLIOGRÁFICAS */</p>
<hr />
<div>__toc__<br />
<br />
=TCC-Ana Luiza Scharf=<br />
<br />
Autor: '''Ana Luiza Scharf'''<br />
<br />
Orientador: '''Marcelo Maia Sobral'''<br />
<br />
Curso: Engenharia de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
analuscharf@gmail.com<br />
<br />
==RESUMO ESTENDIDO==<br />
<br />
<br />
O presente trabalho é um estudo de caso da rede da Eletricas - Centrais Elétricas S.A. Onde realizará um laboratório de testes sobre a técnica de MPLS juntamente empregada com a engenharia de tráfego, MPLS-TE, e oferecer níveis de garantias de serviço (QoS) para os diversos tipos de serviços. O objetivo desse laboratório é verificar-se a utilização dessas técnicas são suficientes para resolver os déficits atuais da metro Ethernet da Eletrosul, tais quais: subutilização da rede, ausência do controle dos tipos de tráfegos e vulnerabilidade da rede em relação a falha de enlace.<br />
<br />
<br />
O desejo da Eletrosul em empregar o MPLS, é para solucionar a vulnerabilidade de falha de enlace, um problema recorrente na sua rede. O MPLS é uma técnica de comutação de pacotes através de rótulos (label), que permite encontrar caminhos alternativos até o seu destino, caso ocorra falha de enlace. O mecanismo de QoS, permite classificar e marcar os tráfegos que transitam pela rede e também fornecer formas de priorização para os serviços que tem uma prioridade maior. A engenharia de tráfego fornece meios de controlar os tráfegos da rede, evitando congestionamento e o desperdício dos recursos dela.<br />
<br />
<br />
O laboratório de testes que acontecerá na Eletrosul, simulará uma parte da sua topologia para averiguar o funcionamento dessas técnicas. Além de verificar se elas realmente fornecem os benefícios que elas possuem e se são capazes de solucionar as atuais deficiências da rede da Eletrosul. Para mais tarde, seja implementado o MPLS-TE com QoS em toda infraestrutura.<br />
<br />
<br />
== APRESENTAÇÃO DO TCC==<br />
<br />
A seguir a o link com os seguintes conteúdos:<br />
<br />
*Objeto de estudo: <br />
*Problema de pesquisa; <br />
*Objetivo Geral;<br />
*Objetivo Específico;<br />
*Estrutura do Marco Teórico;<br />
*Principais Fontes;<br />
*Cronograma;<br />
*Dificuldades;<br />
*Referências.<br />
<br />
[https://www.dropbox.com/home/TCC1 Apresentação: proposta do TCC]<br />
<br />
==REFERÊNCIAS BIBLIOGRÁFICAS==<br />
<br />
<br />
'''1.''' D. Awduche, J. Malcolm,J. Agogbua, M O’Dell e J. McManus. “RFC<br />
2702: Requirements for Traffic Engineering Over MPLS ”.Setembro 1999<br />
<br />
'''2.''' D. Awduche, A. Chiu,A. Elwalid, I. Widjaja e X. Xiao. “RFC 3272:<br />
Overview and Principles of Internet Traffic Engineering ”. May 2002<br />
<br />
'''3.''' Muckai K Girish,Bei Zhou e Jian-Qiang Hu, “Formulation of the<br />
Traffic Engineering Problems in MPLS Based IP Networks”, pp.<br />
214–219,2000.<br />
<br />
'''4.''' Ina Minei e Julian Lucek, “MPLS-Enabled Aplications: Emerging<br />
Developments and New Tecnologies”, pp. 214–219,2006.<br />
<br />
'''5.''' E. Rosen, A. Viswanathan e R. Callon, M O’Dell e J. McManus. “RFC<br />
3031: Multiprotocol Label Switching Architecture ”.January 2001<br />
<br />
'''6.''' Bruce Davie e Yakov Rekhter, “MPLS: Tecnology and<br />
Applications”,2000.<br />
<br />
'''7.''' K. Kompella e Y. Rekhter. “RFC 4206: Label Switched Paths (LSP)<br />
Hierarchy with Generalized Multi-Protocol Label Switching (GMPLS)<br />
Traffic Engineering (TE)”.Setembro 2005<br />
<br />
'''8.'''L. Andersson, I. Minei e B. Thomas. “RFC 5036: LDP Specification ”.<br />
October 2007<br />
<br />
'''9.''' Y. Rekhter, T. Li e S. Hares . “RFC 4271: A Border Gateway<br />
Protocol 4 (BGP-4) ”. January 2006<br />
<br />
'''10.''' D. Katz, K. Kompella e D. Yeung. “RFC 3630: Traffic Engineering<br />
(TE) Extensions to OSPF Version 2 ”. September 2003<br />
<br />
'''11.''' S. Kini e W. Lu. “RFC 6138: LDP IGP Synchronization for<br />
Broadcast Networks ”. February 2011<br />
<br />
'''12.''' R. Braden, L. Zhang, S. Berson, S. Herzog e S. Jamin “RFC 2205:<br />
Resource ReSerVation Protocol (RSVP)s ”. Septmber 1997<br />
<br />
'''13.''' D. Awduche, L. Berger, D. Gan, T. Li, V. Srinivasan e G. Swallow<br />
“RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels ”.<br />
December 2001<br />
<br />
'''14.''' J. Korhonen, M. Arumaithurai e A. Lior. “RFC 5777: Traffic<br />
Classification and Quality of Service (QoS) Attributes for Diameter ”,<br />
February 2010<br />
<br />
'''15.''' R. Braden, D. Clark e S. Shenker . “RFC 1633: Integrated Services<br />
in the Internet Architecture: an Overview ”. June 1994<br />
<br />
'''16.''' F. Le Faucheur, L. Wu, S. Davari, P. Vaananen, R. Krishnan, P.<br />
Cheval e J. Heinanen . “RFC 3270: Multi-Protocol Label Switching<br />
(MPLS) Support of Differentiated Service ”. May 2002<br />
<br />
'''17.''' L. Andersson e R. Asat. “RFC 5462: Multiprotocol Label Switching<br />
(MPLS) Label Stack Entry: ”EXP”Field Renamed to ”Traffic Class”Field<br />
”. February 200 <br />
<br />
'''18.''' J. Babiarz e F.Baker “RFC 4594: Configuration Guidelines for<br />
DiffServ Service Classes”. August 2006<br />
<br />
'''19.''' F. Le Faucheur e W. Lai “RFC 3564: Requirements for Support of<br />
Differentiated Services-aware MPLS Traffic Engineering ”, July 2003<br />
<br />
'''20.''' J. Heinanen, F. Baker, W. Weiss e J. Wroclawski “RFC 2597:<br />
Assured Forwarding PHB Group”. June 1999<br />
<br />
'''21.''' An Expedited Forwarding PHB (Per-Hop Behavior) “RFC 3246: An<br />
Expedited Forwarding PHB (Per-Hop Behavior)”. March 2002<br />
<br />
'''22.''' Cisco IOS Quality of Service Solutions Configuration Guide, Release<br />
12.2. Dispon´ıvel em: http:<br />
//www.cisco.com/c/en/us/td/docs/ios/122/qos/configuration/guide/fqo<br />
<br />
== CRONOGRAMA ==<br />
<br />
<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses| Etapas |Ago/2016|Set/2016|Out/2016|Nov/2016|Dez/2016|Jan/2017|Fev/2017|Mar/2017|Abr/2017|Maio/2017|Jun/2017}}<br />
{{cronogramaX-item | Formulação do tema |1 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Revisão Bibliográfica I |0 |1 |1 |1 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Modelagem |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Implantação |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 }}<br />
{{cronogramaX-item | Experimentos |0 |0 |0 |0 |0 |0 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Avaliação dos resultados |0 |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Relato e conclusões |0 |0 |0 |0 |0 |1 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Revisão da tese |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 }}<br />
|}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=MPLS-TE_na_Redes_da_Eletrosul_-_Centrais_El%C3%A9tricas_S.A.&diff=123284MPLS-TE na Redes da Eletrosul - Centrais Elétricas S.A.2016-12-15T02:23:45Z<p>Ana.ls1994: /* REFERÊNCIAS BIBLIOGRÁFICAS */</p>
<hr />
<div>__toc__<br />
<br />
=TCC-Ana Luiza Scharf=<br />
<br />
Autor: '''Ana Luiza Scharf'''<br />
<br />
Orientador: '''Marcelo Maia Sobral'''<br />
<br />
Curso: Engenharia de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
analuscharf@gmail.com<br />
<br />
==RESUMO ESTENDIDO==<br />
<br />
<br />
O presente trabalho é um estudo de caso da rede da Eletricas - Centrais Elétricas S.A. Onde realizará um laboratório de testes sobre a técnica de MPLS juntamente empregada com a engenharia de tráfego, MPLS-TE, e oferecer níveis de garantias de serviço (QoS) para os diversos tipos de serviços. O objetivo desse laboratório é verificar-se a utilização dessas técnicas são suficientes para resolver os déficits atuais da metro Ethernet da Eletrosul, tais quais: subutilização da rede, ausência do controle dos tipos de tráfegos e vulnerabilidade da rede em relação a falha de enlace.<br />
<br />
<br />
O desejo da Eletrosul em empregar o MPLS, é para solucionar a vulnerabilidade de falha de enlace, um problema recorrente na sua rede. O MPLS é uma técnica de comutação de pacotes através de rótulos (label), que permite encontrar caminhos alternativos até o seu destino, caso ocorra falha de enlace. O mecanismo de QoS, permite classificar e marcar os tráfegos que transitam pela rede e também fornecer formas de priorização para os serviços que tem uma prioridade maior. A engenharia de tráfego fornece meios de controlar os tráfegos da rede, evitando congestionamento e o desperdício dos recursos dela.<br />
<br />
<br />
O laboratório de testes que acontecerá na Eletrosul, simulará uma parte da sua topologia para averiguar o funcionamento dessas técnicas. Além de verificar se elas realmente fornecem os benefícios que elas possuem e se são capazes de solucionar as atuais deficiências da rede da Eletrosul. Para mais tarde, seja implementado o MPLS-TE com QoS em toda infraestrutura.<br />
<br />
<br />
== APRESENTAÇÃO DO TCC==<br />
<br />
A seguir a o link com os seguintes conteúdos:<br />
<br />
*Objeto de estudo: <br />
*Problema de pesquisa; <br />
*Objetivo Geral;<br />
*Objetivo Específico;<br />
*Estrutura do Marco Teórico;<br />
*Principais Fontes;<br />
*Cronograma;<br />
*Dificuldades;<br />
*Referências.<br />
<br />
[https://www.dropbox.com/home/TCC1 Apresentação: proposta do TCC]<br />
<br />
==REFERÊNCIAS BIBLIOGRÁFICAS==<br />
<br />
<br />
'''1.''' D. Awduche, J. Malcolm,J. Agogbua, M O’Dell e J. McManus. “RFC<br />
2702: Requirements for Traffic Engineering Over MPLS ”.Setembro 1999<br />
<br />
'''2.''' D. Awduche, A. Chiu,A. Elwalid, I. Widjaja e X. Xiao. “RFC 3272:<br />
Overview and Principles of Internet Traffic Engineering ”. May 2002<br />
<br />
'''3.''' Muckai K Girish,Bei Zhou e Jian-Qiang Hu, “Formulation of the<br />
Traffic Engineering Problems in MPLS Based IP Networks”, pp.<br />
214–219,2000.<br />
<br />
'''4.''' Ina Minei e Julian Lucek, “MPLS-Enabled Aplications: Emerging<br />
Developments and New Tecnologies”, pp. 214–219,2006.<br />
<br />
'''5.''' E. Rosen, A. Viswanathan e R. Callon, M O’Dell e J. McManus. “RFC<br />
3031: Multiprotocol Label Switching Architecture ”.January 2001<br />
<br />
'''6.''' Bruce Davie e Yakov Rekhter, “MPLS: Tecnology and<br />
Applications”,2000.<br />
<br />
'''7.''' K. Kompella e Y. Rekhter. “RFC 4206: Label Switched Paths (LSP)<br />
Hierarchy with Generalized Multi-Protocol Label Switching (GMPLS)<br />
Traffic Engineering (TE)”.Setembro 2005<br />
<br />
'''8.'''L. Andersson, I. Minei e B. Thomas. “RFC 5036: LDP Specification ”.<br />
October 2007<br />
<br />
'''9.''' Y. Rekhter, T. Li e S. Hares . “RFC 4271: A Border Gateway<br />
Protocol 4 (BGP-4) ”. January 2006<br />
<br />
'''10.''' D. Katz, K. Kompella e D. Yeung. “RFC 3630: Traffic Engineering<br />
(TE) Extensions to OSPF Version 2 ”. September 2003<br />
<br />
'''11.''' S. Kini e W. Lu. “RFC 6138: LDP IGP Synchronization for<br />
Broadcast Networks ”. February 2011<br />
<br />
'''12.''' R. Braden, L. Zhang, S. Berson, S. Herzog e S. Jamin “RFC 2205:<br />
Resource ReSerVation Protocol (RSVP)s ”. Septmber 1997<br />
<br />
<br />
'''13.''' D. Awduche, L. Berger, D. Gan, T. Li, V. Srinivasan e G. Swallow<br />
“RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels ”.<br />
December 2001<br />
<br />
'''14.''' J. Korhonen, M. Arumaithurai e A. Lior. “RFC 5777: Traffic<br />
Classification and Quality of Service (QoS) Attributes for Diameter ”,<br />
February 2010<br />
<br />
'''15.''' R. Braden, D. Clark e S. Shenker . “RFC 1633: Integrated Services<br />
in the Internet Architecture: an Overview ”. June 1994<br />
<br />
'''16.''' F. Le Faucheur, L. Wu, S. Davari, P. Vaananen, R. Krishnan, P.<br />
Cheval e J. Heinanen . “RFC 3270: Multi-Protocol Label Switching<br />
(MPLS) Support of Differentiated Service ”. May 2002<br />
<br />
'''17.''' L. Andersson e R. Asat. “RFC 5462: Multiprotocol Label Switching<br />
(MPLS) Label Stack Entry: ”EXP”Field Renamed to ”Traffic Class”Field<br />
”. February 200 <br />
<br />
'''18.''' J. Babiarz e F.Baker “RFC 4594: Configuration Guidelines for<br />
DiffServ Service Classes”. August 2006<br />
<br />
'''19.''' F. Le Faucheur e W. Lai “RFC 3564: Requirements for Support of<br />
Differentiated Services-aware MPLS Traffic Engineering ”, July 2003<br />
<br />
'''20.''' J. Heinanen, F. Baker, W. Weiss e J. Wroclawski “RFC 2597:<br />
Assured Forwarding PHB Group”. June 1999<br />
<br />
'''21.''' An Expedited Forwarding PHB (Per-Hop Behavior) “RFC 3246: An<br />
Expedited Forwarding PHB (Per-Hop Behavior)”. March 2002<br />
<br />
'''22.''' Cisco IOS Quality of Service Solutions Configuration Guide, Release<br />
12.2. Dispon´ıvel em: http:<br />
//www.cisco.com/c/en/us/td/docs/ios/122/qos/configuration/guide/fqo<br />
<br />
== CRONOGRAMA ==<br />
<br />
<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses| Etapas |Ago/2016|Set/2016|Out/2016|Nov/2016|Dez/2016|Jan/2017|Fev/2017|Mar/2017|Abr/2017|Maio/2017|Jun/2017}}<br />
{{cronogramaX-item | Formulação do tema |1 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Revisão Bibliográfica I |0 |1 |1 |1 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Modelagem |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Implantação |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 }}<br />
{{cronogramaX-item | Experimentos |0 |0 |0 |0 |0 |0 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Avaliação dos resultados |0 |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Relato e conclusões |0 |0 |0 |0 |0 |1 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Revisão da tese |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 }}<br />
|}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=MPLS-TE_na_Redes_da_Eletrosul_-_Centrais_El%C3%A9tricas_S.A.&diff=123283MPLS-TE na Redes da Eletrosul - Centrais Elétricas S.A.2016-12-15T02:22:09Z<p>Ana.ls1994: /* REFERÊNCIAS BIBLIOGRÁFICAS */</p>
<hr />
<div>__toc__<br />
<br />
=TCC-Ana Luiza Scharf=<br />
<br />
Autor: '''Ana Luiza Scharf'''<br />
<br />
Orientador: '''Marcelo Maia Sobral'''<br />
<br />
Curso: Engenharia de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
analuscharf@gmail.com<br />
<br />
==RESUMO ESTENDIDO==<br />
<br />
<br />
O presente trabalho é um estudo de caso da rede da Eletricas - Centrais Elétricas S.A. Onde realizará um laboratório de testes sobre a técnica de MPLS juntamente empregada com a engenharia de tráfego, MPLS-TE, e oferecer níveis de garantias de serviço (QoS) para os diversos tipos de serviços. O objetivo desse laboratório é verificar-se a utilização dessas técnicas são suficientes para resolver os déficits atuais da metro Ethernet da Eletrosul, tais quais: subutilização da rede, ausência do controle dos tipos de tráfegos e vulnerabilidade da rede em relação a falha de enlace.<br />
<br />
<br />
O desejo da Eletrosul em empregar o MPLS, é para solucionar a vulnerabilidade de falha de enlace, um problema recorrente na sua rede. O MPLS é uma técnica de comutação de pacotes através de rótulos (label), que permite encontrar caminhos alternativos até o seu destino, caso ocorra falha de enlace. O mecanismo de QoS, permite classificar e marcar os tráfegos que transitam pela rede e também fornecer formas de priorização para os serviços que tem uma prioridade maior. A engenharia de tráfego fornece meios de controlar os tráfegos da rede, evitando congestionamento e o desperdício dos recursos dela.<br />
<br />
<br />
O laboratório de testes que acontecerá na Eletrosul, simulará uma parte da sua topologia para averiguar o funcionamento dessas técnicas. Além de verificar se elas realmente fornecem os benefícios que elas possuem e se são capazes de solucionar as atuais deficiências da rede da Eletrosul. Para mais tarde, seja implementado o MPLS-TE com QoS em toda infraestrutura.<br />
<br />
<br />
== APRESENTAÇÃO DO TCC==<br />
<br />
A seguir a o link com os seguintes conteúdos:<br />
<br />
*Objeto de estudo: <br />
*Problema de pesquisa; <br />
*Objetivo Geral;<br />
*Objetivo Específico;<br />
*Estrutura do Marco Teórico;<br />
*Principais Fontes;<br />
*Cronograma;<br />
*Dificuldades;<br />
*Referências.<br />
<br />
[https://www.dropbox.com/home/TCC1 Apresentação: proposta do TCC]<br />
<br />
==REFERÊNCIAS BIBLIOGRÁFICAS==<br />
<br />
<br />
'''1.''' SKLAR, Bernard. Digital Communications - Fundamentals and Applications. . Englewood Cliffs, N.J.: Prentice-Hall, 1988. ISBN 0132119390<br />
<br />
'''2.''' LATHI, B.P.. Modern Digital and Analog Communications Systems. 3 ed.. : Oxford University Press, 1998. ISBN 0195110099<br />
<br />
'''3.''' LATHI, B.P.. Sistemas de comunicação. . Rio de Janeiro : Guanabara Dois, 1983. ISBN 8570300336<br />
<br />
'''1.''' D. Awduche, J. Malcolm,J. Agogbua, M O’Dell e J. McManus. “RFC<br />
2702: Requirements for Traffic Engineering Over MPLS ”.Setembro 1999<br />
'''2.''' D. Awduche, A. Chiu,A. Elwalid, I. Widjaja e X. Xiao. “RFC 3272:<br />
Overview and Principles of Internet Traffic Engineering ”. May 2002<br />
'''3.''' Muckai K Girish,Bei Zhou e Jian-Qiang Hu, “Formulation of the<br />
Traffic Engineering Problems in MPLS Based IP Networks”, pp.<br />
214–219,2000.<br />
'''4.''' Ina Minei e Julian Lucek, “MPLS-Enabled Aplications: Emerging<br />
Developments and New Tecnologies”, pp. 214–219,2006.<br />
'''5.''' E. Rosen, A. Viswanathan e R. Callon, M O’Dell e J. McManus. “RFC<br />
3031: Multiprotocol Label Switching Architecture ”.January 2001<br />
'''6.''' Bruce Davie e Yakov Rekhter, “MPLS: Tecnology and<br />
Applications”,2000.<br />
14/17Referˆencias<br />
'''7.''' K. Kompella e Y. Rekhter. “RFC 4206: Label Switched Paths (LSP)<br />
Hierarchy with Generalized Multi-Protocol Label Switching (GMPLS)<br />
Traffic Engineering (TE)”.Setembro 2005<br />
'''8.'''L. Andersson, I. Minei e B. Thomas. “RFC 5036: LDP Specification ”.<br />
October 2007<br />
'''9.''' Y. Rekhter, T. Li e S. Hares . “RFC 4271: A Border Gateway<br />
Protocol 4 (BGP-4) ”. January 2006<br />
'''10.''' D. Katz, K. Kompella e D. Yeung. “RFC 3630: Traffic Engineering<br />
(TE) Extensions to OSPF Version 2 ”. September 2003<br />
'''11.''' S. Kini e W. Lu. “RFC 6138: LDP IGP Synchronization for<br />
Broadcast Networks ”. February 2011<br />
'''12.''' R. Braden, L. Zhang, S. Berson, S. Herzog e S. Jamin “RFC 2205:<br />
Resource ReSerVation Protocol (RSVP)s ”. Septmber 1997<br />
15/17Referˆencias<br />
'''13.''' D. Awduche, L. Berger, D. Gan, T. Li, V. Srinivasan e G. Swallow<br />
“RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels ”.<br />
December 2001<br />
'''14.''' J. Korhonen, M. Arumaithurai e A. Lior. “RFC 5777: Traffic<br />
Classification and Quality of Service (QoS) Attributes for Diameter ”,<br />
February 2010<br />
'''15.''' R. Braden, D. Clark e S. Shenker . “RFC 1633: Integrated Services<br />
in the Internet Architecture: an Overview ”. June 1994<br />
'''16.''' F. Le Faucheur, L. Wu, S. Davari, P. Vaananen, R. Krishnan, P.<br />
Cheval e J. Heinanen . “RFC 3270: Multi-Protocol Label Switching<br />
(MPLS) Support of Differentiated Service ”. May 2002<br />
'''17.''' L. Andersson e R. Asat. “RFC 5462: Multiprotocol Label Switching<br />
(MPLS) Label Stack Entry: ”EXP”Field Renamed to ”Traffic Class”Field<br />
”. February 2009<br />
16/17Referˆencias<br />
'''18.''' J. Babiarz e F.Baker “RFC 4594: Configuration Guidelines for<br />
DiffServ Service Classes”. August 2006<br />
'''19.''' F. Le Faucheur e W. Lai “RFC 3564: Requirements for Support of<br />
Differentiated Services-aware MPLS Traffic Engineering ”, July 2003<br />
'''20.''' J. Heinanen, F. Baker, W. Weiss e J. Wroclawski “RFC 2597:<br />
Assured Forwarding PHB Group”. June 1999<br />
'''21.''' An Expedited Forwarding PHB (Per-Hop Behavior) “RFC 3246: An<br />
Expedited Forwarding PHB (Per-Hop Behavior)”. March 2002<br />
'''22.''' Cisco IOS Quality of Service Solutions Configuration Guide, Release<br />
12.2. Dispon´ıvel em: http:<br />
//www.cisco.com/c/en/us/td/docs/ios/122/qos/configuration/guide/fqo<br />
<br />
== CRONOGRAMA ==<br />
<br />
<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses| Etapas |Ago/2016|Set/2016|Out/2016|Nov/2016|Dez/2016|Jan/2017|Fev/2017|Mar/2017|Abr/2017|Maio/2017|Jun/2017}}<br />
{{cronogramaX-item | Formulação do tema |1 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Revisão Bibliográfica I |0 |1 |1 |1 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Modelagem |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Implantação |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 }}<br />
{{cronogramaX-item | Experimentos |0 |0 |0 |0 |0 |0 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Avaliação dos resultados |0 |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Relato e conclusões |0 |0 |0 |0 |0 |1 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Revisão da tese |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 }}<br />
|}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=MPLS-TE_na_Redes_da_Eletrosul_-_Centrais_El%C3%A9tricas_S.A.&diff=123282MPLS-TE na Redes da Eletrosul - Centrais Elétricas S.A.2016-12-15T02:19:20Z<p>Ana.ls1994: Criou página com '__toc__ =TCC-Ana Luiza Scharf= Autor: '''Ana Luiza Scharf''' Orientador: '''Marcelo Maia Sobral''' Curso: Engenharia de Telecomunicações Instituto Federal de Santa Catarin...'</p>
<hr />
<div>__toc__<br />
<br />
=TCC-Ana Luiza Scharf=<br />
<br />
Autor: '''Ana Luiza Scharf'''<br />
<br />
Orientador: '''Marcelo Maia Sobral'''<br />
<br />
Curso: Engenharia de Telecomunicações<br />
<br />
Instituto Federal de Santa Catarina (IFSC), São José – SC<br />
<br />
analuscharf@gmail.com<br />
<br />
==RESUMO ESTENDIDO==<br />
<br />
<br />
O presente trabalho é um estudo de caso da rede da Eletricas - Centrais Elétricas S.A. Onde realizará um laboratório de testes sobre a técnica de MPLS juntamente empregada com a engenharia de tráfego, MPLS-TE, e oferecer níveis de garantias de serviço (QoS) para os diversos tipos de serviços. O objetivo desse laboratório é verificar-se a utilização dessas técnicas são suficientes para resolver os déficits atuais da metro Ethernet da Eletrosul, tais quais: subutilização da rede, ausência do controle dos tipos de tráfegos e vulnerabilidade da rede em relação a falha de enlace.<br />
<br />
<br />
O desejo da Eletrosul em empregar o MPLS, é para solucionar a vulnerabilidade de falha de enlace, um problema recorrente na sua rede. O MPLS é uma técnica de comutação de pacotes através de rótulos (label), que permite encontrar caminhos alternativos até o seu destino, caso ocorra falha de enlace. O mecanismo de QoS, permite classificar e marcar os tráfegos que transitam pela rede e também fornecer formas de priorização para os serviços que tem uma prioridade maior. A engenharia de tráfego fornece meios de controlar os tráfegos da rede, evitando congestionamento e o desperdício dos recursos dela.<br />
<br />
<br />
O laboratório de testes que acontecerá na Eletrosul, simulará uma parte da sua topologia para averiguar o funcionamento dessas técnicas. Além de verificar se elas realmente fornecem os benefícios que elas possuem e se são capazes de solucionar as atuais deficiências da rede da Eletrosul. Para mais tarde, seja implementado o MPLS-TE com QoS em toda infraestrutura.<br />
<br />
<br />
== APRESENTAÇÃO DO TCC==<br />
<br />
A seguir a o link com os seguintes conteúdos:<br />
<br />
*Objeto de estudo: <br />
*Problema de pesquisa; <br />
*Objetivo Geral;<br />
*Objetivo Específico;<br />
*Estrutura do Marco Teórico;<br />
*Principais Fontes;<br />
*Cronograma;<br />
*Dificuldades;<br />
*Referências.<br />
<br />
[https://www.dropbox.com/home/TCC1 Apresentação: proposta do TCC]<br />
<br />
==REFERÊNCIAS BIBLIOGRÁFICAS==<br />
<br />
<br />
'''1.''' SKLAR, Bernard. Digital Communications - Fundamentals and Applications. . Englewood Cliffs, N.J.: Prentice-Hall, 1988. ISBN 0132119390<br />
<br />
'''2.''' LATHI, B.P.. Modern Digital and Analog Communications Systems. 3 ed.. : Oxford University Press, 1998. ISBN 0195110099<br />
<br />
'''3.''' LATHI, B.P.. Sistemas de comunicação. . Rio de Janeiro : Guanabara Dois, 1983. ISBN 8570300336<br />
<br />
<br />
<br />
== CRONOGRAMA ==<br />
<br />
<br />
{{cronogramaX-top}}<br />
{{cronogramaX-meses| Etapas |Ago/2016|Set/2016|Out/2016|Nov/2016|Dez/2016|Jan/2017|Fev/2017|Mar/2017|Abr/2017|Maio/2017|Jun/2017}}<br />
{{cronogramaX-item | Formulação do tema |1 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Revisão Bibliográfica I |0 |1 |1 |1 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |1 |0 |0 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Modelagem |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 |0 }}<br />
{{cronogramaX-item | Implantação |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 |0 }}<br />
{{cronogramaX-item | Experimentos |0 |0 |0 |0 |0 |0 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Avaliação dos resultados |0 |0 |0 |0 |0 |0 |0 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Relato e conclusões |0 |0 |0 |0 |0 |1 |1 |1 |1 |0 |0 }}<br />
{{cronogramaX-item | Revisão da tese |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 |0 }}<br />
{{cronogramaX-item | Entrega e defesa do TCC I |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |1 }}<br />
|}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-meses&diff=123281Predefinição:CronogramaX-meses2016-12-15T02:18:32Z<p>Ana.ls1994: </p>
<hr />
<div>! scope="col" width=50% style="text-align:left"| {{{1}}}<br />
! scope="col" width=8% | {{{2}}}<br />
! scope="col" width=8% | {{{3}}}<br />
! scope="col" width=8% | {{{4}}}<br />
! scope="col" width=8% | {{{5}}}<br />
! scope="col" width=8% | {{{6}}}<br />
! scope="col" width=8% | {{{7}}}<br />
! scope="col" width=8% | {{{8}}}<br />
! scope="col" width=8% | {{{9}}}<br />
! scope="col" width=8% | {{{10}}}<br />
! scope="col" width=8% | {{{11}}}<br />
! scope="col" width=8% | {{{12}}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-meses&diff=123280Predefinição:CronogramaX-meses2016-12-15T02:17:38Z<p>Ana.ls1994: </p>
<hr />
<div>! scope="col" width=50% style="text-align:left"| {{{1}}}<br />
! scope="col" width=10% | {{{2}}}<br />
! scope="col" width=10% | {{{3}}}<br />
! scope="col" width=10% | {{{4}}}<br />
! scope="col" width=10% | {{{5}}}<br />
! scope="col" width=10% | {{{6}}}<br />
! scope="col" width=10% | {{{7}}}<br />
! scope="col" width=10% | {{{8}}}<br />
! scope="col" width=10% | {{{9}}}<br />
! scope="col" width=10% | {{{10}}}<br />
! scope="col" width=10% | {{{11}}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-meses&diff=123279Predefinição:CronogramaX-meses2016-12-15T02:15:39Z<p>Ana.ls1994: </p>
<hr />
<div>! scope="col" width=50% style="text-align:left"| {{{1}}}<br />
! scope="col" width=10% | {{{2}}}<br />
! scope="col" width=10% | {{{3}}}<br />
! scope="col" width=10% | {{{4}}}<br />
! scope="col" width=10% | {{{5}}}<br />
! scope="col" width=10% | {{{6}}}<br />
! scope="col" width=10% | {{{7}}}<br />
! scope="col" width=10% | {{{8}}}<br />
! scope="col" width=10% | {{{9}}}<br />
! scope="col" width=10% | {{{10}}}<br />
! scope="col" width=10% | {{{11}}}<br />
! scope="col" width=10% | {{{12}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-item&diff=123278Predefinição:CronogramaX-item2016-12-15T02:15:08Z<p>Ana.ls1994: </p>
<hr />
<div>| align="left" | {{{1}}}<br />
| align="center" | {{#switch:{{{2}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{3}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{4}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{5}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{6}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{7}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{8}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{9}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{10}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{11}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{12}}} |1=X |0=}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-meses&diff=123277Predefinição:CronogramaX-meses2016-12-15T02:12:18Z<p>Ana.ls1994: </p>
<hr />
<div>! scope="col" width=50% style="text-align:left"| {{{1}}}<br />
! scope="col" width=10% | {{{2}}}<br />
! scope="col" width=10% | {{{3}}}<br />
! scope="col" width=10% | {{{4}}}<br />
! scope="col" width=10% | {{{5}}}<br />
! scope="col" width=10% | {{{6}}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Predefini%C3%A7%C3%A3o:CronogramaX-item&diff=123276Predefinição:CronogramaX-item2016-12-15T02:11:52Z<p>Ana.ls1994: </p>
<hr />
<div>| align="left" | {{{1}}}<br />
| align="center" | {{#switch:{{{2}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{3}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{4}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{5}}} |1=X |0=}}<br />
| align="center" | {{#switch:{{{6}}} |1=X |0=}}<br />
|-</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Usu%C3%A1rio:Ana.ls1994&diff=122785Usuário:Ana.ls19942016-12-08T02:27:43Z<p>Ana.ls1994: /* TCC-Ana Luiza Scharf */</p>
<hr />
<div></div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Ana_Luiza_Scharf&diff=122784Ana Luiza Scharf2016-12-08T02:27:34Z<p>Ana.ls1994: Criou página com '=TCC-Ana Luiza Scharf= Instituto Federal de Santa Catarina - Campus São José Curso: Engenharia de Telecomunicações Título: MPLS-TE na rede da Eletrosul Centrais Elétrica...'</p>
<hr />
<div>=TCC-Ana Luiza Scharf=<br />
<br />
Instituto Federal de Santa Catarina - Campus São José<br />
<br />
Curso: Engenharia de Telecomunicações<br />
<br />
Título: MPLS-TE na rede da Eletrosul Centrais Elétrica S/A<br />
<br />
Graduanda: Ana Luiza Scharf<br />
<br />
Orientador: Marcelo Maia Sobral<br />
<br />
<br />
=== Proposta===<br />
<br />
A seguir a o link com os seguintes conteúdos:<br />
<br />
* Objeto de estudo;<br />
*Problema de pesquisa; <br />
*Objetivo Geral;<br />
*Objetivo Específico;<br />
*Estrutura do Marco Teórico;<br />
*Principais Fontes;<br />
*Cronograma;<br />
*Dificuldades;<br />
*Referências.<br />
<br />
[https://www.dropbox.com/home/TCC1 Apresentação: proposta do TCC]</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=Usu%C3%A1rio:Ana.ls1994&diff=122783Usuário:Ana.ls19942016-12-08T02:25:44Z<p>Ana.ls1994: Criou página com '=TCC-Ana Luiza Scharf= Instituto Federal de Santa Catarina - Campus São José Curso: Engenharia de Telecomunicações Título: MPLS-TE na rede da Eletrosul Centrais Elétrica...'</p>
<hr />
<div>=TCC-Ana Luiza Scharf=<br />
<br />
Instituto Federal de Santa Catarina - Campus São José<br />
<br />
Curso: Engenharia de Telecomunicações<br />
<br />
Título: MPLS-TE na rede da Eletrosul Centrais Elétrica S/A<br />
<br />
Graduanda: Ana Luiza Scharf<br />
<br />
Orientador: Marcelo Maia Sobral<br />
<br />
<br />
=== Proposta===<br />
<br />
A seguir a o link com os seguintes conteúdos:<br />
<br />
* Objeto de estudo;<br />
*Problema de pesquisa; <br />
*Objetivo Geral;<br />
*Objetivo Específico;<br />
*Estrutura do Marco Teórico;<br />
*Principais Fontes;<br />
*Cronograma;<br />
*Dificuldades;<br />
*Referências.<br />
<br />
[https://www.dropbox.com/home/TCC1 Apresentação: proposta do TCC]</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=91327PJI29006-2015-1-Wiki do Projeto2015-07-06T19:27:18Z<p>Ana.ls1994: /* Sincronização de Diretórios Utilizando Rsync */</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 webba sh /opt/webba/srv/cfg/script/removels.sh <br />
25 5 * * 1-5 webba sh /opt/webba/srv/cfg/script/chama_agendamento.sh<br />
5 7 * * 1-5 webba sh /opt/webba/srv/cfg/script/chama_agendamento.sh<br />
20 9 * * 1-5 webba sh /opt/webba/srv/cfg/script/chama_agendamento.sh<br />
5 13 * * 1-5 webba sh /opt/webba/srv/cfg/script/chama_agendamento.sh<br />
20 15 * * 1-5 webba sh /opt/webba/srv/cfg/script/chama_agendamento.sh<br />
5 18 * * 1-5 webba sh /opt/webba/srv/cfg/script/chama_agendamento.sh<br />
20 20 * * 1-5 webba sh /opt/webba/srv/cfg/script/chama_agendamento.sh<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/{user}/{nome} || <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}}<br />
<br />
==Resultados obtidos na implementação do projeto==</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=91326PJI29006-2015-1-Wiki do Projeto2015-07-06T19:21:37Z<p>Ana.ls1994: /* Sincronização de Diretórios Utilizando Rsync */</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/{user}/{nome} || <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}}<br />
<br />
==Resultados obtidos na implementação do projeto==</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89380PJI29006-2015-1-Wiki do Projeto2015-05-22T18:04:18Z<p>Ana.ls1994: /* 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 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 />
===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 />
|@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 />
|@DELETE || /arquivos/{nomeDoArqivo} || <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 || /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 />
|@POST || /upload/{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 />
|@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 />
|@GET || /salas/ || || <syntaxhighlight lang=java> Lista listaDeSala </syntaxhighlight>|| Então o servidor retorna uma lista com todos as salas.<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 || /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 />
|}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89369PJI29006-2015-1-Wiki do Projeto2015-05-22T17:45:29Z<p>Ana.ls1994: /* 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 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 />
===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/{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 || /auth || <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 || /arquivos/{user} || <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 || /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 />
|}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89362PJI29006-2015-1-Wiki do Projeto2015-05-22T17:39:40Z<p>Ana.ls1994: /* 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 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 />
===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/{usuario} || <syntaxhighlight lang=json> String usuario </syntaxhighlight> <syntaxhighlight lang=json> String senha </syntaxhighlight> || <syntaxhighlight lang=json> 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 || /arquivos/{nomeDoArquivo} || <syntaxhighlight lang=json> String usuario </syntaxhighlight> <syntaxhighlight lang=json> String senha </syntaxhighlight> || <syntaxhighlight lang=json> 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 || /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 />
|}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=89067PJI29006-2015-1-Wiki do Projeto2015-05-14T21:23:07Z<p>Ana.ls1994: /* Descrição das URI do 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 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 />
===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>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=88721PJI29006-2015-1-Wiki do Projeto2015-05-08T18:16:49Z<p>Ana.ls1994: /* 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 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 />
env "/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 />
env "/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 />
env "/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 />
env "/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 />
env "/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 || /abrir || <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 || /abrir/{''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>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=88720PJI29006-2015-1-Wiki do Projeto2015-05-08T18:14:52Z<p>Ana.ls1994: /* 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 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 />
env "/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 />
env "/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 />
env "/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 />
env "/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 />
env "/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 || /abrir || <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 || /abrir/{''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 usuário </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>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=88719PJI29006-2015-1-Wiki do Projeto2015-05-08T18:13:21Z<p>Ana.ls1994: /* API Web-Service a ser implementado no Celular */</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 />
env "/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 />
env "/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 />
env "/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 />
env "/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 />
env "/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 || /abrir || <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 || /abrir/{''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 usuário </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>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=88718PJI29006-2015-1-Wiki do Projeto2015-05-08T18:12:27Z<p>Ana.ls1994: /* Descrição das URI do 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 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 />
env "/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 />
env "/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 />
env "/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 />
env "/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 />
env "/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 || /abrir || <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 || /abrir/{''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 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>|| 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 usuário </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>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=87904PJI29006-2015-1-Wiki do Projeto2015-04-23T22:12:10Z<p>Ana.ls1994: /* 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 />
===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 />
env "/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 />
env "/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 />
env "/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 />
env "/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 />
env "/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 || /abrir || <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 || /abrir/{''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}}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=87092PJI29006-2015-1-Wiki do Projeto2015-04-07T21:05:42Z<p>Ana.ls1994: /* Sincronização de Diretórios Utilizando Rsync */</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 />
===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/karol/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
#echo $origem<br />
<br />
destino="/home/karol/srv/webba/equipamentos/projetor/${proj}/${arq}"<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/karol/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}" <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/karol/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/karol/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi<br />
<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 '''Cron''' no Servidor e no Cliente}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<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 />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<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 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 />
{{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+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 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+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 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 />
env "/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 />
env "/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 />
env "/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 />
env "/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 />
env "/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}}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=87089PJI29006-2015-1-Wiki do Projeto2015-04-07T21:03:42Z<p>Ana.ls1994: /* Sincronização de Diretórios Utilizando Rsync */</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 />
===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/karol/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
#echo $origem<br />
<br />
destino="/home/karol/srv/webba/equipamentos/projetor/${proj}/${arq}"<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/karol/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}" <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/karol/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/karol/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi<br />
<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 '''Cron''' no Servidor e no Cliente}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<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 />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><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 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 />
{{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+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 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+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 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 />
env "/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 />
env "/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 />
env "/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 />
env "/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 />
env "/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}}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=87085PJI29006-2015-1-Wiki do Projeto2015-04-07T21:00:47Z<p>Ana.ls1994: /* Sincronização de Diretórios Utilizando Rsync */</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 />
===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/karol/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
#echo $origem<br />
<br />
destino="/home/karol/srv/webba/equipamentos/projetor/${proj}/${arq}"<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/karol/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}" <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/karol/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/karol/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi<br />
<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 '''Cron''' no Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<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 />
{{collapse bottom}}<br />
{{collapse top| Configurar '''Cron''' no Cliente}}<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><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 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 />
{{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+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 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+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 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 />
env "/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 scripts.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
env "/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 />
env "/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 />
env "/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 />
env "/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}}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=87077PJI29006-2015-1-Wiki do Projeto2015-04-07T20:53:14Z<p>Ana.ls1994: /* Sincronização de Diretórios Utilizando Rsync */</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 />
===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/karol/srv/webba/usuarios/${user}/${pasta}/${arq}"<br />
<br />
#echo $origem<br />
<br />
destino="/home/karol/srv/webba/equipamentos/projetor/${proj}/${arq}"<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/karol/srv/webba/equipamentos/projetor/${proj}/${user}_${pasta}_${arq}" <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/karol/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/karol/srv/webba/equipamentos/projetor/${proj} -maxdepth 1 -type l -delete<br />
fi<br />
<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 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 '''Cron''' no Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<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 />
{{collapse bottom}}<br />
{{collapse top| Configurar '''Cron''' no Cliente}}<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<br />
<syntaxhighlight lang=text><br />
<br />
# crontab -e<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang=text><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 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 />
{{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+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 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+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 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 />
env "/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 scripts.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
env "/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 />
env "/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 />
env "/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 />
env "/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 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)<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}}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=86961PJI29006-2015-1-Wiki do Projeto2015-04-07T00:08:49Z<p>Ana.ls1994: /* Sincronização de Diretórios Utilizando Rsync */</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 />
===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:diretorio.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 />
<br />
#!/bin/bash<br />
<br />
echo -n "Favor digite usuario: "<br />
read user<br />
<br />
echo -n "Favor digite pasta: "<br />
read pasta<br />
<br />
echo -n "Favor digite arquivo: "<br />
read arq<br />
<br />
string1=$user<br />
string2=$pasta<br />
string3=$arq<br />
<br />
origem="/srv/webba/usuarios/${string1}/${string2}/${arq}"<br />
<br />
echo $origem<br />
<br />
echo -n "Favor digite o projetor: "<br />
read proj<br />
<br />
echo -n "Favor digite o arquivo a ser transferido: "<br />
read tf<br />
<br />
string4=$proj<br />
string5=$tf<br />
<br />
<br />
destino="/srv/webba/equipamentos/projetor/${string4}/${string5}"<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="/srv/webba/equipamentos/projetor/${string4}/${string1}_${string2}_${string3}" <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 />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
fi<br />
<br />
<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 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 '''Cron''' no Servidor}}<br />
<br />
*Para configurar um crontab no servidor, utiliza-se o comando:<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 />
{{collapse bottom}}<br />
<br />
{{ collapse top| Configurar '''Cron''' no Cliente}}<br />
<br />
*Para configurar um crontab no cliente, utiliza-se o comando:<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 /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 />
#<br />
</syntaxhighlight><br />
<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+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 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+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 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 />
env "/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 scripts.<br />
<br />
====2. Pular para próximo slide ====<br />
<br />
<syntaxhighlight lang=bash><br />
<br />
#!/bin/bash<br />
<br />
env "/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 />
env "/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 />
env "/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 />
env "/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 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)<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}}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=86313PJI29006-2015-1-Wiki do Projeto2015-03-27T05:20:26Z<p>Ana.ls1994: /* Sincronização de Diretórios Utilizando Rsync */</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 />
===Sincronização de Diretórios Utilizando Rsync===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync}}<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 />
'''Documentando o Rsync'''<br />
<br />
* Um exemplo de como será a estrutura do diretório no servidor:<br />
<br />
<center>[[Arquivo:diretorio.png| 650px]]</center><br />
<br />
* Criamos os scripts abaixo para facilitar os testes:<br />
<br />
<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<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 />
<br />
<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 />
<br />
<br />
{{collapse top| 3. Script para criação do link simbólico:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
echo -n "Favor digite usuario: "<br />
read user<br />
<br />
echo -n "Favor digite pasta: "<br />
read pasta<br />
<br />
echo -n "Favor digite arquivo: "<br />
read arq<br />
<br />
string1=$user<br />
string2=$pasta<br />
string3=$arq<br />
<br />
origem="/srv/webba/usuarios/${string1}/${string2}/${arq}"<br />
<br />
echo $origem<br />
<br />
echo -n "Favor digite o projetor: "<br />
read proj<br />
<br />
echo -n "Favor digite o arquivo a ser transferido: "<br />
read tf<br />
<br />
string4=$proj<br />
string5=$tf<br />
<br />
<br />
destino="/srv/webba/equipamentos/projetor/${string4}/${string5}"<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="/srv/webba/equipamentos/projetor/${string4}/${string1}_${string2}_${string3}" <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 />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
fi<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<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 />
<br />
<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 /S01/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
* Abaixo segue o 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 top| Ferramenta crontab para agendamentos}}<br />
<br />
<br />
Para acontecer a sincronização usamos a ferramenta crontab para agendamento da tarefas.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
sudo gedit /etc/crontab<br />
</syntaxhighlight><br />
<br />
e modificar no servidor para seguinte arquivo.<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 11 * * * root find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
30 5 1,5 * * #chamar sincronização<br />
10 7 1,5 * *<br />
25 9 1,5 * *<br />
10 13 1,5 * *<br />
25 15 1,5 * *<br />
10 18 1,5 * *<br />
25 20 1,5 * *<br />
#<br />
</syntaxhighlight><br />
<br />
e o cliente repetira o comando, mas para o seguinte artigo.<br />
<br />
<syntaxhighlight lang=text><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 11 * * * root find /s001/projetor -type f -exec rm {} \;<br />
<br />
#<br />
</syntaxhighlight><br />
E ambos os casos devem salvar as modificações.<br />
<br />
===Exibição de PDF com xpdf em Virtual Display===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync}}<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}}</div>Ana.ls1994https://wiki.sj.ifsc.edu.br/index.php?title=PJI29006-2015-1-Wiki_do_Projeto&diff=86312PJI29006-2015-1-Wiki do Projeto2015-03-27T05:19:28Z<p>Ana.ls1994: </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 />
===Sincronização de Diretórios Utilizando Rsync===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync}}<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 />
'''Documentando o Rsync'''<br />
<br />
* Um exemplo de como será a estrutura do diretório no servidor:<br />
<br />
<center>[[Arquivo:diretorio.png| 650px]]</center><br />
<br />
* Criamos os scripts abaixo para facilitar os testes:<br />
<br />
<br />
{{collapse top| 1. Script que o servidor precisa executar:}}<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 />
<br />
<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 />
<br />
<br />
{{collapse top| 3. Script para criação do link simbólico:}}<br />
<br />
<syntaxhighlight lang=text><br />
<br />
#!/bin/bash<br />
<br />
echo -n "Favor digite usuario: "<br />
read user<br />
<br />
echo -n "Favor digite pasta: "<br />
read pasta<br />
<br />
echo -n "Favor digite arquivo: "<br />
read arq<br />
<br />
string1=$user<br />
string2=$pasta<br />
string3=$arq<br />
<br />
origem="/srv/webba/usuarios/${string1}/${string2}/${arq}"<br />
<br />
echo $origem<br />
<br />
echo -n "Favor digite o projetor: "<br />
read proj<br />
<br />
echo -n "Favor digite o arquivo a ser transferido: "<br />
read tf<br />
<br />
string4=$proj<br />
string5=$tf<br />
<br />
<br />
destino="/srv/webba/equipamentos/projetor/${string4}/${string5}"<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="/srv/webba/equipamentos/projetor/${string4}/${string1}_${string2}_${string3}" <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 />
fi<br />
<br />
<br />
else<br />
echo "Arquivo criado "; <br />
ln -s $origem $destino<br />
fi<br />
<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
<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 />
<br />
<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 /S01/projetor -type f -exec rm {} \;<br />
<br />
</syntaxhighlight><br />
<br />
{{collapse bottom}}<br />
<br />
* Abaixo segue o 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 />
{{ Ferramenta crontab para agendamentos}}<br />
<br />
<br />
Para acontecer a sincronização usamos a ferramenta crontab para agendamento da tarefas.<br />
<br />
<syntaxhighlight lang=text><br />
<br />
sudo gedit /etc/crontab<br />
</syntaxhighlight><br />
<br />
e modificar no servidor para seguinte arquivo.<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 11 * * * root find /srv/webba/equipamentos/projetor -type l -exec rm {} \;<br />
30 5 1,5 * * #chamar sincronização<br />
10 7 1,5 * *<br />
25 9 1,5 * *<br />
10 13 1,5 * *<br />
25 15 1,5 * *<br />
10 18 1,5 * *<br />
25 20 1,5 * *<br />
#<br />
</syntaxhighlight><br />
<br />
e o cliente repetira o comando, mas para o seguinte artigo.<br />
<br />
<syntaxhighlight lang=text><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 11 * * * root find /s001/projetor -type f -exec rm {} \;<br />
<br />
#<br />
</syntaxhighlight><br />
E ambos os casos devem salvar as modificações.<br />
<br />
===Exibição de PDF com xpdf em Virtual Display===<br />
<br />
{{collapse top| Sincronização de Diretórios Utilizando Rsync}}<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}}</div>Ana.ls1994