Translate

terça-feira, 26 de novembro de 2013

Edgewall TRAC: result list ( Test Execution), adding "Passed (Restriction)" option

Adicionar a opção "Passed (Restriction)" na listagem de resultados;


a. Em "lib/results/resultsByStatus.php", adicionar "restriction":

418: foreach(array('failed','blocked','not_run','restriction') as $verbose_status)
b. Em "cfg/const.inc.php", inserir " 'restriction!' => 'r',":



383: $tlCfg->results['status_code'] = array (
384:   'failed'        => 'f',
385:   'blocked'       => 'b',
386:   'passed'        => 'p',
387:   'restriction'   => 'r',
388:   'not_run'       => 'n',
389:   'not_available' => 'x',
390:   'unknown'       => 'u',
391:   'all'           => 'a'
392: );
Inserir " 'restriction' => 'test_status_restriction',":



408: $tlCfg->results['status_label'] = array('not_run' => 'test_status_not_run',
409:                     'passed' => 'test_status_passed',
410:                     'failed' => 'test_status_failed',
411:                     'blocked'=> 'test_status_blocked',
412:                     'restriction' => 'test_status_restriction',
413:                       'all' => 'test_status_all_status',
414:                       'not_available' => 'test_status_not_available',
415:                     'unknown' => 'test_status_unknown');
Inserir " 'restriction' => 'test_status_restriction',":



434: $tlCfg->results['status_label_for_exec_ui'] = array('not_run' => 'test_status_not_run',
435:                           'passed'  => 'test_status_passed',
436:                           'restriction' => 'test_status_restriction',
437:                           'failed'  => 'test_status_failed',
438:                           'blocked' => 'test_status_blocked');
Inserir " 'restriction' => 'FFCC00' ":



450: $tlCfg->results['charts']['status_colour'] = array('not_run' => '000000','passed'  => '006400',
451:                            'failed'  => 'B22222','restriction' => 'FFCC00','blocked' => '00008B');
c. Em "gui/themes/default/css/testlink.css", inserir o seguinte estilo CSS:



577: div.passed, div.failed, div.blocked, div.not_run, div.restriction {
Inserir o seguinte na linha 588:



588: div.restriction {
589:       background:             #FFCC00; /* yellow */
590: }
Inserir "span.light_restriction":



606: span.light_passed, span.light_failed, span.light_blocked,
607: span.light_not_run, span.light_not_available, span.light_unknown,
608: span.light_restriction
Inserir:



631: span.light_restriction {
631:         background:             #FFCC00;
631: }
Inserir:



664: .restriction {
665:         color:                  white;
666:         background:             #FFCC00;
667: }
Inserir:




687: .restriction_text {
688:         color:    #FFCC00;
689:         font-weight: bold;
690: }
d. Inserir tradução nos idiomas desejados
Português do Brasil - "locale/pt_BR/strings.txt", "$TLS_test_status_restriction = "Passou com ressalva";":



231: $TLS_test_status_restriction = "Passou com ressalva";
Inglês Americano - "locale/en_US/strings.txt", "$TLS_test_status_restriction = "Passed (restriction)";":



231: $TLS_test_status_restriction = "Passed (restriction)";

terça-feira, 15 de outubro de 2013

Edgewall TRAC: add a custon HTML code (like a menu) at the top of TRAC page

How to add custon HTML code like a menu/link in the TRAC interface.
In this case, users can return to the main page using a link.

Create the file "/path/to/env/templates/site.html" with the following content:
  <!--! Add site-specific style sheet -->
  <head py:attrs="select('@*')" py:match="head">
    ${select('*|comment()|text()')}
    <link href="${href.chrome('site/style.css')}" rel="stylesheet" type="text/css"></link>
  </head>

  <body py:attrs="select('@*')" py:match="body">

    <!--! MY LINK/MENU -->
    <center>
<a href="PORTAL_LINK">Back to The Portal</a></center>

    <div id="siteheader">
    
    </div>
${select('*|text()')}
   
    <div id="sitefooter">
    
    </div>
</body>
</html>


You can add items in the header and footer of the TRAC page, inserting HTML code within DIV "siteheader" and "sitefooter"  respectively.


More information: http://trac.edgewall.org/wiki/TracInterfaceCustomization

Edgewall TRAC update from 0.12.3 to 0.12.5 (Debian 7.2 - Wheezy) - DistributionNotFound

When I update TRAC of 0.12.3 to 0.12.5 using "aptitude" (Debian 7.2), the file "/usr/local/bin/trac-admin" was not updated automatically, generating the following error:
root@SERVER:/home/users# trac-admin /home/trac/PROJECT
Traceback (most recent call last):
  File "/usr/local/bin/trac-admin", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2711, in <module>
    parse_requirements(__requires__), Environment()
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 584, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: Trac==0.12.3
To solve the defect, it was necessary to change the following items of the file "/usr/local/bin/trac-admin":
#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'Trac==0.12.3','console_scripts','trac-admin'
__requires__ = 'Trac==0.12.5' #Changed from 0.12.3 to 0.12.5
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('Trac==0.12.5', 'console_scripts', 'trac-admin')() #Changed from 0.12.3 to 0.12.5
    )

That's all!

More information: http://trac.edgewall.org/ticket/11327

segunda-feira, 30 de setembro de 2013

Montar diretórios através de SSH (SFTP), métodos: Windows e Linux


Windows

Pré Requisitos

Utilização

  • Verificar se .NET Framework e o Win-SSHFS estão devidamente instalados;
  • Executar o Win-SSHFS e adicionar as configurações de acesso ao Files desejado:
Drive name: o nome que o usuário irá fornecer à unidade local, será utilizado como nome da unidade em "Meu computador";
Host: endereço do servidor;
Port: manter a padrão (22);
Username: login do usuário no servidor;
Authentication method: PrivateKey ou Password;
Password: senha utilizada para acesso ao servidor (para Authentication method Password);
Directory: diretório remoto que deseja acessar;
Drive Letter: letra de unidade associada à unidade;
Mount at login: se desejar que a unidade seja automaticamente montada na inicialização do Windows.
  • Após preencher os campos de configuração, salve clicando em Save e depois monte a unidade clicando em Mount. Esta janela pode ser fechada;
  • Acesse "Meu computador" e verifique se a unidade foi montada:

Usuário Linux

Pré Requisitos

  • Instalar "sshfs":
    #Debian:
    aptitude install sshfs
    
    #Fedora:
    yum -i sshfs
    

Utilização

  • Para utilizar o "sshfs" com um usuário comum (não root), adicione seu usuário local ao grupo "fuse":
    sudo usermod -a -G fuse <local_user_name>
    
  • Criar a pasta de montagem, exemplo:
    mkdir ~/ponto_de_montagem_local
    
  • Montar a unidade, exemplo:
    sshfs -o follow_symlinks <usuário>@<ip_do_servidor>:/pasta_remota ~/ponto_de_montagem_local
    
  • Acessar o ponto de montagem ("~/ponto_de_montagem_local"). Pronto!

quarta-feira, 5 de junho de 2013

KVM - Kernel-based Virtual Machine

Servidor de Virtualização: KVM

Neste artigo, irei mostrar como instalar, configurar e otimizar um solução de servidor de virtualização KVM. Utilizarei como exemplo uma implementação real... estou aberto a críticas e sugestões.

Características

Servidor HP Proliant:
Processador Dual-Core AMD Opteron Processor 2220;
Memória de 10GB DDRII 667;
Fonte simples;
Placa de rede onboard com duas saídas Gigabit;
HD SAS 2.5", 2 x 30 GB (RAID 1) e 4 x 146 GB (RAID 5 - 404 GB);
Sistema Operacional Debian 7 (Wheezy).
Plataforma de virtualização KVM.

Implementação

Instalação
apt-get install qemu-kvm
Adicionar usuários utilizadores do KVM ao grupo "kvm"
adduser ravel kvm
Criar o disco virtual
qemu-img create disco.img -f qcow2 100G 
#"qcow2" refere-se ao tipo de disco (recomendado); 
#"100G" é o tamanho do disco dinamicamente alocado
Configurar bridge em placa de rede (/etc/network/interfaces)
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
#auto eth1
iface eth1 inet manual
#allow-hotplug eth1

auto br0
iface br0 inet static
        #tap0: Zabbix
        #tap1: Yocto
        #tap2: Batman
        #tap3: Zabbix-TI
        #tap4: Disponível       
        pre-up ip tuntap add dev tap0 mode tap user ravel
        pre-up ip tuntap add dev tap1 mode tap user yocto
        pre-up ip tuntap add dev tap2 mode tap user batman
        pre-up ip tuntap add dev tap3 mode tap user ti
        pre-up ip tuntap add dev tap4 mode tap user ravel
        pre-up ip link set tap0 up
        pre-up ip link set tap1 up
        pre-up ip link set tap2 up
        pre-up ip link set tap3 up
        pre-up ip link set tap4 up
        bridge_ports all tap0
        bridge_ports all tap1
        bridge_ports all tap2
        bridge_ports all tap3
        bridge_ports all tap4
        post-down ip link set tap0 down
        post-down ip link set tap1 down
        post-down ip link set tap2 down
        post-down ip link set tap3 down
        post-down ip link set tap4 down
        post-down ip tuntap del dev tap0 mode tap
        post-down ip tuntap del dev tap1 mode tap
        post-down ip tuntap del dev tap2 mode tap
        post-down ip tuntap del dev tap3 mode tap
        post-down ip tuntap del dev tap4 mode tap

        address 10.0.0.26
        netmask 255.255.0.0
        gateway 10.0.0.9
        bridge_ports eth1
        bridge_fd 0
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off

Reinicie a rede:
/etc/init.d/networking restart
Mais informações:

Máquinas virtuais

As máquinas virtuais são inicializadas automaticamente através de "/etc/rc.local":
#Inicializar VMs
/home/ravel/vm/zabbix-vm.sh &
/home/yocto/vm/yocto-vm.sh &
/home/batman/vm/batman-vm.sh &
/home/ti/vm/zabbix-vm.sh &
a. Zabbix-PD
Utilização: monitoramento de servidores de redes
Usuário: ravel
Diretório: /home/ravel/vm
Disco virtual: /home/ravel/vm/hd/zabbix_pd-hda.img
Rede: tap0
Script de inicialização: /home/ravel/vm/zabbix-vm.sh:
#!/bin/bash
cdrom="/home/ravel/vm/isos/debian-7.0.0-amd64-DVD-1.iso"
hda="file=/home/ravel/vm/hd/zabbix_pd-hda.img,if=virtio,cache=writethrough"
mem="1G -mem-path /hugepages"

#Vídeo
video="-display none" #desativar saída de vídeo VNC
#video="-vnc :2" #habilitar saída de vídeo VNC

kvm -cdrom $cdrom -drive $hda -m $mem $video -smp cores=2,threads=2,sockets=1 -enable-kvm -cpu host -net nic,macaddr=52:54:00:12:01:01 -net tap,ifname=tap0,script=no,downscript=no

b. Zabbix-TI
Utilização: monitoramento de servidores de redes, utilizado pela TI Usuário: ti
Diretório: /home/ti/vm
Disco virtual: /home/ti/vm/hd/zabbix_ti-hda.img
Rede: tap4
Script de inicialização: /home/ti/vm/zabbix-vm.sh:
#!/bin/bash
cdrom="/home/ti/vm/isos/debian-7.0.0-amd64-DVD-1.iso"
hda="/home/ti/vm/hd/zabbix_ti-hda.img"
mem="1G -mem-path /hugepages"

#Vídeo
#video="-display none" #desativar saída de vídeo VNC
video="-vnc :1" #habilitar saída de vídeo VNC

kvm -cdrom $cdrom -hda $hda -m $mem $video -smp cores=2,threads=2,sockets=1 -enable-kvm -cpu host -net nic,macaddr=52:54:00:12:01:03 -net tap,ifname=tap4,script=no,downscript=no
#-display none

c. Yocto
Utilização: servidor de compilação Usuário: yocto
Diretório: /home/yocto/vm
Disco virtual: /home/yocto/vm/hd/yocto-hda.img
Rede: tap1
Script de inicialização: /home/yocto/vm/yocto-vm.sh:
#!/bin/bash
cdrom="/home/yocto/vm/isos/kubuntu-13.04-desktop-amd64.iso"
hda="/home/yocto/vm/hd/yocto-hda.img"
mem="4G -mem-path /hugepages"

#Vídeo
video="-display none" #desativar saída de vídeo VNC
#video="-vnc :4" #habilitar saída de vídeo VNC

kvm -cdrom $cdrom -hda $hda -m $mem $video -smp cores=2,threads=2,sockets=1 -enable-kvm -cpu host -net nic,macaddr=52:54:00:12:01:00 -net tap,ifname=tap1,script=no,downscript=no

d. Batman
Utilização: servidor de compilação
Usuário: batman
Diretório: /home/batman/vm
Disco virtual: /home/batman/vm/hd/batman.img
Rede: tap2
Script de inicialização: /home/batman/vm/batman-vm.sh:
#!/bin/bash
cdrom="/home/batman/vm/isos/gentoo-install-amd64-minimal-20130516.iso"
hda="/home/batman/vm/hd/batman.img"
mem="2G -mem-path /hugepages"

#Vídeo
#video="-display none" #desativar saída de vídeo VNC
video="-vnc :3" #habilitar saída de vídeo VNC

kvm -cdrom $cdrom -hda $hda -m $mem -boot d -smp cores=2,threads=2,sockets=1 -enable-kvm -cpu host $video -net nic,macaddr=52:54:00:12:01:02 -net tap,ifname=tap2,script=no,downscript=no
** Cada VM deve utilizar um endereço MAC distinto.

Otimização

Parâmetros:
  • "-smp cores=2,threads=2,sockets=1 -cpu host -enable-kvm":
    Acelerador KVM ("-enable-kvm") e configuração do processador virtual ("-smp cores=2,threads=2,sockets=1 -cpu host") - inserido no script de inicialização da VM.
    "-cpu host": disponibiliza todas as instruções do processador físico à VM;


  • "KSM (Kernel Samepage Merging)":
    Permite que páginas idênticas de memória sejam empacotadas pelo kernel numa única página compartilhada por um ou mais processos. Esta funcionalidade é potenciada pelo KVM para permitir que múltiplas, similares, máquinas virtuais tenham uma utilização de memória reduzida. Como a memória é compartilhada, a utilização combinada desta pelas máquinas virtuais é reduzida.

    Habilitar KSM (Kernel Samepage Merging) - "/etc/rc.local" (inserir acima dos scripts de inicialização de VMs):
    #Habilitar KSM - Kernel Samepage Merging
    echo 1 > /sys/kernel/mm/ksm/run
    

sexta-feira, 10 de maio de 2013

TRAC (Edgewall) 0.12: textarea autoresize bug (Firefox)

Ao concluir a migração do Edgewall TRAC 0.11 para 0.12 (sistema de Gerenciamento de Projetos e Rastreamento de BUGs), alguns usuários do sistema, que utilizam o navegador Firefox, relataram problemas com a caixa de texto (textarea) para edição de Wikis e Tickets. As caixas eram exibidas com apenas 2px. de largura, obrigando o usuário a redimensioná-la a cada edição.

Para solucionar este problema, os seguintes arquivos TRAC foram modificados:
   /usr/share/pyshared/trac/htdocs/css/trac.css
      Comentar as linhas 412 e 413:
div.trac-resizable { display: table; width: 1px } 
div.trac-resizable > div { display: table-cell } 
    /usr/share/pyshared/trac/htdocs/js/resizer.js
      Substituir a linha 6:
$(this).wrap('<div class="trac-resizable"><div></div></div>')
      Por:
$(this).wrap('<div class="trac-resizable"></div>')
Pronto, basta apenas reiniciar o servidor WEB. Lembre-se se apagar o cache do seu navegador para visualizar corretamente a modificação.

Fonte:
   http://trac.edgewall.org/ticket/8216#comment:8

quinta-feira, 2 de maio de 2013

Sistema de Controle de Horas Simples

1. Sobre o Controle de Horas

Portal destinado ao controle de horas simples.
Principais funcionalidades:
   Cadastro de horas por período, atrelado a projeto, atividade, local e usuário;
   Listagem/Relatório de horas cadastradas por período, usuário, atividade e projeto;
   Relatório graico em Google Chart por período, usuário, atividade e projeto.

2. Banco de Dados

Banco de dados SQLite2, localizado em ch.db.
Arquitetura:
a. ch
cidnametype
0idinteger, primary key
1datainiciodate
2iniciotext
3dataterminodate
4terminotext
5usuariotext
6projetotext
7atividadetext
8localtext
9descricaotext
10tickettext
11changesettext
12datadate

3. Código Fonte (PHP)

O código fonte é constituído pelos seguintes arquivos PHP:
a. cadastro.php: permite o cadastro de novas horas, edição e visualização das horas do usuário conectado;
b. listagem.php: permite visualizar e filtrar os dados por período, projeto, atividade e usuário;
c. graficos.php: permite visualizar e filtrar os dados - por período, projeto, atividade e usuário - exibindo em formato gráfico (Google Chart);

4. Plugins de Terceiros

Localizados em third-part.
a. jquery.js: é uma biblioteca JavaScript cross-browser desenvolvida para simplificar os scripts client side que interagem com o HTML;
b. jquery.elastic.source.js: responsável por permitir autosize em textareas;
c. jsapi.js: biblioteca Google Chart para exibição de indicadores em formato gráfico;
d. jquery-ui.js: biblioteca utilizada na construção do calendário para escolha da data ("datepicker").
Download do código fonte exemplo:
https://www.dropbox.com/s/of4pjqltbn8732m/Controle%20de%20Horas.zip


terça-feira, 30 de abril de 2013

Currículo: administrador de sistemas Linux



Carlos Alexandre Jacon da Silva
Informações pessoais
  • Estado civil: solteiro
  • Nacionalidade: Brasileiro
  • Idade: 29 anos
  • Naturalidade: Limeira – SP
  • E-mail: carlosjacon (arroba) gmail.com
Objetivo
Administrador de sistemas Linux
Formação
  • Universidade Paulista – UNIP – Limeira
Curso: Redes de Computadores
Conclusão: 12/2011

Cursos extracurriculares
  • 4Linux – São Paulo – SP
Curso: JBoss para Administradores de Sistemas EAD.
Conclusão: em curso.

  • Tempo Real Eventos (SAVANT) – São Paulo – SP
Curso: Amazon AWS.
Conclusão: 03/2014

  • Blackdoor Security – São Paulo – SP
Treinamento (EAD): Pentest e Engenharia Social - “Sua Empresa Está Realmente Segura?”
Conclusão: 12/2013

  • Welcome to the Django – São Paulo – SP
Curso: Django (Python Web Framework).
Conclusão: 02/2013

  • Linux Force Brasil – São Paulo – SP
Cursos: Linux Básico e Avançado, Administração de Servidores Linux, Blindagem Linux, Segurança Profissional.
Conclusão: 10/2012

  • Tempo Real Eventos (SAVANT) – São Paulo – SP
Curso: Samba com LDAP, integração com Windows 7 e Linux.
Conclusão: 10/2011

  • SENAC – Limeira – SP
Curso: Implantação de redes Wlan (sem fio).
Conclusão: 12/2009

  • Microvip – Limeira – SP
Curso: AutoCAD 2005.
Conclusão: 01/2008

  • Centro Brasileiro de Informática e Inglês – Limeira – SP
Curso: Programação - Delphi 5.
Conclusão: 09/2001

  • SENAI – Limeira – SP
Curso: Montagem e manutenção de microcomputadores.
Conclusão: 09/2000

  • Microcamp – Limeira – SP
Cursos: Windows, Office e Internet
Conclusão: 11/1999
Idiomas
Inglês Intermediário
Espanhol Intermediário
Conhecimentos
  • Pacote Office (Word, Excel, Power Point, Internet Explorer);
  • Linguagens: Pascal, Shell Script, Python, PHP e SQL;
  • Administração de sistemas Linux: políticas de segurança e acesso, backup e firewall;
  • Administração de máquinas virtuais (KVM, VirtualBox, XEN e VMWare ESXi);
  • Administração de sistemas de gestão de projetos (Edgewall TRAC e Subversion);
  • Administração de banco de dados (MySQL, PostgreSQL, SQLite e MSSQL);
  • Desenvolvimento de ferramentas de gestão de projetos em PHP (Gantt Online, Controle de Horas, Dashboard (acompanhamento) de projetos;
  • Administração de ferramenta de monitoramento de redes e servidores (Zabbix).
Experiência Profissional
  • AsGa S/A – Paulínia – SP
02/2012 – Atualmente – Administrador de sistemas Linux e Desenvolvedor
Manutenção de políticas de segurança (usuários, grupos e firewall), backup;
Desenvolvimento e manutenção de sistemas de gestão de projetos - Subversion, TRAC, e ferramentas em PHP (Indicadores, Gantt Online, Controle de Horas e etc.);
Implementação de sistema de monitoramento de redes e servidores (Zabbix);
Redundância de aplicações web através de KVM (Virtual Machine), LVM e Shell Script;
Manutenção da intranet corporativa (ASP);
Administração de banco de dados: SQLite (TRAC), MS SQL (intranet), MySQL (Zabbix) e PostgreSQL (TestLink).

  • AsGa S/A – Paulínia – SP
10/2011 – 02/2012 – Estagiário: administrador de sistemas Linux
Administração de servidores e redes Linux.

  • Dutra Acessórios – Limeira – SP
10/2010 – 10/2011 – Administrador de redes e servidores
Suporte a usuário Linux e Windows;
Administração de banco de dados MySQL;
Administração de firewall (IPTables e PfSense);
Acompanhamento em auditoria de implementação de sistema Microsiga.


  • Empresas de pequeno e médio porte – Limeira – SP
01/2006 – 10/2010 – Freelancer: técnico em informática
Suporte a usuário Linux e Windows;
Administração de servidores e redes Windows;
Administração de firewall (Windows);
Elaboração de planos de backup.


terça-feira, 16 de abril de 2013

Aprimorar a segurança SSH para ataques de força bruta: fail2ban



O pacote "fail2ban" é utilizado para limitar a ação de "curiosos" que tentam obter acesso root via SSH através de "brute force".
Para instalar:
apt-get install fail2ban
Configuração ("/etc/fail2ban/jail.conf"):
#Linhas 18 a 23
[DEFAULT]

# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 192.168.210.0/24   #Faixa de IP ignorada (Faixa de IP Local)
bantime  = 3600               #Tempo de BAN para o usuário que estava tentando acessar o Servidor
maxretry = 10                 #Quantidade de tentativas de conexão até banir o usuário
Fonte:
href="http://xmodulo.com/2013/03/how-to-protect-ssh-server-from-brute-force-attacks-using-fail2ban.html 

quinta-feira, 14 de março de 2013

MySecureShell - SFTP com Chroot: habilitar acesso à terceiros de forma limitada e segura

Um excelente substituto ao FTP é o SFTP. Através de SSH, permite criptografar todo o fluxo de senhas e dados, aprimorando a segurança neste ponto... e reduzindo segurança em outro:
através de SSH, o usuário tem acesso ao shell do sitema.
Para limitar o acesso, MySecureShell isola o usuário em sua pasta home através de chroot.
Demais recursos:
   - Controle de banda;
   - Administração através de interface gráfica;
   - Gestão de atividades através de LOGs;
   - Restrições através de usuários, grupos, IPs e etc.


Instalação: http://www.howtoforge.com/mysecureshell_sftp_debian_etch
Mais informações (configurações): http://mysecureshell.sourceforge.net/en/faq.html
Dica: restringir o acesso à SFTP (proteção ao acesso em linha de comando SSH) - adicionar ao arquivo de configuração (/etc/ssh/sftp_config) a seguinte linha:

Subsystem sftp /bin/MySecureShell -c sftp-server

quinta-feira, 13 de dezembro de 2012

Diagrama de Gantt Online (Open Source)

Diagrama de Gantt

1. Sobre o Diagrama de Gantt

O Gráfico de Gantt, ou Diagrama de Gantt, é uma ferramenta que permite a visualização do progresso de projetos. É, basicamente, uma ferramenta de acompanhamento, bastante visual, cujo objetivo é deixar a informação o mais transparente possível.
A função do Gráfico de Gantt é, de uma forma genérica, permitir o acompanhamento da realização de tarefas e atividades que compõem um projeto de objetivo maior. Dessa forma, a utilização da ferramenta permite que todos os interessados possam verificar o andamento das atividades. É muito útil para o Gerenciamento de Projetos onde existem muitos envolvidos.

Possibilidades:
  • Criar diagramas pessoais e de projetos;
  • Compartilhar diagrama entre usuários do servidor;
  • Compartilhamento automático de diagrama de projetos aos membros do projetos;
  • Definir políticas de acesso;
  • Renomear, deletar e versionar.

A solução utilizada é uma adaptação da ferramenta Open Source ().

2. Código Fonte PHP

a. gantt.php: script PHP que permite a visualização / impressão dos gráficos de Gantt, executando a leitura em DB;
b. gantt.css / platform.css / teamworkFont.css: arquivo que contém as propriedades de estilo dos objetos utilizados em modelo.php;
c. gantt_save.php: salva as alterações realizadas no Gantt, gerando uma nova versão do mesmo;
d. index.php: listagem de Gantts do usuário / compartilhados;
e. modelo.php: modelo (layout) do gráfico de Gantt;
f. notificacao.php: envia uma notificação por e-mail ao receptor do compartilhamento de Gantt;

O código fonte foi amplamente comentado.

3. Fluxograma


4. Banco de Dados

Banco de dados SQLite2, localizado em /var/www/gantt/gantt.db.
Arquitetura: 
a. notificacoes
Tabela responsável por armazenar as notificações de compartilhamento de Gantt. A cada minuto (CRONTAB), o script notificacoes.php verifica a tabela por novas mensagens e as envia.
cidnametypedescrição
0idINTEGERID do item na tabela
1statusTEXT"NOVO" ou "OK", informando se a mensagem já foi enviada
2ownerTEXTautor do Gantt
3receiverTEXTdestinatário da mensagem (alvo do comaprtilhamento)
4titleTEXTtítulo do Gantt
5dateTEXTdata do compartilhamento
b. $USUÁRIO
Cada usuário do sistema possui uma tabela com a nomenclatura do próprio usuário.
Responsável por armazenar os Gantts pessoais e compartilhamentos.
cidnametypedescrição
0idINTEGERID do item na tabela
1statusTEXT"OK", "DEL" (removido) e "OCULTO" (versão anterior)
2uidTEXTID do documento (versões anteriores possuem mesmo UID
3ownerTEXTautor do Gantt
4titleTEXTtítulo do Gantt
5ganttTEXTdiagrama
6dateTEXTdata de criação
c. compartilhamentos
Gerencia o compartilhamento de diagramas, armazenando a permissão e localização do mesmo.
cidnametypedescrição
0idINTEGER|ID do item na tabela
1statusTEXT"OK", "DEL" (removido)
2uidTEXTID do documento compartilhado
3ownerTEXTautor do diagrama
4projectTEXTprojeto pertencente
5titleTEXTtítulo
6receptorTEXTdestinatário do compartilhamento
7permissaoTEXT"W" ou "R", permissão de leitura ou escrita
8dateTEXTdata do compartilhamento
d. projects
Responsável por armazenar os Gantts de projetos.
cidnametypedescrição
0idINTEGERID do item na tabela
1statusTEXT"OK", "DEL" (removido) e "OCULTO" (versão anterior)
2uidTEXTID do documento (versões anteriores possuem mesmo UID
3ownerTEXTautor do Gantt
4projectTEXTprojeto pertencente
5titleTEXTtítulo do Gantt
6ganttTEXTdiagrama
7dateTEXTdata de criação

5. Ferramenta de Terceiro: TeamWork Gantt

Localizado localmente no diretório "/var/www/gantt/libs".
Trata-se de uma ferramenta OpenSource que possibilita a elaboração de diagramas de Gantt WEB (PHP).
Desenvolvido em JQuery, possibilita a criação de Gantts, árvores de tarefas, dependências e exportação em formato JSON.

Para maiores informações: http://gantt.twproject.com 


6. Download de Exemplo


 https://www.dropbox.com/s/kmdgho9zp6k46mu/gantt.zip (basta criar o banco de dados)

quarta-feira, 17 de outubro de 2012

Configuração de "Bonding" em placas de rede

  1. Instalar o pacote ifenslave (depende de iproute e libpb-4.8);
  2. Desative as placas de rede:
    ifdown eth0 #Para todas as placas de rede
    ifdown eth1
    /etc/init.d/networking stop
    
  3. Configurar bonding comentando a configuração das placas de rede atualmente configuradas (/etc/network/interfaces);
  4. Inserir a configuração do bonding:
    # == Comentar ==
    # The primary network interface
    #auto eth0
    #allow-hotplug eth0 
    #iface eth0 inet static  
    #    address 10.0.0.88
    #    netmask 255.255.0.0
    #    gateway 10.0.0.9
    
    # The secondary network interface
    #auto eth1
    #llow-hotplug eth1
    #iface eth0 inet static
    #   address 10.0.0.87
    #   netmask 255.255.0.0
    #   gateway 10.0.0.9
    
    # == Adicionar ==
    auto bond0
    iface bond0 inet static
        address 10.0.0.89 #IP virtual utilizado no bonding
        netmask 255.255.0.0
        gateway 10.0.0.9
        slaves eth0 eth1 #Placas de rede físicas a serem utilizadas pelo bonding
        bond-mode active-backup
        bond-miimon 100
        bond-downdelay 200
        bond-updelay 200
    
  5. Inicie a rede:
    ifup bond0
    /etc/init.d/networking start
    
Fonte: http://wiki.debian.org/Bonding

terça-feira, 2 de outubro de 2012

Testlink: Exportar Test Suite para XML suportado pelo MS Excel




Edite o arquivo de configuração lib/testcases/tcExport.php, adicionando o seguinte texto antes de "downloadContentsToFile($content,$gui->export_filename);":
#Linha 133
#Converter codificação ISO-8859-1 em caracteres/simbolos
$content = htmlentities($content, ENT_QUOTES);
#"ENT_QUOTES": converte aspas simples e duplas;
#"ENT_COMPAT": converte aspas duplas;
#"ENT_QUOTES": converte aspas simples.
Este código irá remover tags HTML que "poluem" o relatório de Test Suite.

quarta-feira, 19 de setembro de 2012

Realizar consultas MS SQL 2008 através de PHP



  1. Instalar pré-requisitos:
    apt-get install apache2 php5 libapache2-mod-php5 php5-mssql unixodbc unixodbc-dev freetds-dev tdsodbc freetds-bin
    
  2. Configurar /etc/freetds/freetds.conf, adicionando:
    [tds]
    host = IP_DO_SERVIDOR_MSSQL
    port = 1433
    tds version = 8.0 #Porta padrão para MSSQL
    client charset = UTF-8
    
  3. Configurar /etc/odbcinst.ini, adicionando:
    [tds]
    Description     = FreeTDS Driver for Linux & MSSQL on Win32
    Driver          = /usr/lib/odbc/libtdsodbc.so
    Setup           = /usr/lib/odbc/libtdsS.so
    UsageCount      = 1
    
  4. Configurar /etc/odbc.ini, adicionando:
    [tds]
    Description = Test to freeTDS
    Driver = tds
    Trace = No
    Database = BANCO_DE_DADOS
    Server = IP_DO_SERVIDOR_MSSQL
    Port = 1433 #Porta padrão para MSSQL
    
  5. Testar a conexão:
    isql -v tds USUARIO_DO_DB PASS_DO_DB
    #retornará: o prompt SQL "SQL>"
    
  6. Ativar o módulo ODBC em PHP5 (/etc/php5/apache2/php.ini), adicionando:
    extension = odbc.so
    
  7. Reiniciar o Apache:
    /etc/init.d/apache2 restart
    
  8. Testar a consulta em PHP, criando um script PHP como o seguinte:
    <?php
    //teste_de_coexao.php
    
    echo "<table>";
    $link = mssql_connect('IP_DO_SERVIDOR_MSSQL', 'USUARIO_NO_DB', 'PASS_NO_DB');
    
    if (!$link) {
       die('Unable to connect!');
    }
    
    if (!mssql_select_db('BANCO_DE_DADOS', $link)) {
       die('Unable to select database!');
    }
    
    $result = mssql_query('SELECT * FROM TABELA');
    
    while ($row = mssql_fetch_array($result)) {
       echo "<tr><td>NA: " . $row['numero'] . "/" . $row['ano'] . "</td><td> Solicitante: " . $row['solicitante'] . "</td></tr>";
    }
    
    echo "</table>";
    mssql_free_result($result);
    ?>
    

Acesse o site para verificar se o resultado esperado foi retornado.


Se tiver problemas com charset:
http://www.rafaeltheodoro.com.br/php/converter-codificacao-do-sqlserver-para-o-mysql-em-php-charset-cp850-do-sqlserver-para-mysql/comment-page-1/


segunda-feira, 10 de setembro de 2012

TestLink: exportar relatório HTML para PDF / export report to PDF



Habilitar formato / Enable Format

a. testlink/cfg/reports.cfg.php - habilitar formato: descomentar "FORMAT_PDF => 'format_pdf" (linha 44); / enable format: uncomment "FORMAT_PDF => 'format_pdf" (line 44);
b. testlink/cfg/reports.cfg.php - habilitar formato em cada tipo de relatório: adicionar "format_pdf" em "format" dos tipos de relatórios do qual habilitaremos a saída em PDF (atualmente habilitado nas linhas 79 e 85); enable format in each report type: add "format_pdf" in "format" of the types of reports which habilitaremos the PDF output (I enabled only in 79 and 85);
c. testlink/testlink/lib/results/printDocument.php - se o relatório for em PDF, redirecionar para o conversor: altere as seguintes linhas (262-270): / if the report is in PDF, redirect to the converter: change the following lines (262-270):
// add application header to HTTP
if (($args->format == FORMAT_ODT) || ($args->format == FORMAT_MSWORD))
{
    flushHttpHeader($args->format, $doc_info->type);
}
// send out the data
echo $generatedText;

Para / To:
// add application header to HTTP 
if (($args->format == FORMAT_ODT) || ($args->format == FORMAT_MSWORD))
{
        flushHttpHeader($args->format, $doc_info->type);

} else if ($args->format == FORMAT_PDF) { // ********* Saída do relatório em PDF *********

        //Enviar HTML para DOMPDF, via POST (converter html > pdf) / Send HTML to DOMPDF via POST (convert html> pdf)
        echo "<form action='dompdf/conversor.php' method='post' name='frm'>";
                //Enviar via POST o relatório em HTML para conversão ($PDF) e o nome do documento PDF ($_SESSION['testprojectName']) / Send the POST report to HTML conversion ($ PDF) and the name of the PDF document ($ _SESSION ['testprojectName'])
                echo "<input type='hidden' name='html' value='" . base64_encode(serialize($PDF)) . "'>
                      <input type='hidden' name='projectname' value='" . $_SESSION['testprojectName'] . "'>
                ";
        echo "
                </form>
                <script language=\"JavaScript\">
                        document.frm.submit();
                </script>
        ";

} else {
        // send out the data (!=PDF)
        echo $generatedText;
}

Observações: a variável "$generatedText" recebe o relatório em HTML, para depois exibir través de "echo $generatedText;" (PHP). Para o relatório em PDF, não é interessante que a primeira página e o HTMLHeader sejam exibidos, portanto utiliza-se a variável "$PDF" para receber paralelamente todos os valores tal como "$generatedText", exclusive:
Notes: The variable "$ generatedText" receives the report in HTML to display after abeam of "echo $ generatedText;" (PHP). For the PDF report, is not it interesting that the first page to appear HTMLHeader and therefore uses the variable "$ PDF" to receive all parallel values ​​such as "$ generatedText 'exclusive:
//Linhas / Lines 216-217
//$PDF = renderHTMLHeader($doc_info->type.' '.$doc_info->title,$_SESSION['basehref']); //Desativado / Disable
//$PDF .= renderFirstPage($doc_info); //Desativado / Disable

Valores recebidos pela variável / Amounts received by the variable:
//Linhas / Lines 231-232
$PDF .= renderSimpleChapter(lang_get('scope'), $doc_info->tproject_scope);
$PDF .= renderTestSpecTreeForPrinting($db, $tree, $doc_info->content_range,$printingOptions, null, 0, 1, $args->user_id);

//Linha 242
$PDF .= renderSimpleChapter(lang_get('scope'), $doc_info->testplan_scope);

//Linha 247
$PDF .= renderTestPlanForPrinting($db, $tree, $doc_info->content_range,$printingOptions,null,0,1, $args->user_id,$args->tplan_id,$args->tproject_id);

//Linha 253
$PDF .= buildTestPlanMetrics($doc_data->statistics);

d. testlink/lib/results/dompdf/conversor.php - gera código para executar a conversão através do plugin dompdf:
testlink/lib/results/dompdf/conversor.php - generates code to perform the conversion using the dompdf plugin:
<?php
//Invoca o conversor / Invoke the converter
require_once("dompdf_config.inc.php");
//Recebe o relatório em HTML / Get the HTML report
$html = utf8_decode(unserialize(base64_decode($_POST["html"])));
$dompdf = new DOMPDF();
//Indica o que converter / Indicates that convert
$dompdf->load_html($html, 'UTF-8');
$dompdf->set_paper('a4', 'portrait');
$dompdf->render();
//Disponibiliza o relatório / Provides the report
$dompdf->stream($_POST['projectname'] . ".pdf");
?>

terça-feira, 13 de dezembro de 2011

Acesso remoto a sistema desenvolvidos em CLIPPER (plataforma Windows 16 bits)

Para a próxima feira de jóias de Limeira, precisei bolar uma forma de acessar remotamente um programa em clipper (DOS) com a necessidade de imprimir localmente.
Como no DOS não é possível (com qualidade e velocidade), apelei para o nosso querido amigo Linux... através do DOSEMU e o FreeDOS (veja na bibliografia), emulei o ambiente DOS e rodei o sistema em uma máquina virtual Ubuntu.
Para tonar o acesso remoto/impressão mais confiável e fácil, fiz uma VPN através do Hamachi:

http://rairo.wordpress.com/2009/01/16/ubuntu-instalando-o-hamachi-vpn/

Removi a solicitação de senha para executar comando como root (sudo), não é recomendável mas o objetivo do projeto é torná-lo o mais fácil possível para os usuários acostumados com Windows:
http://www.vivaolinux.com.br/topico/vivaolinux/Permissao-12
Consegui desta forma auto iniciar o hamachi-gui como root no início da sessão no servidor e no cliente (menu sistema > preferências > aplicativos de sessão).

Para que o acesso remoto pudesse imprimir através do computador cliente e não do servidor:
Instalei uma impressora no computador cliente e configurei o CUPS (http://localhost:631/ ou menu sistema > administração > impressão) para compartilhar a impressora (ativei também a opção de compartilhar via internet - ipp). No servidor, busquei a impressora do cliente através do IP da VPN do Hamachi; instalei, e imprimi corretamente.

Para facilitar mais ainda procedimento do usuário:
iniciar a sessão do usuário no Ubuntu automaticamente (menu sistema > administração > tela de login);
criei um script para conectar via SSH ao IP da VPN automaticamente ao iniciar a sessão no Ubuntu 
Exemplo:

#!/bin/bash
ssh usuário@IP_VPN

...coloquei-o no autostart (menu sistema > preferêcias >aplicativos de sessão);
para que não seja solicitada senha para conectar via SSH: http://papogeek.wordpress.com/2008/05/13/login-ssh-sem-senha/;
para que após o acesso ao servidor via SSH o DOSEMU inicie automaticamente, na pasta do usuário (/home/usuário) no servidor, localizei o arquivo ".bashrc" e adicionei na ultima linha o comando "sudo dosemu";
dentro do DOSEMU, editei o arquivo autoexec.bat para executar automaticamente o sistema ao iniciar.

Dica: na configuração do dosemu.conf, a nossa codificação latina para escrita é "cp850".

Se não me esqueci de nada, está pronto! Uma semana de trabalho.

Em suma: consigo acessar remotamente através de SSH um sistema em Clipper (DOS) e ao imprimir, o servidor encaminha a impressão para o computador cliente e assim não é impresso na impressora padrão do servidor. Este processo utiliza pouca banda e é tolerável a variações do link de internet.


Referência Bibliográfica
SILVA, João Almeida. " Implantação de acesso remoto de sistema legado em Clipper sobre Linux". Disponível em <http://www.ginux.ufla.br/node/128>. Acessado em 15/06/2010