Sem categoria

Inserindo metadados de latitude e longitude em imagem no Linux

Para quem não habilitou a função de localização no dispositivo móvel e a foto foi registrada sem a posição de latitude e longitude é possível inserir manualmente com o comando exiftool.

Para instalar em Debian e derivados é só rodar um apt

apt install exiftool

E para inserir os metadados basta rodar o comando:

exiftool -XMP:GPSLatitude="31.6348373" -XMP:GPSLongitude="-8.1479418" -P "marrocos-01.jpg"

Será gerado uma cópia do arquivo e mantendo o original.

Para verificar se os metadados realmente foram inseridos é só rodar o comando:

exiftool -gpslatitude -gpslongitude marrocos-01.jpg

ou com o ImageMagick:

identify -verbose marrocos-01.jpg | grep GPS

Caso você não tenha a latitude/longitude, uma sugestão é usar o Nominatim, um geocoder para OpenStreetMap.

Padrão
Sem categoria

Transforme linha separada por vírgulas em 1 coluna

Apareceu uma demanda de validar e-mail para uma campanha, mas estava todos numa mesma linha e separada por vírgula e nesse padrão não seria possível avançar na validação. Seguem abaixo três formas para transformar linha separada por vírgulas em 1 coluna.

Na linha de comando com SED

sed -i 's/,/\n/g' seu-arquivo.txt

Na linha de comando com TR

tr ',' '\n' < seu-arquivo.txt > seu-novo-arquivo.txt 

Ou pelo site https://convert.town/comma-separated-list-to-column

Referências: Turn comma-separate rows into 1 column

Padrão
Sem categoria

Exim – routing defer (-51): retry time not reached

Por um problema nas entregas de mensagens, encontrei o erro routing defer (-51): retry time not reached no log do Exim, isso num servidor com WHM/Cpanel.

E o espaço em disco estava ficando menor muito rápido, ao ponto de ocupar todo o disco e travar todos os serviços.

A solução que encontrei foi limpar todas as mensagem não enviadas com o comando

exim -bp | awk '/^ *[0-9]+[mhd]/{print "exim -Mrm " $3}' | bash

E depois apagar o arquivo eximstats_db.sqlite3

rm /var/cpanel/eximstats_db.sqlite3 -fr
/scripts/restartsrv_tailwatchd
/scripts/import_exim_data /var/log/exim_mainlog

Referências: The system cannot open the database eximstats_db.sqlite3

Padrão
Sem categoria

Como adicionar tempo de leitura no WordPress sem usar o plugin

Num projeto recente previa a implementação de uma funcionalidade que calculasse o tempo de leitura no artigos, tem bons plugins como Reading Time WP e outros, mas optei por uma solução sem necessidade de plugin.

Pegue esse código e insira em functions.php do seu tema

Para aparecer no seu template é só inserir o código

<?php echo reading_time(); >

Artigo baseado em How to Add Reading time in WordPress without using plugin

Padrão
Linux

Usando Imapsync

Exemplo simples

imapsync --host1 mail.seuservidor1.tld --user1 "seuemail1@seuservidor1.tld" --password1 "suasenha" \
--host2 mail.seuservidor2.tld --user2 "seuemail1@seuservidor2.tld" --password2 "suasenha" \
--authmech1 PLAIN --authmech2 PLAIN -ssl1 -sep1 "." --prefix1 ""

Migrando mensagem da Locaweb para um servidor com CPanel padrão

imapsync --nofoldersizes --skipsize --syncinternaldates --useheader 'Message-Id' -ssl2 -sep1 "." --prefix1 "" \
--host2 mail.seuservidor2.tld --user2 "seuemail1@seuservidor1.tld" --password2 "suasenha" --authmech1 PLAIN \
--host1 email-ssl.com.br --user1 "seuemail1@seuservidor2.tld" --password1 "suasenha" --authmech2 PLAIN \
--f1f2 INBOX.enviadas=INBOX.Sent --f1f2 INBOX.lixo=INBOX.Trash --f1f2 INBOX.Mala_Direta=INBOX.spam --f1f2 INBOX.rascunho=INBOX.Drafts
Padrão
Linux

Extraindo mensagem de arquivo maildir

Por dez anos usei um servidor próprio para hospedar o serviço de e-mail meu e de clientes/parceiros.

No início usei uma solução bem artesanal, mas depois adotei o IRedMail (uma ótima solução para quem deseja criar uma solução profissional para servidor de mensagens e 100% Free Software e OpenSource).

Recentemente resolvi abandonar a ideia ter que um servidor próprio e passei a usar os serviços do HostGator, para reduzir custos e tempo de gestão.

Optei por não migrar todas as mensagens para pro HostGator, baixei todas as mensagens no Thunderbird e simples recriei as contas no novo servidor. E só recentemente percebi que determinadas mensagens não foram migradas ou anexo não vieram 🙁 precisei de um anexo e não estava onde deveria.

Antes de apagar o servidor eu fiz um backup das mensagens, compactando o diretório /var/mail. O IRedMail usa por padrão o formato maildir. Como já tinha em mãos o Assunto da mensagem, com o comando grep localizei o arquivo. O problema agora era extrair o anexo de um arquivo. Foi então que descobri o comando mu extract.

Instalei o pacote maildir-utils via apt, que é quem fornecer o comando.

Por fim, para extrair o arquivo anexado rodei o comando:

mu extract mensagem.mail -a
Padrão
Linux

Instalando Imapsync em Debian 9

Sempre que preciso migrar mensagens de um servidor para o outro, via protocolo IMAP, uso o Imapsync. Para quem deseja instalar ele em Debian 9, segue abaixo as instruções:

Instalando dependências

apt install -y libauthen-ntlm-perl libcgi-pm-perl libcrypt-openssl-rsa-perl \
libdata-uniqid-perl libencode-imaputf7-perl libfile-copy-recursive-perl \
libfile-tail-perl libio-socket-inet6-perl libio-socket-ssl-perl libio-tee-perl \
libhtml-parser-perl libjson-webtoken-perl libmail-imapclient-perl \
libparse-recdescent-perl libmodule-scandeps-perl libreadonly-perl \
libregexp-common-perl libsys-meminfo-perl libtest-requires-perl cpanminus \
libterm-readkey-perl libtest-mockobject-perl libdist-checkconflicts-perl \
libtest-pod-perl libunicode-string-perl liburi-perl libwww-perl \
libtest-nowarnings-perl libtest-deep-perl libtest-mock-guard-perl \
libtest-warn-perl make libpar-packer-perl libtest-fatal-perl git-core

Baixando o código

git clone https://github.com/imapsync/imapsync.git

Instalando

cd imapsync
make install
Padrão
Sem categoria

Bloqueando Drupalgeddon2 com Fail2ban

Recentemente tive que limpar alguns sites com Drupal 7 que foram alvos da vulnerabilidade CVE-2018-7600 / SA-CORE-2018-002, conhecido como Drupalgeddon2.

Mesmo que tenha que limpado os efeitos colaterais e atualizado o core resolvi implementar uma regra no Fail2ban para que aqueles ataques que tentassem explorar a vulnerabilidade à partir de um método conhecido não pudesse explorar outra forma.

Testei um exploit em Ruby e outro em Python que exploram a vulnerabilidade e usei dois trechos para o Fail2ban identificar e bloquear a ação.

Acrescentei em /etc/fail2ban/jail.local

[drupalgeddon2]
enabled = true
filter = drupalgeddon2
port = http,https
action = iptables-multiport[name=drupalgeddon2, port=”http,https”, protocol=tcp]
# logpath = /var/log/apache2/*.log
logpath = /var/log/nginx/*.log
bantime = 84600
maxretry = 1

e em /etc/fail2ban/filter.d/drupalgeddon2.conf 

[Definition]
failregex = ^ .* “.*passthru&name.*” .*$
^.*GET.*(?i)passthru&name.*
ignoreregex =

Padrão