Arquivos mensais: março 2013

Verificar atividade de serviços no Tomcat – serviço sempre ativo

Este script roda em background no sistema a fim de verificar a atividade de uma ou mais instâncias do serviço Tomcat.

Caso alguma das instâncias apresente ausência (por queda por exemplo), a mesma é ativada, restabelecendo novamente o serviço.

Obs.: O mesmo script pode ser usando para outros serviços e não especificamente para o Tomcat.

Funcionamento:

Ao executar “sh verifica_tomcats.m.sh start” o script entra em um loop infinito, fazendo verificação dos serviços a cada 5 segundos.

Sintaxe de uso:

Iniciar:

sh verifica_tomcats.m.sh start
ou
./verifica_tomcats.m.sh start

Parar:

sh verifica_tomcats.m.sh stop
ou
./verifica_tomcats.m.sh stop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash
# Este script roda em background no sistema a fim de verificar a atividade de três instâncias do Tomcat.
# Caso alguma das instâncias apresente inatividade, a mesma é ativada.
nomeScript="verifica_tomcats.m.sh"
n=0
start (){
	while [ true ]
	do
		if [ $(ps aux | awk '{print $15}' | grep tomcat5-01 > /dev/null 2>&1 ; echo $?) != $n ];then
		sh /usr/share/tomcat5-01/bin/startup.sh > /dev/null
		fi
		if [ $(ps aux | awk '{print $15}' | grep tomcat5-02 > /dev/null 2>&1 ; echo $?) != $n ];then
		sh /usr/share/tomcat5-02/bin/startup.sh > /dev/null
		fi
		if [ $(ps aux | awk '{print $15}' | grep tomcat5-03 > /dev/null 2>&1 ; echo $?) != $n ];then
		sh /usr/share/tomcat5-03/bin/startup.sh > /dev/null
		fi
 
		sleep 5
	done
}
stop (){
	echo "Matando $nomeScript"
	kill -9 `ps aux | grep $nomeScript | awk '{print $2}'`
}
case $1 in
### recebe valor externo
    'start') start & exit ;;
    'stop') stop ; exit ;;
    *) echo "Utilize start ou stop. Ex.: sh $nomeScript start."; exit ;;
esac
# Desenvolvido por Marcelo Viana - Analista em redes Linux
# Bendito seja Deus.

Plugin BACULA

Publicação no vivaolinux:

http://vivaolinux.com.br/script/Plugin-BACULA/
NTRODUÇÃO:

Pequena contribuição de três scripts para auxiliar de forma organizada e fácil na CRIAÇÃO e REMOÇÃO de CLIENTES para o SERVIDOR de backup BACULA.

SCRIPT 1:

criar_cliente.sh: este script gera um novo cliente ou gera e instala se usado com a opção “–instalar”.

Ao executar, serão solicitadas informações do novo cliente como: nome, IP do cliente, IP do storage e o diretório do cliente que será backupeado. Após, serão criados dois arquivos .conf, um com a configuração padrão do cliente e outro com a configuração de storage.

Obs.: Os arquivos .conf gerados só serão vistos se a opção “–instalar” NÃO for usada. Se a opção “–instalar” for usada, os arquivos serão movidos para os respectivos diretórios.

Obs. 2: Caso um cliente seja instalado mais de uma vez (duplicando do nome) com mesmo nome, um erro será exibido ao reiniciar o Bacula. Se isso acontecer, basta executar o script “remover_cliente.sh” para limpar a duplicação.

Sintaxe:

# sh criar_cliente.sh (somente gera)
# sh criar_cliente.sh –instalar (gera e instala)

SCRIPT 2:

instalar_cliente.sh: somente instala (move para os devidos diretórios) os arquivos gerados pelo script “criar_cliente.sh”.

Sintaxe:

# sh instalar_cliente.sh:

SCRIPT 3:

remover_cliente.sh: remove um ou mais clientes criado pelos scripts.

Sintaxe:

# sh remover_cliente.sh (mostrará opções para exclusão de clientes).

ESTRUTURA DE DIRETÓRIOS PADRÃO:

1 – /etc/bacula
2 – /etc/bacula/criar_cliente/
3 – /etc/bacula/clientes/
4 – /etc/bacula/storage_clientes/
5 – /etc/bacula/clientes.conf
6 – /etc/bacula/clientes_storage.conf

1 – bacula: /etc/bacula/ (padrão da instalação)
2 – criar_cliente: /etc/bacula/criar_cliente/ (local home dos scripts)
3 – clientes: /etc/bacula/clientes/ (local dos arquivos .conf com a configuração de cada novo cliente gerado pelo script)
4 – storage_clientes: /etc/bacula/storage_clientes/ (local dos arquivos .conf com as informações de onde será armazenado o backup de cada cliente).
5 – clientes.conf: /etc/bacula/clientes.conf (é a ligação entre o Bacula e os scripts)
6 – clientes_storage.conf: /etc/bacula/clientes_storage.conf (indica o diretório de armazenamento de cada cliente)

Aviso: Os scripts correspondem ao diretório de instalação padrão do Bacula, caso sua instalação seja diferente, deve alterar o valor das variáveis contida no cabeçalho de cada script, indicando o diretório correto da instalação.

ADICIONANDO O PLUGIN AO BACULA

Para instalar:

# sh INSTALAR_PLUGIN.sh

Obs.: Caso execute mais de uma vez a instalação do plugin, ligações duplicadas serão criadas causando erro na inicialização do Bacula. Se isso ocorrer, simplesmente execute o script abaixo para limpar as ligações, então volte e execute novamente o instalador.

Para remover:

# sh REMOVER_PLUGIN.sh

Obs.: A remoção não apaga arquivos, somente desfaz a ligação.

Nota:

– Os scripts usam dois arquivos modelo para gerar os novos clientes.
– Antes da utilização é necessário que o arquivo “nome_storage.conf” que fica em “/etc/bacula/criar_cliente/modelo/” seja alterado com o diretório de backup de sua preferência, acrescentando no final do diretório a palavra chave “nome”, veja a seguir:

# vim /etc/bacula/criar_cliente/modelo/nome_storage.conf

Arhive Device = /MEU_DIRETORIO_DE_BACKUP/nome

Obs.: Repare que no final do diretório acima há a palavra chave “nome”, ela é extremamente fundamental para a criação das pastas e arquivos de backup dos clientes.

Feito isso, entre no diretório “/etc/bacula/criar_cliente” e faça os testes.

# cd /etc/bacula/criar_cliente

Gerar:

# sh criar_cliente.sh

ou

Gerar e instalar:

# sh criar_cliente.sh –instalar

Instalar:

# sh instalar_cliente.sh

Remover:

# sh remover_cliente.sh

Espero de verdade que isso seja útil, nem que seja só para terem novas idéias.

Paz e bem, fiquem com Deus.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
##SCRIPT 1(CRIAR_CLIENTE.SH):
 
#!/bin/bash
parametro=$1
home=/etc/bacula/criar_cliente
bkp_home=/MEU_DIRETORIO_DE_BACKUP/
clientes=/etc/bacula/clientes
clientes_storage=/etc/bacula/storage_clientes
storage=_storage.conf
cd $home
gerar (){
echo "Nome do novo cliente:"
read novo_nome
echo "IP do novo cliente:"
read ip
echo "IP do storage (normalmente o IP do Bacula):"
read novo_ip_storage
echo "Senha do diretor - bacula-dir):"
read senha
echo "Diretorio do cliente a ser backupeado"
echo "Exemplos:"
echo "Para Windows: C:\\\\\\\\/pasta\\\\\\\/bkp"
echo "Para Linux: \\\\\\\\/home\\\\\\\\/user"
read caminho
cp $home/modelo/nome.conf $novo_nome.conf
cp $home/modelo/nome_storage.conf $novo_nome$storage
grep -l nome $novo_nome* | xargs sed -i s/nome/$novo_nome/g
grep -l ip $novo_nome* | xargs sed -i s/ip/$ip/g
grep -l endereco_storage $novo_nome.conf | xargs sed -i s/endereco_storage/$novo_ip_storage/g
grep -l 123456 $novo_nome* | xargs sed -i s/123456/$senha/g
grep -l caminho $novo_nome* | xargs sed -i s/caminho/$caminho/g
if [ $parametro = 0 ]; then
instalar
else
echo "{FONTE}33[32;1m Cliente $novo_nome gerado! {FONTE}33[m"
echo "Use o script 'instalar_cliente.sh' para completar a operacao"
fi
}
instalar (){
mkdir $bkp_home/$novo_nome > /etc/null
cp $novo_nome.conf $clientes/
cp  $novo_nome$storage $clientes_storage/
echo "@$clientes/$novo_nome.conf" >> $home/../clientes.conf
echo "@$clientes_storage/$novo_nome$storage" >> $home/../clientes_storage.conf
echo "{FONTE}33[32;1m Cliente $novo_nome gerado e instalado! {FONTE}33[m"
echo "Reinicie o bacula."
rm $home/*.conf
exit
}
if [ -z $parametro ]; then
parametro=1
gerar
else
if [ $parametro = "--instalar" ]; then
parametro=0
gerar
else
echo "O parametro correto é: --instalar"
fi
fi
# É o Senhor que mostra os caminhos.
 
 
 
 
##SCRIPT 2 (INSTALAR_CLIENTE.SH):
 
#!/bin/bash
home=/etc/bacula/criar_cliente
bkp_home=/MEU_DIRETORIO_DE_BACKUP/
clientes=/etc/bacula/clientes
clientes_storage=/etc/bacula/storage_clientes
storage=_storage.conf
conf=.conf
echo "Nome do cliente:"
read novo_nome
if [ -e $novo_nome$conf ]; then
mkdir $bkp_home/$novo_nome > /etc/null
cp $novo_nome$conf $clientes/
cp $novo_nome$storage $clientes_storage/
echo "@$clientes/$novo_nome$conf" >> $home/../clientes.conf
echo "@$clientes_storage/$novo_nome$storage" >> $home/../clientes_storage.conf
echo "{FONTE}33[32;1m Cliente $novo_nome instalado! {FONTE}33[m"
echo "Reinicie o bacula."
rm $home/*.conf
exit
else 
echo "{FONTE}33[31;1m Cliente $novo_nome nao encontrado! {FONTE}33[m"
fi
# É o Senhor que mostra os caminhos.
 
 
 
 
##SCRIPT 3 (REMOVER_CLIENTE.SH):
 
#!/bin/bash
home=/etc/bacula/criar_cliente
bkp_home=/MEU_DIRETORIO_DE_BACKUP
clientes=/etc/bacula
clientes_storage=/etc/bacula/storage_clientes
storage=_storage.conf
opc=d
listar (){
echo "Listando clientes..."
sleep 3
leitura
}
leitura (){
grep -n $ $clientes/clientes.conf
echo "Digite o numero do cliente que deseja remover:(ctrl+c para sair)"
read num
remover
}
remover (){
linhas=`grep -cv $= $clientes/clientes.conf`
if [ $num -le $linhas ]; then
num1=$num$opc
sed -i $num1 $clientes/clientes.conf
sed -i $num1 $clientes/clientes_storage.conf
echo '{FONTE}33[32;1m Cliente removido! {FONTE}33[m'
listar
else
echo '{FONTE}33[31;1m Numero ivalido! {FONTE}33[m'
listar
fi
}
listar
# É o Senhor que mostra os caminhos.
 
 
 
 
## OS ARQUIVOS MODELO:
 
##Modelo1 “nome_storage.conf”:
Device {
  Name = nome_storage_files
  Media Type = File
  Archive Device = /MEU_DIRETORIO_DE_BACKUP/nome
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = yes;
}
 
##Modelo2 “nome.conf”:
Job {
  Name = "nome"
  Type = Backup
  Level = Incremental
  Client = nome-fd
  FileSet = "nome_fileset"
  Schedule = "WeeklyCycle"
  Storage = nome_storage
  Messages = Standard
  Pool = File
  Priority = 10
  Write Bootstrap = "/var/bacula/working/%c.bsr"
}
FileSet {
  Name = "nome_fileset"
  Include {
    Options {
      signature = MD5
    }
    File = "caminho"
  }
   Exclude {
   File = .tmp
}
}
Client {
  Name = nome-fd
  Address = ip
  FDPort = 9102
  Catalog = MyCatalog
  Password = "123456"
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes
}
Storage {
  Name = nome_storage
  Address = endereco_storage
  SDPort = 9103
  Password = "123456"
  Device = nome_storage_files
  Media Type = File
}

LoadbalanceFAILOVER

Loadbalance FAILOVER:
Em um servidor com dois links de Internet, este script atuará no gerenciamento dos links. Caso o link que estiver ativo no momento, apresente erro (ou perda de conexão com a Internet por algum motivo), o script mudará o tráfego automaticamente para outro link existente. E se os dois links apresentarem problemas, então o script tenta uma reparação, restartando a rede e setando novamente as configurações: variáveis, limpeza de tabelas (iptables), roteamento, NAT e gateways.

Obs.: É extremamente importante que cada gateway esteja configurado de acordo com sua interface nas VARIÁVEIS (“iface1″ de acordo com “gw1″ e “iface2″ de acordo com “gw2″) do script, para que o route trate corretamente as saídas.

Exemplo:
iface1=eth0 (interface)
gw1=”10.26.20.1″ (gateway)

iface2=eth1 (interface)
gw2=”10.15.20.1″ (gateway)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/bin/bash
 
  ### CONFIGURE AS VARIÁVEIS AQUI:
  testeip="8.8.8.8"
  iface1=eth0
  iface2=eth1
  gw1="10.26.20.1"
  gw2="10.15.20.1"
  nomeGw1="CTBC"
  nomeGw2="EMBRATEL"
  ### FIM DA CONFIG.
  rota1=0
  rota2=0
  nomeScript="loadbalanceFAILOVER.sh"
iniciar(){
  ### LIMPEZA:
  iptables -t mangle -F
  iptables -t mangle -X
  iptables --flush
  iptables -F
  iptables -t nat -F
  iptables -X
  iptables -t nat -X
  ip route flush cache
  ### HABILITA ROTEAMENTO:
  echo "1" > /proc/sys/net/ipv4/ip_forward
  ### MASCARA OS PACOTES COM DESTINO A INTERNET (NAT):
  iptables -t nat -A POSTROUTING -o $iface1 -j MASQUERADE
  iptables -t nat -A POSTROUTING -o $iface2 -j MASQUERADE
  ### ADICIONA OS GATEWAYS NAS DEVIDAS INTERFACES:
  route add -net default gw $gw1 dev $iface1
  route add -net default gw $gw2 dev $iface2
### LINK 1 ATIVO
clear
echo "Link em atividade: $nomeGw1"
echo "Interface:$iface1"
echo "Gateway:$gw1"
echo "Status: Ok"
while [ $(ping -qc 3 $testeip -I $iface1 > /dev/null 2>&1 ; echo $? ) = 0 ]
  do
  if [ $rota1 = 0 ]
  then
    rota1=1
    route del -net default gw $gw2 dev $iface2
  fi
done
route add -net default gw $gw2 dev $iface2
### LINK 2 ATIVO
clear
echo "Link em atividade: $nomeGw2"
echo "Interface:$iface2"
echo "Gateway:$gw2"
echo "Status: Ok"
while [ $(ping -qc 3 $testeip -I $iface2 > /dev/null 2>&1 ; echo $? ) = 0 ]
  do
    if [ $rota2 = 0 ]
    then
    rota2=1
    route del -net default gw $gw1 dev $iface1
    fi
  done
### Se os links estiverem 'down', tenta uma reparação restartando a rede e chamando novamente o script:
if [ $(ping -qc 3 $testeip -I $iface1 > /dev/null 2>&1 ; echo $? ) != 0 ] || [ $(ping -qc 3 $testeip -I $iface2 > /dev/null 2>&1 ; echo $? ) != 0 ]
  then
    clear
    echo "Sem conexao!"
    echo "Tentando reparar..."
    /etc/init.d/networking stop
    /etc/init.d/networking start
    iniciar
fi
}
parar(){
  kill -9 `ps aux | grep $nomeScript | awk '{print $2}'`
  echo "Morto"
  exit
}
helpp(){
  echo "Para executar o script, usa-se a seguinte sintaxe:"
  echo " "
  echo "Iniciar:"
  echo "sh $nomeScript start"
  echo "Parar:"
  echo "sh $nomeScript stop"
  echo "Rodar em modo background:"
  echo "sh $nomeScript start &"
  echo "Após rodar em background, verifique se está rodando:"
  echo "ps aux | grep $nomeScript"
  echo "Obs.: Não esquecer de configurar as VARIÁVEIS  do script de acordo com sua rede."
  echo " "
  echo "Desenvolvido por: Marcelo Viana"
  echo " "
  exit
}
case $1 in
'start') iniciar ; exit ;;
'stop') parar ; exit ;;
'--help') helpp ; exit ;;
*) echo "Parâmetro desconhecido: '$1'" ; echo "Utilize --help para informações. Exemplo: sh $nomeScript --help"; exit ;;
esac
# É o Senhor que mostra os caminhos. Agradeço por me ajudar através de tantos exemplos.
# E que bom existe o vivaolinux!
# www.infsite.org

Enviar email com PHP pelo terminal GNU/Linux

Em muitos casos, o sistema é configurado para enviar emails periodicamente ao administrador. Muitos usam algumas soluções via console, como: mail, mutt etc.

Um pequeno problema encontrado (pelo menos eu encontrei!) nestas soluções é alterar o remetente do email para um endereço específico que não seja o usuário que está executando a ação ou rotina de envio. Por exemplo: se eu estou no usuário “root” e executo o comando “mail -s “assunto” destino@exemplo.com < corpo_do_email.txt”, o email será enviado como remetente “root@exemplo.com”. Então para resolver isso, usei um arquivo em PHP contendo o cabeçalho “#!/usr/bin/php”, que é o caminho do interpretador do PHP no sistema. Obs.: O PHP deve está instalado e funcionando! Sintaxe: ./php_terminal.php

1
2
3
4
5
6
7
8
#!/usr/bin/php
<?php
$assunto = "Enviado pelo terminal Linux";
$mensagem = "Corpo do email";
$de = "email_origem@exemplo.com";
$para = "email_destino@exemplo.com";
mail("$para","$assunto","$mensagem","From: $de");
?>

Loadbalance – para testes e estudos!

LoadBalance para servidor com dois links de Internet e um para rede local.

O Script faz o balanciamento através de marcação de pacotes (ip rule) para serem distribuídos pelo “ip route” de acordo com a tabela indicada.

# Em outros casos, poderá servir apenas de exemplo para ser estudado.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/bin/bash
### INTERFACES:
rede1="eth0"
iface1="eth1"
iface2="eth2"
### Obs.: As interfaces tem que está de acordo com os gateways.
### Exemplo: eth1 10.15.20.21 gateway 10.15.20.10
### Exemplo: eth2 10.26.20.21 gateway 10.26.20.1
### GATEWAYS
gw1="10.15.20.1"
gw2="10.26.20.1"
### Outras variáveis
nomeScript="loadbalance-s.sh"
op=0
a=true
### HABILITA ROTEAMENTO:
echo "1" > /proc/sys/net/ipv4/ip_forward
function start(){
### Chama funções.
    limpeza ; nat ; rotas ; looping
}
function limpeza(){
### Limpa tabelas.
    iptables -t mangle -F
    iptables -t mangle -X
    iptables --flush
    iptables -F
    iptables -t nat -F
    iptables -X
    iptables -t nat -X
    ip route flush cache
}
function nat(){
### MASCARAMENTO(NAT) E MARCAÇÃO DE PACOTES PARA ROTEAMENTO.
    iptables -t nat -A POSTROUTING -o $iface1 -j MASQUERADE
    iptables -t nat -A POSTROUTING -o $iface2 -j MASQUERADE
    iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,443 -j MARK --set-mark 1
}
function marcacao1(){
### Altera a marcação de pacotes da tabela "mangle"
    iptables -t mangle -R PREROUTING 1 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 1
}
function marcacao2(){
### Altera a marcação de pacotes da tabela "mangle"
    iptables -t mangle -R PREROUTING 1 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 2
}
function rotas(){
### MARCA E PRIORIZA DE ACORDO COM A TABELA
    ip rule add fwmark 1 table 10 prio 0
    ip rule add fwmark 2 table 20 prio 0
### DESTINA OS PACOTES
    ip route add default via $gw1 dev $iface1 table 10
    ip route add default via $gw2 dev $iface2 table 20
}
function looping(){
### LOOP PARA MUDAR A MARCAÇÃO
  while [ $a ]; do
   sleep 1
      if [ $op == 0 ]; then
   op=1
   marcacao1
      else
   op=0
   marcacao2
      fi
  done
}
function para(){
### PARA O LOADBALANCE.
    a=false
    limpeza
    kill -9 `ps aux  |grep $nomeScript|awk '{print $2}'`
}
function helpp(){
### HELP
echo "Uso: loadbalance + opção"
echo "Modos:"
echo "./$nomeScript start &"
echo "./$nomeScript stop &"
echo "sh $nomeScript start &"
echo "sh $nomeScript stop &"
echo "Modo depuração: sh -x $nomeScript start"
}
case $1 in
### RECEBE VALOR EXTERNO
    'start') start ; exit ;;
    'stop') para ; exit ;;
    '--help') helpp ; exit ;;
    *) echo "Utilize start ou stop. Ex.: ./$nomeScript start."; exit ;;
 
esac
# É o Senhor que mostra os caminhos. Obrigado Senhor por me ajudar atravez de tantos exemplos.
# www.infsite.org