Aggiungere spazio disco su una vecchia DL360 G7

Ho avuto la necessità di aggiungere un paio di dischi alla vecchia DL360 G7, ma installare è stato un attimo, molto più lungo farf rigenerare il RAID5…

I comandi che ho dato sotto Proxmox per aggiungere i dischi al raid

ssacli ctrl slot=0 ld 1 add drives=2I:1:6,2I:1:7

Una volta finita la sincronizzazione dei dischi ho controllato che tutto fosse a posto

root@pve:/var/log# ssacli ctrl slot=0 ld all show status
logicaldrive 1 (2.18 TB, RAID 5): OK
root@pve:/var/log# ssacli ctrl slot=0 pd all show status
physicaldrive 1I:1:1 (port 1I:box 1:bay 1, 600 GB): OK
physicaldrive 1I:1:2 (port 1I:box 1:bay 2, 600 GB): OK
physicaldrive 1I:1:3 (port 1I:box 1:bay 3, 600 GB): OK
physicaldrive 1I:1:4 (port 1I:box 1:bay 4, 600 GB): OK
physicaldrive 2I:1:5 (port 2I:box 1:bay 5, 600 GB): OK
physicaldrive 2I:1:6 (port 2I:box 1:bay 6, 600 GB): OK
physicaldrive 2I:1:7 (port 2I:box 1:bay 7, 600 GB): OK

A questo punto ho ampliato il ld con

ssacli ctrl slot=0 ld 1 modify size=max forced

Ho dovuto fare il reboot per far vedere al PVE la nujova dimensione del disco (!)

growpart -h

per conferma e poi un

root@pve:~# growpart /dev/sda 3
CHANGED: partition=3 start=1050624 old: size=4686186647 end=4687237271 new: size=7029805207 end=7030855831
root@pve:~# zpool status
pool: rpool
state: ONLINE
scan: scrub repaired 0B in 00:05:58 with 0 errors on Sun Apr 10 00:29:59 2022
config:
NAME                                            STATE     READ WRITE CKSUM
rpool                                           ONLINE       0     0     0
  scsi-3600508b1001c28197d35b0c71acc18d8-part3  ONLINE       0     0     0
errors: No known data errors

ed espando il volume logico con

root@pve:~# zpool online -e rpool scsi-3600508b1001c28197d35b0c71acc18d8-part3

Huawei AT + SMS

Oggi mi sono imbattuto in un problema molto particolare…

Dovevo per lavoro configurare una chiavetta USB huawei per inviare e ricevere SMS con i comandi AT.

Inserisco la chiavetta nella porta USB ed ottengo la coppia (verificata tramite lsusb)

Bus 001 Device 025: ID 12d1:1f01 Huawei Technologies Co., Ltd. E353/E3131 (Mass storage mode)

Quando la cofigurazione è impoostabile via web la chiavetta si presenta

Bus 001 Device 026: ID 12d1:14db Huawei Technologies Co., Ltd. E353/E3131

Forzandola con usb_modemswitch e con il file

12d1:1f01

il cui contenuto è

Huawei E353 (3.se) and others

TargetVendor=0x12d1
TargetProduct=0x155e
MessageContent=”55534243123456780000000000000011063000000100010000000000000000″

Bus 001 Device 028: ID 12d1:155e Huawei Technologies Co., Ltd. HUAWEI_MOBILE

vengono esposte tre porte seriali che consentono di inviare (solo sulla prima) i comandi AT per la gestione del modem per (esempio) inviare e ricevere sms.

Ma a questo punto ho trovato il problema.

Volendo eliminare il blocco del PIN della SIM per poter gestire rapidamente i miei comandi AT, quindi:

il comando

AT+COPS=?

server per interrogare il modem per vedere quali operatori vede e la banda usata:
+COPS: (2,”I TIM”,”TIM”,”22201″,7),(1,”I TIM”,”TIM”,”22201″,2),(1,”I TIM”,”TIM”,”22201″,0),(3,”WINDTRE”,”WINDTRE”,”22288″,7),(3,”ILIAD”,”ILIAD”,”22250″,7),(3,”v)

invece il camando

AT+CMGF=1

imposta l’invio di SMS in formato ASCII, ma tentando di inviare lo SMS ottenevo

AT+CMGS=”+393481122334″
+CMS ERROR: 302

e lo stesso per la verifica del centro servizi!

AT+CSCA?
+CSCA: “002B003300390033003300350039003600300039003600300030”,145

ne un banale ATZ ha messo a resettato l’errore.

Per recuperare l’errore ho reimpostato il PIN sulla SIM e verificato

at+cpin?
+CPIN: SIM PIN

ed una volta sbloccato

AT+CPIN=”0000″

AT+CSCA?
+CSCA: “+393359609600”,145

OK
AT+CMGF=1
OK
AT+CMGS=”+393341122334″

Funziona ….
+CMGS: 1

Che il problema sia solo sul blocco/sblocco del PIN ?

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…