Logrotate e MongoDB

Il server finisce lo spazio e MongoDB non funziona più.. Un classico .

Lo spazio finisce in quanto MongoDB logga una marea di dati e non viene installato di default una configurazione di logrotate per MongoDB, ma il problema (dopo) si risolve facilmente:

eseguire

vi /etc/logrotate.d/mongodb

ed inserire

/var/log/mongodb/*.log {
daily
rotate 30
compress
dateext
missingok
notifempty
sharedscripts
postrotate
/bin/kill -SIGUSR1 cat /var/lib/mongodb/mongod.lock > /dev/null 2>&1 || true
endscript
}

Per testare che tutto sia a posto eseguire

logrotate -vdf mongodb

Verificare sempre che il file sia di root e i permessi settati a 644

FTPS per Vsftpd e gestione della modalità passiva

l’FTP trasferisce userid e password in chiaro e per evitrare che un malandrino possa recuperare le info, si abilita l’TLS con certificato.

Per prima cosa creare un certificato self-signed con

sudo openssl req -x509 -days 365 -newkey rsa:2048 -nodes -keyout /etc/vsftpd.pem -out /etc/vsftpd.pem

Una volta creato bisogna dire a vsftpd di utilizzarlo in aggiungendo al /etc/vsftpd.conf queste righe:

# enable TLS/SSL
ssl_enable=YES

# force client to use TLS when logging in
allow_anon_ssl=NO
force_local_data_ssl=NO
force_local_logins_ssl=NO
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH

# specify SSL certificate/private key (Debian/Ubuntu)
# For CentOS/Fedora/RHEL, replace it with /etc/vsftpd/vsftpd.pem
rsa_cert_file=/etc/vsftpd.pem
rsa_private_key_file=/etc/vsftpd.pem

# define port range for passive mode connections
pasv_max_port=50000
pasv_min_port=5099

Ho settato a NO le due righe del “force_local…” in quanto voglio lasciare aperta la possibilità di ciollegarsi anche con il banale ftp

Far ripartire vsftpd con un

service vsftpd restart

Sono state anche inserite, tanto non fa male, le porte da utilizzare per l’ftp passivo.
Potrebbe essere terminato qui il tutto… ma non è così!
Il protocollo FTP è molto rognoso in quanto spostando la connessione su passive gira al client la coppia ip:porta sulla quale connettersi:
il server non sa di avere un l’indirizzo esterno e gira l’indirizzo che lui conosce, il suo ip interno

pasv_enable=YES
pasv_addr_resolve=YES 
#pasv_address=xxx.xxx.xxx.xxx <=my external Ip  
pasv_address=domain.com.com <= my domain

con le righe qui sopra, il server fornirà le corrette coordinate ip:porta senza possibilità di errore.

Log log ed ancora log

Lavorando con appliocazioni i log sono fondamentali, soprattutto pewr lo start di servi ed altro..

Per essere sicuri che tutto sia partito correttamente bisogna trovare nei log quella parolina magica che ti tranquillizza, tipo Started, Running … od altro

A me serviva una cosa che potesse funzionare e dopo aver cercato in rete ho generato questo mostro:

cd /home/user_APP/APP_HOME
export JAVA_HOME=/home/user_app/JAVA/jdk-14.0.2
if ! [[ "$PATH" =~ "user_app" ]]; then
export PATH=/home/user_app/jdk-14.0.2/bin:$PATH
fi
for app in app1 app2 app3 app3 app4 app5
do
pyfiglet -f poison $app
cd $app
./start.sh
while IFS= read -r LOGLINE || [[ -n "$LOGLINE" ]]; do
printf '%s\n' "$LOGLINE"
[[ "${LOGLINE}" =~ "Started" ]] && break
done < <(timeout 300 tail -f Service.out)
cd ..
done

In questo modo vengono lanciate in sequenza delle diverse appX , visualizzato l’out di spingboot per verificare che non ci siano problemi.

Una piccola nota, siccome dove si trova l’applicazione viene lanciata o a mano o dall’autoscaling group di AWS , ho dovuto mettere alcune variabili di ambiente all’interno dello script ed anche la verifica dell’impostazione della variabile PATH.

ancora la riga (timeout 300 tail -f Service.out) imposta a massimo 5 minuti l’attesa per aspettare la stringa Started che da la conferma della corretta partenza del microservizio.

Bash Indirect expansion

Ma che figo !

oggi dovevo fare un programmino per recuperare all’interno di una riga un numero variale di elementi. Mi serviva una cosa “quick and dirty” ed alla fine ho trovato (e non lo sapevo, ma speravo che esistesse) la “indirect expansion” di bash.

in soldoni ecco il programmino:

#!/bin/bash
while IFS="," read f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15
do
for index in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
do
findex="f$index"
if [ "${!findex}" != "" ]
then
echo ${!findex}
fi
done
done<estrazione.txt

Notate il ! davanti findex: indica di espandere la variabile come una variabile preesistente, non come una nuova variabile:

Funzione fondamentale nei cicli for dove cicli su una numero notevole di variabili !!

Si ma come su utilizza il DB Oracle da PHP?

E’ vero, avevo scritto come ripristinare il funzionamento fra PHP e DB oracle, ma come l’avevo fatto ? Bho !!

Alla fine mi sono messo d’impegno per capire come e questi sono i passi :

Innanzitutto dal sito di Oracle, bisogna prendere i pacchetti del client Oracle, ma ci sono due difficoltà: la prima che bisogna registrarsi sul sito di Oracle per prelevare i pacchetti, che però sono pacchettizzati come rpm, ma possono essere convertiti facilmente da rpm id deb tramite alien; una volta a disposizione i pacchetti deb lanciare

dpkg -i oracle-instantclient18.5-sqlplus_18.5.0.0.0-4_amd64.deb
dpkg -i oracle-instantclient18.5-devel_18.5.0.0.0-4_amd64.deb
dpkg -i oracle-instantclient18.5-basic_18.5.0.0.0-4_amd64.deb

Seguito da

apt install php-dev php-pear build-essential libaio1

Aggiornare il repository del pecl

pecl channel-update pecl.php.net

a questo punto è possibile lanciare l’installazione vero e propria della libreria per il php, ma servono un paio di informazioni aggiuntive:

la versione che io ho installato era relativa alla version di php 7.4 e per lanciare la versione corretta di sorgente oci bisogna lanciare

pecl install oci8-2.2.0

che indica che la versione da installare è la 2.2.0 e non l’ultima (oggi è la 3.0.1) in quanto la 3.x è per la versione 8.0 del php ed inoltre bisogna cercare la di della libreria di Oracle: ne mio sistema è sotto /usr/lib/oracle/18.5/client64/lib

Quindi lanciare

pecl install oci8-2.2.0

ed alla richeta del path digitare

instantclient,/usr/lib/oracle/18.5/client64/lib

una volta terminate l’installazione bisogna creare/modificare il file /etc/ld.so.conf.d/oracle.conf

vi /etc/ld.so.conf.d/oracle.conf inserndo

/usr/lib/oracle/18.5/client64/lib

e poi

ldconfig

inserire all’interno dei due php.ini la riga

extension=oci8.so

e poi (nel caso di php-fpm per nginx) un

service php7.4-fpm restat

o

service apache2 restart

se tutto è filato liscio come dovrebbe essere stato con

php -i | grep -i OCI

avrete la conferma che le librerie di oracle sono utilizzabili !!

Piwigo e caricamento bulk

Non ho resistito…

ho messo da parte il mio scriptino bash basilare per passare ad uno script “più meglio assai di più” (forse) in python, che fa la stessa cosa, ma anche di più in quanto è ricorsivo.

Le immagini (per evitare spechi di banda e di spazio) sono ridotte, croppate ed aggiunto il bordino bianco che fa tanto anni 80!

#!/usr/bin/python3
import PythonMagick as Magick
from ftplib import FTP_TLS
import sys, os
import os.path
from pathlib import Path
 
def resize_and_crop(directory, photo):
    """
    Resize and crop image
    :param filename
    """
    img = Magick.Image(directory+'/'+photo)

    img.crop("4200X2800+20+20")
    img.resize("1600x1000");
    img.enhance() #full compression
    img.borderColor("white") #full compression
    img.border("20x20+0+0") #full compression
    img.magick('JPG')
    img.write('/tmp/'+photo)


if len(sys.argv) < 2:
    print("Devi passare il nome della directory da inviare allo script!")
    print("Sto uscendo...")
    sys.exit()

nome_script, directory_immagini = sys.argv

rootfs="/home/user/Immagini/"+directory_immagini
destdir="/public_html/photo/galleries/"+directory_immagini

if (os.path.isdir(rootfs) == False):
    print("Devi esistere il nome della directory da inviare allo script!")
    print("Sto uscendo...")
    sys.exit()
    
ftps = FTP_TLS('ftp.sito.com')
ftps.set_debuglevel(1)
ftps.set_pasv(True)
ftps.connect(port=21, timeout=80)
ftps.login('userid', 'password')
ftps.prot_p()
ftps.ccc()
try:
       ftps.cwd(destdir)
except Exception:
       ftps.mkd(destdir)
for (dir, _, files) in os.walk(rootfs):
       newdir=destdir+dir[len(rootfs):len(dir)]
       try:
               ftps.cwd(newdir)
       except Exception:
               ftps.mkd(newdir)
               ftps.cwd(newdir)
               print('Created new dir on remote')
       for f in files:
           head, tail = os.path.split(f)
           print(newdir)
           ftps.cwd(newdir)
           try:  
               print(ftps.size(f))
           except Exception:
                   resize_and_crop(dir, f)
                   file = open(os.path.join('/tmp', f),'rb')
                   cur_dir=(os.path.abspath(os.curdir))
                   os.chdir("/tmp")
                   ftps.set_debuglevel(1)
                   ftps.storbinary('STOR '+f, file,blocksize=8192)
                   ftps.set_debuglevel(0)
                   os.chdir(cur_dir)
                   file.close()
                   os.remove(os.path.join('/tmp', f))
ftps.close()

E uno script quick and dirty, ma sono interessanti gli utilizzi della libraria PythonMagick che consente di utilizzare da python i pacchetti grafici di ImageMagick e l’utilizzo di FTPS (come già riportato in un post precedente) per l’invio delle foto in sicurezza.. o quasi.

Per PythonMagic ho avuto alcuni problemi in quanto i sorgenti sono fermi alla version 2 di python, ma per fortuna sul repository di Ubuntu era disponibile il pacchetto python3-pythonmagick che mi ha tolto dall’impasse.

Cercando sulla rete NON HO TROVATO alcun documento che mi fornisse indicazioni su come utilizzare la libreria PythonMagick. Tuttavia seguendo diverse indicazioni che ho trovato, mi sono basato sugli esempi e note di Magick++ la controparte in C++ di Python l’utilizzo delle librerie di ImageMagick.

FTPS (si.. FPTS e non SFTP !) in bash Ubuntu 20.10

Per pubblicare le foto che scatto durante le partite di Rugby, ho utilizzato per diverso tempo il “banale” FTP, con tutti i problemi di sicurezza del caso.. (userid e password in chiaro e disponibile a TUTTI!!)

Facendo però FTP con fileZilla, vedevo che potevo utilizzare l’FTPS, l’FTP con criptazione.

L’FTP è uno dei primi protocolli/servizi di internet, insieme al telnet. All’inizio di internet (o per meglio dire di arpanet) non esistevano problemi di sicurezza e le password erano inviate sulla rete in chiaro (lo stesso protocollo pop ne è vittima).

Per ovviare a questi problemi di sicurezza, fu affiancato al protocollo FTP anche il servizio di TLS (Transport Layer Security) e SSL (Socket Secure Layer) in maniera di ottenere un riconoscimento e trasferimento dati sicuro, cifrato.

Con Ubuntu per fare questo ho utilizzato lftp con un piccolo file di configurazione: .lftprc

il contenuto del file è il seguente:

set ftp:ssl-auth TLS
set ftp:ssl-force true
set ftp:ssl-protect-list yes
set ftp:ssl-protect-data yes
set ftp:ssl-protect-fxp yes
set ssl:verify-certificate no

e nel mio batch viene utilizzato in questo modo

lftp -u userid,password ftp.miosito.com << EOF
cd /public_html/photo/galleries/$1
put /tmp/${file}
bye
EOF

Nel titolo ho detto non SFTP, in quato l’SFTP è un figlio del SSH ed ha bisogno del servizio SSH disponibile…

VmWare e UUID

Dopo aver installato un Ubuntu server in un ambiente gestito da VmWare ho verificato che il log produceva diversi errori…

prod multipathd[794]: sdb: failed to get sysfs uid: Invalid argument
prod multipathd[794]: sdb: failed to get sgio uid: No such file or directory
prod multipathd[794]: sda: add missing path
prod multipathd[794]: sda: failed to get udev uid: Invalid argument
prod multipathd[794]: sda: failed to get sysfs uid: Invalid argument
prod multipathd[794]: sda: failed to get sgio uid: No such file or directory
prod multipathd[794]: sdb: add missing path
prod multipathd[794]: sdb: failed to get udev uid: Invalid argument
prod multipathd[794]: sdb: failed to get sysfs uid: Invalid argument
prod multipathd[794]: sdb: failed to get sgio uid: No such file or director

cercando in rete ho trovato:

By default VMWare doesn’t provide information needed by udev to generate /dev/disk/by-id.
This can be done by setting the following:
Start the vSphere Client, and log in to a vCenter Server.
Select Virtual Machines and Templates and click the Virtual Machines tab.
Right-click the virtual machine for which you are enabling the disk UUID attribute, and select Power > Power Off.
The virtual machine powers off.
Right-click the virtual machine, and click Edit Settings.
Click the Options tab, and select the General entry in the settings column.
Click Configuration Parameters. The Configuration Parameters window appears.
Click Add Row.
In the Name column, enter disk.EnableUUID.
In the Value column, enter TRUE.
Click OK and click Save.
Power on the virtual machine.

Generatore di firewall per Linux / IpTables

Volendo implementare un firewall sul mio server casalingo, avevo pensato a diverse soluzioni, ufw, firewall-builder e tanti altri, ma nessuno mi faceva capire esattamente cosa e come fare.

L’unico era firewall-builder, ma non è aggiornato da moltissimo tempo, non è assolutamente user-friendly anche se possiede un interfaccia grafica.

Navigando su internet, molto tempo fa, ho trovato un sito che a fronte di semplici click, produceva un file ascii che poteva essere dato in pasto a linux utilizzando solo iptables: il sito per completezza è raggiungibile via http://easyfwgen.morizot.net/gen/

Ho preso il sorgente e dopo averlo modificato ho messo in linea il prodotto finale: al 90% fa quello che dovrebbe fare, ma vi prego di prestare attenzione, in quanto potrebbero esserci degli errori.

L’indirizzo al quale puntare il browser è

http://firewall.corsaro.biz

Speriamo che vi interessi come ha interessato me.