Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

SrTunes

script .bat para DB Postgres

Recommended Posts

Bom dia colegas,

 

Estou precisando de uma ajuda de vocês. Não sei se é exatamente aqui que tenho que postar, se tiver errado, por favor me informe.

 

Seguinte, tenho um banco de dados postgres instalado em um servidor windows e estou querendo fazer um script para coletar os bancos existentes. Tenho um script que faz exatamente isso, só que em linux. E quero fazer um em bat para windows.

 

Segue abaixo o script em linux .sh:

 

#!/bin/bash
# Autor: Rodrigo Lang
# Data: 08/12/2012
lines=$(psql --dbname postgres -Atc '\l' | grep '|' | cut -d'|' -f1 | wc -l)
loop=1
inicio="{\"data\":["
for i in $(psql --dbname postgres -Atc '\l' | grep '|' | cut -d'|' -f1); do
loop=$(($loop+1))
if [ $loop -gt $lines ]; then
data=${data}"{\"{#DBNAME}\":\"$i\"}"
else
data=${data}"{\"{#DBNAME}\":\"$i\"},"
fi
done
final="]}"
echo $inicio$data$final

Alguem pode me ajudar?

 

Desde ja agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, ta duído resolver isso...

 

Será que alguém sabe me dizer como eu insiro o valor de um comando dentro de uma variável?

Tipo: quando digito esse comando no cmd:

psql --dbname postgres -U zabbix -Atc "\l" | find "|" /c

ele me retorna em números a quantidade de bancos postgres que tenho no servidor.

Bem, preciso saber como coloco esse número dentro de uma variável. Alguém tem alguma idéia?

 

Ja tentei assim:

set var=psql --dbname postgres -U zabbix -Atc "\l" | find "|" /c

Mas não funciona, ele não insere nada na variavel var e aparece o valor 0.

 

Por favor, alguém me ajude... rs

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caros colegas, depois de dias de muita pesquisa e estudo, pois não sei criar script .bat, consegui desenvolver um script que me traz quase o que preciso.

 

Seguinte, tenho uma rede de servidores sendo monitorados pelo Zabbix, e tenho bancos de dados instalados em servidores linux e windows. Pois bem, estava precisando de um script que me retorna-se uma string assim:

 

{\"data\":[{\"{#DBNAME}\":\"nomebanco1\"},{\"{#DBNAME}\":\"nomebanco2\"},...,{\"{#DBNAME}\":\"nomebancon\"}]}

Comecei a pesquisar para fazer isso nos servidores linux, pois eu acho bem mais fácil. Sendo assim, consegui encontrar um blog que me ajudou com o script para DB postgres (foi o script que postei inicialmente). A partir deste script desenvolvi um para MySQL e foi um sucesso. Tudo funcionou perfeitamente para os DBs instalados nos servidores linux, que são CentOS.

 

Ai começou minha dor de cabeça. Para fazer isso nos DBs dos servidores windows eu pensei em fazer um script .bat que me retornasse exatamente a mesma string, o problema é que estava me aventurando em um campo que eu não conheço quase nada.

 

Bem, inicialmente fui tentar fazer o bat para o DB postgres, usando como referência o script do linux. Ralando muito consegui chegar a um script que esta quase perfeito:

@echo off
setlocal enabledelayedexpansion
cd C:\Program Files\PostgreSQL\9.2\bin
psql --dbname postgres -U zabbix -Atc "\l" | find "|" /c > C:\zabbix\externalscripts\db_postgres\nresult.txt
psql --dbname postgres -U zabbix -Atc "\l" | find "|" > C:\zabbix\externalscripts\db_postgres\dbresult.txt
cd C:\zabbix\externalscripts\db_postgres

set /p lines=<nresult.txt
set lines=%lines: =%
del nresult.txt

set loop=1

echo {\"data\":[ > listpg.txt

for /f "tokens=1 delims=|" %%a in (dbresult.txt) do (
	if !loop! == %lines% (
		echo {\"{#DBNAME}\":\"%%a\"}
		goto exit
	)
	set /a loop=!loop!+1
	echo {\"{#DBNAME}\":\"%%a\"},
)

:exit
del dbresult.txt
echo ]} 

O problema deste script agora é que ele me retorna varios "echo", um em cada linha e eu preciso de toda a saída em uma linha. Tentando resolver o problema joguei os resultados para um arquivo, fazendo assim:

 

@echo off
setlocal enabledelayedexpansion
cd C:\Program Files\PostgreSQL\9.2\bin
psql --dbname postgres -U zabbix -Atc "\l" | find "|" /c > C:\zabbix\externalscripts\db_postgres\nresult.txt
psql --dbname postgres -U zabbix -Atc "\l" | find "|" > C:\zabbix\externalscripts\db_postgres\dbresult.txt
cd C:\zabbix\externalscripts\db_postgres

set /p lines=<nresult.txt
set lines=%lines: =%
del nresult.txt

set loop=1

echo {\"data\":[ > listpg.txt

for /f "tokens=1 delims=|" %%a in (dbresult.txt) do (
	if !loop! == %lines% (
		echo {\"{#DBNAME}\":\"%%a\"} >> listpg.txt
		goto exit
	)
	set /a loop=!loop!+1
	echo {\"{#DBNAME}\":\"%%a\"}, >> listpg.txt
)

:exit
del dbresult.txt
echo ]} >>listpg.txt

Beleza, foi direitinho, mas não em uma linha. Ele esta gravando assim:

{\"data\":[ 
{\"{#DBNAME}\":\"nomebanco1\"}, 
{\"{#DBNAME}\":\"nomebanco2\"}, 
...
{\"{#DBNAME}\":\"nomebancon\"} 
]} 

::onde n= quantidade de bancos

Estou pedindo uma ajuda de alguém que souber. Como faço para editar um arquivo txt usando um script .bat para organizar o texto todo em uma linha, ou melhor, deletar os "enters" e os espaços?

 

Alguém pode me ajudar?

 

Desde ja agradeço a todos do fórum.




			
		

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver o problema pessoal (depois de muita pesquisa).

Se alguém quiser monitorar o tamanho dos Dbs postgres instalados em servidores windows pelo zabbix estou deixando aqui o script que criei para fazer isso:

 

postgres_zabbix.bat

:: Autor: Andrei Tunes Claro
:: Data: 06/06/2013
 
@echo off
setlocal enabledelayedexpansion

cd C:\Program Files\PostgreSQL\9.2\bin\

for /f "delims=" %%a in ('psql.exe --dbname postgres -U zabbix -Atc "\l" ^| find "|" /c') do @set lines=%%a
set loop=1

set out={\"data\":[

for /f "tokens=1 delims=|" %%a in ('psql.exe --dbname postgres -U zabbix -Atc "\l" ^| find "|"') do (

	if !loop! == %lines% (
		set out=!out!{\"{#DBNAME}\":\"%%a\"}
		goto exit
	)
	set /a loop=!loop!+1
	set out=!out!{\"{#DBNAME}\":\"%%a\"},
)

:exit
set out=!out!]}
echo %out%

ai só acrescentar no zabbix_agentd.conf os parametros no final:

## Postgres
UserParameter=pgsql.db.names,C:\zabbix\externalscripts\db_postgres\postgres_zabbix.bat
UserParameter=pgsql.db.size[*],psql --dbname postgres -U zabbix -Atc "select pg_database_size('$1') as size

Qualquer dúvida estou a disposição!

Falou galera!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, corrigindo o script:

 

:: Autor: Andrei Tunes
:: Data: 06/06/2013

@echo off
setlocal enabledelayedexpansion

cd C:\Program Files\PostgreSQL\9.2\bin\

for /f "delims=" %%a in ('psql.exe --dbname postgres -U zabbix -Atc "\l" ^| find "|" /c') do @set lines=%%a
set loop=1

set out={"data":[

for /f "tokens=1 delims=|" %%a in ('psql.exe --dbname postgres -U zabbix -Atc "\l" ^| find "|"') do (

	if !loop! == %lines% (
		set out=!out!{"{#DBNAME}":"%%a"}
		goto exit
	)
	set /a loop=!loop!+1
	set out=!out!{"{#DBNAME}":"%%a"},
)

:exit
set out=!out!]}
echo %out%

e corrigindo os parametros do agentd.conf do zabbix:

## Postgres
UserParameter=pgsql.db.names,C:\zabbix\externalscripts\db_postgres\postgres_zabbix.bat
UserParameter=pgsql.db.size[*],C:\"Program Files"\PostgreSQL\9.2\bin\psql --dbname postgres -U zabbix -Atc "select pg_database_size('$1') as size

Do outro jeito não funcionaria...

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Grato pelo retorno mesmo resolvendo sozinho, pode vir a ajudar alguém algum dia.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.