Pesquisar neste blog

sexta-feira, 19 de dezembro de 2008

Código de exemplo de funções em C

#include stdio.h
#include conio.h
#include math.h



float area_raio (int r)
{
return((float)3.14 * r*r);
};

float eq_seg_grau(int a, int b, int c)
{
float x1,x2,D;
D=pow(b,2)-4*(a*c);
printf("\n\n VALOR DE DELTA EH: .0f \n", D);
if(D<0){
printf("Nao existem raizes reais!");
printf("\n\n");
system("pause");
}
else { x1=((-b)+pow(D,0.5))/2*a; x2=((-b)-pow(D, 0.5))/2*a;
printf("x1: .0f\n",x1);
printf("x2: .0f\n",x2);
printf("\n\n");
system("pause");
}
};

float distancia_dois_pontos(int x1, int x2, int y1, int y2)
{
float D;
D = sqrt(pow(x2-x1,2) + pow(y2-y1,2));
return D;
}



main () {

int a,b,c,opcao,r,result_area,rs_pontos,x1,x2,y1,y2;
// FAZER UM PROGRAMA QUE CRIE UM MENU COM AS SEGUINTES OPÇÕES
// [1] - CALCULA DA EQUACAO DO SEGUNDO GRAU
// [2] - CALCULO DA DISTANCIA ENTRE DOIS PONTOS
// [3] - CALCULO DA AREA DO CIRCULO
// [4] - SAIR

//A > 0 2 raizes reais
//A = 0 2 raizes reais e iguais
//A < 0 Raizes imaginarias


//distancia entre dois pontos
// P1 (x1,y1)
// P2 (x2, y2);
// D = sqrt(pow(x2-x1) + pow(y2-y1))




int menu () {
int x;
printf("\n [1] - CALCULA DA EQUACAO DO SEGUNDO GRAU");
printf("\n [2] - CALCULO DA DISTANCIA ENTRE DOIS PONTOS");
printf("\n [3] - CALCULO DA AREA DO CIRCULO");
printf("\n [4] - SAIR");
printf("\n\n DIGITE A OPCAO DESEJADA:");
scanf("%d",&opcao);
return x;
};




int i;
do{
system("cls");
i=menu();

switch (opcao) { //inicio bloco switch

case 1: {
printf("\n\nDIGITE A,B e C RESPECTIVAMENTE:\n");
scanf("%d %d %d",&a,&b,&c);
eq_seg_grau(a, b, c);
break;
}


case 2: {
printf("\nDigite as coordenadas do ponto A(x1,x2): ");
scanf("%d %d",&x1,&x2);
printf("\nDigite as coordenadas do ponto B(y1,y2): ");
scanf("%d %d",&y1, &y2);
rs_pontos = distancia_dois_pontos(x1,x2,y1,y2);
printf("\n A DISTANCIA ENTRE DOIS PONTOS EH: %d",rs_pontos);
printf("\n\n");
system("Pause");
break;
}

case 3: {
printf("\n\n DIGITE O VALOR DO RAIO: ");
scanf("%d",&r);
result_area = area_raio(r);
printf("\n AREA DO RAIO EH: %d",result_area);
printf("\n\n");
system("Pause");
break;
}


case 4: {
system("exit");
break;
}

}
}while (opcao!= 4);

}

quarta-feira, 17 de dezembro de 2008

Exemplo de código em C que imprime a tabela ASCII

#include iostream
int main(){
int i,j=0;

for(i=0;i<255;i++)
{
printf("%d = %c ",i,i);
j++;
if (j == 8) {
printf("\n");
}
}
printf("\n \n \n \n \n %c",181);
system("PAUSE");
}

Código de exemplo usando Herança - C++

// Herança
#include

using namespace std;

enum type {carro, van, wagon};

// Definicao da classe generica veiculo
class veiculo {
int passageiros;
int rodas;

public:
void set_rodas(int num) { rodas = num; } ;
int get_rodas() { return rodas; };
void set_pass(int num) { passageiros = num; } ;
int get_pass() { return passageiros; };

};

// Definicao da classe caminhao
class caminhao : public veiculo {
int carga;
public:
void set_carga(int num) { carga = num; };
int get_carga() { return carga; };
void show();
};


// Definicao da classe automovel
class automovel : public veiculo {
enum type tipo_auto;
public:
void set_type(enum type t) {tipo_auto = t; };
enum type get_type() { return tipo_auto; };
void show();
};


// Descrição das Funções
void caminhao::show()
{
cout << "\nInformacao do Caminhao\n";
cout << "Quantidade de rodas: " << get_rodas() << endl;
cout << "Quantidade maxima de passageiros: " << get_pass() << endl;
cout << "Capacidade maxima para transporte (carga): " << get_carga() << endl;

}

void automovel::show()
{
cout << "\nInformacao do Automovel\n";
cout << "Quantidade de rodas: " << get_rodas() << endl;
cout << "Quantidade maxima de passageiros: " << get_pass() << endl;
cout << "Tipo de automovel: ";

switch(get_type()) {
case van: cout << " Van\n";
break;
case carro: cout << " Carro\n";
break;
case wagon: cout << " Wagon\n";
break;
}
}

int main()
{
caminhao t1, t2;
automovel c;

t1.set_rodas(18);
t1.set_pass(2);
t1.set_carga(3200);

t2.set_rodas(6);
t2.set_pass(3);
t2.set_carga(1200);

t1.show();
t2.show();

c.set_rodas(4);
c.set_pass(10);
c.set_type(van);
c.show();

system("pause");
return 0;
}

Exercício C++ usando herança

Exemplo de exercício em C++ usando herança

#include
#include

using namespace std;


class pessoa {
string nome;
char sexo;
int idade;

public:
pessoa(){};
~pessoa(){};
void set_nome(string nome) { this->nome = nome; };
string get_nome() { return this->nome; };
void set_sexo(char sexo) { this->sexo = sexo; };
char get_sexo(){ return this->sexo; };
void set_idade(int idade) { this->idade = idade; };
int get_idade() { return this->idade; };
};

class aluno: public pessoa {
string disciplinas[10];
int matricula, apt;

public:
aluno() { apt=0; };
~aluno() { };
void set_matricula(int mat){ matricula = mat; };
int get_matricula(){ return matricula; };

void set_disciplinas(string disc)
{
disciplinas[apt] = disc;
apt++;
}
void show_disciplinas()
{
for (int i=0; i < apt; i++)
{
cout <<"Disciplinas:"<< disciplinas[i] << endl;
}
}
};

class professor: public pessoa {
string aulas[10];
int carga_h, apt;
double valor_ch;

public: professor(){ apt = 0;};
~professor(){ };
void set_aulas(string aula) {

aulas[apt] = aula; apt++;
}

void show_aulas() {
for (int i=0; i < apt; i++) {
cout <<"Aulas: "<< aulas[i] << endl;
}
}

void set_ch (int ch) {
carga_h = ch;
};

void set_vh (double vh) {
valor_ch = vh;
};

int get_ch () {
return carga_h;
};

double get_vh () {
return valor_ch;
};
};

void menu() {
cout << " ---- Menu ---- " << endl;
cout << " 1) Cadastrar Professor " << endl;
cout << " 2) Cadastrar Aluno " << endl;
cout << " 3) Listar Professores " << endl;
cout << " 4) Listar alunos " << endl;
cout << " 5) Sair " << endl;
cout << " --------------- " << endl;
cout << endl; }

int main (){

string nome, aulas, disciplinas;
int idade_, cargah, matricula;
char sexo;
double vcargah;
bool exec = true;
char op;
int apt=0;
professor profs[3];
aluno alunos[5];

do {

menu();
cout << "Opcao: " ; cin >> op;

switch(op)
{
case '1':
for (int i=0; i <3>> nome;
profs[i].set_nome(nome);
cout <<"Entre com a idade do prof.:" ; cin >> idade_;
profs[i].set_idade(idade_);
cout <<"Entre com o sexo do prof.:" ; cin >> sexo;
profs[i].set_sexo(sexo);

for (int j=0; j<3;>> aulas;
profs[i].set_aulas(aulas);
}
cout <<"Entre com a carga horaria prof.:" ; cin >> cargah;
profs[i].set_ch(cargah);
cout <<"Entre com o valor carga horaria prof.:" ; cin >> vcargah;
profs[i].set_vh(vcargah);
cout <<"\n----------------" << i="0;">> nome;
alunos[i].set_nome(nome);
cout <<"Entre com a idade:" ; cin >> idade_;
alunos[i].set_idade(idade_);
cout <<"Entre com o sexo:" ; cin >> sexo;
alunos[i].set_sexo(sexo);

for (int j=0; j<3;>> disciplinas;
alunos[i].set_disciplinas(disciplinas);
}

cout <<"Entre com a matricula:" ; cin >> matricula;
alunos[i].set_matricula(matricula);
cout <<"\n----------------" << endl;
}

break;
case '3':
system("cls");
for (int i=0; i <3 ; i++)
{

cout <<"Nome do prof:"<<>
cout <<"Idade do prof.:"<<>
cout <<"Sexo do prof.:"<<>

for (int j=0; j<3; j++){
cout <<"Aula prof.:" <<>
}

cout <<"Carga horaria prof.:"<<>
cout <<"Valor carga horaria prof.:" <<>
cout <<"\n----------------" << endl;
}

break;
case '4':

system("cls");
for (int i=0; i <3 ; i++)
{

cout <<"Nome do aluno:"<<>
cout <<"Idade do aluno.:"<<>
cout <<"Sexo do aluno.:"<<>
cout <<"\n----------------" << endl;
}

break;
case '5':
exec = false;
break;
default:
{
cout << "Opcao Invalida! " << endl;
}
break;
}
} while(exec);


system("pause");
return 0;

}


Herança - Virtual - C++

#include
using namespace std;

class Base {
public:
virtual void show () = 0;
};

class D_Class: public Base {
public:
virtual void show () { cout << " D_Class \n"; }
};


class D_Class2: public Base {
public:
virtual void show () { cout << " D_class2 \n"; }
};


int main()
{

D_Class b;
D_Class2 c;

b.show();
c.show();


cin.get();
return 0;
}

Herança C++

Segue abaixo um exemplo de herança em C++.


#include
using namespace std;

class X{
protected: int x;

public:
void set_x(int _x) { x = _x; }
int get_x(){ return x; }
};


class Y : protected X {

protected: int y;
public:
void set_y(int _y) { y = _y; }
int get_y(){ return y; }
};


class Z: public Y
{
public:
void show()
{
cout << " X * Y " << x * y << endl;
}
};



int main()
{

Z val;
//val.set_x(20);
val.set_y(5);
val.show();
cin.get();
return 0;
}


Classes e Objetos

Seguem abaixo um exemplo de código de como inicializar e destruir um objeto.


#include
using namespace std;
class Base {
protected: int b;
public:
Base(int _b) { b = _b ; cout << " Objeto do tipo classe Base inicializado !! \n"; }
~Base() { cout << " Objeto do tipo classe Base destruido !! \n"; }
};

class D_Class: public Base {
int d;
public:
D_Class(int _b, int _d) : Base(_b)
{ d = _d; cout << " Objeto do tipo classe D_Class inicializado !! \n"; }
~D_Class() { cout << " Objeto do tipo classe D_Class destruido !! \n"; }
void show() { cout << " B " << b << " D " << d << endl;}
};


int main()
{
D_Class var(2,3);
var.show();
cin.get();
return 0;
}

quinta-feira, 11 de dezembro de 2008

Instalando o OC4J - (Oracle Containers for J2EE)

Vou fazer demonstrar abaixo como efetuar a instalação do oc4j no sistema operacional CentOS 5.2, tendo em vista que você já tenha o java JDK 1.5 ou 1.6 instalado em seu ambiente.

Primeiramente vamos fazer o Download OC4J 10g ou diretamente clicando no link abaixo:
Oracle Containers for J2EE 10g (OC4J) .

O arquivo que será baixado está no formato .zip, então vamos descompactá-lo:

[root@centos ]# unzip oc4j_extended_101340.zip

Agora vamos mover o diretório criado para um local adequado.

[root@centos ]# mv oc4j /usr/local

Agora, antes de inicializamos o serviço, vamos setar a seguinte variável de ambiente informando o local onde está a instalação do oc4j:

Edite o arquivo /etc/profice com o seguinte conteúdo:

[root@centos ]# vim /etc/profile

export ORACLE_HOME=/usr/local/oc4j

Salve e saia.
Execute o comando abaixo para que os parâmetros sejam executados.
[root@centos ]# source /etc/profile

Pronto, agora vamos executar o servidor.

Quando o oc4j é executado pela primeira vez, o mesmo solicita que criemos uma senha para acesso a sua console de administração:

[root@centos ]# /usr/local/oc4j/bin/oc4j start

08/12/08 14:21:28 Set OC4J administrator's password (password text will not be displayed as it is entered)
Enter password: xxxxxx

Confirm password: xxxxxx
The password for OC4J administrator "oc4jadmin" has been set.
08/12/08 14:21:53 The OC4J administrator "oc4jadmin" account is activated.

Agora o serviço já está rodando e sua porta de escuta é a 8888.

Agora vamos acessar a sua console pelo seguinte endereço:

http://endereco-do-servidor-oc4j:8888/em

Coloque os dados da conta de oc4admin.


Tela da console depois de logada:






Alterando parametros do Oracle

Para quem precisar alterar certos parâmetros do oracle, como formato da data, charset ou linguagem segue a dica abaixo.

Visualizando parâmetros padrões do Oracle

Tendo em vista que você já esteja conectado ao Oracle usando o SQL Developer ou semelhante digite a seguinte linha de comando para listar os parâmetros:

SELECT * FROM v$nls_parameters;

Alterando parâmetros da base

Agora vamos dar um exemplo de como alterar o parâmetro do formato da data executando o comando abaixo:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/RRRR'


Segue imagem abaixo demonstrando os procedimentos acima:

quinta-feira, 27 de novembro de 2008

Fazendo um Cluster de alta-disponibilidade com LVS no CentOS

Primeiro vou explicar o que é um cluster de alta-disponibilidade (HA), no caso estes modelos de clusters são construídos para prover uma disponibilidade de serviços e recursos de forma ininterruptas através do uso da redundância implícitas ao sistema. A idéia geral é que se um nó do cluster vier a falhar (failover), aplicações ou serviços possam estar disponíveis em outro nó.

Estes tipos de cluster são utilizados para base de dados de missões críticas, correio, servidores de arquivos, aplicações web, e uma série de outros serviços.

Resumo

Para quem tem uma grande quantidade de acessos e roda aplicações que são essências, que não podem ter a produção afetada por uma queda, mesmo que temporariamente, bom, ai vai um exemplo de como montar um cluster de servidores web usando o recurso do LVS (Linux Virtual Server).

Topologia

Teremos a seguinte topologia em nosso exemplo, na qual iremos nos basear para efetuarmos a configuração logo abaixo.
Iremos usar o modo DR do LVS (Direct Routing)

Servidor real (Servidor onde está instalado o software de gerenciamento das conexões)

Nosso servidor real, ou seja, nosso front-end terá dois ips:
IP REAL (eth0) = 10.0.20.10/24
IP VIRTUAL (eth0:1)= 10.0.20.20/32

Os servidores que fazem parte do cluster, irão possuir o mesmo endereço ip, que no caso nós chamamos de IP VIRTUAL.

Servidor web 01
IP REAL (eth0) = 10.0.20.11/24
IP VIRTUAL (l0:1) = 10.0.20.20/32

Servidor web 02
IP REAL (eth0) = 10.0.20.12/24
IP VIRTUAL (l0:1) = 10.0.20.20/32

Servidor web 03
IP REAL (eth0) = 10.0.20.13/24
IP VIRTUAL (l0:1) = 10.0.20.20/32

Pré-requisitos

Distribuição: CentOS 4.x ou CentOS 5.x
Pacotes: ipvsadm, piranha

O pacote ipvsadm é responsável pela administração da distribuição das conexões aos servidores.

O pacote piranha é apenas a interface (GUI) de administração, é nela que iremos configurar os servidores que fazem parte do cluster, qual tipo, e outras mais...

Instalação

[root@centos ]# yum install ipvsadm piranha

Após instalados os pacotes acima, vamos definir uma senha de acesso a interface de administração do piranha usando o comando abaixo:

[root@centos ]# piranha-passwd

Após termos definidos uma senha para o usuário piranha, vamos iniciar o serviço usando o seguinte comando:

[root@centos ]# service piranha-gui start
[root@centos ]# chkconfig piranha on

Depois de termos inicializado o serviço vamos abrir a interface de administração:

http://meuservidor.com.br:3636




Após efetuarmos o login, será mostrado a tela de controle e monitoramento (CONTROL/MONITORING)

Agora vamos clicar no link Global Settings para iniciarmos as configurações:

Primary server public IP: 10.0.20.10 (IP REAL)
Primary Server private IP: deixe em branco
Use network type: direct



Na aba REDUNDANCY só é necessária quando utilizamos um servidor secundário para alta disponibilidade, não sendo necessário neste caso.

Vamos então a aba VIRTUAL SERVERS


Nesta aba criaremos o host virtual, responsável pelo encaminhamento das solicitações. Para criarmos um servidor virtual, clique em ADD, depois selecione o novo servidor e clique em EDIT. Será exibida a tela abaixo onde em VIRTUAL SERVER devemos entrar com as seguintes informações:

Name: Nome do servidor virtual
Application port: Endereço do serviço onde está rodando sua aplicação
Virtual Network Mask: Máscara de rede da rede virtual, que no caso é de 32bits (255.255.255.255).
Firewall Mark: Não aplicável.
Device: O nome do dispositivo que será criado na interface virtual.
Re-entry Timeout: Intervalo de verificações, no caso de uso do HEARTHBEAT, não aplicável no nosso caso.
Service Timeout: Define o intervalo de tempo em que o servidor será considerado como DEAD, retirando o mesmo do Cluster.
Quiesce Server: Habilita a limpeza automática das das tabelas de roteamento caso um host anteriormente considerado como DEAD retorna ao status de ativo.
Load monitoring tool: Usado para monitorar os status dos hosts em caso de uso com o HEARTHBEAT. Não aplicável.
Scheduling: É o algoritmo que será utilizado para decidir como será efetuado o balanceamento das conexões entre os REAL SERVERS. Neste caso utilizamos o tipo Weighted least-connections, ele irá enviar as conexões para os serviços que possuírem o menor numero de conexões ATIVAS.

Na aba REAL SERVER exibe o status dos servidores reais que fazem parte do grupo de um servidor virtual, exibe se o host está UP, nome dado a máquina virtual e o endereço IP.

Adicionando ou editando um REAL SERVER
Name: nome do servidor REAL
Address: IP do servidor REAL
Weight: Prioridade usada pelo algoritmo de balanceamento.


Na aba MONITORING SCRIPTS, são mostrado os scripts utilizados para verificar se um host está UP ou DOWN.


Após realizar toda configuração indicada acima, vamos iniciar o serviço pulse, responsável pelo gerenciamento do cluster.

[root@centos ]# service pulse start
[root@centos ]# chkconfig pulse on

Criando autenticação no Postfix com ldap no CentOS

Existem vários métodos de autenticação, o exemplo abaixo mostra como autenticar utilizando o sasl com ldap como base consulta de senhas.

1) Instalando o método de autenticação

[root@centos ]# yum install cyrus-sasl*

Bom, depois de instalado vamos as configurações.
Para termos certeza que o mecanismo de autenticação usado pelo sasl está disponível, usamos o seguinte comando abaixo:

[root@centos ]# saslauthd -v
saslauthd 2.1.19
authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap

Bom, vemos acima na lista que o mecanismo que iramos usar está instalado, então blz.

Vamos definir o tipo de autenticação usado pelo sasl no arquivo /etc/sysconfig/saslauthd:

[root@centos ]# vim /etc/sysconfig/saslauthd

MECH=ldap

salve e feche o arquivo.

Vamos editar o arquivo de configuração chamado smtpd.conf localizado na pasta /usr/lib/sasl2 para definir o servidor de diretório de pesquisa do ldap.

[root@centos ]# vim /usr/lib/sasl2/smtpd.conf

Edite-o deixando exatamente como abaixo:

pwdcheck_method: saslauthd
mech_list: plain login

ldap_servers: ldap://meuservidorldap.com.br
ldap_bind_dn: senha_do_servidor_ldap
ldap_search_base: ou=usuarios,dc=meuservidorldap,dc=com,dc=br

Salve o arquivo e feche.

Agora vamos inicializar o serviço do sasl
[root@centos ]# service saslauthd start

Vamos efetuar um teste para nos certificarmos que o sasl está autenticando nosso usuário na base ldap usando o exemplo do comando abaixo:

[root@centos ]# testsaslauthd -u usuario -p senha
0: OK "Success."

Se aparecer a mensagem acima então sua autenticação ldap está funcionando.

Agora vamos configurar o postfix para que use esse mecanismo de autenticação para seus usuários localizados na base ldap:

[root@centos ]# vim /etc/postfix/main.cf

ao lado do parâmetro smtpd_recipient_restrictions depois do sinal de igual adicione a condição permit_sasl_authenticated ficando conforme abaixo:

smtpd_recipient_restrictions = permit_sasl_authenticated

# Habilita a autehticação no servidor
smtpd_sasl_auth_enable = yes
# desabilitando acesso anonimo
smtpd_sasl_security_options = noanonymous
# Configura o domínio de autenticação SASL
smtpd_sasl_local_domain = $myhostname
# Habilita suporte a clientes de email antigos
broken_sasl_auth_clients = yes

Salve o arquivo e feche.

Reinicializando o serviço do postfix
[root@centos ]# service postfix restart

Testando

[root@centos]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mailserver.meuservidor.com.br ESMTP Postfix (2.2.10 RHEL)
ehlo localhost
250-mailserver.meuservidor.com.br
250-PIPELINING
250-SIZE 15000000
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME

Instalando o Squid3 no CentOS 5.x

Olá pessoal,
vou mostrar-lhes abaixo os procedimentos de como baixar e instalar o Squid3 no CentOS 5,x.

1 - Instalação do Squid 3

O centOS 5 vem por padrão com o Squid 2.6, mas nós queremos o squid 3, então nós precisaremos fazer o download do rpm source do Squid 3 e compilá-lo em nosso sistema.

1.1) Instalando Pré-requisitos

Vamos executar os comandos abaixo para instalar nossos softwares, compiladores, etc... como pré-requisitos.

[root@centos ]# yum -y groupinstall "Development Tools"
[root@centos ]# yum -y install rpm-build openjade linuxdoc-tools openldap-devel pam-devel openssl-devel httpd rpm-devel

1.2) Download do RPM Source do Squid 3

[root@centos ]# cd /usr/src
[root@centos ]# wget http://download.fedora.redhat.com/pub/fedora/linux/development/source/SRPMS/squid-3.0.STABLE10-1.fc10.src.rpm
[root@centos ]# rpm -ivh squid-3.0.STABLE10-1.fc10.src.rpm


1.3) Criando o novo pacote para o seu CentOS 5

Usamos o seguinte comando para iniciar a compilação e no final gerar o pacote rpm para instalação.

[root@centos ]# cd /usr/src/redhat/SPECS
[root@centos ]# rpmbuild -bb squid.spec

1.4) Instalando o Squid 3

[root@centos ]# rpm -Uvh /usr/src/redhat/RPMS/i386/squid-3.0.STABLE10-1.i386.rpm

Squid 3 instalado e pronto para ser utilizado.

1.5) Iniciando e configurando para iniciar automaticamente no boot

[root@centos ]# service squid start
[root@centos ]# chkconfig squid on


É claro que você não precisaria fazer todos esses passos, basta simplesmente baixar o pacote do endereço: http://people.redhat.com/mnagy/squid/, mas claro é para o Red Hat Enterprise Linux 5: squid-3.0.STABLE7-1.el5, mas lembre-se, sempre baixe pacotes rpm de sites confiáveis ou faça o procedimento acima que é mais seguro.

Configuração de um servidor SMTP com Postfix no CentOS

Configuração de um servidor SMTP com Postfix no CentOS

Resumo

Este documento tem como objetivo fornecer uma documentação para implementação e administração de um servidor SMTP utilizando o Postfix.

Introdução

O Postfix utiliza dois arquivos de configuração principais que ficam no diretório /etc/postfix, o main.cf e master.cf. Além disso, o postfix possui outro diretório chamado /var/spool/postfix/ onde encontram-se as filas de emails.

Configuração Básica

A configuração básica é bem simples de se fazer, e deixa o servidor apto a entregar emails diretamente aos destinatários, para fazer a configuração basta modificar os seguintes parâmetros do arquivo /etc/postfix/mainf.cf :

myhostname = smtp.minhaempresa.com.br
mydomain = minhaempresa.com.br
mydestination = $mydomain, $myhostname, localhost.domain
relay_domains = dominioamigo.com.br

O domínio utilizado deve ter seu nome resolvido !!
Apague a linha abaixo no main.cf:

inet_interfaces = localhost

Feita esta configuração basta iniciar o serviço para testar, verifique o log para confirmar que ocorreu tudo bem.

[root@centos ]# service postfix start
[root@centos ]# tail -f /var/log/maillog

Teste a conexão com telnet, envie o email como na figura abaixo.

[root@centos ]# telnet smtp.minhaempresa.com.br 25

Você acabou de enviar um email para o fulano, vamos confirmar:

[root@centos ]#
postqueue -p

Poderia ser utilizado ‘’mailq’‘ ou ainda as opções ‘’-f’‘ do postqueue para forçar a entrega dos emails. No nosso exemplo o email não foi entregue por que a resolução de nomes para dominioamigo.com.br não foi possível. Vamos excluir estes emails da fila.

[root@centos ]# postsuper -d 7A4DB834D

No exemplo acima ‘’7A4DB834D’‘ é o identificador do email. Substitua este valor para um da sua fila. Para verificar quais parâmetros estão ativos no Postfix faça:

[root@centos ]# postconf -n

Mapas

O Postfix utiliza na sua configuração arquivos textos formatados em duas colunas, são os mapas. Os mapas são utilizados para adicionar funcionalidades a configuração, tais como controlar relay, autenticação, acesso a servidor LDAP, aliases de email, etc...

No arquivo de configuração (main.cf) os mapas são especificados no formato ‘’tipo:nome’‘.

transport_maps = hash:/etc/postfix/transport
header_checks = regexp:/etc/postfix/header_checks

Para descobrir, os tipos de mapas faça:

[root@centos ]# postconf -m

Mapa de "aliases"

Aliases são apelidos de contas de email utilizados para redirecionar mensagens de uma conta para outra. O arquivo onde são definidos os aliases é o /etc/postfix/aliases. Vamos adicionar um alias para a conta webmaster@minhaempresa.com.br. Para isso, edite o arquivo de aliases e adicone a seguinte linha:

webmaster: eva@empresa.com.br

É possível também utilizar o alias para fazer uma pequena lista, por exemplo:

diretoria: fulano@minhaempresa.com.br, deltrano123@gmail.com, joao

Atualize a base de dados de alias executando o comando abaixo:

[root@centos ]# postalias /etc/postfix/aliases

Feita a configuração não é necessário reiniciar o Postfix. Faça testes enviando emails para os aliases.

Tabelas simples (DB, hash)

Vamos agora gerar mapas do tipo DB, criaremos um mapa que contém uma lista de endereços IP e uma ação a ser tomada. Edite um arquivo texto com o conteúdo abaixo e salve-o como /etc/postfix/client_access

10.0.2.5 REJECT
uol.com.br REJECT
spammer.net REJECT
intranet.com.br OK

Para que o Postfix possa utilizar este mapa, temos que converte-los para um mapa DB executando o comando abaixo.

[root@centos ]#
postmap /etc/postfix/client_access

Para consultar o mapa e testar, faça:

[root@centos ]# postmap -q 10.0.2.5 hash:/etc/postfix/client_access

Expressões Regulares

Tabela com expressões regulares (ER) tem na primeira coluna uma expressão regular, e na segunda coluna a substituição que deve ser feita. Se a ER ‘’casar’‘ com a chave de procura, o valor retornado será o da segunda coluna.
Vejam alguns exemplos feitos no arquivo /etc/postfix/sender_access.regexp:

Convertendo fulano@intranet.dominio.com.br para fulano@dominio.com.br
/(.*)@intranet\..*/ $1@dominio.com.br

Rejeita email do tipo qualquercoisa@naoresponda.com.br
/.*@naoresponda\.com\.br/ REJECT

Colocando o .br opcional
/.*@naoresponda\.com(\.br)?/ REJECT

Esse tipo de mapa não precisa ser convertido para DB. Vamos fazer testes com o postmap.

[root@centos ]# postmap -q ola@naoresponda.com regexp:/etc/postfix/sender_access.regexp

Usando Mapas em Restrições

No Postfix existem inúmeras classes de restrições que podem ser usadas para controlar se uma mensagem é aceita ou não. Para realizar esta decisão é possível verificar diversas variáveis:

• Endereço IP de origem da conexão.
• Parâmetro do comando EHLO (ou HELO).
• Remetente (MAIL FROM).
• Destinatário (RCPT TO).
• Conteúdo dos cabeçalhos da mensagem.
• Conteúdo da mensagem.

Estas variáveis são utilizadas nas classes de restrição, no postfix temos as seguintes classes disponíveis.

Table 1: Classes Disponíveis

Classe de restrição onde atua smtpd client restrictions | Estabelecimento de conexão com o servidor:
smtpd_helo
_restrictions Após o comando HELO ou EHLO
smtpd
_sender_restrictions Após o comando MAIL FROM
smtpd
_recipient_restrictions Após o comando RCPT TO
smtpd
_etrn_restrictions Quando do comando ETRN
smtpd
_restriction_classes Classe genéricas definidas pelo usuário

Configuração mínima

Uma configuração mínima para a classe ‘’smtpd_recipient_restrictions’‘ pode ser:
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

Esta configuração deve ser adicionada no arquivo main.cf e o postfix deve ser reiniciado para ativar esta nova configuração.

• permit mynetworks: Casa com o parâmetro mynetworks e indica os clientes que podem conectar no servidor e enviar emails.
• reject_unauth_destination: Rejeita relay não autorizado.

Acrescentando verificação de sintaxe e DNS

Vamos acrescentar mais duas verificações, a reject_non_fqdn_sender para rejeitar MAIL FROM não qualificado e reject_unknown
_sender_domain que rejeita MAIL FROM cujo domínio não resolve para um registro A ou MX.

smtpd_recipient_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit_mynetworks,
reject_unauth_destination,
permit

Tente enviar um email onde o destino seja por exemplo bob@dominio, esta mensagem deve ser rejeitada.

Outras verificações ainda podem ser feitas:
• reject_non_fqdn_recipient: Rejeita mensagens cujo o domínio do destinatário não seja qualificado.
• reject_unknown_recipient_domain: Rejeita mensagens cujo o domínio do destinatário não pode ser resolvido por DNS.

Restrições de acesso

Com as restrições de acesso é possível também restringir um determinado domínio ou endereçoo IP, ou ainda um remetente específico, além de outras.
(Man 5 postconf)
A sintaxe das restrições são utilizadas no formato:

Verificação | O que faz
check_helo_access Verifica parâmetro passado para HELO
check
_client_access Verifica o IP do cliente
check
_sender_access Verifica o endereço do remetente (MAIL FROM)
check
_recipient_access Verifica o endereço do destinatário (RCPT TO)

Com estes parâmetros a configuração deve ficar da seguinte maneira:

smtpd_recipient_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit_mynetworks,
reject_unauth_destination,
check_helo_access hash:/etc/postfix/helo_access,
check_client_access hash:/etc/postfix/client_access,
check_sender_access hash:/etc/postfix/sender_access,
check_sender_access regexp:/etc/postfix/sender_access.regexp,
check_recipient_access hash:/etc/postfix/recipient_access,
permit

Desta maneira, para fazermos com que nosso servidor de email bloqueie mensagens do domínio spammer.net edite o arquivo /etc/postfix/client
_access e coloque o seguinte conteúdo:

spammer.net REJECT

As ações que podem ser tomadas (colocadas nos mapas) são:

Ações | Efeito
OK Endereço/Email aceito
REJECT[texto] Endereço/Email rejetado
45[NN] texto Rejeita especificando qual o código e texto
DUNNO Age como se a chave não tivesse sido encontrada
HOLD [texto] Coloca a mensagem na fila de espera
DISCARD [texto] Faz de conta que aceita a mensagem, mas na verdade é descartada

Edite o arquivo client_access e configure para rejeitar o endereço de um cliente. Crie o mapa novamente e tente enviar um email deste cliente.

RBL - Realtime Black Lista

Para tentar vencer a briga contra os spammers as empresas juntaram-se coletando informações sobre as redes e servidores utilizados para enviar spam. Esses dados foram organizados e disponibilizados de maneira pública (ou não) para os administradores, foi criada então as ‘’black lists’‘. Para configuar que uma determinada ‘’black list’‘ seja utilizada para filtras os emails, adicione a seguinte configuração:

smtpd_recipient_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit_mynetworks,
reject_unauth_destination,
check_helo_access hash:/etc/postfix/helo_access,
check_client_access hash:/etc/postfix/client_access,
check_sender_access hash:/etc/postfix/sender_access,
check_sender_access regexp:/etc/postfix/sender_access.regexp,
check_recipient_access hash:/etc/postfix/recipient_access,
reject_rbl_client site.rbl.com,
reject_rbl_client outrosite.rbl.com,
permit

Inspeção de conteúdo

Com o postfix é possível fazer verificações no conteúdo das mensagens (cabeçalho e corpo) em tabelas, os parâmetros mais utilizados são:

Parâmetro | Função
header_checks Verifica cabeçalhos
body_checks Verifica o corpo da mensagem
mime_header checks texto Verifica cabeçalhos MIME somente
body_checks_size_limit Controla quantos bytes do corpo da mensagem são verificados
Esses filtros não são configurados dentro das classes de restrições de acesso, eles podem estar em qualquer local do arquivo de configuração do Postfix.

Exemplos:
/etc/postfix/main.cf
header_checks = regexp:/etc/postfix/header_checks.regexp
body_checks = regexp:/etc/postfix/body_checks.regexp
header checks.regexp
/^Subject: Fique rico/ REJECT
body checks.regexp
/filename=\"?.*\.(doc|tar|zip|exe)\.(pif|bat|com|exe)\"?$/
REJECT Possible Virus (double extension)

Autenticação

Até agora configuramos um servidor SMTP funcional que realiza alguns filtros que podem ser bem ‘’refinados’‘. Agora vamos fazer para que nosso servidor exija autenticação para os usuários que desejarem utilizá-lo. No Postfix é necessário utilizar a biblioteca SASL (Simple Authentication and Security Layer ) que oferece diversos métodos de autenticação, cada uma com suas características.

Autenticação é útil em:

• Controle (log) de usuários
• Permitir relay de usuários autenticados
• Servidor de email que envia mensagens para internet através de outro servidor de email.
Vamos configurar a autenticação utilizando do tipo plain text que utiliza o shadow do sistema, para isso edite o arquivo /usr/lib/sasl/smtpd.conf como abaixo:

pwcheck_method = saslauthd

Para configurar o daemon saslauthd que será responsável por ‘’pegar’‘ a senha e enviar para um dos diversos tipos de autenticação, devemos configurá-lo no arquivo /etc/sysconfig/saslauthd como abaixo:

MECH="shadow"

Você pode também rodar o comando "saslauthd -v" para visualizar uma lista disponível de mecanismos de autenticação.

Agora iniciamos o serviço:

[root@centos ]# service saslauthd start

E por fim, configurar o Postfix com os seguintes parâmetros:

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_helo_access hash:/etc/postfix/helo_access,
check_client_access hash:/etc/postfix/client_access,
check_sender_access hash:/etc/postfix/sender_access,
check_sender_access regexp:/etc/postfix/sender_access.regexp,
check_recipient_access hash:/etc/postfix/recipient_access,
reject_rbl_client site.rbl.com,
reject_rbl_client outrosite.rbl.com,
permit

Reinicie o Postfix e configure um MUA de sua preferência para autenticar-se no seu servidor.

Configuração como ‘’Relay Agent’‘

Um servidor configurado como ‘’Relay Agent’‘ não envia as mensagens diretamente para os MTA dos provedores de destino, ele envia estas mensagens apenas para um servidor específico.
Para fazer esta configuração edite o arquivo main.fc e faça:

relayhost = smtp.meuprovedor.com.br

Desta maneira, o servidor já está atuando como ‘’Relay Agent’‘, mas em muitos casos os servidores exigem autenticação. Então deve-se configurar o Postfix como um cliente de autenticação SASL (diferente do passo anterior que configuramos como servidor de autenticação).

Habilitando a autenticação (cliente) no main.fc

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/saslpass
smtp_sasl_security_options =

Como definimos o arquivo do mapa anteriormente, agora temos que definir os servidores remotos e seus usuários e senhas. Edite o arquivo /etc/postfix/saslpass e faça:

smtp.meuprovedor.com.br bob:passw123

E depois, gere o mapa:

postmap /etc/postfix/saslpass

Domínios Virtuais

Provedores de acesso tem em seus servidores diversos domínios configurados,
para isso é utilizado Domínios Virtuais, vamos fazer uma configuração simples para
um domínio editando o main.fc:

virtual_alias_domains = virtual.com.br
virtual_alias_maps = hash:/etc/postfix/virtual

O arquivo /etc/postfix/virtual

postmaster@virtual.com.br postmaster
info@virtual.com.br fulano
joao@virtual.com.br jsilva
maria@virtual.com.br maria
compras@virtual.com.br gerencia@empresa.com.br
@virtual.com.br @empresa.com.br

Faça os testes enviando emails para estas contas.

E ficamos por ai. Grande Abraço a Todos.

terça-feira, 25 de novembro de 2008

Squid 2.6 com Suporte a ARP ACLs no CentOS 5.2

Segue um passo-a-passo de como habilitar o suporte a arp acls no squid 2.6 do CentOS 5.2

1 - Entrar no site abaixo e baixar o pacote src do squid.
http://centos.oi.com.br/5.2/os/SRPMS/

[root@centos redhat]# wget http://centos.oi.com.br/5.2/os/SRPMS/squid-2.6.STABLE6-5.el5_1.3.src.rpm
--07:23:03-- http://centos.oi.com.br/5.2/os/SRPMS/squid-2.6.STABLE6-5.el5_1.3.src.rpm
Resolving centos.oi.com.br... 200.222.115.42
Connecting to centos.oi.com.br|200.222.115.42|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1474027 (1.4M) [application/x-rpm]
Saving to: `squid-2.6.STABLE6-5.el5_1.3.
src.rpm'

100%[
=============================>] 1,474,027 117K/s in 13s

07:23:16 (112 KB/s) - `squid-2.6.STABLE6-5.el5_1.3.
src.rpm' saved [1474027/1474027]


2 - Instalando o fonte do squid

[root@centos redhat]# rpm -ivh squid-2.6.STABLE6-5.el5_1.3.src.rpm
1:squid ########################################### [100%]

3 - Editando o arquivo .spec

[root@centos redhat]# cd /usr/src/redhat/SPECS/
[root@centos SPECS]# vim squid.spec

Adicione o parâmetro abaixo aproximadamente na linha 85 do arquivo

--enable-arp-acl \


Para quem não tem instalado o rpmbuild execute o comando abaixo:

[root@centos SPECS]# yum install rpm-build

4 - Instalando dependencias do squid

[root@centos SPECS]# yum install linuxdoc-tools openldap-devel pam-devel

Se der problemas de dependência do openldap-devel como ocorreu no meu, faça o procedimento abaixo:

[root@centos SPECS]# wget http://centos.oi.com.br/5.2/os/i386/CentOS/openldap-devel-2.3.27-8.el5_1.3.i386.rpm

[root@centos SPECS]# yum install cyrus-sasl-devel
[root@centos SPECS]# rpm -ivh openldap-devel-2.3.27-8.el5_1.3.i386.rpm --force --nodeps
Preparing... ########################################### [100%]
1:openldap-devel ########################################### [100%]


5 - Criando o pacote com a nova opção

[root@centos SPECS]# rpmbuild -ba squid.spec

Entrar no diretório onde foi gerado o novo pacote rpm:

[root@centos redhat]# cd /usr/src/redhat/RPMS/i386/

Atualizando o pacote existente

[root@centos i386]# rpm -Uvh squid-2.6.STABLE6-5.3.i386.rpm
Preparing... ########################################### [100%]
1:squid ########################################### [100%]


Verificando se a nova opção foi habilitada:

[root@centos i386]# squid -v |grep arp
configure options: '--host=i686-redhat-linux-gnu' '--build=i686-redhat-linux-gnu' '--target=i386-redhat-linux' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--includedir=/usr/include' '--libdir=/usr/lib' '--libexecdir=/usr/libexec' '--sharedstatedir=/usr/com' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--exec_prefix=/usr' '--bindir=/usr/sbin' '--libexecdir=/usr/lib/squid' '--localstatedir=/var' '--datadir=/usr/share' '--sysconfdir=/etc/squid' '--enable-epoll' '--enable-snmp' '--enable-arp-acl' '--enable-removal-policies=heap,lru' '--enable-storeio=aufs,coss,diskd,null,ufs' '--enable-ssl' '--with-openssl=/usr/kerberos' '--enable-delay-pools' '--enable-linux-netfilter' '--with-pthreads' '--enable-ntlm-auth-helpers=SMB,fakeauth' '--enable-external-acl-helpers=ip_user,ldap_group,unix_group,wbinfo_group' '--enable-auth=basic,digest,ntlm' '--enable-digest-auth-helpers=password' '--with-winbind-auth-challenge' '--enable-useragent-log' '--enable-referer-log' '--disable-dependency-tracking' '--enable-cachemgr-hostname=localhost' '--enable-underscores' '--enable-basic-auth-helpers=LDAP,MSNT,NCSA,PAM,SMB,YP,getpwnam,multi-domain-NTLM,SASL' '--enable-cache-digests' '--enable-ident-lookups' '--with-large-files' '--enable-follow-x-forwarded-for' '--enable-wccpv2' '--enable-fd-config' '--with-maxfd=16384' 'CFLAGS=-fPIE -Os -g -pipe -fsigned-char' 'LDFLAGS=-pie' 'build_alias=i686-redhat-linux-gnu' 'host_alias=i686-redhat-linux-gnu' 'target_alias=i386-redhat-linux'


Fazendo uma regra de exemplo editando o arquivo squid.conf:

[root@centos i386]# vim /etc/squid/squid.conf

acl mac arp 00:0C:29:84:32:A9
http_access deny mac

Reinicializando o serviço:

[root@centos i386]# service squid restart

Monitorando os logs:

[root@centos i386]# tail -f /var/log/squid/access.log

1227607222.602 0 intra.w3haus.poa TCP_DENIED/403 1606 GET http://linux.ittoolbox.com/groups/technical-functional/linuxadmin-l - NONE/- text/html




sexta-feira, 21 de novembro de 2008

Criando e colocando um scripts para inicializar automaticamente

Tenho visto que muita gente tem dificuldade na hora de colocar um serviço pra rodar na inicialização do linux, bom vou mostrar abaixo um exemplo bem simples de um script e como adicioná-lo no inicialização automática das distros equivalentes ao redhat.

Abaixo segue o script para inicialização do msn-proxy como exemplo, que foi compilado e instalado na mão, portanto não cria o script de inicialização no init do sistema.

#!/bin/sh

start (){
echo "Iniciando o MSN-Proxy"
/usr/local/bin/msn-proxy -b >> /dev/null
}
stop (){
echo "Finalizando o MSN-Proxy"
pkill -9 msn-proxy >> /dev/null
}

case "$1" in
start) start
;;
stop) stop
;;
*) echo "Uso: msn-proxy (startstop)"
;;
esac


Bom, mostrado o script acima agora vamos colocar ele pra inicializar automático.
Em primeiro lugar, existe uma pasta padrão nas distros derivadas do redhat onde devemos colocar os scripts, chamada init.d

Segue o caminho dela abaixo:
/etc/rc.d/init.d

Vamos copiar o script pra lá então:

[root@centos ~]# cp msn-proxy /etc/rc.d/init.d

Agora que copiamos, vamos adicionar o serviço no sistema com o comando chkconfig usando a seguinte sintaxe abaixo:

[root@centos ~]# chkconfig --add msn-proxy
O Serviço não suporta o chkconfig

Ops, acho que deu problema, porque será que o chkconfig não quer adicionar meu script. Bom, pesquisando na internet descobri que o chkconfig usa duas linhas de comentários para poder ser instalado, informando os runlevels e a descrição do sistema.

Aqui estão as duas linhas que você precisa informar em seu arquivo de inicialização:

# chkconfig: 345 99 10
# description: Msn-proxy

Agora vamos ao script novamente:

#!/bin/sh
# chkconfig: 345 99 10
# description: Msn-proxy


start (){
echo "Iniciando o MSN-Proxy"
/usr/local/bin/msn-proxy -b >> /dev/null
}
stop (){
echo "Finalizando o MSN-Proxy"
pkill -9 msn-proxy >> /dev/null
}

case "$1" in
start) start
;;
stop) stop
;;
*) echo "Uso: msn-proxy (startstop)"
;;
esac



Bom, agora sim vamos ao comando chkconfig

[root@centos ~]# chkconfig --add msn-proxy
Hum, agora sim deu certo, hehehe

Agora depois de adicionado ao sistema, vamos ativá-lo para inicializar, você pode fazer isso usando o comando abaixo:

[root@centos ~]# chkconfig msn-proxy on

ou escolher apenas o runlevel que quizer

[root@centos ~]# chkconfig --level 235 msn-proxy on

Para ter certeza que o serviço está instalado e em qual modo vai inicializar use o comando abaixo:

[root@centos ~]# chkconfig --listgrep msn-proxy


Pronto, agora sabemos como adicionar qualquer script na inicialização de distribuições derivadas do redhat usando o chkconfig.

[update]: 21/11/08- Uma colaboração do nosso colega Yucatan (Kenjiro)

Nem todas as distribuições Linux existentes utilizam o esquema de inicialização derivado do System V UNIX, o Slackware utiliza o conceito do BSD UNIX.

Conhecendo a inicialização do Linux

Grande parte das pessoas não sabem como funciona o sistema de
inicialização do Linux, por isso resolvi descrevê-lo aqui.

O boot do sistema é baseado em fases, cada fase tem uma função
específica, por isso nenhuma fase deve ser repetida e a próxima fase
sempre levará em conta que as tarefas da fase anterior foram
executadas com sucesso.

A primeira fase, depois da escolha do kernel a ser carregado (geralmente via LILO ou GRUB), é a descompressão e carregamento do kernel. O kernel do Linux é comprimido, o que possibilita, entre outras coisas, a ocupação de menos espaço em disco.

Depois da descompressão e carregamento do sistema, começarão a surgir mensagens do kernel, avisando sobre o que está acontecendo, como testes de portas seriais, entre outros. Todas as mensagens do kernel são úteis e devem sempre ser observadas. Caso você precise ver as mensagens do kernel após o boot completo do sistema, não precisa reiniciá-lo, basta digitar dmesg no shell.


Após a inicialização completa do kernel, o sistema passa o controle para alguns scripts, conhecidos como scripts de inicialização ao estilo Sys V. Os scripts podem ser encontrados geralmente no diretório /etc/rc.d, são normalmente três:

rc.sysinit:
Executado apenas uma vez, durante o boot do sistema. Ajusta algumas coisas, como o relógio e data do sistema, entre outras coisas.

rc:
Executado quando o runlevel é alterado. Runlevels serão explicados posteriormente. O rc "mata" os processos do atual runlevel, levando em consideração alguns detalhes que serão descritos posteriormente, e inicia os novos processos, característicos do runlevel atual.

rc.local:
Executado logo após todos os outros scripts de inicialização. É útil para ajustar alguns parâmetros do sistema que devem ser inicializados mas não necessitam da criação de um script completo ao estilo Sys V. Alguns exemplos de programas normalmente incializados nesse script são servidores de fontes "incomuns", restauradores de som, entre outros. Outra função desse script é recriar os arquivos /etc/issue e /etc/issue.net, que são responsáveis
pelas mensagens exibidas enquanto o sistema aguarda o login e senha do usuário (nos sistemas Conectiva é comum a presença da imagem gerada pelo linux_logo, com algumas informações sobre o sistema).

Agora o sistema já está inicializado, então o controle é passado para o gerenciador de login, que ficará aguardando a ação do usuário. Se algum usuário realizar o login no sistema, o controle será passado para o shell padrão do usuário, por exemplo o bash. Outras formas de login são discutidas abaixo, junto com a explicação sobre os runlevels.

Runlevels

Toda a inicialização do sistema é baseada em runlevels, ou seja,
níveis de execução. Os sistemas Linux possuem 6 runlevels:

0 - conhecido como halt, é o runlevel que desliga o sistema;

1 - monousuário, inicilializa o sistema sem opções de segurança, no
modo monousuário sem rede;

2 - multiusuário, inicializa o sistema com todas as opções de
multiusuários e segurança;

3 - multiusuário com rede, o mesmo do runlevel 2, mas com opções de rede ativas, o runlevel mais comum;

4 - não utilizado;

5 - multiusuário em modo gráfico, igual ao runlevel 3, mas inicia o
servidor X automaticamente;

6 - reboot, reinicializa o sistema.


Alguns sistemas podem variar, mas o padrão é esse. A descrição do sistema de runlevels normalmente pode ser encontrada no arquivo /etc/inittab, onde você também poderá alterar runlevel padrão do sistema.

Alguns runlevels que merecem destaque são o 1, 3 e 5. O runlevel 1 nunca deve ser utilizado, a não ser para manutenção do sistema, devido a falta total de segurança. O runlevel 3 é o mais comum e eu pessoalmente aconselho o seu uso. O runlevel 5 é o mais indicado para usuários novatos, que dependem completamente do sistema gráfico para trabalhar. Não aconselho o uso do runlevel 5, pois além de gastar recursos de máquina ainda, se a sua
placa de vídeo estiver configurada incorretamente, o servidor X tentará forçar a inicialização gráfica e sua tela no mínimo ficará piscando, tornando impossível qualquer comunicação com o sistema, o que também dificultará a reconfiguração da placa de vídeo. A escolha
fica por sua conta.

Runlevels e os scripts Sys V

O sistema de init, como foi citado anteriormente, procurará os scripts de incialização em /etc/rc.d. Existem, além dos scripts já citados, muitos outros, dentro do diretório /etc/rc.d/init.d.

Os scripts encontrados dentro do diretório /etc/rc.d/init.d possuem um modelo a ser seguido, onde eles devem aceitar no mínimo quatro parâmetros, a saber: stop, start, restart, status.

O init possui um sistema interessante para verificar quais os scripts que devem ser executados em cada runlevel. Dentro do diretório /etc/rc.d existem vários subdiretórios, com os nomes seguindo o modelo rcX.d, onde X é o numero do runlevel atendido pelo diretório. Isso significa que normalmente temos 6 diretórios seguindo esse modelo, de rc0.d a rc6.d. O script de inicialização, rc, verificará o runlevel atual e, segundo ele, entrará no diretório correto, por exemplo, para um runlevel 3, o diretório rc3.d. Dentro dos diretórios estão links
simbólicos para os scripts em init.d que devem ser executados no runlevel. Os links simbólicos possuem a seguinte nomenclatura:

EXXnome, onde E pode ser S, de start ou K, de kill, XX indica qual a ordem de execução do script na hierarquia de scripts e nome indica o nome do script na pasta init.d. Quem cria ou destrói os links é um aplicativo, chamado chkconfig.

O chkconfig lê algumas informações no cabeçalho dos scripts Sys V e determina qual a ordem de execução do script, quais os runlevels onde o script será executado com o parâmetro start e quais os runlevels onde o parâmetro utilizado será stop. Para indicar qual parâmetro usar ele cria o link com um prefixo K, de kill, para o parâmetro stop, e S, de start, para o parâmetro start. As páginas do manual do chkconfig explicam corretamente cada parâmetro do mesmo e como utilizá-lo corretamente.

Outro aplicativo normalmente encontrado é o ntsysv, que é uma espécie de front-end para o chkconfig, por meio dele podemos ver quais os serviços estão ativos e quais estão inativos de uma forma bem mais simples que pelo chkconfig.

Observe que não é porque você possui um script em /etc/rc.d/init.d que ele será executado, para ele ser executado, deve ser adicionado ao init via chkconfig ou ntsysv (ou outro aplicativo equivalente). Algumas informações sobre os serviços também podem ser visualizadas, essas informações são inseridas no cabeçalho dos scripts e normalmente
tem suporte a vários idiomas, descrevendo o que aquele serviço inicializado pelo script fará no seu sistema.

O shutdown do sistema também é determinado por um runlevel, ou o runlevel 0 (halt) ou o 6 (reboot), permitindo assim que alguns serviços possam ser devidamente desligados antes da queda do sistema, como por exemplo um servidor em impressão ou um gravador de configurações do misturador de som.

Agora que já conhecemos as fases básicas do boot do sistema e também o sistema de inicialização por scripts conhecido como Sys V, podemos personalizar alguns scripts segundo as nossas necessidades, criar alguns serviços e selecionar corretamente aqueles que serão
inicializados ou não durante os vários runlevels. Uma última dica: se você quiser alterar o runlevel com o sistema ligado, basta utilizar, como root, init X, onde X é o runlevel que você quer iniciar, ou seja, se você quiser reiniciar o sistema sem usar shutdown, basta digitar
"init 6".

No próximo artigo irei demonstrar como criar um script de inicialização e colocar para rodar via chkconfig.

quinta-feira, 20 de novembro de 2008

SSH sem senha entre Servidores

Criando a chave rsa

[root@servidor01 .ssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):

Apenas tecle enter duas vezes

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
81:86:21:dd:ec:97:c2:27:d3:dd:16:7c:18:ca:cc:d5 root@servidor01.dominio.net

[root@servidor01 .ssh]# ls -l
total 12
-rw-------  1 root root  883 Nov 20 05:59 id_rsa
-rw-r--r--  1 root root  232 Nov 20 05:59 id_rsa.pub
-rw-r--r--  1 root root 3552 Oct 24 09:14 known_hosts

Copiar a chave pública para o servidor 2

[root@servidor01 .ssh]# scp id_rsa.pub servidor02.dominio.net:/root/.ssh/
root@servidor02.dominio.net's password:
id_rsa.pub                                  100%  232     0.2KB/s   00:00

[root@servidor01 .ssh]# ssh servidor02.dominio.net
root@servidor02.dominio.net's password:
Last login: Thu Nov 20 08:46:00 2008 from servidor01
[root@servidor02 ~]#
[root@servidor02 ~]# cd .ssh/
[root@servidor02 .ssh]# ls -la
total 24
drwx------  2 root root 4096 Nov 20 08:52 .
drwxr-x---  7 root root 4096 Nov 20 08:46 ..
-rw-r--r--  1 root root  232 Nov 20 08:52 id_rsa.pub
-rw-r--r--  1 root root 2022 Jun 13 14:42 known_hosts

Adicionando a chave pública ao arquivo authorized_keys

[root@servidor02 .ssh]# cat id_rsa.pub > authorized_keys
[root@servidor02 .ssh]#
[root@servidor02 .ssh]# logout
Connection to servidor02 closed.

Testando conexão ssh sem senha

[root@servidor01 .ssh]#
[root@servidor01 .ssh]# ssh servidor02
Last login: Thu Nov 20 08:53:11 2008 from servidor01
[root@servidor02 ~]#
[root@servidor02 ~]# logout


Pronto e sem mistério.


Agora podemos executar cópia de arquivos e executar comandos remotamente neste servidor sem o uso de senha.




terça-feira, 18 de novembro de 2008

Gerenciando as filas do postfix

Olá pessoal, mais uma vez, eu aqui.
Para os usuários do MTA Postfix que querem aprender um pouco mais sobre como gerenciar as filas de emails ai vão algumas dicas então.

Para quem recebe uma grande demanda de emails diariamente ou até mesmo rastrear o envio ou recebimento de um email é sempre bom saber como fazer isso. O postfix conta com alguns utilitários em sua instalação que nos ajuda a fazer estas tarefas, também é claro que existem outras ferramentas do nosso próprio linux que podem nos auxiliar.

Em primeiro lugar vamos ver onde ficam as pastas das filas:

No meu caso que estou utilizando a distribuição baseada no redhat, o CentOS 4.6 a licalização dos diretórios ficam em:

/var/spool/postfix

Dentro desta pasta existem inúmeros diretórios, vamos ver alguns importantes:

incoming - Esta file contém todos os emails novos que entram na fila do postfix. Eles são armazenados pelo processo cleanup.
active - Esta file contém todos os e-mails que foram abertos pelo gerenciador da fila para entrega.
deferred - Esta fila armazena todos os emails que por algum motivo não puderam ser entregues aos seus receptores.
corrupt - As mensagens que não podem ser lidas ou danificadas são colocadas nesta fila.
hold - Esta fila é usada pelos administradores para por mensagens em espera até que alguém especifique que ela deva ser liberdada. Esta fila é muito usada por programas de checagem de mensagens, como o MailScanner, Clamav, etc... antes de serem entregues para o usuário.


Bom, agora que já aprendemos um pouco sobre a função de cada pasta vamos nos deter nos aplicativos para controlar as mensagens.

Na instalação do postfix já vem com vários aplicativos que iremos detalhar seu uso abaixo:

postqueue - Postfix Queue Control
postsuper - Postfix Superintendent
qshape - Print Postfix queue domain and age distribuition


Postfix Queue Control

postqueue -p -> comando usado para verificar a fila de emails

postqueue -f -> comando usado para dar um flush, ou seja, tenta entregar todos os emails da fila.
postqueue -s dominio -> comando usado para iniciar a entrega imediata de mensagens de um determinado domínio.

postqueue -v -> Habilita modo verbose para debug.




Postfix Superintendent

postsuper -h queue_id -> comando usado para colocar uma mensagem em espera.

postsuper -H queue_id -> Comando usado para tirar uma mensagem da espera.

postsuper -p -> comando usado para dar um purge nos arquivos temporários.

postsuper -d queue_id -> comando usado para deletar uma mensagem da fila.

postsuper -r queue_id -> comando usado para enfileirar novamente as mensagens.

postsuper -s -> comando usado para checar a estrutura e reparar caso haja erros.

postsuper -v -> Habilita modo verbose para debug.


Print Postfix queue domain and age distribuition

Por último temos o comando qshape, podemos usá-lo para ver as filas.

qshape active -> mostra o conteúdo da fila active.
qshape incoming -> mostra o conteúdo da fila incoming.
qshape hold -> mostra o conteúdo da fila hold.
qshape deferred -> mostra o conteúdo da fila deferred.
qshape -s -> mostra os domínios de destino.



Exemplo de filtros

Com o auxílio do comando find podemos fazer uma busca nas filas por um determinado email e depois apagá-lo com mostra o comando abaixo:

# find /var/spool/postfix -type f | xargs -n 1000 grep -l email@dominio.com.br | sed 's/.*\///g' | postsuper -d -

Para tirarmos da fila de espera um determinado email:
# find /var/spool/postfix -type f | xargs -n 1000 grep -l email@dominio.com.br | sed 's/.*\///g' | postsuper -H -

Excluindo tudo que está em HOLD, ou seja, na fila de espera.

# find /var/spool/postfix/hold -type f | sed 's/.*\///g' | postsuper -H -

Procurar mensagens do domínio teste.com.br
# tail -10000 /var/log/maillog | egrep -i ': from=<.*@teste\.com\.br>,' | less

Procurar uma mensagem por um específico queue_id
# tail -10000 /var/log/maillog | egrep ': 2B2173FF68: '

Verificar possíveis problemas.
# egrep 'qmgr.*(panic|fatal|error|warning):' /var/log/maillog




Fontes:
Postfix Frequently Asked Questions

qshape
postsuper
postqueue
qmgr

sexta-feira, 14 de novembro de 2008

Otimizando seu MySQL

Olá pessoal, para os que não tem muita experiência em otimização do MySQL-Server ai uma dica.

É claro que existem outras várias formas de se fazer otimizações em um servidor MySQL, como colocando um bom hardware dedicado, ou seja, um servidor rodando apenas o serviço de banco de dados, uma segunda forma de melhorar o desempenho é otimizando as consultas SQL que são de extrema importância, através da definição correta dos índices e outros arranjos de parâmetros. Uma terceira forma é analizando as informações do seu banco e ajustando o arquivo my.cnf de acordo com os resultados, que no caso é isso que vou falar abaixo.


Uma ferramenta muito útil que encontrei na internet, que nos dá uma boa base do que devemos fazer ou ajustar de acordo com os resultados coletados do nosso servidor MySQL é o script tuning-primer.sh, esse script faz alguma recomendações sobre como tunar sua instalação do MySQL através de ajustes finos feitos no arquivo de configuração my.cnf.

O script pode ser obtido aqui.

Baixe o arquivo e execute o comando abaixo para poder executá-lo:
# chmod +x tuning-primer.sh

Agora iremos rodar o arquivo usando o comando abaixo:
# ./tuning-primer.sh

Ao rodar o arquivo, o mesmo solicitará autenticação para poder rodar os procedimentos de análise, logue-se como root por sua própria conta ou crie um usuário com privilégios para isso. Você terá a opção de armazenar seus dados localmente para que na próxima execução não sejam solicitados novamente.

Segue abaixo uma imagem da tela após rodar o script:


O script é bem intuitivo, pois mostra através de cores o que devemos nos deter em analizar, ou no caso ajustar.

As frases na cor vermelha indica parametros desadequados ou que devemos ajustar.
As frases na cor amarela apenas indicam algumas referências e sugestões.
As frases na cor verde indicam que os ajustes feitos já estão ok.



O script acima foi desenvolvido por Matthew Montgomery da MySQL Inc. -- MySQL Technical Support Specialist.

Segue abaixo alguns links como referência para estudo:
Tuning Server Parameters
Banco de dados MySQL Performance Tuning melhores práticas vídeo tutorial

Fine-Tuning MySQL Full-Text Search

Tuning MySQL Performance with MySQLTuner

Aprendendo Expressões Regulares

Expressões Regulares

Pesquisando na internet verifiquei a grande dificuldade de muitas pessoas em entender expressões regulres (RE), que são obviamente necessárias por vários filtros, alguns como: Postfix, Spamassassin, MailScanner, etc...; Saber expressões é muito importante pois dá a um administrador de redes ou a um programador grande credibilidade de manusear com qualquer tipo de material que às contenham.

Um notável site com um conteúdo muito intuitivo sobre ER é o do nosso grande Aurélio, chamado GUIA-ER que até esteve em nossa cidade de Porto Alegre palestrando a convite do nosso grupo Tchelinux no evento que ocorreu na PUC semana passada.

O conteúdo é muito bem explicado, pelo menos não tive dúvidas ao ler, ele está dividido em tópicos com a demonstração de vários exemplos.



Esta é a edição online da obra Expressões Regulares

http://guia-er.sourceforge.net/

quarta-feira, 12 de novembro de 2008

Download de Livros

Com o avanço da tecnologia, internet e tudo mais, documentos, artigos, revistas já são possíveis de serem lidos pela internet nos variados formatos, isto não muda para os Livros, você não precisa ir aquela velha biblioteca para ler um livro, muitos sites já dispõem de uma grande diversidade de livros digitalizados sobre os mais variados assuntos. Podemos até lermos livros pelo celular. Muitos são págos é claro, mas vamos aos livres... Segue abaixo uma lista com os principais links.

A Wikilivros é dedicada ao desenvolvimento e livre disseminação de livros e textos didáticos de conteúdo aberto. A Wikilivros é um projeto da Wikimedia Foundation e a versão em português conta neste momento com 5 858 módulos de livros.
[update] 13/11/2008 - Uma dica do grande Rafael Carvalho é o site PDL (Projeto Democratização da Leitura), é uma das maiores referências de biblioteca virtual livre em língua portuguesa da internet, com um acervo alimentado por centenas de colaboradores em todo o mundo e uma história de 5 anos de existência. Todo os e-books são produzidos e geridos pelos próprios usuários, que fazem do site um grande centro de troca de novidades e discussões relacionadas à área. O acesso é livre e independe de registro ou qualquer forma de pagamento.


O portal brasileiro Domínio Público é mantido pelo Governo e tem inúmeras obras no seu arquivo, pode fazer download de livros gratuitos para o seu computador e ler com qualquer software de arquivos pdf.


Título

Autor

1 . A Divina Comédia Dante Alighieri
2 . A borboleta azul Lenira Almeida Heck
3 . Poemas de Fernando Pessoa Fernando Pessoa
4 . A Comédia dos Erros William Shakespeare
5 . Romeu e Julieta William Shakespeare
6 . O peixinho e o gato Lenira Almeida Heck
7 . Mensagem Fernando Pessoa
8 . A Bruxa e o Caldeirão José Leon Machado
9 . Dom Casmurro Machado de Assis
10 . Cancioneiro Fernando Pessoa
11 . O galo Tião e a dinda Raposa Lenira Almeida Heck
12 . A Cartomante Machado de Assis
13 . Sonho de Uma Noite de Verão William Shakespeare
14 . O Eu profundo e os outros Eus. Fernando Pessoa
15 . A Carteira Machado de Assis
16 . Poesias Inéditas Fernando Pessoa
17 . A Megera Domada William Shakespeare
18 . A Tragédia de Hamlet, Príncipe da Dinamarca William Shakespeare
19 . Tudo Bem Quando Termina Bem William Shakespeare
20 . Do Livro do Desassossego Fernando Pessoa
21 . Elementos de Geometria Euclides
22 . Dom Casmurro Machado de Assis
23 . Histórias da Avózinha Alberto Figueiredo Pimentel
24 . Macbeth William Shakespeare
25 . O galo Tião e a vaca Malhada Lenira Almeida Heck
26 . O pastor amoroso Fernando Pessoa
27 . No reino das letras felizes Lenira Almeida Heck
28 . A Igreja do Diabo Machado de Assis
29 . A Carta Pero Vaz de Caminha
30 . A Tempestade William Shakespeare
31 . Livro do Desassossego Fernando Pessoa
32 . O Mercador de Veneza William Shakespeare
33 . O Guardador de Rebanhos Fernando Pessoa
34 . Este mundo da injustiça globalizada José Saramago
35 . A Carta de Pero Vaz de Caminha Pero Vaz de Caminha
36 . Memórias Póstumas de Brás Cubas Machado de Assis
37 . Os Lusíadas Luís Vaz de Camões
38 . Trabalhos de Amor Perdidos William Shakespeare
39 . Histórias que acabam aqui Maria Teresa Lobato Fernandes Pereira Lopes
40 . O ensino do desenho Lucio Costa
41 . A Metamorfose Franz Kafka
42 . Manifesto Comunista Friedrich Engels
43 .
Karl Marx
44 . A Cidade e as Serras José Maria Eça de Queirós
45 . Conto de Inverno William Shakespeare
46 . Poemas Traduzidos Fernando Pessoa
47 . A Mão e a Luva Machado de Assis
48 . Muito Barulho Por Nada William Shakespeare
49 . Apologia de Sócrates Platão
50 . Crítica da Razão Pura Immanuel Kant

By: Marcos Abadi