BEM VINDO AO BLOG DO MARCOS CARRARO CRIADOR DO "CARRARO DASHBOARD". MUITO MAIS QUE UM SIMPLES BLOG.

domingo, 21 de dezembro de 2014

XenServer 6.4 + Windows 2012 Server + Lenovo T400 Erro Windows: C4

Buenas,

Tenho um Lenovo T400 que fiz dele meu LAB (bom e barato, com alguns ajustes bala!!!), porém ao instalar o Windows 2012 sever, ele retorna um erro..

Em algumas pesquisas na Internet encontrei que o problema é referente a uma proteção de memoria que na grande maioria dos computadores/servidores/notebooks esta presente, chama-se "Memory Protection", em outros hardwares pode ter outro nome como "no-Execution Memory Protection" mas todas com o mesmo intuito, de impedir que códigos maliciosos sejam executados na memoria, e sim o Windows 2012/ Windows 8 reclamam por esta feature não estar habilitada.

Meu ambiente é o Xenserver 6.4 (Mentira dele!!! Estou usando a versão open do xenserver em xenserver.org).

Para habilitar esta opção acesse a  "Bios", após vá em "Security", depois "Memory Protection", depois habilite a opção "Execution Prevention".

Feito isso salve as alterações e inicie o Sistema novamente.

Pronto, problema resolvido.

Agora bom proveito, e um forte abraço.


Marcos Carraro.
Read More

quarta-feira, 5 de novembro de 2014

Redirecionando saida do netstat + data e hora + log

Buenas,


watch -n 1 'netstat -patun | grep -i post | tee -a listando_conexoes.log; date | tee -a  listando_conexoes.log'


Onde:

watch -n 1 'COMANDO' -> repete o comando a cada 1 segundo.

netstat -patun | grep -i post | tee -a listando_conexoes.log; -> redireciona a saida do netsta para o arquivo listando_conexoes.log

date | tee -a  listando_conexoes.log -> Joga no fim da linha a data e hora



ABraços
Read More

quinta-feira, 23 de outubro de 2014

Sincronizar Senhas do AD (Active Directory) com qualquer outro serviço

Buenas,

Turma, sei que muitos já se perguntaram se é possível sincronizar as senhas dos usuários do AD com outros sistemas e até estes tempos a resposta sempre era NÃO.

Porém esse não vem de pessoas que não estava bem informadas, pois existe duas maneiras de sincronizar as senhas do AD com outros serviços.

Utilizando o ssod desenvolvido pela microsoft (com algumas alterações é possível utilizar ele com outras bases, porém é muito complexo, pois utiliza-se socket, 3DES, sha1, base64...), ou fazendo um "hook" que a microsoft chama de "Passoword Filter" na qual desenvolvi o "esqueleto", na verdade grandes empresas utilizam esta maneira para sincronizar as senhas tais como, Google, SAP, Red Hat, entre outras...

No meu github https://github.com/marcoscarraro/SyncPass tem o projeto.

Esta escrito em C que depois transforma-se em uma dll, lá também tem mais informações de como ativar ela, e alguns erros do compilador.

Porém esta DLL não esta fazendo nenhum insert em banco, nada, apenas jogando para um arquivo de texto, pois a ideia é montar o esqueleto, e o restante vem com as necessidades, com a base pronta adaptar para outros é barbada.

Links:
SSOD,
http://www.microsoft.com/en-us/download/details.aspx?id=2792
http://support.microsoft.com/kb/324542/pt-br

Password Filter,
http://msdn.microsoft.com/en-us/library/windows/desktop/ms721882(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/bb259958.aspx

SyncPass - Desenvolvido por Marcos Carraro (EU :P)
https://github.com/marcoscarraro/SyncPass


Forte Abraço
Marcos Carraro.
Read More

sexta-feira, 19 de setembro de 2014

Criando pacotes RPM Centos 6.5 - 2

Buenas,

Continuidade de http://marcoscarraro.blogspot.com.br/2014/09/criando-um-repositorio-de-rpm-1.html

Então lá vamos nos criar os pacotes RPM.

Pacotes necessários
# yum install rpmdevtools

Vamos criar um usuário limpo para fazer a criação dos pacotes, para não puxar permissões especiais.
# adduser pacotes
# passwd pacotes

Logando no usuário
# su pacotes

Vamos criar a estrutura básica do RPM, o ideal é trabalhar sempre no ~ do usuário
# cd ~
# rpmdev-setuptree

Vai criar uma pasta chamada rpmbuild

Informações da estrutura criada.
BUILD é usado como espaço de rascunho para compilar realmente o software.
RPMS contém o RPM binário que o rpmbuild constrói.
SOURCES destina-se ao código-fonte.
SPECS contém seu arquivo ou arquivos spec— um arquivo spec por RPM que desejar construir.
SRPMS contém o RPM fonte construído durante o processo.

Ok, preparado o terreno, vamos criar a estrutura do nosso programa, a estrutura do programa pode ser /etc/programa , /usr/local/programa , /var/log/programa 

# mkdir -p pacote-1/opt/pacote/
# mkdir -p pacote-1/var/log/pacote/
# echo "Arquivo de testes" > ./pacote-1/opt/pacote/conteudo.conf

Depois da estrutura criada, os arquivos transferidos, é hora de compactar tudo, repare que vamos salvar dentro da pasta SOURCES.
# tar -czvf rpmbuild/SOURCES/pacote-1.tar.gz pacote-1/


Feito isso é a hora de criar o SPEC, esse cara é quem vai reger toda instalação.
# rpmdev-newspec rpmbuild/SPECS/pacote.spec

Utilize este arquivo pré elaborado por mim, ele é genérico, porém esta comentado referente ao que cada bloco ira fazer. Altere as demais informações, onde o Name é utilizado junto do Version, por isso criamos o pacote-1.tar.gz, também pode alterar as dependências do pacote, colocar ações pré instalação, pós instalação, pré desinstalação, pós desinstalação.


#
#  DESCRICAO DO PACOTE E CRIADOR
#
Name: pacote
Version: 1 
Release: 0
Summary: PACOTE ABC De testes
Group: APP
License: GPL
URL: http://marcoscarraro.blogspot.com

#
#  INFORMACOES DO PACOTE, E DEPENDENCIAS
#
Source0: %{name}-%{version}.tar.gz
BuildArch: noarch
BuildRoot: %{_tmppath}/%{name}-buildroot 
#Requires: httpd php php-common

#
#   DESCRICAO GERAL
#
%description
Pacote criado para testes

#
#   ACOES A SEREM TOMADAS
#   %pre,      %post,       %preun,       %postun
#   pre instal, post instal, pre uninstal, pos uninstal
%pre
echo "Instalando O pacote aguarde..."


%prep
%setup -q

#
#  EXECUTA A INSTALACAO, PODEMOS INCREMENTAR A MESMA
#
%install
mkdir -p %{buildroot}
cp -R * %{buildroot}

#
#  FAZ A LIMPEZA DA INSTALACAO
#
%clean
rm -rf %{buildroot}

#
#  TERMINA A INSTALACAO, PODEMOS APLICAR COMANDOS AQUI
#
%post
echo "Pacote Instalado com sucesso"

#
#  INDICA OS ARQUIVOS,PASTAS INSTALADOS, PARA SABER QUANDO FOR FAZER UM RPM -E
#
%files
%defattr(-,root,root,-)
/var/log/pacote
/opt/pacote/pacote.conf
/opt/pacote/

Abraços
Marcos Carraro
Read More

quinta-feira, 18 de setembro de 2014

Criando um repositório de RPM - 1

Buenas,

Começa aqui uma documentação para equalizar a estrutura linux.

A ideia é, montar um repositório de pacotes central, e recriar ISO do Centos pré configurado.

Porque, assim você pode homologar os pacotes antes que seus servidores baixem eles, ou deseja disponibilizar algum pacote recompilado...

Para isso é necessário que a máquina que vai conter todos RPM precisa ter os seguintes pacotes.
# yum install yum-plugin-downloadonly httpd createrepo

Primeiro vamos criar a estrutura básica para disponibilizar os pacotes.

# mkdir -p /var/www/html/repo/6/x86_64/pacotes 

Onde 6 é a versão do Centos, e onde x86_64 é a arquitetura dos pacoes no nosso caso é x64.

Criado a estrutura vamos baixar os pacotes que vamos disponibilizar no repositório.

# yum install --downloadonly --downloaddir=/var/www/html/repo/6/x86_64/base/ httpd httpd-tools php php-cli php-common php-mysql php-pdo php-gd 

Porém muitas vezes temos instalações super leves, minimalistas, então é necessário também disponibilizar além dos pacotes as dependências dos mesmos.

# yum install --downloadonly --downloaddir=/var/www/html/repo/6/x86_64/base/ $(repoquery --requires httpd httpd-tools php php-cli php-common php-mysql php-pdo php-gd  )

Ok, efetuado todos downloads, vamos criar o índice para que seja mais fácil do yum verificar se o pacote que ele precisa tem no nosso repositório.

# createrepo /var/www/html/repo/6/x86_64/pacotes

Pronto, agora já temos o repositório ativado, vamos criar o arquivo para o servidor utilizar o nosso repo.

[pacotes]
name= pacotes homologados
baseurl=http://repo.casa.local/repo/$releasever/$basearch/pacotes
gpgcheck=0


Pronto, o repositório esta criado, próximo post sera criando a ISO personalizada. e o outro post sera criando um pacote rpm.

Abraços
Marcos Carraro
Read More

quarta-feira, 17 de setembro de 2014

Xenserver configurando repositório USB/INTERNO de ISO

Buenas,

Quem nunca teve que subir uma VM no xen e estava sem o CD somente a ISO e sem nenhum compartilhamento na rede???

Pois bem, foi o que deu, precisei subir uma VM onde eu tinha a ISO na pendrive foi que me ocorreu de procurar a informação de como configurar.

Primeiro crie um diretorio para fazer a montagem ou o armazenamento das ISO.

# mkdir /mnt/usb

# mount -t auto /dev/sdc1 /mnt/usb

// Agora sim vem o pulo do gato

# xe sr-create name-label=ISOs type=iso device-config:location=/mnt/usb device-config:legacy_mode=true content-type=iso

Se você deseja despejar as ISOs no servidor, é so pular a parte de montar o dispositivo externo.

Abraços
Marcos Carararo
Read More

sexta-feira, 5 de setembro de 2014

Postgresql - Cacuum+ Reindex = Todo Banco

Buenas,

Talvez para os deconhecidos, ou não, segue um script para fazer uma pequena manutenção no banco Postgresql

#!/bin/bash

# Vaccum organiza os registros
# -a  Todos os Banco de Dados.
# -f  Full
# -z  Analyze
# -v  Exibe mensagens de debug
/usr/bin/vacuumdb -a -z -f -U postgres


# REINDEX
# -a Todos os bancos
# -s Reindexa os catálogos do sistema do banco de dados.
/usr/bin/reindexdb -a -U postgres


Lembrando que no pg_hba.conf deve estar setado para não pedir senha para as conexões locais, caso contrário terá que informar no script a senha utilizando o parâmetro -W.
local   all             all                                     trust

Forte abraços
Marcos Carraro
Read More

segunda-feira, 25 de agosto de 2014

Postgresql 9.2 Log ---> AVISO: pgstat wait timeout + Alguns dicas de performance do pg

Buenas,

Tenho um BI aqui na empresa o qual sempre dá alguns problemas insanos com o pg, porém hoje fiquei na cola dos caras, até pegar o momento exato que ocorre os problemas.

No pg ele lança a seguinte informação nos logs "AVISO:  pgstat wait timeout", como se ele não estivesse dando conta do recado.

Acompanhando IO estava tranquilo "iostat -x 1" porém ele continuava a reclamar.

Pesquisando aqui ali em questão de 15 minutos já tinha encontrado várias pedras para tentar resolver o problema.

Dentre elas a principal de todas "stats_temp_directory" onde o pq salva algumas estatísticas, onde o ideal seria carregar isso na memoria, e não em disco.

Então para jogar estas estatísticas na ram basta seguir estes passos.

# Diretório
mkdir /var/lib/pgsql_stats_tmp

# Permissão para a pasta geral
chmod 777 /var/lib/pgsql_stats_tmp

# Permissão "sticky-bit", onde todos podem ler, escrever e executar, porém so podem fazer isso com seus arquivos.
chmod +t /var/lib/pgsql_stats_tmp

# No fstab vamos montar o diretório e indicar o quanto de memoria ram ele vai ocupar, nesta caso 2G já esta ótimo.
tmpfs /var/lib/pgsql_stats_tmp tmpfs size=2G,uid=postgres,gid=postgres 0 0
# Agora é so reiniciar o serviço e correr para o abraço
/etc/init.d/postgresql-9.2 restart
# FSTAB dos diretórios
/dev/xvda1 / ext4 defaults,noatime,nodiratime,data=writeback,commit=100,nobh 1 1
/dev/xvda3 /db_sadig xfs defaults,noatime,nodiratime,allocsize=512m,barrier=0,inode64,logbufs=8 1 2

# Limites /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

# Sysctl.conf
vm.swappiness = 0 # não usa o swap
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 4194304
net.ipv4.tcp_rmem = 4096 262144 4194304
net.ipv4.tcp_wmem = 4096 262144 4194304
vm.dirty_background_ratio = 50
vm.dirty_ratio = 80
fs.file-max = 6815744
fs.aio-max-nr = 104857600
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.core.netdev_max_backlog = 65536
net.ipv4.tcp_rfc1337 = 1
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.conf.all.arp_notify = 1
# Aqui é feito calculos
# http://www.postgresql.org/docs/9.0/static/kernel-resources.html
# http://helkmut.blogspot.com.br/2011/07/postgresql-tunando-seu-shmmax-e-shmall.html
# http://michael.otacoo.com/postgresql-2/take-care-of-kernel-memory-limitation-for-postgresql-shared-buffers/
# http://serverfault.com/questions/341680/postgresql-performance-adjusting-shmmax-and-shmall
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

# postgresql.conf
#
# ATENCAÇÃO
# Não sou DBA, então pode ter parâmetros fora do normal, que na visão de um DBA estão errados,
# ou deveriam, ter outros valores. Então se você é DBA ou percebeu algum erro comunique-me.
#
#
listen_addresses = '*' # what IP address(es) to listen on;
max_connections = 300 # (change requires restart)
shared_buffers = 2048MB # min 128kB
# (change requires restart)
temp_buffers = 512MB # min 800kB
max_prepared_transactions = 300 # zero disables the feature
# (change requires restart)
work_mem = 256MB # min 64kB
maintenance_work_mem = 512MB # min 1MB
synchronous_commit = on # synchronization level;
# off, local, remote_write, or on
checkpoint_segments = 32 # in logfile segments, min 1, 16MB each
checkpoint_timeout = 1h # range 30s-1h
checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0
random_page_cost = 6.0 # same scale as above
effective_cache_size = 2048MB
log_destination = 'stderr' # Valid values are combinations of
logging_collector = on # Enable capturing of stderr and csvlog
log_directory = 'pg_log' # directory where log files are written,
# can be absolute or relative to PGDATA
log_filename = 'postgresql-%a.log' # log file name pattern,
# can include strftime() escapes
log_truncate_on_rotation = on # If on, an existing log file with the
# in all cases.
log_rotation_age = 1d # Automatic rotation of logfiles will
# happen after that time. 0 disables.
log_rotation_size = 0 # Automatic rotation of logfiles will
# happen after that much log output.
#log_lock_waits = off # log lock waits >= deadlock_timeout
log_statement = 'all' # none, ddl, mod, all
#log_temp_files = -1 # log temporary files equal or larger
# than the specified size in kilobytes;
# -1 disables, 0 logs all temp files
log_timezone = 'Brazil/East'
log_checkpoints = on
stats_temp_directory = '/var/lib/pgsql_stats_tmp'
datestyle = 'iso, dmy'
#intervalstyle = 'postgres'
timezone = 'Brazil/East'
# These settings are initialized by initdb, but they can be changed.
lc_messages = 'pt_BR.ISO88591' # locale for system error message
# strings
lc_monetary = 'pt_BR.ISO88591' # locale for monetary formatting
lc_numeric = 'pt_BR.ISO88591' # locale for number formatting
lc_time = 'pt_BR.ISO88591'
default_text_search_config = 'pg_catalog.english'
default_with_oids = off
escape_string_warning = on
standard_conforming_strings = on
Read More

sexta-feira, 8 de agosto de 2014

Jquery SHA1 + php + mysql + tcpdump = Login seguro

Salve Salve turma,

Tava fazendo umas brincadeiras, quando eu pude perceber que podemos ter problemas de seguranças em formulários que não são https e tem uma senha digitada.

Não vou demonstrar o php recebendo os valores, pois este não é o intuito.

- Primeiro uma pagina simples...

Formulário simples, onde envia para o php

<script type="text/javascript">
    $(document).ready(function() {
        $("#FormLogin").submit(function() {
            $.post('<?php echo site_url('login/logar'); ?>',
                    $(this).serialize(),
                    function(data) {
                        $("#retorno").html(data)
                    }
            );
            return false;
        });
    });
</script>

    <form class="form-signin" id="FormLogin" method="post" role="form">
        <h2 class="form-signin-heading logo_login"></h2>
        <h4 class="form-signin-heading">Extranet Dal Mobile LTDA</h4>
        <input name="usuario" type="text" class="form-control" placeholder="Usuário" required autofocus>
        <input name="senha" type="password" class="form-control" placeholder="Senha" required>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Logar</button>
        <br>
        <div id="retorno"></div>    
    </form>




- Testando
[root@note-marcos upload]# tcpdump -i lo -vvv -l -A | grep -i admin

........usuario=admin&senha=123


- Como vai ficar

<script src="http://www.astronomy.ie/print/www.independent.ie/independent.ie/javascript/jquery.sha1.js%3Fv=3"></script>

<script type="text/javascript">
    $(document).ready(function() {
        $("#FormLogin").submit(function() {

            var pass = $.sha1($('input[name="senha"]').val()); // Pega o value do input e manda para a função
            $('input[name="senha"]').val(""); // Limpa o input da senha
            $('input[name="senha"]').val(pass); // Grava no input da senha a nova senha em sha1

            $.post('<?php echo site_url('login/logar'); ?>',
                    $(this).serialize(),
                    function(data) {
                        $("#retorno").html(data)
                    }
            );
            return false;
        });
    });
</script>

    <form class="form-signin" id="FormLogin" method="post" role="form">
        <h2 class="form-signin-heading logo_login"></h2>
        <h4 class="form-signin-heading">Extranet Dal Mobile LTDA</h4>
        <input name="usuario" type="text" class="form-control" placeholder="Usuário" required autofocus>
        <input name="senha" type="password" class="form-control" placeholder="Senha" required>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Logar</button>
        <br>
        <div id="retorno"></div>    
    </form>


- Testando novamente 
[root@note-marcos upload]# tcpdump -i lo -vvv -l -A | grep -i admin

........usuario=admin&senha=40bd001563085fc35165329ea1ff5c5ecbdbbeef

Read More

terça-feira, 22 de julho de 2014

Mysql - Tabela para armazenar imagens e grandes textos

Bueno, se você esta montando algum sistema de notícias, que o mesmo vai ter imagens, e muito texto, e não deseja hospedar as imagens, então suba todo no banco. 

Para o editor estou utilizando o http://hackerwins.github.io/summernote/ junto do http://getbootstrap.com/

Então lembre-se que a coluna que vai armazenar o conteúdo, deve ter estes tipos, avalie o tamanho que podera ter e utilize a de acordo.

TINYBLOB, TINYTEXT                                 (255 Bytes) 
    BLOB, TEXT                                                    (64 Kilobytes) 
       MEDIUMBLOB, MEDIUMTEXT                 (16 Megabytes) 
  LONGBLOB, LONGTEXT                              (4 Gigabytes)

Forte quebra costelas,
Marcos Carraro.
Read More

quarta-feira, 18 de junho de 2014

Segmentando a rede Visitantes da rede principal

Segmentando a rede visitantes da rede principal.
Equipamentos.
Switch HP
Access Point Ubiquiti UNIFI ULR

Vlan
Vlan da visitantes 220
Configurações na Switch
No switch vamos configurar a porta onde este conectado o AP para usar a porta como tagged (trunk) com as vlans:  1 (Vlan default da rede), 220 (Vlan para a rede visitantes).
Também não podemos esquecer de configurar a porta onde esta conectado o servidor de DHCP e o Roteador para que eles possam enxergar esta rede, distribuir os IPs e fazer os roteamentos.

1 – Criando a VLAN
2 – Configurando a porta onde esta conectado o AP, selecione a VLAN desejada e coloque como “tagged” em outras palavras é “trunk”, as portas que participam da vlan 220 ficaram em verde, caso alguma porta fosse dedicada a esta VLAN ficaria em AZUL.
Feito esta alterações, clique em “apply” e depois no menu da esquerda Device->Configuration
Na aba “Save” clique no botão “Save Currente Settings”, pronto estamos com a switch configurada.
Vamos ao próximo passo configurar a interface com a VLAN no firewall.
Configurando Interface no Servidor
O arquivo de configuração deve ser cirado em  /etc/sysconfig/network-scripts/ (Familia RedHatLike), o nome fica
ifcfg-(Placa de rede com o cabo conectado na switch).(ID da vlan)
Exemplo: ifcfg-eth1.220
# cat /etc/sysconfig/network-scripts/ifcfg-eth1.220
VLAN=yes
DEVICE=eth1.220
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.10.1
NETMASK=255.255.255.0


Configurando DHCPD
 Primeiro, deve-se indicar quais interfaces estarão distribuindo os IPS, para isso altere o arquivo /etc/sysconfig/dhcpd.
# cat /etc/sysconfig/dhcpd
# Command line options here
DHCPDARGS=eth1 eth1.220

Arquivo dhcpd.conf
# cat /etc/dhcpd.conf
ddns-update-style none;
default-lease-time 259200;
max-lease-time 518400;
authoritative;
log-facility local7;

# REDE ADM
subnet 192.168.1.0 netmask 255.255.255.0 {
# --- default gateway
        option routers                  192.168.1.254;
        option subnet-mask              255.255.255.0;

        option domain-name-servers      192.168.1.253;
        option netbios-name-servers     192.168.1.253;
        option ntp-servers              192.168.1.253;
        option domain-name              "rede.interna";

        range 192.168.1.10 192.168.1.240;
        option broadcast-address 192.168.1.255;

ddns-update-style none;
default-lease-time 259200;
max-lease-time 518400;
authoritative;
log-facility local7;

#--------------------------------------------------------
# ips fixados
  host coletor1 {
hardware ethernet 00:23:68:E4:7F:78;
fixed-address 192.168.1.150;
   }
}
# REDE VISITANTES
subnet 192.168.10.0 netmask 255.255.255.0 {
# --- default gateway
        option routers                  192.168.10.1;
        option subnet-mask              255.255.255.0;

        option domain-name-servers      192.168.10.1;
        option domain-name              "rede.interna";

        range 192.168.10.10 192.168.10.90;
        option broadcast-address 192.168.10.255;
}

Configurando APs
Para isso tem que estar rodando o próprio programa da Ubiquiti. Então acesso o seu IP no navegador na porta 8443.
Vá em Wireless networks, supondo que você já tenha uma rede criada vamos configurar a VLAN.

Feito isso clique em “apply” e esta finalizado.




Forte Abraço
Marcos Carraro















Read More

segunda-feira, 28 de abril de 2014

C/C++ Função validar IP faz parte da Rede/Mascara

Buenas,

Segue uma pequena função em C/C++ que valida se o IP x esta na rede Y com a mascara Z.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

//---------------------------------------------------------------------
long ip2long(const char *ip,int mascara, const char *rede){
    int ip_host_long,ip_rede_long,maximo,retorno;

    // Converte o IP do HOST no modo long - clong
    ip_host_long = htonl(inet_addr(ip));
    // Converte o IP da REDE no modo long - min
    ip_rede_long = htonl(inet_addr(rede));

    // Definindo o maximo
    maximo = (ip_rede_long | ((1 << (32 - mascara)) -1));

// Validando
    if(ip_host_long > ip_rede_long && ip_host_long < maximo){
        // Faz parte da rede e da mascara
        retorno = 1;
    } else {
        // Nao faz parte da rede e da mascara
        retorno = 0;
    }

    return retorno;
}


//---------------------------------------------------------------------

int main()
{
    const char *ip;
    int mascara;
    const char *rede;

    mascara = 24;
    rede = "192.168.1.0";
    ip = "192.168.2.3";

    long ip_longo = ip2long(ip,mascara,rede);


    printf("%u\n", ip_longo);


    return 0;
}


Forte abraço
Marcos Carraro
Read More

quarta-feira, 16 de abril de 2014

Centos 6 x64 + php 5.3 + bcompiler Com exemplo de arquivo php

Buenas,

Vamos botar para quebrar com o Centos minimal 6 atualizado com o php 5.3 (http://www.php.net/manual/pt_BR/book.bcompiler.php) e também vamos compilar o módulo bcompiler (http://pecl.php.net/package/bcompiler) para criar arquivos binários do php.

Instalação

Entrar no diretório
# cd /usr/src/

Baixar o pacote mais atual
# wget http://pecl.php.net/get/bcompiler

Descompactar o arquivo
# tar -xvsf bcompiler

# cd bcompiler-1.0.2/

PHPIZE Prepara o ambiente para a compilação (http://php.net/manual/pt_BR/install.pecl.phpize.php)
# phpize

Procedimentos comuns para a compilação
# ./configure
# make

A propria extensão manda fazer um teste antes de compilar verdadeiramente
# make test
# make install

Feito isso e não teve nenhum erro show de bola terminamos a compilação e a instalação.

Ao terminar a compilação ele retorna a mensagem de concluído, e também o diretório onde foi gravado o arquivo no meu caso "/usr/lib64/php/modules/"

Vamos agora para a ativação da extensão no php.

# cd /etc/php.d/

# vim bcompiler.ini

Cole o seguinte conteudo

; Ativando a extensao do bcompiler
extension=bcompiler.so


Reiniciando o serviço httpd.

# service httpd restart


Exemplos

No meu caso vou estar utilizando os arquivos compilados pelo php para a linha de comando (http://php.net/manual/pt_BR/features.commandline.php), para obter mais desempenho.



<?php

// $fh é o arquivo de destino, onde vai ser gravado a compialação
// repare na extensao do arquivo não é mais php e sim phb
$fh = fopen("arq_src.phb", "w");
bcompiler_write_header($fh);
// $fh é o arquivo de origem onde tem o codigo php cru
bcompiler_write_file($fh, "arq_src.php");
bcompiler_write_footer($fh);
fclose($fh);

?>




Read More

sexta-feira, 11 de abril de 2014

Criando Fluxo em ASCII

Buenas,

Ta aqui uma baita ferramente que fazia falta, criar fluxo em modo texto para usar nos script.

http://asciiflow.com/

A ferramente é baseada na web e é muito fácil de usar, com isso monta-se os fluxos e depois cola no script indicando o que ele deve fazer.

Forte Abraços
Marcos Carraro
Read More

sexta-feira, 4 de abril de 2014

Linux Erro Disco - DRDY ERR UNC e ou {DRDY err}

Buenas,

Situação, um servidor com 6 discos de 1,5tb, do nada da um crash (Os discos estão em RAID para ter mais desempenho).

Ao ligar, imagina o retorno....
  {DRDY err} do sata1....

Um simples fsck não tava resolvendo meu problema, até que veio os velhos tempos do slackware, o dino deixou algumas coisas legais...

Então, nada melhor que rodar o e2fsck

# e2fsck -f -c -v -y /dev/md0

No meu caso o /dev/md0 é o raid, mas pode usar o seu disco /dev/sda1....

Após 19Horas, o servidor voltou a vida a todo vapor.

Boa Sorte se não precisarem ocupar o comando, se tiverem que utilizar tomara que de retorno.

Forte quebra costelas,
Marcos Carraro.
Read More

quinta-feira, 3 de abril de 2014

NMAP vs CONFICKER

É velho, mas ainda existe, e por causa dele, fiquei numa blacklist.

Solução.

#sudo nmap -sC --script=smb-check-vulns --script-args=safe=1 -p445  -d -PN -n -T4  --min-hostgroup 256 --min-parallelism 64  -oA conficker_scan 192.168.1.0-254 > conficker

Na máquina atualizar o XP para o SP3, aplicar os FIX, e também http://brazil.kaspersky.com/recursos/combater-conficker 

O legal do NMAP é que o retorno dele é fácil detectar alguma máquina infectada.

Nmap scan report for 192.168.1.110
Host is up, received arp-response (0.0097s latency).
Scanned at 2014-04-03 16:32:49 BRT for 2s
PORT    STATE SERVICE      REASON
445/tcp open  microsoft-ds syn-ack
MAC Address: 00:1D:1A:03:6E:F8 (OvisLink S.A.)

Host script results:
| smb-check-vulns:
|   MS08-067: CHECK DISABLED (remove 'safe=1' argument to run)
|   Conficker: Likely INFECTED (by Conficker.C or lower)
|   regsvc DoS: CHECK DISABLED (add '--script-args=unsafe=1' to run)
|   SMBv2 DoS (CVE-2009-3103): CHECK DISABLED (add '--script-args=unsafe=1' to run)
|   MS06-025: CHECK DISABLED (remove 'safe=1' argument to run)
|_  MS07-029: CHECK DISABLED (remove 'safe=1' argument to run)
Final times for host: srtt: 9730 rttvar: 15146  to: 100000


Marcos Carraro
Read More

Mysql Usando CASE com WHERE com Coluna Virtual - ATUALIZADO

Buenas,

Muitas vezes precisamos montar uma coluna virtual no mysql somente para aquela consulta, onde devemos aplicar um filtro, sem ter que ir para a programação apenas no banco para termos um desempenho melhor.

A situação.

Tabela Dias

Colunas
ID DIA HORA

Precisamos comparar alguns valores se estiverem OK retornar 1 caso contrário retornar 0

select
    ID,
   @DiaValido := (CASE WHEN (DAYOFWEEK(NOW()) = '7' && a.dia = '7')&&(DAYOFWEEK(NOW()) = '7' && b.dia = '1' ) THEN '1'
WHEN (DAYOFWEEK(NOW()) >= a.dia) && (DAYOFWEEK(NOW()) <= b.dia) then '1'
ELSE '0' END) as DiaValido
from
    Dias a,
   Dias b,
where @DiaValido = 1

Desta maneira conseguimos obter melhor desempenho, pois não vamos precisar programar, apenas fazendo a consulta no banco, ganhando assim mais performance.

Atualizando 03/04/2014 - 1058 .
A consulta anterior estava levando 2.15ms para retornar banco pequeno, máquina pequena.

Ao invés de criar uma Coluna Virtual (nome verdadeiro Variável), utilizei o parâmetro HAVING, com isso ganhei 0,20 ms de tempo, pensando em um banco maior, com mais registros....

select
    ID,
(CASE WHEN (DAYOFWEEK(NOW()) = '7' && a.dia = '7')&&(DAYOFWEEK(NOW()) = '7' && b.dia = '1' ) THEN '1'
WHEN (DAYOFWEEK(NOW()) >= a.dia) && (DAYOFWEEK(NOW()) <= b.dia) then '1'
ELSE '0' END) as DiaValido
from
    Dias a,
   Dias b,
HAVING DiaValido = 1

Forte quebra costelas
Marcos Carraro
Read More

terça-feira, 1 de abril de 2014

Site com os principais sites de AD Server (popups de propaganda chatos)

Buenas,

Segue link com uns 300 registros para bloquear no proxy assim melhorando as malditas propagandas.

http://pgl.yoyo.org/adservers/serverlist.php

Abraços
Marcos Carraro.
Read More

segunda-feira, 31 de março de 2014

Xenserver + Storage + Linux + Aumentar espaço partição

Buenas,

Mais um daqueles dias, meu BI acusando falta de espaço ok, então lá vamos nos aumentar. Por sorte eu já tenho experiencia com o linux e espaço em disco, então sempre faço LVM ou duas partições.

Neste caso montei duas partições, pelo motivo dele ser um Banco, e quase todas as documentações falam que LVM é menos performático do que uma partição normal.

Primeiro de tudo, fiz um BKP do postgre, como a instalação do DB esta separada vide link ( http://marcoscarraro.blogspot.com.br/2013/04/instalando-postgresql-92-alterar-local.html ), foi mais fácil.

Feito o BKP é hora de baixar a VM, e no xenserver desconectar o DISCO, para uma maior segurança, selecione o disco, e clique em "Detach".


Feito, isso conecte no HP CMC, gerenciador do Storage, então vamos fazer o resize do disco.

Aumente o tamanho necessário, clique em OK e espere.

Após aumentar o espaço em disco, no xenserver aumente o tamanho do disco, clicando em propriedades, conforme exemplo.


Clique em OK, e pronto, reatach com a máquine, e mande iniciar a VM. Ao iniciar a VM, na linha de comando digitar '# df -h' vai ver que nada mudou para isso, '# fdisk -l', vai perceber que o disco já pegou o tamanho novo.

No linux.

Obs: xvda é o meu disco, o seu pode ser diferente

# umount /dev/xvda3

É necessário desmontar a partição para poder prosseguir.

# fdisk /dev/xvda
p -> mostra todos discos, vamos deletar a partição 3 que é a que vai ser aumentada
d -> comando para apagar
    3 -> numero da partição
w -> grava alterações

# reboot

Ao iniciar a máquina devemos dar o formato à  partição.

# make -t xfs -i size=1024 /dev/xvda3

Aguarde alguns instantes....

# mount -a

# df -h

Vai mostrar o tamanho novo da partição, pronto, so restaurar o bkp, iniciar o DB e aproveitar.

Abraços
Marcos Carraro.
Read More

terça-feira, 25 de fevereiro de 2014

Diminuindo Boa parte dos Spans recebidos Postfix

Buenas,

Lá vai um pente fino que criei para poder reter um pouco de spam enviado a empresa.

Vamos lá,

No arquivo main.cnf adicione a seguinte linha.

header_checks = regexp:/etc/postfix/cabecalho.regexp

# vim /etc/postfix/cabecalho.regexp

# Esconde algumas informações
/^Received:/    IGNORE
/^User-Agent:/  IGNORE
/^X-Mailer:/    IGNORE
/^X-MimeOLE:/   IGNORE
/^X-MSMail-Priority:/   IGNORE
/^X-Spam-Status:/   IGNORE
/^X-Spam-Level:/    IGNORE
/^X-Sanitizer:/     IGNORE
/^X-Originating-IP:/    IGNORE
/^Received: from 127.0.0.1/  IGNORE/^Subject: .*    / REJECT Muitos Espacos.

# Bloqueia charset estranhos
/^Content-Type:.*charset=.*(big5|euc-kr|gb2312|iso-.*-jp|ks_c_5601-1987)/ REJECT  Email com charset diferente.
/^Subject:.*=\?(big5|euc-kr|gb2312|iso-.*-jp|ks_c_5601-1987)\?/ REJECT Email com charset diferente.
/^Subject:.*=?KOI8/ REJECT Email com charset diferente.

# Bloqueia emails com data antigas
# Uma atenção especial, nesta parte tem que alterar todo ano :D
/^Date:.*200[0-13]/ REJECT Email com data antiga .
/^Date:.*19[0-9][0-9]/ REJECT Email com data antiga .

# Bloqueia extensões não legais
/^content-(type|disposition):.*name[[:space:]]*=.*\.(exe|bat|avi|vbs|cmd|asd|pif|scr|cpl|cmd|vxd|dll)/ REJECT Email com anexo nao permitido.

# Rejeitado email mal formado
/^Return-Path: <>/ REJECT Email mal formado.


Compilar para o bom funcionamento

# postmap /etc/postfix/cabecalho.regexp

Algumas restrições para quem vai receber os e-mails
smtpd_recipient_restrictions = permit_mynetworks,
                permit_sasl_authenticated,
                reject_unauth_pipelining,
                reject_invalid_hostname,
                reject_non_fqdn_hostname,
                reject_non_fqdn_sender,
                reject_non_fqdn_recipient,
                reject_unknown_sender_domain,
                reject_unknown_recipient_domain,
                reject_unauth_destination,
                reject_rbl_client sbl.spamhaus.org,
                reject_rbl_client sbl-xbl.spamhaus.org,
                reject_rbl_client bl.spamcop.net,
                reject_rbl_client zen.spamhaus.org,
                reject_rbl_client pbl.spamhaus.org,
                reject_rbl_client cbl.abuseat.org,
                check_relay_domains,
                permit


Se alguém tiver mais dicas são bem vindas para ajudar a melhorar.

abraços


Read More

terça-feira, 18 de fevereiro de 2014

Criando uma "rule" regra no form_validation no codeigniter - Codeigniter parte 4?

Buenas,

Se falando de CodeiGniter ele já tem uma base e tanto de regras de validação, mas muitas vezes precisamos imcorporar alguma validação a mais no mesmo, porém não existe, e você deseja seguir a mesma lógica, então lá vamos nos...

no arquivo
system/librarires/form_validadion.php


Lá pelas ultimas linhas adicione as suas regras, no meu caso criei uma regra para impedir o uso de espaço apenas texto e numero.

    // --------------------------------------------------------------------

    /**
     * Não permite digiar espaços
     *
     * @access public
     * @param string
     * @return string
     */
    public function no_space($str) {
        return (!preg_match("/^[A-Za-z0-9]+$/", $str)) ? FALSE : TRUE;
    }


Até ali tudo beleza, porém ao aplicar no form, o erro dela vai estar como desconhecido, pois não existe uma tradução do erro para a regra no_space. Para isso...


application/languages/pt-BR/form_validation_lang.php

Adicione a tradução do erro.

$lang['no_space'] = 'O campo %s não pode ter espaços.';


Para utilizar a regra use da maneira normal em que é chamado as demais...

        $this->form_validation->set_rules('campo_name', 'Descricao do Input', 'required|no_space');


Forte Abraço
Marcos Carraro

Read More

quarta-feira, 12 de fevereiro de 2014

Shell Script para Calcular Eficiencia do Squid

Buenas,
Script saindo do forno para efetuar o calculo altere apenas o local dos logs e ta feito.

É feito apenas um calculo matemático consultando os logs do squid.


#!/bin/bash
TOTAL=`grep TCP /var/log/squid/proxy2_log.log | wc -l`;
HIT_GERAL=`grep HIT /var/log/squid/proxy2_log.log | wc -l`;
HIT_HTTPS=`grep -i https /var/log/squid/proxy2_log.log | grep HIT | wc -l`;

EFICIENCIA_GERAL=`echo " ($HIT_GERAL * 100)/ $TOTAL" | bc`;
EFICIENCIA_HTTPS=`echo " ($HIT_HTTPS * 100)/ $TOTAL" | bc`;

echo "Eficiencia no GERAL: " $EFICIENCIA_GERAL"%"
echo "Eficiencia com HTTPS: " $EFICIENCIA_HTTPS"%"

Abraços
Marcos Carraro

Read More

sexta-feira, 7 de fevereiro de 2014

Integrando CodeiGniter com jDataTables - CodeiGniter parte 3

Buenas Turma...

É muito bom utilizar o datatables em projetos, ainda mais hoje nessa web 6.0 v12 biturbo HAHAH,

Então para inegrar é barabada.

Projeto:
https://github.com/IgnitedDatatables/Ignited-Datatables

Ali tem todas as partes para fazer a integração, lembre-se que após isto você deve ativar a biblioteca no application/config/autoload.php

em librarires, assim não precisa carregar na mão.

Para emitir o json compativel com o datatalbes...

    function getservicosremotos() {
        $this->datatables
        ->select('a.id,a.descricao_sr,
                b.range_ip,b.host,
                b.descricao_ips,
                c.porta,
                c.descricao_porta')
        ->from('tb_servico_remoto a,tb_ips b,tb_portas c')
        ->where('a.host = b.id_ip and a.porta = c.id_porta') ;    
        echo $this->datatables->generate();
    }

Desta maneira ele vai retornar o json correto.

{"sEcho":0,"iTotalRecords":4,"iTotalDisplayRecords":4,"aaData":[["5","Conexao intranet","10.0.0.1","fw","Firewall principal","80","HTTP"],["6","TESTE","10.0.0.1","fw","Firewall principal","80","HTTP"],["7","ASD 2","172.16.1.1","TS","TS w2k8 SERVER2","8080","HTTP-ALTERNATIVE"],["8","teste dns google","8.8.8.8","google-dns","google-dns","53","DNS-TCP"]],"sColumns":"a.id,a.descricao_sr,b.range_ip,b.host,b.descricao_ips,c.porta,c.descricao_porta"}

// OBS:
wiki https://github.com/IgnitedDatatables/Ignited-Datatables/wiki

para adicionar uma coluna no json com algum link, alguma imagem, alguma informação html, utilize esta m

    function getservicosremotos() {
        $this->datatables
                ->select('
                b.descricao_ips,
                b.range_ip,
                c.descricao_porta,
                c.porta,
                a.descricao_sr,
                ')
                ->add_edit('a.id', '<a href="url/opcao/editar/$1">Editar</a>', 'a.id')
                ->from('tb_servico_remoto a,tb_ips b,tb_portas c')
                ->where('a.host = b.id_ip and a.porta = c.id_porta');
        echo $this->datatables->generate();
    }

->add_edit('COLUNA_ORIGINAL', '<a href="url/opcao/editar/$1">Editar</a>', 'COLUNA_ORIGINAL')

Então, vai ser alterada a coluna_original para o seguinte conteudo <a href="url/opcao/editar/$1">Editar</a> onde $1 é o valor original da mesma.

Abraços

Read More

quinta-feira, 30 de janeiro de 2014

TCPDUMP - Modo Hard

Buena Dica da HORA!

// Capturar senhas em modo texto..
# tcpdump port http or port ftp or port smtp or port imap or port pop3 -l -A | egrep -i 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user ' --color=auto --line-buffered -B20


Read More

domingo, 26 de janeiro de 2014

Compactando Saida HTML CodeiGniter - Parte 2

Dica rápida mas boa.

O que vai acontecer é que a saida do codigo HTML gerado pelas views do CodeiGniter vão ser mais compactas, removendo espaços desnecessários, com isso vai se ganhar mais performance, e também dá uma dificultada na visualização do código html.



application/config/config.php

$config['enable_hooks'] = TRUE;

Cole o seguinte conteudo no arquivo
application/config/hooks.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Hooks
| -------------------------------------------------------------------------
| This file lets you define "hooks" to extend CI without hacking the core
| files.  Please see the user guide for info:
|
| http://codeigniter.com/user_guide/general/hooks.html
|
*/
$hook['display_override'][] = array(
'class' => '',
'function' => 'compress',
'filename' => 'compress.php',
'filepath' => 'hooks'
);


/* End of file hooks.php */
/* Location: ./application/config/hooks.php */

Então agora crie o arquivo compress em 
application/hooks/compress.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
function compress()
{
$CI =& get_instance();
$buffer = $CI->output->get_output();
 
$search = array(
'/\n/', // replace end of line by a space
'/\>[^\S ]+/s', // strip whitespaces after tags, except space
'/[^\S ]+\</s', // strip whitespaces before tags, except space
'/(\s)+/s' // shorten multiple whitespace sequences
 );
 
$replace = array(
' ',
'>',
'<',
'\\1'
 );
 
$buffer = preg_replace($search, $replace, $buffer);
 
$CI->output->set_output($buffer);
$CI->output->_display();
}
 
/* End of file compress.php */
/* Location: ./system/application/hools/compress.php */
Read More

sexta-feira, 24 de janeiro de 2014

Começando com Framework CodeiGniter - Parte 1

// Configurando CodeiGniter.
- Remover Index.php
application/config/config.php
Deixe em branco a variavel $config['index_page'] = '';
Fonte: http://websitetutorials.grafix.gr/php/the-codeigniter-framework/initial-configuration/

- Configurando Modulos HMVC
//Baixar a extensão
https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/overview
//Coloque a subpasta “MX” (dentro de “third_part”) no diretório “application/third_party”
//Coloque os arquivos da pasta “core” (não a própria pasta!) dentro de “application/core”
//Crie a pasta “modules” dentro da pasta “application”

//para utilizar os módulos vai ficar assim a estrutura.
application/modules/livros/
application/modules/livros/controllers/
application/modules/livros/models/
application/modules/livros/views/

Fonte: http://codeigniterbrasil.com/tutoriais/hmvc-no-codeigniter-com-modular-extensions/

- Configurando Modulo Padrão
// Vai chamar a pagina/modulo padrão
application/config/router.php
$route['default_controller'] = "login";

- Habilitando Helpers no AutoLoad
application/config/autoload.php
$autoload['helper'] = array('html','text','url','form');

Fonte: http://websitetutorials.grafix.gr/php/the-codeigniter-framework/codeigniter-helpers/

- Habilitando Bibliotecas no AutoLoad
application/config/autoload.php
$autoload['libraries'] = array('database', 'session','email','form_validation');

Obs:. Se habilitar database, devesse automaticamente configurar o Banco, pois vai apresentar erro ao abrir a aplicação.
application/config/database.php

Obs2:. Se habilitar session devesse rapidamente criar uma chave criptografada
application/config/config.php
$config['encryption_key'] = 'oHnhkSq5zZRhozKoNzKMG6e64dnHv6Rt';
Para usar uma chave aleatória pode utilizar este link: http://jeffreybarke.net/tools/codeigniter-encryption-key-generator/


Read More

Posts que a turma mais esta lendo...

Posts que a turma mais esta lendo...

Marcos Carraro