Archivi tag: server

Column count of mysql user is wrong: soluzione al problema

Sebbene la comparsa di nuove versioni MySQL è sempre stata contenuta, non è possibile contenere completamente disagi e comparsa di errori come Column count of mysql user is wrong o simili successivi a necessari aggiornamenti al software di database ed alle dipendenze.
L’aspetto da tenere in ulteriore considerazione è anche quello dell’esistenza di configurazioni non omogenee, quindi la libertà di poter raggiungere la propria configurazione di riferimento significa dover fare scelte differenti al momento dell’installazione e in occasione degli aggiornamenti.

Column count of mysql user is wrong: cosa fare quando compare questo errore

Perché compare l’errore Column count of mysql user is wrong

Come citato, la configurazione MySQL di un sistema è il risultato di scelte di installazione ed aggiornamento del software di database, di librerie e dipendenze, attività di migrazione da sistemi ereditati. È proprio questo ultimo scenario la combinazione più probabile che espone all’errore focalizzato in questo articolo: versioni differenti del motore MySQL introducono meccanismi diversi di privilegi e permessi, specialmente tra generazioni major distanti.

Questo problema si riesce per esempio a replicare quando dati storici non vengono esportati in uscita con mysqldump, oppure il lancio di un comando GRANT produce un errore.

Sistemare le tabelle dei privilegi per la versione corrente

MySQL mette a disposizione il programma mysql_upgrade (già mysql_fix_privileges_table ) per questo scopo.

Dopo aver salvaguardato i dati con una copia di sicurezza, è possibile lanciare tale comando come se si trattasse del programma “client” mysql ovvero:

mysql_upgrade -uroot -p

ottenendo un risultato simile al seguente

[root@carbonio ~]# mysql_upgrade -uroot -p
Enter password:
Looking for 'mysql' as: mysql
Looking for 'mysqlcheck' as: mysqlcheck
Running 'mysqlcheck'...
bh1.categorie OK
bh1.contact_requests OK
bh1.origine_dati OK
bh1.sotto_categorie OK
bh1.super_categorie OK
impiego.dump OK
impiego.offerte OK
mysql.columns_priv OK
mysql.db OK
mysql.func OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.host OK
mysql.proc OK
mysql.procs_priv OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
web.config OK
Running 'mysql_fix_privilege_tables'...
OK
[root@carbonio ~]#

Sono disponibili alcune direttive ulteriori per un utilizzo avanzato, consultabili attraverso il man del comando.

Errore 550 di outlook.com: soluzione al problema SC-001

A seguito di monitoraggio proattivo di una infrastruttura dedicata al servizio di posta elettronica, si presentano eventi aggressivi di blocco in invio di messaggi di posta elettronica ed è comune trovarsi di fronte ad un errore 550 di outlook.com che si presenta come un rifiuto a prendere in carico email indirizzate ai clienti Microsoft.

Essendo assolutamente legittimo per l’azienda tutelare l’efficenza della consegna di posta elettronica privilegiando fonti con la migliore reputazione possibile, sembra che in alcune occasioni sia davvero restrittiva. Infatti la tecnologia SmartScreen oltre ad effettuare controlli comuni verso dominio, indirizzo IP, DNS, SPF, DKIM, DMARC, oggetto, contenuto, liste di reputazione condivise, valutazione dei reclami mette in campo altre azioni proprietarie. Sebbene nella sezione di risoluzione dei problemi del sito Postmaster di oulook.com presenti delle opzioni comuni da poter verificare, non aiuta nella soluzione del caso particolare.

errore 550 di outlook.com visibile come estratto ritornato da postfix

Errore 550 di outlook.com del tipo SC-001

Nell’estratto di una email d’esempio, il tentativo di inoltrare ad outlook.com qualsiasi messaggio viene bloccato ed il MAILER DAEMON in questo caso presenziato da un setup Postfix comunica il fallimento. Il dettaglio del codice richiamato riporta:

550 SC-001 Messaggio rifiutato da Outlook.com per conformità ai criteri. I motivi del rifiuto possono essere correlati a contenuti con caratteristiche di posta indesiderata o alla reputazione dell’IP o del dominio. Se non sei l’amministratore della rete o della posta elettronica, contatta il tuo provider di servizi Internet o di posta elettronica per assistenza.

Il prossimo passo è stato quindi della richiesta di un accesso allo strumento Smart Network Data Service che consente praticamente di vedere il punto di vista interno ad outlook.com per specifici domini/IP/utenti che intendono comunicare con la loro rete. Compilando il modulo dentro Request Access si ottiene il privilegio di poter consultare, anche in modalità automatica, i dati in View Data per avere già indicazioni di complaints e catture delle spamtrap.

errore 550 di outlook.com non dipendente da spam trap

Va detto che la procedura è riservata a chi ha in carico una rete di indirizzamento assegnata via RIPE o attraverso LIR e la procedura interrogherà il database per l’indirizzo IP, CIDR o ASN quindi per esempio tra i destinatari possibili si troveranno i contatti di postmaster e di abuse.

Contattare il team Outlook.com Deliverability

Visto che lo scenario specifico per l’errore 550 di outlook.com non è aggredibile con queste informazioni, si passa alla sezione View IP Status che putroppo segnala la rete “Blocked due to user complaints or other evidence of spamming”: visto che il filtro SmartScreen è attivo anche per indirizzi IP che non gestiscono posta, è evidente un’opzione aggressiva che si presume attivato per una rete CIDR che intercetta anche la nostra (e magari le lamentele provengono da indirizzi contigui non a nostro carico).

A questo punto è importante chiedere assistenza al team Outlook.com Deliverability Support fornendo maggiori dettagli possibile sull’attuale situazione presentando la vostra disponibilità alla collaborazione ed i ringraziamenti di rito.

Per l’ultimo evento esaminato, vista la bontà dello stack tecnologico gestito e la mancanza di motivazioni oggettive che giustificasse il filtro, la segnalazione è stata subito gestita da Microsoft che ha pianificato l’inserimento della classe in stato Conditionally mitigated.

Il risultato è stato apprezzabile in 4 ore, dopo le quali gli invii di posta elettronica destinati ai clienti outlook.com sono stati nuovamente gestiti da Microsoft.

Migrare posta tra server, via IMAP e POP3

Considerata la dinamicità con la quale possono essere attivate delle caselle di posta elettronica tra tecnologie differenti ma aderenti agli standard, è possibile dover migrare posta o sincronizzare messaggi e struttura Maildir senza un particolare preavviso anche per poche unità.

migrare posta: imap o pop?

Migrare posta: IMAP o POP3?

La domanda se utilizzare il protocollo IMAP o POP3 per sincronizzazioni e trasferimenti può essere influenzata sia dalla disponibilità esclusiva dell’uno nei confronti dell’altro o fino alla simpatia personale: quando possibile l’indicazione è quella di utilizzare IMAP, in quanto consente la migliore flessibilità di interrogazione e gestione delle utenze di posta.

Sincronizzazione della posta con imapsync

Il software da poter utilizzare per la migrazione IMAP preso in esame è imapsync ed è scritto in Perl; disponibile con port nella maggior parte delle piattaforme, è l’ideale per trasferire e replicare in modo unidirezionale il contenuto di una casella di posta (con l’eventuale eccezione di funzionalità tipo contatti e calendario).

Per l’installazione ad esempio in CentOS, il pacchetto è disponibile all’interno del repository epel, pertanto è possibile installarlo via yum, con la sequenza di comandi

yum install epel-release
yum install imapsync

ovvero per le versioni precedenti di Centos

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6*.rpm
yum install imapsync

Imapsync è anche disponibile come port Darwin ed installabile con una formula Homebrew

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null
brew install imapsync

Il manuale completo è disponibile via man, anche se l’opzione fin da subito più comoda è –dry che nel caso sia indicata rende qualsiasi comportamento come solamente simulato.

L’esempio di migrazione base di una casella con medesimo nome utente con cambio di server e password è il seguente

/usr/bin/imapsync \
 --host1 vecchio.server.com --user1 utente@posta.com --password1 1lMioTe$$or0 \
 --host2 nuovo.server.com --user2 utente@posta.com --password2 c0m3_s3_f0ss3_an7an1

ma le opzioni sono talmente raffinabili che vale davvero la pena consultare la documentazione per trovare quelle più indicate per i propri setup.
Una volta lanciata l’esecuzione, il software ricostruisce nel nuovo server la struttura con i messaggi provenienti dalla sorgente, riportando alla fine il numero dei messaggi trasferiti, saltati, cancellati ed altri indicatori relativi alle attività completate.

imapsync running on macosx

MSMTP: usare GMail con la funzione mail() in PHP

Questo articolo può essere applicato a differenti scenari: una installazione Linux minimale, un’istanza virtuale o contenitore che non include un MTA, incompatibilità tra differenti interpreti, un desolante messaggio nella riga di comando da console tipo

sh: 1: /usr/sbin/sendmail: not found

In aggiunta, si può avere la necessità (anche dal punto di vista della comodità o per via di esigenze legate a razionalizzazione delle risorse) di voler utilizzare un servizio esterno all’host che si occupi dell’inoltro dei messaggi di posta elettronica, sfruttando un servizio SMTP con un profilo esistente (fornito anche all’esterno della sede locale, come per es. Google Apps for Work‎ od il comune Gmail), escludendo l’opzione di installare un servizio puro superfluo o inutile su una macchina non desinata a ricevere posta.

Sintesi: il software in questione deve occuparsi di smistare messaggi di posta elettronica, rappresentando il tratto di unione tra un interpretesendmail-compatibile ed un client SMTP. Esiste di già, ed è MSMTP.

MSMTP: requisiti ed installazione

Il progetto MSMTP manutenuto da Martin Lambers è rilasciato come codice libero in licenza GPLv3: i requisiti sono ristretti ad un compilatore e le funzioni per socket tipo Berkeley. Disponibile sui repository delle maggiori distribuzioni Linux, si può comunemente lanciare

apt-get install msmtp

per l’installazione in Debian od Ubuntu, mentre per le altre in base yum tipo RHEL / CentOS

yum install msmtp

Su Apple MacOS 10, MSMTP è disponibile con la formula homebrew

brew install msmtp

La configurazione si basa su file di testo semplici, con i percorsi predefiniti per sistema su /etc/msmtprc e ~/.msmtprc per le configurazione dei singoli utenti. Sul sito di riferimento è presente la documentazione completa (in inglese) ed un file di esempio. Davvero lineare.

google-gmail

Integrazione con PHP ed uso di account Gmail

Come riportato poco prima, MSMTP è sostituibile al comando sendmail, pertanto ci si può disporre a questo tipo di configurazione creando un file in /etc/msmtprc con la configurazione di un account SMTP esistente; il software supporta il TLS, quindi l’esempio Gmail è anche un buon esercizio per verificare questa opzione.

Contenuto del file /etc/msmtprc :

# Esempio msmtprc per Gmail
# 2014 Alessio Felicioni
# fonte: http://www.alessiofelicioni.it/msmtp-gmail-funzione-mail-php/

# valori predefiniti
defaults
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log

# configurazione account
account default
host smtp.gmail.com
port 587
auth on
from utente@gmail.com
user utente@gmail.com
password La(TUA)Password_va_qui

Importante garantire che il file sia leggibile dall’utente che esegue il php via processo server (es. apache, www-data o equivalente): vale a dirsi

chown www-data /etc/msmtprc
chmod 600 /etc/msmtprc

Quindi il valore di sendmail_path in php.ini potrebbe essere sostituito con la seguente sintassi

sendmail_path = "/usr/bin/msmtp -C /etc/msmtprc -t"

MSMTP supporta anche la configurazione di account multipli anche sullo stesso file: il parametro che controlla questa opzione è -a con il significato che se invocato con valori differenti, lo smistamento avverrà attraverso profili (ed eventualmente tratte/server SMTP) differenti.

La sezione di documentazione del progetto all’indirizzo http://msmtp.sourceforge.net/documentation.html è il punto di riferimento per utilizzare al meglio il programma e ricca di esempi.

Ripristinare yum su CentOS 5, con RPM

A seguito dell’introduzione di una versione incompatibile dell’interprete python o per altri eventi che abbiano in qualche modo corrotto la corretta dimensione delle dipendenze, può essere necessario ripristinare yum su CentOS 5.

Pur non essendo nello specifico la macchina con dei servizi esposti ma facente parte di una rete attivamente utilizzata per lo sviluppo, è opportuno tornare ad avere yum in efficienza.

cat /etc/redhat-release
CentOS release 5 (Final)

Le necessità al momento non prevedono un upgrade di versione (sebbene preferibile), quindi la dimensione di intervento è quella circoscritta dal mantenersi nel perimetro di CentOS 5.

Ripristinare yum su CentOS 5, con RPM

Dove recuperare file RPM

I file rpm necessari per l’attività di ripristino di yum sono disponibili all’indirizzo http://mirror.centos.org/centos-5/5/os/i386/CentOS/ e pertanto possono essere recuperati ad esempio con wget. Nel mio caso ho recuperato la seguente lista:

python-2.4.3-56.el5.i386.rpm
python-libs-2.4.3-56.el5.i386.rpm
yum-3.2.22-40.el5.centos.noarch.rpm

Completati i download, siccome intendo forzare la sostituzione dei precedenti rpm, posso lanciare

rpm -Uvh --replacepkgs *.rpm

Non sufficiente per ripristinare yum su CentOS 5?

Tutto quanto anticipato sembrerebbe formalmente aver contribuito a sistemare l’installazione di yum per riprendere ad utilizzarlo.

Infatti

yum --version

torna la versione di yum presente e le informazioni sul parser utilizzato per comunicare con le fonti, ma già un

yum list installed

frena gli entusiasmi. Uno dei mirror è in HTTPS ed un componente python m2crypto solleva un’eccezione non gestita.

Ho individuato la soluzione riprendendo dal mirror di CentOS 5 un rpm m2crypto-0.16-9.el5.i386.rpm ed in effetti sono riuscito a superare anche l’ostacolo del repository in HTTPS.

Trasferire file via ZModem

Tra le operazioni di base più utili per una macchina connessa ad una rete, è fondamentale poter trasferire in ingresso ed uscita dei file. ZModem è un protocollo utilizzato per la sua semplicità e flessibilità per trasferimenti veloci all’interno di sessioni SSH.

Trasferire file via ZModem

ZModem

Emerso negli anni 80 come protocollo di trasferimento di file, ZModem è il risultato di miglioramenti a tecniche preesistenti. La diffusione è stata tale nel mondo delle BBS che praticamente ancora oggi le implementazioni software sono esistenti per la maggior parte delle piattaforme, da DSZ a lrzsz.

Proprio quest’ultimo è praticamente un pacchetto ubiquo e disponibile per tutti i sistemi Unix, Linux e derivati.

Installare ZModem in Linux

Di seguito l’installazione e i repository disponibili per le distribuzioni Linux più comuni:

Debian, Ubuntu

apt-get install lrzsz

RedHat, CentOS

yum -y install lrzsz

Usare ZModem in MacOSX

In MacOSX ZModem è disponibile come formula Homebrew installabile con il comando

brew install lrzsz

In caso di utilizzo in abbinamento con iTerm2, è necessario creare degli script da lanciare e configurare tra i trigger, attivandoli con le sintassi in espressione regolare intercettando l’output restituito rispettivamente da rz e sz.

Codice dal repository Github

#!/bin/bash
# Author: Matt Mastracci (matthew@mastracci.com)
# AppleScript from http://stackoverflow.com/questions/4309087/cancel-button-on-osascript-in-a-bash-script
# licensed under cc-wiki with attribution required 
# Remainder of script public domain

FILE=`osascript -e 'tell application "iTerm" to activate' -e 'tell application "iTerm" to set thefile to choose folder with prompt "Choose a folder to place received files in"' -e "do shell script (\"echo \"&(quoted form of POSIX path of thefile as Unicode text)&\"\")"`
if [[ $FILE = "" ]]; then
	echo Cancelled.
	# Send ZModem cancel
	echo -e \\x18\\x18\\x18\\x18\\x18
	echo \# Cancelled transfer
	echo
else
	echo $FILE
	cd "$FILE"
	/usr/local/bin/rz 
	echo \# Received $FILE
	echo
fi
#!/bin/bash
# Author: Matt Mastracci (matthew@mastracci.com)
# AppleScript from http://stackoverflow.com/questions/4309087/cancel-button-on-osascript-in-a-bash-script
# licensed under cc-wiki with attribution required 
# Remainder of script public domain

FILE=`osascript -e 'tell application "iTerm" to activate' -e 'tell application "iTerm" to set thefile to choose file with prompt "Choose a file to send"' -e "do shell script (\"echo \"&(quoted form of POSIX path of thefile as Unicode text)&\"\")"`
if [[ $FILE = "" ]]; then
	echo Cancelled.
	# Send ZModem cancel
	echo -e \\x18\\x18\\x18\\x18\\x18
	echo \# Cancelled transfer
	echo
else
	echo $FILE
	/usr/local/bin/sz "$FILE"
	echo \# Received $FILE
	echo
fi

Attivare un tunnel inverso per pubblicare un servizio dietro NAT

Spesso, con l’aggiunta di ulteriori opportuni accorgimenti, è utile poter utilizzare alcuni servizi disponibili all’interno di una rete locale in una sede remota. L’ostacolo in questo caso è costituito dalla funzione NAT che a meno di riconfigurazione dei nodi intermedi non consente un instradamento diretto al server oggetto di interesse: una possibile soluzione è quella di attivare un tunnel inverso.

Una delle funzionalità di OpenSSH è quella di poter attivare dei tunnel; per lo scopo prefissato l’unico prerequisito è poter avere accesso verso la macchina che intende consumare direttamente tale servizio, ovvero anche nel caso sia designato come macchina intermedia (l’idea è quella di attivare un proxy).

Esempio per tunnel inverso dietro NAT

Creare un tunnel inverso con SSH

Il caso più semplice può essere quello di pubblicare un servizio HTTP: l’opzione di nostro interesse è -R alla quale va indicato come parametro una stringa composta dalla porta sull’host remoto al quale il servizio verrà consumato, l’indirizzo della macchina che offre il servizio e la porta, separati da : pertanto la seguente sintassi riassume un classico esempio

ssh -R 10080:localhost:80 utente@macchina.esempio.it

Come anticipato, all’interno di macchina.esempio.it è disponibile alla porta 10080 il servizio HTTP che comunica con la macchina originale e rende disponibile attraverso il tunnel inverso il servizio che lì si trova alla porta 80.

Alternative

In alternativa all’utilizzo di ssh, esistono alcuni servizi che semplificano la configurazione e l’utilizzo, con dei piani introduttivi di primo utilizzo gratuiti.

Quasi sempre sono include delle funzionalità aggiuntive utili per la pubblicazione di demo o sviluppo di servizi web, console di monitoraggio delle richieste e utilità per l’analisi di webhook. I costi dei vari servizi sono piuttosto accessibili e convenienti per una disponibilità già pronta per queste necessita e con profili di offerta diversificati dal singolo utente ad entità più strutturate.

Aperto a segnalazioni per ulteriori alternative.