venerdì 29 maggio 2015

2 Nic su Centos 7

Alcune volte puo' essere comodo avere installate due schede di rete, una con indirizzo pubblico ed una con indirizzo di rete interna.

Su Centos la gestione di una scheda aggiuntiva non e' proprio immediata come su altre distribuzioni, a partire dal nome delle interfacce

Dopo aver installato la scheda si procede montato il modulo corrispondente e si digita ifconfig
---------------------------------------
enp0s29u1u4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.1.1.238  netmask 255.255.255.0  broadcast 10.1.1.255
        inet6 fe80::21f:5bff:feff:272e  prefixlen 64  scopeid 0x20<link>
        ether 00:1f:5b:ff:27:2e  txqueuelen 1000  (Ethernet)
        RX packets 513511  bytes 486606241 (464.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 39723 (38.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet xxx.xxx.xxx.xxx  netmask 255.255.255.0  broadcast xxx.xxx.xxx.xxx
        inet6 fe80::76d0:2bff:fe33:1b57  prefixlen 64  scopeid 0x20<link>
        ether 74:d0:2b:33:1b:57  txqueuelen 1000  (Ethernet)
        RX packets 40416982  bytes 21343890651 (19.8 GiB)
        RX errors 0  dropped 9381  overruns 0  frame 0
        TX packets 44936717  bytes 45611506292 (42.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 3209  bytes 330370 (322.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3209  bytes 330370 (322.6 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
---------------------------------------
l'interfaccia enp3s0' e' quella che e' stata configurata in automatico durante l'installazione mentre la enp0s29u1u4 e' quella aggiunta in un secondo momento. Ci si deve annotare il MAC Address della nuova scheda.

Si va quindi nella directory /etc/sysconfig/network-scripts/ e si duplica il file ifcfg-enp3s0 su un nuovo file ifcfg-enp0s29u1u4 (da notare che il nome corrisponde all'dentificativo di ifconfig)
---------------------------------------------
TYPE=Ethernet
BOOTPROTO=static
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s29u1u4
ONBOOT=yes
IPADDR0=10.1.1.238
PREFIX0=24
IPV6_PEERDNS=yes
HWADDR=00:1f:5b:ff:27:2e

---------------------------------------------
si inserisce in HWADDR il valore copiato da ifconfig e si elimina il gateway

si rilancia la rete con il comando
systemctl restart network.service

Puo' essere utile mettere in ascolto il demone SSH su entrambe le interfacce di rete (sia quella interna che quella esterna). Per fare cio' si edita il file /etc/ssh/sshd_config impostante il ListenAddress a 0.0.0.0 (che equivale a tutti gli indirizzi IP impostati sulla macchina)

il server SSH si aggiorna con 
systemctl restart sshd.service

giovedì 28 maggio 2015

Hack a keyboard

Hack nel senso di migliorare....
Sto lavorando ad un progetto per modificare una tastiera Usb per renderla un footswitch per cambiare pagina su uno spartito elettronico di MuseScore (cio' non mi rendera' sicuramente un miglior musicista ma sicuramente piu' geek)


L'elettronica di una tastiera USB e' molto ridotta ed e' concentrata sullo su una schedina, il resto e' solo una matrice di fili per arrivare alla posizione dei tasti.
Il connettore e' di tipo a 26 piste divise in due sezioni da 13. Cortocircuitando una coppia di pista si simula la pressione di un tasto


Le tastiere generano di solito un codice di scansione per i tasti standard e due codici di scansione per i tasti speciali (per esempio i tasti di espansione aggiungono il codice 224 mentre il tastierino numerico ha come predecessore il codice 0)


A me interessava cercare la combinazione PageUp e PageDown.
Cosi' mediante il seguente programmino in Python mi sono messo a cortocircuitare coppie di piste e trascrivere su una griglia il risultato
------------------------------------------------------
from msvcrt import getch
import sys
z_old = "a"
while True:
    z = getch()
    # escape key to exit
    if ord(z) == 27:
        break
    if (z != z_old):
        print ord(z)
        sys.stdout.flush()
        z_old = z
------------------------------------------------------


Con una buona dose di fortuna ho trovato quasi subito la combinazione giusta
13/18 : PageUp
13/19 : PageDown

mercoledì 27 maggio 2015

Centos e Debian su Lenovo X200T

Un po' come sfizio (visto il basso costo) mi sono comprato un Lenovo X200T, un portatile convertibile ovvero con la possibilita' di rovesciare il monitor e di usarlo tipo tablet.


Lo schermo e' dotato di un digitalizzatore Wacom da usare mediante penna (non e' un touchscreen che riconosce il tocco delle dita)

Il portatile mi e' arrivato privo di sistema operativo e per non impazzire troppo con Linux ed in digitalizzatore Wacom ho provato ad installare Ubuntu perche' ricordavo che nelle configurazioni di sistema era presente la configurazione di Wacom....ma senza successo.
Al contrario Centos  7 e Debian 8 riconoscono al volo il digitizer (Centos 7 in particolare riconosce tutto l'hardware, wifi compreso, senza dover effettuare ulteriori configurazioni..ma per comodita' ho installato Debian)

Un po' di configurazioni per l'uso in modalita' tablet

1) al login si puo' aprire la tastiera virtuale per inserire la password



2) nel DE si puo' installare una tastiera virtuale come florence




3) con la modalita' tablet si puo' tenere il computer in modalita' landscape o portrait. La rotazione delle schermo puo' essere fatta con il comando

xrandr -o left (landscape)
xrandr -o normal (portratit)

cosi' facendo si ruota lo schermo ma non si ruota il sistema di riferimento del puntatore. Per questo motivo si deve eseguire il seguente comando ad ogni rotazione

xsetwacom set "Wacom Serial Penabled 1FG Touchscreen stylus" rotate ccw

per tornare al settaggio normale del mouse
xsetwacom set "Wacom Serial Penabled 1FG Touchscreen stylus" rotate none

ovviamente non funzionano di default i tasti per la rotazione dello schermo ma si puo' creare una combinazione di tasti che, mediante xbindkeys, permette di effettuare questa operazione.

Una volta installato xbindkeys si lancia
xbindkeys -k

si preme la combinazione preferita, si copiano le tre righe di testo che devono essere inserite .xbindkeys nella propria home. Nel mio caso ho inserito le combinazione CTRL+ALT+z per ruotare lo schermo in formato tablet e CTL+ALT+a per riportarlo in modalita' desktop
-----------------------------------------------------
"/home/luca/rotazione.sh"
    m:0xc + c:52
    Control+Alt + z

"/home/luca/no_rotazione.sh"
    m:0xc + c:38
    Control+Alt + a
-----------------------------------------------------

lo script di rotazione e' il seguente
-----------------------------------------------------
xrandr -o left
xsetwacom set "Wacom Serial Penabled 1FG Touchscreen stylus" rotate ccw
-----------------------------------------------------
mentre quello che riprstina lo schermo e'
-----------------------------------------------------
xrandr -o normale
xsetwacom set "Wacom Serial Penabled 1FG Touchscreen stylus" rotate none
-----------------------------------------------------

martedì 26 maggio 2015

DIY Puzzle Mac

Un portatile Mac e' stato vittima di un incidente stradale (e' caduto da una moto in corsa ed e' stato schiaccciato da diverse macchine)...ovviamente il display e' stato immediatamente distrutto ma i pezzi interni al case unibody (rivelatosi molto resistente) ne sono usciti sostanzialmente integri

dato che ormai erano sostanzialmente inutilizzabili, se non come parti di ricambio, me li hanno prestati per vedere se era possibile ricostruire un pc Mac funzionante


In sostanza i pezzi recuperati sono stati la scheda madre, la matrice della tastiera, la flat dell'hard disk (il disco originario SSD e' stato subito cannibalizzato), il trackpad e l'altoparlante di sinistra con relativa flat

la scheda e' all'interno della scatola bianca al di sotto della tastiera


i pezzi sono stati racchiusi tra due pezzi di legno (case artiginale), il segnale video e' stato preso dalla thunderbolt mediante un adattore, e' stato inserito un hard disk tradizionale ed e' stata collegata una tastiera/mouse della Logitech sulla porta usb (purtroppo iil modulo wifi/bluetooth del portatile erano alloggiati in uno spigolo del case e mi sono arrivati).. il trackpad non e'  stato montato

E' da notare che oltre alla tastiera USB ho dovuto montare anche la tastiera originale (o meglio quello che ne rimane) perche' il pulsante di accensione del Mac (un diaframma a bolla) e' presente solo sulla tastiera



Una volta finito il montaggio e' stato il momento di preparare il disco per installare Mac Os X.
Per fare cio' da App Store si deve scaricare l'installer di Yosemite. Dopo 5 e passa gigabyte si apre in automatico l'installer ma non si deve fare niente. L'installer si autocancella per cui e' consigliabile copiarlo dalla cartella Applicazioni per esempio su Desktop per poterlo usare se qualcosa va male. Senza chiudere l'installer si deve usare DiskMakerX4b4 ed un pen drive USB da 8 Gb per creare una unita' di avvio

Messi insieme tutti i pezzi e' partita l'installazione che e' andata a buon fine



Come si vede la scheda madre apparteneva ad un MacBook Pro 5,5 (13 pollici mid 2009) A1278


L'unico appunto e' che il sistema dopo aver effettuato lo shutdown deve essere disconnesso dal connettore magsafe per poi potersi riavviare


giovedì 21 maggio 2015

Flashare il firmware ad un aliante

Come programmatore non avrei mai pensato di dover appoggiare il portatile su un'ala per cambiare il firmware ad un sistema anti-collisione di un aliante.


Giusto come indicazione non credo che affiderei la mia sicurezza ad un sistema (come quello che ho aggiornato) che:
  1. funziona solo se aggiorni il firmware entro una certa data
  2. funziona solo se anche gli altri alianti possiedono la stessa versione di firmware
  3. si puo' aggiornare solo usando il proprio software proprietario (e' una trasmissione seriale ma non sono dati i parametri per cui o si usa l'applicazione proprietaria Windows o niente da fare)

Il sistema anti-collisione e' la scatola rossa





Salvare uno stream radio su file con Audacity

Oggi un amico ha tenuto una intervista radiofonica presso una radio locale che trasmetteva anche in streaming. Per salvare l'audio della trasmissione era necessario dirotta il flusso dalla scheda audio verso gli altoparlanti verso un file, cosa effettuabile con Audacity.
Il programma usato per leggere lo stream e' stato VLC

La procedura e' leggermente differente in Mac e Windows

MAC
Si deve prima andare in Preferenze di Sistema/ Suono. Nel tab Uscita si deve selezionare Soundflower (2ch) ed nel tab Effetti Sonori/Riproduci effetti audio mediante Soundflower (2ch)

A questo punto non si sentira' piu' nessun suono dagli altoparlanti ma aprendo Audacity con input Soundflower (2ch) e mandando in registrazione Audacity si osserva lo stream catturato

Windows
Su questa piattaforma la cosa e' ancora piu' semplice perche' basta impostare come sorgente il missaggio della scheda audio. Si potra' inoltre ascoltare in diretta la registrazione mentre viene effettuata









mercoledì 29 aprile 2015

Mappe offline con Phonegap e Leaflet.js

Mi e' stato chiesto di sviluppare una applicazione per Android/IOS/W8 che permetta di visualizzare mappe di escursionismo in modalita' completamente offline (non e' prevista la copertura internet via cellulare nel mezzo del bosco) e con un minimo di utilizzo del posizionamento GPS



Una delle richieste e che l'utente doveva avere subito disponibile tutta la cartografia dell'area di interesse (24Km x13Km) senza la necessita' di scaricare dati

Viste le limitazioni imposte e i sistemi da supportare mi sono orientato su una applicazione HTML5 su Phonegap ed usando la libreria Leaflet.JS .
Con Leaflet e' possibile mostrare mappe dinamiche (pan/zoom) derivanti dai progetti di cartografici open e vista la tematica ho scelto come sorgente dati 4UMaps, un servizio dedicato all'escursionismo e alla mountain bike con indicazione delle isoipse e di alcuni tracciati di sentieri

Le varie mattonelle della cartografia ai vari livelli di dettaglio (su 4UMaps il livello di maggiore dettaglio e' il 15) possono essere scaricati medianti il softare MOBAC (Mobile Atlas Creator), un software Java che date le coordinate dei vertici si occupa di scaricare tutti i dati legati all'area selezionata


Il primo problema che si e' posto e' che le mappe dell'area di interesse agli zoom 13-14-15 ha una dimensione di circa 90 Mb, decisamente troppi per gli utenti che si devono scaricare tutto il pacchetto (il limite proposto per l'applicazione completa e' massima di 50 Mb).

Mediante il software Pngyu e' pero' possibile effettuare una compressione dei PNG delle mappe di un fattore del 40-50% senza perdere sensibilmente in qualita'

Per ottenere il segnale del punto GPS e' possibile utilizzare un plugin per Leaflet (Leaflet.Control.GPS)

Per sovrapporre una traccia GPS alla mappa esistono vari plugin di leaflet ma sono nati per l'uso online ed usandoli all'interno di Phonegap viene generato un errore di javascript che per problemi di sicurezza non puo' accedere ai dati sul filesystem; per ovviare a questa limitazione ho trasformato il file GPX in un file testo creando poi un polilinea con l'array dei punti ...tracce con 5000 punti sono gestite senza troppi problemi o rallentamenti)

Al termine il file html di un progetto di sentiero e' cosi' composto (nella sottocartella Maps sono contenute le immagini della cartografia divise per livello di zoom)

--------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
<title>Sentiero 2</title>
<meta charset="utf-8" />

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<link rel="stylesheet" href="leaflet.css" />
<link rel="stylesheet" href="leaflet-compass.css" />
<link rel="stylesheet" href="leaflet-gps.css" />
</head>
<body>
<div id="map" style="width: 500px; height: 500px"></div>

<script src="leaflet.js"></script>
<script src="leaflet-compass.js"></script>
<script src="leaflet-gps.js"></script>

<script>

var map = L.map('map').setView([44.1496, 10.7321], 12);

L.tileLayer('Maps/{z}/{x}/{y}.png', {
maxZoom: 15,
attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
'<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
'Imagery © <a href="http://4umaps.eu">4UMaps</a>',
id: 'examples.map-i875mjb7'
}).addTo(map);



var polygon = L.polyline([
   [44.136394501,10.721472740],
[44.136398315,10.721463203],
[44.136402130,10.721356392],
[44.136432648,10.721227646],
[44.136440277,10.721220016],
[44.136497498,10.721108437],
[44.136562347,10.721001625],
..................................................................................
..................................................................................
[44.136318207,10.721796036],
[44.136318207,10.721800804],
[44.136306763,10.721786499],
[44.136322021,10.721772194],
[44.136325836,10.721771240],

]).addTo(map);

//map.addControl( new L.Control.Compass() );
map.addControl( new L.Control.Gps({autoActive:false}) );



</script>
</body>

</html>
--------------------------------------------------------

martedì 28 aprile 2015

Windows Phone SDK su Virtualbox

Sto sviluppando una applicazione in Phonegap e volevo provare a fare il porting in Windows Phone....peccato che non ho una macchina fisica con installato Windows 8.
Per questo motivo ho provato ad installare il sistema di sviluppo su una macchina virtuale VirtualBox partendo da un disco di installazione Windows 8 Pro


I primi problemi non hanno tardato ad arrivare. Per installare il sistema non e' stato possibile usare l'installer online ma ho dovuto prendere l'immagine iso del DVD dell'SDK (circa 1.6 Gb) ed installarlo in questo modo
Una volta avuto l'SDK funzionante ho visto che il sistema di creazione dell'interfaccia utente non funzionava, non era possibile comporre i form delle pagine dell'applicazione....leggendo a giro ho visto che il problema era legato ad un conflitto tra l'installazione di Silverlight di W8 e quello dell'SDK. E' stato necessario rimuovere l'SDK e Silverlight e ripartire da capo con l'installer

Alla fine sono riuscito ad avere l'IDE completa ed ho trovato l'ultima sorpresa. Nei dispositivi non era presente l'opzione dell'emulatore del Windows Phone


Lanciando a  mano il software dell'emulatore, dall'esterno dell'ambiente di sviluppo, e' risultato un po' piu' chiaro il motivo.....l'emulatore di Windows Phone gira come macchina virtuale direttamente dentro a Windows ma Virtualbox, essendo lui stesso un ambiente di virtualizzazione, non permette un ambiente virtuale dentro un ambiente virtuale.

Nessuna soluzione. O mi compro un telefono Windows o cerco un computer fisico con Windows 8 installato dove far girare l'emulatore

Schermare beacon

Lavorando con diversi beacon e' piuttosto fastidioso quando interferiscono tra di loro all'interno dell'ufficio



Un sistema banale e' quello di avvolgere i trasmettitori nella carta argentata per uso alimentare (piu' di una volta, un solo giro non e' garanzia di schermatura), altrimenti possono essere messi dentro un forno a microonde

OpenVPN Server e Client su Westermo

Dopo aver aggiornato il firmware al Westermo Lynx DSS L205-S1 (per me al firmware v4.15.3) e' possibile creare un server OpenVPN

Prima di tutto pero' e' necessario impostare la data e l'ora sul dispositivo

Questo e' importante perche' i certificati di autenticazione self-signed hanno tempo di default di scadenza di 10 anni. Il Lynx, se non ha l'ora impostata, parte dal 1 gennaio 1970 e cio' comporta il fatto che tutti i certificati risultano scaduti (...nel futuro)
(in caso di non aver settata l'ora corretta sul server verra' generato il criptico messaggio di errore
OpenVPN - TLS incoming plaintext read error)

In seguito devono essere generati i certificati mediante la normale procedura mediante easy-rsa (le istruzioni possono essere seguite mediante la guida qui linkata)

Se tutto e' andato bene ci troveremo con diversi file relativi ai certificati per il server e per il client

dato che stiamo guardando il lato server si deve andare nel menu Maintenance/Certificates e si effettua l'upload dei file ca.crt (come CA Certificate), ca.key (come Private Key), Server.key (come Private Key) ed infine Server.crt (come Certificate)


fatto cio' ci si sposta in Configuration/VPN&Tunnel/SSL per terminare la configurazione di OpenVPN

Senza mutare nessuna configurazione si scorre verso il basso e si popolano i campi Local Certificate con il valore Server e CA Certificate come ca (cliccando sull'icona del folder si ottiene un aiuto)

Si avvia il server VPN con la spunta in alto (Enabled)
Per permettere che i client VPN si vedano reciprocamente e' utile spuntare Client-to-Client

Per verificare che tutto funzioni si puo' andare su Maintenance/ViewLog

Come VPN Client ho usato un Westermo MRD-310. Non ho avuto necessita' di aggiornare il firmware perche' il client OpenVPN era gia' incluso in quello installato
Per amministrare questo dispositivo ci si puo' collegare a 192.168.2.200 con credenziali admin/westermo

Come nel caso precedente si deve prima settare l'ora in System/Administration



Si popola quindi il certificato OpenVPN del client in VPN/Certificates. L'opzione migliore e' avere il certificato direttamente in formato PK12


Si va poi in VPN/SSL per settare i parametri di configurazione. Sostanzialmente e' sufficiente mettere l'IP del server VPN (oscurato nell'immagine sottostante) e selezionare il certificato prima inserito

Si abilita la VPN (flaggando in alto) e si va in Status/System Log per verificare che il collegamento sia avvenuto (tale verifica si fa anche sui log del server)




giovedì 9 aprile 2015

Android come tavoletta grafica

A seguito del precedente post ho visto con un po' di sorpresa che il tablet che mi e' stato prestato e' un Panasonic FZ-A1 che monta un digitalizzatore Wacom (per essere piu' precisi un Penabled, basato su tecnologia EMR e quindi in grado di avere la posizione del mouse anche se il pennino non poggia sullo schermo link)




Mi e' venuta cosi' l'idea di poterlo utilizzare, nonostante lo schermo rotto, come tavoletta grafica per disegnare....ovviamente qualcuno ci aveva gia' pensato e la soluzione e' stata GfxTablet 

GfxTablet e' costuita da una coppia di applicazioni, una client da montare sul tablet Android ed una server da montare su una macchina Linux. Il client cattura la posizione dello stilo sul tablet ed il livello di pressione e lo manda al server sul PC che converte i dati. La trasmissione avviene su protocollo UDP in porta 40118

L'applicazione Android e' stata ricompilata direttamente  partendo dai sorgenti cosi' come la parte server (su una macchina Ubuntu 14.10). In nessuno dei due casi ci sono stati particolari problemi di compilazione

A questo punto si lancia l'applicazione sui due dispositivi configurando sul client l'ip della macchina server e se tutto e' andato a buon fine si vedra' il cursore di XWindow muoversi come la penna sulla tavoletta.
(per verificare si digiti il comando xinput list e dovra' comparire un dispositivo Network Tablet)

Questo sistema puo' essere anche usato per disegnare con Gimp configurando opportunamente il device di input dal menu Modifica/Preferenze/Dispositivi di ingresso

Di seguito uno screencast per vedere piu' in dettaglio la fluidita' del sistema
Sul terminale in background c'e' l'applicazione networktablet che riceve di dati mentre in primo piano Gimp comandato dal tablet Android


L'aspetto utile e' che questo sistema funziona wireless.

Prendere il controllo di un tablet Android con schermo rotto

Mi e' stato prestato (per vedere se lo recuperavo in qualche modo) un tablet Android con lo schermo all'80% distrutto. Il digitalizzatore e tutto il resto funzionano correttamente



Cercare di interagire con il tablet in queste condizioni e' a dir poco proibitivo ma usando Droid at Screen si puo' replicare su computer via cavo Usb il display di Android
Ci sono un po' di limitazioni
1) il sistema deve essere settato in Debug Mode. Fortunatamente nel mio caso era gia' cosi' altrimenti si puo' via Adb forzare via recovery

Adb shell 
echo "persist.service.adb.enable=1" >>/system/build.prop 
echo "persist.service.debuggable=1" >>/system/build.prop 
echo "persist.sys.usb.config=mass_storage,adb" >>/system/build.prop" 
reboot

(sorgente


2) non c'e' un puntatore per cui si deve cliccare piu' o meno a caso sull'icona del tablet una volta presa la mira guardando l'immagine sul desktop

In questo modo si possono effettuare operazioni base (io per esempio sono riuscito ad agganciarlo al WiFi)

venerdì 3 aprile 2015

Cron fork crash

Un amico mi ha contattato perche' la sua macchina di acquisizione dati (Ubuntu 14.04 su una macchina DELL certificata Linux) nella notte ha crashato con reboot e perdita di dati
La macchina e' esposta con indirizzo pubblico su Internet ma non ha servizio Web (solo SSH ed altri sistemi di controllo remoto)

I sintomi dal syslog sono una serie di errori
-----------------------------------------------------
Mar 10 06:38:01 apollo CRON[2745]: (apollo) CMD (/home/apollo/xxxxxxxxx)
Mar 10 06:38:01 apollo CRON[28701]: (apollo) MAIL (mailed 1 byte of output; but got status 0x00ff, #012)
Mar 10 06:34:01 apollo CRON[16435]: (apollo) CMD (/home/apollo/xxxxxx)
Mar 10 06:39:01 apollo CRON[18558]: (CRON) error (can't fork)
Mar 10 06:39:01 apollo CRON[16435]: (CRON) error (can't fork)
-----------------------------------------------------

con l'ultimo messaggio prima di fare reboot
-----------------------------------------------------
Mar 10 08:49:27 apollo xinetd[27808]: service telnet: too many consecutive fork failures
Mar 10 09:22:16 apollo xinetd[27808]: telnet: fork failed: Cannot allocate memory (errno = 12)
Mar 10 09:22:36 apollo xinetd[27808]: message repeated 4 times: [ telnet: fork failed: Cannot allocate memory (errno = 12)]
Mar 10 09:22:36 apollo xinetd[27808]: service telnet: too many consecutive fork failures
-----------------------------------------------------

mi viene detto che e' stato installato il servizio telnet perche' la macchina non era piu' raggiungibile via SSH (insieme a telnet erano stati installati ShellInABox, Vino e NoMachine)
Nei log erano presenti connessioni da tutto il mondo su telnet

-----------------------------------------------------
Mar 10 05:32:40 apollo in.telnetd[28701]: connect from xx.xxx.x.xxx (xx.xxxx.x.xxx)
-----------------------------------------------------

il primo consiglio e' stato quello di spengere tutti i servizi non necessari, in particolare telnet (al giorno d'oggi e' sostanzialemente obsoleta)

Il mattino dopo la macchina presentava un normale traffico di rete solo sulla rete interna ma nella notte era andata di nuovo in crash con un ultimo messaggio
-----------------------------------------------------
Mar 11 03:34:01 apollo cron[1163]: (CRON) error (can't fork)
-----------------------------------------------------
di nuovo un crash su un fork

a questo punto e' partita la ricerca sul colpevole. La macchina lavorava al 5% della CPU con la Swap libera quindi in condizioni sostanzialmente ottimali ed eseguiva uno script una volta al minuto che elabora dei dati acquisiti e invia i risultati ad un'altra macchina. Lo script era costituito da diverse fasi la somma dei tempi di ciascun passo era nettamente inferiore ad un minuto, non era quindi possibile la sovrapposizione di piu' lavori in cron che potessero generare una fork bomb

Guardando meglio e' emerso pero' che l'ultimo passo copiava i dati sulla macchina remota mediante un comando rsync un solo file (peraltro sempre dello stesso nome) ed e' stato visto che la directory di arrivo era costituita da una moltitudine di file. Il numero dei file nel server di arrivo rendevano rsync molto lenta e cio' creava il sovrapporsi dei cron ogni minuto per arrivare a saturare le risorse acccumulandosi lavoro con il tempo

Sostituito il comando rsync con scp la macchina ha ripreso a lavorare senza interruzioni



HTML Dom Parser in PHP

In questo post viene descritto come estrarre i dati da una pagina HTML. Cio' mi e' stato richiesto perche' una ditta offre un servizio di pubblicazione dati (peraltro forniti con licenza Common Creative) in formato CSV solo a seguito di autenticazione mediante un Captcha impedendo di fatto il download automatico

I medesimi dati sono pero' pubblicati anche all'interno di una tabella di una pagina HTML piuttosto complessa. Per "catturare" i dati si puo' analizzare il Document Object Method HTML (DOM) mediante la libreria Simple HTML Dom (http://simplehtmldom.sourceforge.net/) che indicizza i tag e permette di creare per esempio degli array php a partire da tag table

una volta importata la pagina html (anche da un link web oltre che file) nell'esempio sottostante e' stata selezionata la seconda tabella presente nel codice (linea evidenziata in giallo). Il contenuto della tabella e' salvato nell'array rowData

--------------------------------------------------------
<?php
require('simple_html_dom.php');
$html = file_get_html('http://xxxxxxx');

$table = $html->find('table', 2);
$rowData = array();

foreach($table->find('tr') as $row) {
    $flight = array();
    foreach($row->find('td') as $cell) {
        $flight[] = $cell->plaintext;
    }
    $rowData[] = $flight;
}
--------------------------------------------------------

La libreria funziona anche su pagine html non perfettamente formattate (per esempio con tag aperti e non chiusi)

LLama3 Anita

A seguito di questo post ho provato a vedere ho provato a vedere cosa accadeva ad utilizzare un modello specifico per la lingua italiana in...