:::: MENU ::::
Mostrando postagens com marcador scripts. Mostrar todas as postagens
Mostrando postagens com marcador scripts. Mostrar todas as postagens

segunda-feira, 18 de dezembro de 2017

Um amigo me perguntou como ele conseguiria identificar quais máquinas eram windows na nossa rede, daí, me veio na cabeça um parâmetro bem simples, que é o TTL de resposta do ping.

Se esse valor não for alterado, máquinas windows respondem com 128, e alguns gatos pingados, com 127.

Com isso em mente, então a solução ficou simples: Pingo em todo o range da rede, e quem responder com ttl=128 ou ttl=127, é Windows.

Isso daria um script, mas dá pra fazer em uma linha. Vejamos:

raul@lizard:~> for i in $( seq 254 ); do ping -c 1 192.168.0.$i | egrep -q '127|128' ; if [ $? == 0 ];  then tput setaf 2; echo "192.168.0.$i é windows"; tput sgr0; else tput setaf 1; echo "192.168.0.$i não é windows"; tput sgr0; fi; done

Ah, uma lista completa com os TTL você pode achar aqui: https://subinsb.com/default-device-ttl-values/

E só isso. Abraço!



terça-feira, 24 de maio de 2016

Queridos! A coisa toda é simples. Vou deixar um template aqui pra vocês colocarem seus scripts como serviço e pararem de usar o útil nohup. Outra coisa: Seu script DEVE TER perfil de serviço. Não estou falando de um monte de comandos um embaixo do outro, beleza?
Pra facilitar, vou sublinhar as linhas que vocês devem alterar.


[Unit]
Description=Hubot
Requires=network.target
After=network.target
[Service]
Type=simple
WorkingDirectory=/home/butis/hubot
User=sobutis
Restart=always
RestartSec=10
EnvironmentFile=/etc/hubot/variaveis.conf
ExecStart=/home/butis/hubot/bin/hubot -a rocketchat

[Install]
WantedBy=multi-user.target


Eu acho que o conteúdo é bastante explicativo, mas, vamos explicar assim mesmo. Nesse exemplo, vamos criar um usuário que executará o hubot.

1. Precisamos criar um usuário pra rodar esse serviço, por questões de segurança.
adduser hubot

Nós não vamos definir o shell dele como /bin/false, porque é um script, ou seja, ele precisa do bash/ksh/sh para executar os comandos.

2. Coloque o script no diretório do usuário criado - isso é meio que lógico né?

3. Crie o arquivo hubot.service dentro de /etc/systemd/system.  Repare: {nome do serviço}.service. Pegou o padrão? Ok!

O Conteúdo é esse daí de cima. Vamos comentar linha a linha pra entendermos.


[Unit]
Description=Hubot 

Descrição do serviço
 

Requires=network.target
Dependências. O seu serviço depende de algum outro?
 

After=network.target
Ordem de execução. O serviço só será iniciado após o outro definido estar rodando.

[Service]
Type=simple
WorkingDirectory=/home/butis/hubot

Diretório de execução do seu serviço.

User=sobutis

Restart=always
RestartSec=10

Caso o serviço não inicie, ele tentará reiniciar de acordo com o estabelecido nas regras de Restart.

EnvironmentFile=/etc/hubot/variaveis.conf

Como meu script possui várias variáveis, eu preferi carregá-las em um arquivo separado. Defina suas variáveis nele.

ExecStart=/home/butis/hubot/bin/hubot -a rocketchat

Comando de execução do script. Coloque o path inteiro.

[Install]
WantedBy=multi-user.target 


Terminado o arquivo, execute um reload nas confs do systemd:
systemctl daemon-reload

E inicie o serviço
systemctl start hubot

Podemos deixar que ele inicie junto com os outros serviços:
systemctl enable hubot


Prontinho. Com esse modelo vocês já podem colocar qualquer script pra rodar como serviço sem dor de cabeça. Como informação adicional, recomendo a leitura de um documento da Red Hat, muito bem explicado por sinal:
 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html

E um guia pra quem ainda tem medo do systemd
E isso aí. Abraços!

sexta-feira, 4 de dezembro de 2015

Isso é útil em scripts, quando você quer que a saída padrão (STDOUT) seja emitida na tela e também seja anexada em um arquivo. Você pode fazer isso de duas maneiras:

1. Emitindo a saída duas vezes, sendo que a primeira vai direto para o STDOUT e depois você emite a mesma saída, mas dessa vez jogando para um arquivo ( > ou >> file.txt). Esse funciona melhor quando é usado o comando echo.
2. Usando o comando tee. Maneira mais simples.

Comando tee
O tee lê da entrada padrão (STDIN) e escreve na saída padrão (STDOUT) e arquivos, como a própria manpage descreve.


DESCRIÇÃO
        Copia a entrada padrão para cada arquivo, e também para a saída padrão.

       -a, --append
               anexa aos arquivos, não sobrescrevendo

       -i, --ignore-interrupts
              ignora sinais de interrupção

       --help mostra essa saída e sai

       --version
              mostra a versão e sai

       Se FILE é -, copie novamente para a saída padrão (standard output).

AUTORES
       Escrito por Mike Parker, Richard M. Stallman, e David MacKenzie.


Exemplo:

[root@digestor var]# du -sh * | tee -a file.txt
561M    cache
8.0K    db
8.0K    empty
4.0K    file.txt
4.0K    games

[root@digestor var]# cat file.txt
8.1G    .
561M    cache
8.0K    db
8.0K    empty
4.0K    file.txt
4.0K    games

[root@digestor var]#


Mas aí alguém pode dizer: Ô! Isso eu faço usando o > ou >>. É, faz, mas não vai conseguir jogar na tela e no arquivo ao mesmo tempo.

Use o tee para criar seus arquivos de log, fica muito prático.

Abs!

quinta-feira, 3 de dezembro de 2015

Fala queridos!

Fiz esse script para preparar os hosts que receberão o agente do HP Data Protector de lá da empresa.
Percebam que ele:
Permite que o host servidor (de onde você vai executar os comandos) consiga logar no host cliente sem autenticação
Edita arquivos
Envia arquivos
Instala pacotes
Configura serviços

Tenham esse script como referência. Mudem como preferir. Usem a criatividade! :)


#!/bin/bash
# Instala software cliente de backup
# Raul Libório, raul.liborio@solutis.com.br
# 1.0

AUTH_KEYS_DIR="/root/.ssh"
AUTH_KEYS="$AUTH_KEYS_DIR/authorized_keys"
AUTH_ID="$AUTH_KEYS_DIR/id_rsa.pub"
DNSCLIENTE=$1
PASSWD="asdfghjklç"
SSH="sshpass -p "$PASSWD" ssh -o "StrictHostKeyChecking=no" root@$DNSCLIENTE"
SCP="sshpass -p "$PASSWD" scp -o "StrictHostKeyChecking=no""
DEPENDENCIAS="yum -y install xinetd rpm libstdc++ rsh-server glibc rsync"
RESPOSTA_OK="$( date ) - Iniciando instalacao no cliente $DNSCLIENTE"
RESPOSTA_NO="$( date ) - Instalacao cancelada pelo usuario $USER no host $DNSCLIENTE"
RESPOSTA_HOST_ERR="Use o FQDN do host. Exemplo: $(nslookup $DNSCLIENTE | awk /name/'{print $NF}')"
LOG="/var/log/hp_dataprotector_shell-installer.log"

# Testa se $1 recebeu um nome de host valido - o HP Data Protector so aceita FQDN
echo $1 | grep -q '.solutis.net.br'
[ $? != "0" ] && echo "$RESPOSTA_HOST_ERR" && exit 2

# Confirmacao se quer continuar a execucao do script
read -p "Deseja preparar o host $1 para instalar o HP Data Protector? " RESPOSTA
[ $RESPOSTA != "y" ] && echo $RESPOSTA_NO &>> $LOG && exit 1 || echo "$RESPOSTA_OK" &>> $LOG

# Desabilitar SELinux
$SSH sed -i 's/enforcing/disabled/' /etc/selinux/config

# Cria o diretorio $AUTH_KEYS_DIR caso ele nao exista
$SSH "mkdir $AUTH_KEYS_DIR 2> /dev/null"

# Copia o $AUTH_ID para o $DNSCLIENTE
$SCP $AUTH_ID root@$DNSCLIENTE:/tmp

# Adiciona $AUTH_ID ao $AUTH_KEYS
$SSH "touch $AUTH_KEYS"
$SSH "cat /tmp/id_rsa.pub >> $AUTH_KEYS"

# Instala as depenencias do HP Data Protector
$SSH $DEPENDENCIAS

# Habilite os servicos necessarios
$SSH "chkconfig rexec on"
$SSH "chkconfig rsync on"
$SSH "chkconfig rsh on"
$SSH "service xinetd restart"

# Confirmacao da execucao
echo "$( date ) - Host $DNSCLIENTE preparado com sucesso." &>> $LOG
exit 0

domingo, 15 de novembro de 2015

Sobre

O Slack é uma ferramenta sensacional! O Slack é um software de comunicação de equipes com suporte a canais, conversas privadas, integração com serviços externos e diversos detalhes bacanas que fazem dele simplesmente viciante. Ele integra Dropbox, Wunderlist, Github, Google Drive, Trello, RSS, faz vídeo-conferência pelo Hangout do Google, recebe informações via API, e outras dezenas de integrações. É muita coisa!

Faça o seguinte: Leia essa matéria do Tecnoblog e depois volte. Vai ver que a ferramenta é algo que faltava no seu dia-a-dia
https://tecnoblog.net/179267/slack-motivos-para-usar/


A Configuração

No slack.com

Primeiramente vá no slack.com, clique em integrations e no fim da página, procure pela integração "Incoming WebHooks". Clique.
Em "Post to Channel", selecione qual canal ou usuário receberá as notificações (#zabbix ?). Em seguida, aparecerá a tela "Setup Instructions".

Observe o campo "Webhook URL". Essa URL é única e será a ponte de ligação para o envio das mensagens. Anote e guarde!
Atenção: Caso você venha a refazer esse caminho (slack > Integrations > Incoming WebHooks), ele gerará uma nova URL.

Com a webhook url anotada, vamos ao próximo passo: o script slack.sh


SCRIPT

Configuração

Verifique o local do seu AlertScriptPath no zabbix_server.conf:


grep AlertScriptsPath /usr/local/etc/zabbix_server.conf
### Option: AlertScriptsPath
AlertScriptsPath=/etc/zabbix/alertscripts


O nosso diretório é o /etc/zabbix/alertscripts. Agora precisamos colocar o script aqui.

Baixe o script para este diretório:
wget -P /etc/zabbix/alertscripts/ https://github.com/ericoc/zabbix-slack-alertscript/raw/master/slack.sh

Dê permissões de execução

chmod +x /etc/zabbix/alertscripts/slack.sh



Lembra do WebHook URL? Pois bem, vamos usá-lo nesse script. Edite o script e procure pela linha url='CHANGEME'. Acho que já sabem o que devem fazer né?
Remova o CHANGEME e coloque o a sua url. Como por exemplo:

url='https://hooks.slack.com/services/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'


A linha 'username' é a do nome do bot que irá postar. Zabbix (o default) é uma boa pedida.

Agora, a última parte, a configuração na interface web do Zabbix.


INTERAFCE WEB


Crie o tipo de mídia:

Logado no Zabbix Server como Super-Administrador, clique em "Administração" > "Tipos de mídias" e depois em "Criar tipo de mídia".
Então teremos:
Nome: Slack
Tipo: Script
Nome do script: slack.sh
Ativo: sim

Crie o usuário Slack

Em "Administração" > "Usuários", clique em "Criar usuário"
Na guia Usuário, defina o apelido "Slack". Fique a vontade com os outros parâmetros. Coloque-o em um grupo que tenha acesso as notificações que deseja emitir. O Zabbix administrators é uma sugestão.
Na guia Mídia, clique em adicionar. Defina:
Tipo: Slack
Enviar para: Aqui você colocará para qual canal irá receber as notificações. Se você criou o canal #zabbix, então defina #zabbix.
Quando ativo: Período de notificação. O padrão é 24/7.
Usar se risco: Com todos os campos marcados, ele gerará notificações sobre qualquer alerta das triggers. Configure de acordo sua vontade.
Ativo: Sim


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Defina as ações

Na guia "Configuração" > "Ações", clique em "Criar ação"
Na guia "Ação", defina o nome "Slack".
No campo "Assunto padrão", defina "PROBLEM". Isso fará com que, quando ocorra uma notificação de incidente, aparecerá um emoji de carinha de espanto.
No campo "Mensagem padrão", defina algo simples, como por exemplo:

{TRIGGER.NAME} - {HOSTNAME} ({IPADDRESS})


Marque o campo "Mensagem de recuperação" e defina o "Assunto da recuperação" como "RECOVERY". A mensagem de recuperação deixe igual (se quiser, claro!) a mensagem padrão.
Mais na frente vamos aprender a customizar isso ;)

Na guia "Ações", em "Operações da ação", clique em "Nova".
defina, em "Detalhes da operação" > "Enviar para usuários", clique em "Adicionar" e selecione "Slack" e adicione a ação.

 

 

 

HORA DO TESTE!

Agora é a hora da verdade, vamos ver se funciona!
Vá no diretório do seu AlertScriptsPath e execute o script dessa maneira:


$ bash slack.sh '@SeuUsuario' PROBLEM 'Oh não! Algo está errado!'






Onde: @SeuUsario é o seu usuário (¯\_(ツ)_/¯), e ele deverá receber essa mensagem.


Tudo ok? Ótimo! Vamos aprender a customizar no próximo post.
Abraços.

Fonte

Todas as informações desse post foram aprendidas e inspiradas do GitHub do criador, o Eric O'Callaghan https://github.com/ericoc

segunda-feira, 24 de agosto de 2015

Situação:

Empresa com o servidor web, que possui várias aplicações GLPI, um para cada cliente.

Problema:

A aplicação GLPI, está criando arquivos de log muito grandes, no diretório /var/www/html/glpi/files/_log, e isso está fazendo o servidor estourar o espaço em disco.

Solução: Script!

Script que crie um arquivo de logrotate para cada cliente, que é executado mensalmente - para caso apareça algum novo cliente.

Show me the code:

#/bin/bash
# Raul Libório, <rauhmaru@opensuse.org>
# Versao: 1.0 - 24/08/2015
# Problema: Arquivos do GLPI no diretorio
# /var/www/html/$CLIENTES/files/_log/
# que crescem bastante, levando ao
# estouro de disco
#
# Funcao: Cria arquivos de config. do logrotate
# para as aplicacoes do GLPI. e resolver
# problema do tamanho dos arquivos de log.
#
## Variaveis
LOGROTATE_FILE="/etc/logrotate.d/glpi"
GLPI_DIR="/var/www/html/"
LOGROTATE_PARAMS="
{\n
        missingok\n
        monthly\n
        notifempty\n
        size 20M\n
        rotate 7\n
        compress\n
        create 0664 apache apache\n
}
"
## Cria arquivo do logrotate para o GLPI
rm $LOGROTATE_FILE
for CLIENTES in $(ls $GLPI_DIR | grep glpi ); do
        GLPI_LOGS="/var/www/html/$CLIENTES/files/_log/logfiles"
        echo -e $GLPI_LOGS >> $LOGROTATE_FILE
done
echo -e $LOGROTATE_PARAMS >> $LOGROTATE_FILE
sed -i 's/logfiles/\*.log/g' $LOGROTATE_FILE
## Executa o arquivo criado
logrotate -f /etc/logrotate.conf
E adicione a linha ao cron: (supondo que seu script está no /scripts)
@monthly  /scripts/logrotate_glpi.sh

terça-feira, 12 de maio de 2015

Queridos! Sim, estou sumido, mas é por conta de que estava trabalhando com outras ferramentas, mas voltei para o querido mundo Linux. Então, vamos voltar as nossas postagens sempre que possível, beleza? Então, segue o enterro :)

Situação

Estamos testando uma ferramenta, e foi necessário levantar algumas máquinas Linux. Criei 40 máquinas virtuais usando o CentOS (openSUSE me perdoe, mas a instalação do CentOS é muito rápida), e em determinado momento, foi identificado que o firewall dessas máquinas deveria ser desabilitado, além de que, era preciso colocar o nome das máquinas no arquivo /etc/hosts.

Problema

Acessar as máquinas remotamente e executar os comandos:
echo "127.0.0.1 $(hostname).intranet.cliente.br" >> /etc/hosts
chkconfig iptables off
iptables -F

Solução

Que eu teria de usar o ssh não era novidade, mas o problema é ter de passar a senha, isso seria desgastante. Eu precisava de uma forma de fazer essa entrada automaticamente. Me veio na cabeça o expect, mas esse cara nunca funcionou direito comigo (mesmo seguindo a risca cada tutorial).
Me bati com o sshpass pela webs, que resolveu minha vida (nesse momento e futuramente quando surgir a necessidade!)
Segue o comando:

for i in $(seq 10 1 54); do \
sshpass -p MinhaSenha ssh -oScrictHostKeyChecking=no 10.0.1.$i 'echo 127.0.0.1 $(hostname).intranet.cliente.br >> /etc/hosts'; done

Explico o necessário

O laço é por conta de que as máquinas estão do endereço IP 10.0.1.10 até o 10.0.1.54, conforme setado no escopo do dhcp. Como somente o último octeto varia, eu fiz um for que incrementa de um em um, começando do 10 e indo até o 54.

O sshpass vai passar a senha para o ssh quando for solicitado, mas só isso não resolve nosso problema, já que o ssh quando acessa uma máquina em que ainda não aceitou suas chaves, vai questionar isso pelo terminal. É aí que entra as opções do -o. Usando o parâmetro -oScrictHostKeyChecking=no, eu digo que ele não deve verificar as chaves naquele momento, e, daí pra frente, é só seguir com os comandos.

O echo 127.0.0.1 $(hostname).intranet.cliente.br >> /etc/hosts eu acho que ficou bem auto-explicativo, mas, pra quem não entendeu, eu estou adicionando no arquivo de hosts, o nome da máquina + o domínio.


Creio que não é necessário explicar o chkconfig iptables off (desabilitar o serviço iptables) e o iptables -F (limpar as regras do iptables) dentro do laço.
Então é isso galera. Essa linha me ajudou PRACARALHO e vai me ajudar muito quando for preciso acessar máquinas remotamente.

Observações

No meu caso, funcionou de maneira simples por conta de que as senhas das máquinas estão iguais. Mas, nada impede de que você tenha um .csv ou até mesmo uma lista com login e senha, e daí o seu script/one-liner cate cada parâmetro e encaminhe para o sshpass e o ssh. Tudo vai de sua imaginação e habilidade.

quinta-feira, 3 de julho de 2014

Uma das grandes vantagens de se utilizar o Zabbix, é as suas infinitas possibilidades de expansão. O shellscript é um grande aliado na coleta de informações, visto que qualquer informação que você possa obter com o shellscript, ela pode ser jogada no Zabbix. 

Nesse post, vamos mostrar por etapas como consultar dentro da base de dados do GLPI, o número de tickets fechados no mês e jogar essas informações no Zabbix, e gerar também gráficos, porque chefe gosta é de gráfico! :D


Vamos dividir esse tutorial em:
1. Banco de dados
1.1 Criação de usuário no banco
1.2 Criação do select
2. Shell Script
2.1 Criação do script
2.2 Teste de script
3. Configuração do Zabbix
3.1 Inserção do shell script
3.2 Criação do template
3.2.1 Criação do item
3.2.2 Criação do gráfico

domingo, 3 de junho de 2012

Imaginemos a situação:
Você possui um servidor que recebe os arquivos de backup, eles são guardados por 30 dias e depois são removidos, liberando espaço para os mais novos. Ah, lembre-se de ter um log dos arquivos removidos ;)
Um modo fácil de fazer essa rotação é guardando os backups em pastas por mês, por exemplo, todos os arquivos de Janeiro ficarão no diretório 01, Fevereiro no 02 e por aí vai...
Mas, caso não seja possível fazer isso, vamos montar um simples script para executar essa tarefa :)


#!/bin/bash
# Remove arquivos maiores que 30 dias e gera um log
FILENAME=FILES_$(date +%Y%m%d%H%M%m).log
find . -mtime +30 -exec echo {} \; > $FILENAME
rm -rfv $(cat $FILENAME)

A lógica é simples:
Na variável, eu crio um arquivo que possui um prefixo e como sufixo coloco:
  1. Ano, com 4 dígitos - %Y
  2. Mês, com 2 dígitos - %m
  3. Dia, com 2 dígitos - %d
  4. Horas, com 2 dígitos - %H
  5. Minutos, com 2 dígitos - %M
  6. Segundos, com 2 dígitos - %S

O Find irá buscar por arquivos que não modificados nos últimos 30 dias, exibindo os seus nomes e enviando o seu output para um arquivo, que será o log dos arquivos removidos naquele momento.

Após isso, o rm irá ler o arquivo gerado pelo find e removê-los um a um.

Mole né?

quinta-feira, 8 de março de 2012

O Case

Outro dia o amigo ElCheVive68 me pediu para fazer um script, que o auxiliaria em uma de suas tarefas, já que o equipamento comprado para tal demanda estava se confundindo nos cálculos :)

Nesse post, abordaremos apenas o tratamento do arquivo e como realizar a limpeza + cálculo dos valores.


Os arquivos

Estes continham em média 360 linhas, com valores em V/m (volts/minuto) e mV/m (microvolts/minuto). Era esperado que mostrasse:
  • A média do campo elétrico
  • O campo magnético
  • A potência

Eles são mais ou menos assim:
1sec  Logging at: Feb 04, 2012 Thu 10:32:36 Temp=+29.1 C
7.20V/m
7.23V/m
7.46V/m
[...]
7.46V/m
AUZ V/m
AUZ V/m
2.30V/m
2.18V/m
1.48V/m
 972mV/m
 972mV/m
 755mV/m
[...]
Recorded samples: 00366  Thu 10:38:44 Temp=+29.4 C
Max:14.6V/m   Avg:2.61V/m 

Segue arquivos de exemplo:

Baixe os arquivos e vamos começar a brincadeira :)
Lembrem de deixar esses arquivos no mesmo diretório do script. Eu sei que poderia ter melhorado isso, mas tô com preguiça ( mimimimimimimi )

HANDS ON!


Primeiro, vamos arrumar um lugar pra fazer nossa brincadeira:

[ -d output ] || mkdir output

Depois, vamos criar uma função, para deixar tudo bem organizado:
tratamento(){
LIST=output/$FILE
VERIFIED=output/${FILE}_verificado.txt
cp $FILE $LIST.out
dos2unix $LIST.out 


[ -d output ] || mkdir output irá criar um diretório chamado output, caso ele não exista;
OUTPUT="resultado.csv" é a variável que criará o arquivo com o resultado;
tratamento(){ é como iniciamos uma função em Shellscript;
LIST=output/$FILE é a variável que manterá o nome do arquivo que será tratado pelo script;
VERIFIED=output/${FILE}_verificado.txt gerará a saída dos arquivos já tratados.
 cp $FILE $LIST.out cria uma cópia do arquivo a ser tratado. Sempre trabalharemos com a cópia;
 dos2unix $LIST.out irá converter os arquivos de texto do padrão windows para o Unix - essa parte é MUITO IMPORTANTE.




Se o objetivo é realizar cálculos com os valores, então, temos de analisar o arquivo-fonte e deixar somente o que é necessário, no caso, os números. A melhor ferramenta para realizar essa limpeza é, na minha opinião, o sed:

 sed -i 's/ //g;/AUZ/d;/^$/d;/Recordedsamples/d;/Logging/d;/Max/d;' $LIST.out
Aqui, estamos:
sed -i - altera diretamente o arquivo de entrada;
's/ //g; - remove todos os espaços em branco;
/AUZ/d; - remove as linhas que contém o valor AUZ;
/^$/d; - Nas expressões regulares, '^' significa início de linha e '$' final de linha. Então, se juntarmos os dois, teremos uma linha vazia! Caso haja alguma em nosso arquivo, ela será removida.
/Recordedsamples/d; - Observem que no final do arquivo, temos esse trecho. Como o sed já removeu os espaços em branco, temos de ficar atentos às strings posteriores.
/Logging/d; - É o cabeçalho do arquivo. Inútil.
/Max/d;' - Última linha do arquivo. Inútil.
$LIST.out - O arquivo de entrada.
Com isso, teremos o arquivo apenas com os valores das cargas.

Mas, temos um pequeno problema: Temos valores em mV/m e em V/m!
Esse ponto é fácil de resolver, basta acharmos o valor total em mV/m e dividir por 1000. Com isso teremos o seu valor em V/m.
Apenas como forma de prevenção a outros problemas, devemos prevenir o caso de termos arquivos com apenas mV/m ou V/m. Faremos isso de maneira simples:
Usa-se o grep buscando, por exemplo, por mV/m. Se ele encontrar, o valor de retorno será 0, pois o comando foi executado com sucesso. Caso ele não encontre nenhum valor igual ao padrão especificado, ele retornará 1. Então, de posse dessas informações...


grep 'mV/m' $LIST.out > /dev/null ; [ $? = 0 ] && \
 MVM=$( bc <<< "scale = 3; $( grep 'mV/m' $LIST.out | tr -d 'mV/m' | paste -sd+ | bc ) / 1000 " ) \
 || MVM=0
 grep -E '*[0-9]V/m' $LIST.out > /dev/null ; [ $? = 0 ] && \
        VM=$( egrep '*[0-9]V/m' $LIST.out | tr -d 'V/m' | paste -sd+ | bc ) || VM=0


Então, aqui temos:
grep 'mV/m' $LIST.out > /dev/null ; [ $? = 0 ]: Um grep buscando por 'mV/m' no arquivo presente na variável com seu STDOUT direcionado para o /dev/null, uma maneira de ocultar a saída em tela. Caso o grep tenha sucesso em sua busca, ele retornará 0 na variável $?, e em seguida:
Fará uma nova busca pelo mesmo valor (mV/m), porém, redirecionará a saída para o tr;
O tr irá remover todos os padrões 'mV/m' encontrados no arquivo e jogará a saída para o paste;
O paste irá mudar a posição dos valores. Ao invés de um valor por linha, ele os colocará lado a lado e, utilizando como separador, um sinal de soma ( + ).
O bc, por sua vez, receberá o redirecionamento do paste, obtendo os valores, parecido com essa saída:
972+972+755+435+358+307+704+716+601+371+345+460+499+473+409+320+384+422+473+396
+396+371+371+371+371+358+512+499+486+332+358+371+371+358+371+371+396+384+345+33
2+345+358+384+358+332+345+358+358+332... 

Bom, aí o bc só soma e vai pra galera :)
Se ele não encontrar nenhum valor em mV/m, ele irá atribuir 0 a variável MVM, pois se esta estiver vazia, o bc não irá calcular e apresentará um erro.
Percebam também que existe um / 1000. Com isso, eu consigo igualar o valor dos mV/m aos V/m, facilitando o meu cálculo pela média do arquivo.

No trecho buscando V/m, eu faço algo parecido, exeto pelo fato que, deixo claro, utilizando expressões regulares, que quero apenas valores numéricos imediatamente seguidos por V/m ( *[0-9]V/m ). Do mesmo modo, caso não encontre nada em V/m, atribua 0 a variável VM.

De posse das variáveis MVM e VM com seus devidos valores, vamos ao final:

SUM=$( bc <<< "$MVM + $VM " )
LINHAS=$( wc -l $LIST.out | cut -f1 -d' ' )
MED=$( bc <<< "scale = 3; $SUM / $LINHAS" )
HAV=$( bc <<< "scale = 6; $MED / 377" )
SEQ=$( bc <<< "scale = 6; $MED ^ 2 /377" )

SUM é a soma dos valores de MVM (já convertidos em V/m) e VM;
LINHAS é a quantidade de valores válidos no arquivo;
MED é a média do campo elétrico;
HAV é o campo magnético e;
SEQ é a potência.

Depois disso, é só printar na tela, fechar a função e adicionar um laço para ler os arquivos que serão usados como STDIN :D

echo -e "Total = $SUM
Amostras = $LINHAS
Media = $MED
H = $HAV
Seq = $SEQ" > $VERIFIED

}

for FILE in $( ls *.TXT ); do
   tratamento
done

Prontinho! Seu script para fazer cálculos estranhos (hauhauhauhaa) está pronto! Todos os resultados estarão no diretório output (criado no diretório corrente do script).
Agora é só juntar tudo e... FINISH!


#!/bin/bash
# Rauhmaru, rauhmaru@opensuse.org
# ElCheVive68, elchevive68@opensuse.org
# Calcula valores
#
[ -d output ] || mkdir output
OUTPUT="resultado.csv"
tratamento(){
LIST=output/$FILE
VERIFIED=output/${FILE}_verificado.txt
 cp $FILE $LIST.out
 dos2unix $LIST.out
## LIMPEZA
 sed -i 's/ //g;/AUZ/d;/^$/d;/Recordedsamples/d;/Logging/d;/Max/d;' $LIST.out
## CALCULOS
 grep 'mV/m' $LIST.out > /dev/null ; [ $? = 0 ] && \
 MVM=$( bc <<< "scale = 3; $( grep 'mV/m' $LIST.out | tr -d 'mV/m' | paste -sd+ | bc ) / 1000 " ) \
 || MVM=0
 grep -E '*[0-9]V/m' $LIST.out > /dev/null ; [ $? = 0 ] && \
        VM=$( egrep '*[0-9]V/m' $LIST.out | tr -d 'V/m' | paste -sd+ | bc ) || VM=0
 SUM=$( bc <<< "$MVM + $VM " )
 LINHAS=$( wc -l $LIST.out | cut -f1 -d' ' )
 MED=$( bc <<< "scale = 3; $SUM / $LINHAS" )
 HAV=$( bc <<< "scale = 6; $MED / 377" )
 SEQ=$( bc <<< "scale = 6; $MED ^ 2 /377" )
## PRINTS
 echo -e "Total = $SUM
Amostras = $LINHAS
Media = $MED
H = $HAV
Seq = $SEQ" > $VERIFIED
 rm $LIST.out
}
for FILE in $( ls *.TXT ); do
tratamento
done
echo -e "Arquivo\tTotal\tAmostras\tMedia\tH\tSeq" > $OUTPUT
for i in $( ls output/*_verificado.txt ); do
LINHA=$( awk '{ print $NF}' $i | paste -sd'\t')
echo -e "$(basename $i | awk -F'.' '{ print $1}' )\t$LINHA" >> $OUTPUT
done

Pra dar mais uma incrementada, no final eu coloco os arquivos em um .csv, para que sejam visualizados no Calc ou Excel. Cada arquivo estará em uma linha, e os seus valores agrupados em coluna. :)

Um abraço!





domingo, 9 de outubro de 2011

Essa dica vai em homenagem ao pessoal que gosta de fazer downloads o dia inteiro e dão pití quando encontram uma url invertida heheheh

Inverter me lembra o golpe do grande mestre Lindomar, o Subzero Brasileiro, o LAI (Losango Aberto Invertido)


Outro dia meu amigo Antonio Brito (do cachorro cego) postou um filme do Donnie Yen no Buzz, aquele que fez "O Grande Mestre" (Ip Man, o mestre de Bruce Lee, lembraram?) e, eu todo empolgado, fui fazer o download. Chegando lá - SURPRAISEEEE!!! URL INVERTIDA!

SInceramente falando a verdade do fundo da minha alma: EU ODEIO ESSAS DESGRAÇAS. O gênio que inventou isso com certeza a mãe tá no brega.

Mas enfim, esse é até um problema simples. Como resolver? Simples:
1. Copie a url
2. Coloque em um arquivo (ex.: arquivo_com_links.txt)
3 Faça a mágica:
rev < arquivo_com_links.txt | sed "s/=lru\(.*\)//"


A base da solução é o comando rev. O modafoca inverte as strings que recebe como stdin, gerando o stdout completamente invertido. Coisa linda de Deus :3


UPDATE

 Todos os meus posts caem automaticamente no Buzz e isso gerou uma ótima discussão e apareceram várias maneiras de fazer o trabalho sujo :D

Brito levantou uma questão que quebrava minha primeira solução, que era de ter mais de um link. O simples "cat link.txt | rev | cut -f1 -d=" não resolveria, e teria problemas no link do Megaupload, que utiliza dois '=', obrigando que o one-liner possuísse um "if" e mudar o "cut -f1 -d=" para "cut -f1,2 -d=". Implementar essa condição estava me dando um trabalho do caralho, mas depois achei um modo mais simples de filtrar :D FuckYea



Enfim, graças a essa bela discussão, tivemos:

Addon para o Firefox, pelo Margeylson Ribeiro
https://addons.mozilla.org/pt-BR/firefox/addon/reverse-text/?src=search

Uma macro, para Excel, feita pelo Antonio Brito

Uma em python, pelo Alan Teixeira
x='link'
x[::-1]

Uma web, feita pelo Ivan Clay Moura
http://www.urlraiox.com/AntiProtecaoLinks.aspx


Um grande abraço, parabéns e muito obrigado a todos que colaboraram. Conhece mais algum método? Posta lá no Buzz!

quarta-feira, 21 de setembro de 2011

É ridiculamente fácil:

dmidecode --type 17 | sed -n 's/\t//;s/MHz/MHz\n/;s/wn/wn\n----/;/^Locator\|^Speed\|^Size/p'
 E teremos uma saída mais ou menos assim (eu uso só um módulo de 2GB DDR2/800MHz):


miharu-chan:~ # dmidecode --type 17 | sed -n 's/\t//;s/MHz/MHz\n/;s/wn/wn\n----/;/^Locator\|^Speed\|^Size/p'
Size: 2048 MB
Locator: DIMM_A1
Speed: 800 MHz

Size: No Module Installed
Locator: DIMM_A2
Speed: Unknown
----
Size: No Module Installed
Locator: DIMM_B1
Speed: Unknown
----
Size: No Module Installed
Locator: DIMM_B2
Speed: Unknown
----

Ordenado por tamanho de RAM, slot e velocidade. :D

Por mais que pareça uma besteira, procure treinar com saídas de comandos extensas e pratique o seu sed, awk, cut, grep, tr, sort, uniq e outros. Isso ajuda PRA CARALHO na hora de desenvolver scripts. Aprenda se divertindo manolos ;)

Ok, ok... Podem me chamar de desocupado e de penteadeira de puta... Mas ficou legal né? :D

segunda-feira, 7 de fevereiro de 2011

Dica rápida:

Situação:
Baixou um video do Youtube e quer extrair SOMENTE o audio? It's easy dude!!! Vamos no passo-a-passo:

1. Carregue o video. Quando ele estiver completamente carregado, verifique o diretório /tmp.
Adivinha quem está lá??? (o video, claro! LOL!!!11!). Ele fica com um nome bastante estranho, tiops Flashxaxou, algo assim. Sugiro que renomeie. Vamos usar no nosso exemplo o video que eu usei para fazer o teste, DJ J-Star-Techno Love Mix.flv
mv Flashxaxou DJ_J-Star-Techno_Love_Mix.flv

2. Instale o ffmpeg
zypper in ffmpeg

3. Agora é só converter:
ffmpeg -i DJ_J-Star-Techno_Love_Mix.flv -ab 256k output.aac
Eu especifiquei -i para mostrar as informações e depois um -ab (audio bitrate) para definir o bitrate da saída. Quanto maior, melhor - e maior o tamanho do arquivo. Atentem-se com qual é o bitrate original, para não tentar extrair com uma saída maior - o que será apenas ilusão.

Para mais informações, consulte a página do FFMPEG

Prontinho :D
Agora é só definir os metadados (artista, nome da faixa, ano e talz...). Recomendo o uso do entagged-tageditor


Ah, este é o video que usei:


Quem curte animes, vai gostar ;D
Um abraço!

quinta-feira, 23 de dezembro de 2010

Um alias é na verdade um apelido, um atalho para determinado comando. Muitas vezes executamos alguns comandos que vão recheados de opções: ls -lha, rm -rf, grep -i, free -m, df -h, du -sh, ps aux, e por ai vai... Devido a prática, já fazemos isso no automático.

Agora, imaginem só - Vamos a alguns exemplos:
* Você faz um rm e ele não lhe pergunta se você tem certeza de que quer remover esse arquivo. Bom né?
* Você faz um grep e a palavra que você procura aparece em uma cor diferente da padrão do terminal! Rapidamente você irá identificar qual é o termo procurado!
* Você faz um du em um diretório e ele automaticamente lhe diz qual é o tamanho da pasta em MB.

Esses e outros comandos possuem opções que geralmente utilizamos, que até já poderiam ser padrão. É isso que vamos fazer :D


Criando os alias


Existem duas maneiras de criar alias: Inserindo os apelidos no arquivo .alias ou no .bashrc, ambos
localizados na raiz do diretório home do usuário.

Para utilizar o arquivo .alias, verifique se existe a seguinte linha no seu .bashrc (se não existir, insira):
test -s ~/.alias && . ~/.alias || true

Após isso, insira os seus alias no arquivo .alias. A sintaxe é a seguinte:
alias apelido='comando real'

Vamos a um exemplo prático, por exemplo o meu .alias (não esqueça que você também pode inserir os comandos diretamente no .bashrc):
alias grep="grep --color"
alias fuck="rm -rf"
alias df="df -h"
alias free="free -m"
alias ..="cd ../"
alias ...="cd ../../"
alias ....="cd ../../../../"
alias ll="ls -lh"
alias la="ls -lah"

Após a inserção dos comandos, execute um source no arquivo:
source ~/.alias

Pronto galera, a partir de agora seus alias estão valendo! ;D
Use sua criatividade! Facilite sua vida!

sexta-feira, 10 de dezembro de 2010

Todos os dias vemos sites ficarem indisponíveis por causa de ataques DDOS (Ataques de negação de serviço distribuídos). Estes sites, aos que não sabem, foram pressionados pelos governos a proibirem o acesso a contas vinculadas ao Assange e/ou WikiLeaks. Some isso a prisão do Assange e... BOOOM! A ira de centenas de hackers e milhares de newbies mobilizaram-se para não deixar isso barato!

LOIC

Dentre as ferramentas que estão sendo utilizadas, uma se destaca na multidão: O LOIC (Low Orbit Ion Cannon). Essa ferramenta é capaz de realizar milhares de requisições ao endereço especificado. Talvez você sozinho não consiga atrapalhar um site inteiro, mas, quando temos mil pessoas realizando milhões de requisições por segundo diretamente em um servidor, dificilmente este aguentará.
Está rolando um script na Internet de como instalar esse brinquedinho, no princípio ele não suportava o openSUSE mas, meti mão e adicionei o suporte ao nosso queridinho :D
O script também pode ser encontrado no link http://pastebin.com/hKbZSGP6

#!/bin/bash
# Copyfuck © 2010 q
#
# This script installs, updates and runs LOIC on Linux.
#
# Supported distributions:
# * Ubuntu / Debian
# * Fedora
# * openSUSE
#
# Usage: bash install_loic.bash

###COLOURS###

txt_bld=$(tput bold)
bld_red=${txt_bld}$(tput setaf 1)
col_rst=$(tput sgr0)

###GLOBALS###

GIT_REPO=https://github.com/NewEraCracker/LOIC.git
GIT_BRANCH=master

###FUNCTIONS###

ensure_git() #Checks if git is installed, Tries to install it if not
{
type -P git &>/dev/null ||
{
echo -e "${bld_red}Git not found! Attempting to install...${col_rst}"
if [ -f /etc/SuSE-release ] ; then
sudo zypper install git
elif [ -f /etc/lsb-release ] ; then
sudo apt-get install git
elif [ -f /etc/fedora-release ] ; then
sudo yum install git
elif [ -f /etc/debian_version ] ; then
sudo apt-get install git
fi
}
}


is_loic_git()
{
[[ -d .git ]] && grep -q LOIC .git/config
}


is_loic() {
is_loic_git ||
{
[[ -d LOIC ]] && cd LOIC && is_loic_git
}
}

get_loic() {
ensure_git
if ! is_loic ; then
git init
git clone $GIT_REPO -b $GIT_BRANCH
fi
}

compile_loic() {
get_loic
if ! is_loic ; then
echo -e "${bld_red}Error: You are not in a LOIC repository.${col_rst}"
exit 1
else
if [ -f /etc/SuSE-release ] ; then
echo -e "${bld_red}mono-basic, mono-devel, monodevelop and mono-tools not found! Attempting to install...${col_rst}"
sudo zypper install mono-basic mono-devel monodevelop mono-tools
elif [ -f /etc/lsb-release ] ; then
echo -e "${bld_red}monodevelop and liblog4net-cil-dev not found! Attempting to install...${col_rst}"
sudo apt-get install monodevelop liblog4net-cil-dev
elif [ -f /etc/fedora-release ] ; then
echo -e "${bld_red}mono-basic, mono-devel, monodevelop and mono-tools not found! Attempting to install...${col_rst}"
sudo yum install mono-basic mono-devel monodevelop mono-tools
elif [ -f /etc/debian_version ] ; then
echo -e "${bld_red}monodevelop and liblog4net-cil-dev not found! Attempting to install...${col_rst}"
sudo apt-get install monodevelop liblog4net-cil-dev

fi
fi
mdtool build
}

run_loic() {
is_loic
if [[ ! -e bin/Debug/LOIC.exe ]] ; then
compile_loic
fi
type -P mono &>/dev/null ||
{
echo -e "${bld_red}mono-runtime not found! Attempting to install...${col_rst}"
if [ -f /etc/SuSE-release ] ; then
sudo yum install mono-runtime
elif [ -f /etc/lsb-release ] ; then
sudo apt-get install mono-runtime
elif [ -f /etc/fedora-release ] ; then
sudo yum install mono-runtime
elif [ -f /etc/debian_version ] ; then
sudo apt-get install mono-runtime
fi
}
mono bin/Debug/LOIC.exe
}

update_loic() {
ensure_git
if is_loic ; then
git pull --rebase
compile_loic
else
echo -e "${bld_red}Error: You are not in a LOIC repository.${col_rst}"
fi
}

case $1 in
install)
compile_loic
;;
update)
update_loic
;;
run)
run_loic
;;
*)
echo "Usage: $0 "
;;
esac


A primeira guerra cibernética está rolando... E você, quer se alistar? Acompanhe o @Anon_Operationn e @Op_Payback ;)

quinta-feira, 9 de dezembro de 2010

segunda-feira, 6 de dezembro de 2010

domingo, 5 de dezembro de 2010

sábado, 4 de dezembro de 2010

A resenha do mundo GNU agora é um novo patch de 200 linhas que melhora o desempenho do escalonador de processos. Depois, veio um sacaninha da red Hat e fez a mesma coisa, só que sem patch nenhum, só usando um pacote e configurando umas besteirinhas. #RedHatFuckYea \o/

Sou bastante meio incréduo quanto ao desempenho dessa dica, mas, muitas pessoas disseram que realmente funciona. Acho que meu problema é que meu hardware atende minhas necessidades e não se estressa assim tão fácil... Não é nenhuma máquina monstra mas atende as minhas necessidades com louvor :D
Como recentemente perguntam na lista de emails do openSUSE-PT onde ficava o rc.local, imaginei que essa dica fosse o motivo.
Bom, como a dica é bastante simples, fiz em um script. Basicamente ele verifica se o libcgroup1 está instalado, caso não esteja, ele instalará. Depois adiciona uma entrada no /etc/rc.d/boot.local e depois no .bashrc do root.

Enfim, vamos a dica?

#! /bin/bash
# Otimiza o desempenho do desktop
# Raul Liborio, rauhmaru@opensuse.org, 04122010

# -- VARIAVEIS
BOOTLOCAL=/etc/rc.d/boot.local
INSTALL="zypper in -y libcgroup1"
MSG="Apenas root pode realizar essa tarefa.
BASHRC='
if [ "$PS1" ] ; then\n
    mkdir -p -m 0700 /cgroup/cpu/user/$$\n
    echo $$ > /cgroup/cpu/user/$$/tasks\n
fi
'
escalonador(){
    chkconfig cgconfig on
    echo "/bin/mkdir -m 0777 /cgroup/cpu/user" >> $BOOTLOCAL
    echo -e $BASHRC >> ~/.bashrc
}

# -- CORE
[ "$USER" != "root" ] && echo $MSG; exit 1
[ -f /lib/libcgroup.so.1 ] && escalonador && exit 0 || $INSTALL &&
escalonador && exit 0


Use(m) por conta própria e risco!
Brincadeira.. o script n faz nada de nocivo. Leia o source e veja ;)

Posts populares