IP Statico TIM

Configurazione ADSL telecom anche con IP statico su router diversi

Il nome utente si ricava dall’indirizzo MAC del router Telecom (consegnato al momento dell’attivazione) seguito da una stringa costante. Mentre la password è default per tutte le connessioni busines ed è “alicenewag

Indicando invece la coppia username/password aliceadsl/aliceads, si perde l’eventuale IP Statico.

Protocollo:          PPoE

Incapsulazione:   LLC

VPI/VCI:             8 / 35

User Name:        xxyyzzxxyyzz-0013C8-t@alicebiz.it

Password:          alicenewag

xxyyzzxxyyzz: al posto di questa stringa bisogna inserire l’indirizzo MAC WAN del router che vi ha consegnato Telecom (lo trovate scritto sotto, è composto da 6 coppie alfanumeriche).

In alcuni casi funziona anche la coppia:

User: @alicebiz.routed
passw: @alicebiz.routed

 

Usare router TIM FIBRA come

Dopo avervi aiutato nello sblocco di questo dispositivo, con questa guida sarà possibile convertire il modem, in router puro per utilizzarlo come access point oppure come ata voip. L’unico requisito per eseguire questo cambio è ovviamente il root…

 E’ consigliato creare un backup della configurazione nel caso in cui si volesse tornare indietro

Andremo prima di tutto a pulire il modem dalle varie configurazioni per la pppoe e la parte adsl.

ATTENZIONE!
Prima di eseguire questi cambiamenti bisogna cambiare la classe di ip del modem… Se il router a cui si vorrà collegare il modem ha classe di ip 192.168.1.1 ovviamente il modem non dovrà e potrà avere la stessa classe di ip quindi dalla gui telecom cambiarla di conseguenza in qualcosa come 192.168.2.1. Nel caso in cui si mantenga la stessa classe non si potrà accedere al router collegato ma esclusivamente al modem.

Dare quindi i seguenti comandi

:ppp relay flush

:ppp flush

:eth flush

:atm flush

:atm phonebook flush

Ora andremo ad eliminare la porta WAN dalla configurazione per cui telecom l’ha settata inizialmente (in situazioni di connessioni FTTH in cui il collegamento si esegue con la medesima)

:eth bridge vlan ifdelete brname=bridge name=dummy intf=eth_wan

:eth bridge ifdelete brname=bridge intf=eth_wan

Andremo a settare il modem in WAN mode
:system config WANMode=ETH

Ora è tutto pronto per procedere alla conversione…

:eth ifadd intf=eth_wan

:eth ifconfig intf=eth_wan dest=ethif7 vlan=default

:eth ifattach intf=eth_wan

:ip ifadd intf=Internet dest=eth_wan

:ip ifconfig intf=Internet mtu=1500 linksensing=enabled group=wan acceptredir=disabled rpfilter=disabled ipv4=enabled ipv6=enabled curhoplimit=64 dadtransmits=1 retranstimer=1000 basereachabletime=30000 gctimer=600000 acceptra=disabled autoconf=disabled

:ip ifattach intf=Internet

E ora il fulcro, dove verrà settato il dhcp client

:dhcp client ifadd intf=Internet
:dhcp client ifconfig intf=Internet metric=0 dnsmetric=5 broadcast=enabled serverroute=disabled followlabel=disabled forcerenew=enabled leasehist=enabled localdns=enabled gracefulrestart=1 gracefulrestartcount=1
:dhcp client rqoptions add intf=Internet option=dhcp-lease-time
:dhcp client rqoptions add intf=Internet option=dhcp-renewal-time
:dhcp client rqoptions add intf=Internet option=dhcp-rebinding-time
:dhcp client rqoptions add intf=Internet option=subnet-mask
:dhcp client rqoptions add intf=Internet option=classless-static-routes
:dhcp client rqoptions add intf=Internet option=default-routers
:dhcp client rqoptions add intf=Internet option=classfull-static-routes
:dhcp client rqoptions add intf=Internet option=domain-name-servers
:dhcp client ifattach intf=Internet

Ora attiviamo il nat per il passaggio della connessione

:nat ifconfig intf=Internet translation=enabled

Disattiviamo il check dei led per l’aggancio alla portante così da non avere il led rosso sempre attivo per un errore non esistente.

:led config mode=all-led-blinking-in-trouble-state checkinternetservice=enabled checkbroadbandservice=disabled checkvoiceservice=enabled checkvideoservice=disabled

:system config defaultconnection=Internet

Procedere con un

:saveall

per confermare i cambiamenti e riavviare

Ora il modem prenderà in automatico l’ip da un qualsiasi modem/router che collegherete via lan alla porta WAN.
Il modem sarà accessibile dall’ip assegnato dal router a cui è collegato e l’access point configurato potrà accedere al router a cui è collegato internamente.

Correggere problemi di connessione voip

Per permettere la connessione al voip, bisognerà modificare l’outbound proxy e convertirlo in ip. Quindi eseguire il seguente comando modificandolo propriamente.

:voice sip config primproxyaddr=IP CONVERTITO

Mini Guida per convertire ims address in ip
Abbiamo xxxxx.co.imsw.telecomitalia.it (si può prendere dal file ini tranquillamente)

xxxxx cambia da persona a persona!
Digitare nel prompt dei comandi

nslookup
server 151.99.0.100
set q=srv
_sip._udp.xxxxx.co.imsw.telecomitalia.it

Dopo aver ottenuto il risultato in figura eseguire i seguenti comandi
set q=a
server xxxxxxxxx.co.imsw.telecomitalia.it (utilizzare l’address con priority 10)

A questo punto vi restituirà l’ip convertito

In questo modo non si sarà obbligati ad usare i dns telecom per effettuare la connessione voip!

Connessione PPP dedicata

Nel caso in cui il modem o il router support il pppoerelay (protocollo per permettere di creare una ulteriore connessione ppp su un dispositivo che non effettua collegamento alla centrale, telecom ne permette 10 contemporaneamente) e si voglia utilizzare il modem solo come ata voip è consigliato creare una connessione pppoe separata.
:ppp ifadd intf=Voip

:ppp ifconfig intf=Voip dest=eth_wan user=alice password=alice

:ppp ifattach intf=Voip

E quindi modifichiamo l’interfaccia da cui il voip dovrà collegarsi.

:voice config intf=Voip

Sblocco Smart Modem TIM Technicolor TG789 vac (AGTOT)

Interessante articolo per la gestione del router fibra tim 1.04

Nel passaggio del firmware dalla versione 1.0.2 alla versione 1.0.4 è stata modificata la chiave di criptazione del file di configurazione rendendo non modificabile la stessa ed è inoltre stato rimosso il menù segreto originale di Technicolor.

Chi possiede il modem alla versione AGTOT_1.0.2 può utilizzare la seguente guida:

Per poter utilizzare questi comandi mi rifaccio alla guida di  AlezzioZ_

  1. Se non lo avete già, scaricatevi OpenSSL
    io utilizzo ( https://indy.fulgan.com/SSL/openssl-1.0.2k-x64_86-win64.zip );
  2. Estraete lo zip;
  3. Nella cartella appena creata inserite il file di backup generato dal modem chiamato user_config.ini;
  4. Aprite una finestra Dos (cmd) e date:
    openssl aes-128-cbc -K a0dd1da4242d32424fdffaa0ed0e0f12 -nosalt -iv 0 -d -in user_config.ini -out user.ini
  5. Avete appena generato il file user.ini in chiaro dove potete leggere ed apportare modifiche alla attuale configurazione.
  6. Per caricarlo nuovamente sul modem dovrete trasformarlo nuovamente in file cryptato. Per cui, a modifiche terminate e salvate date:
    openssl aes-128-cbc -K a0dd1da4242d32424fdffaa0ed0e0f12 -nosalt -iv 0 -e -in user.ini -out newuser_config.ini

Per la versione AGTOT_1.0.4 la chiave è stata cambiata nella seguente:

openssl aes-128-cbc -K a875e62aa6f1d430dac45fcd0e3bb246 -nosalt -iv 0 -d -in user_config.ini -out user.ini (Per decriptare)
openssl aes-128-cbc -K a875e62aa6f1d430dac45fcd0e3bb246 -nosalt -iv 0 -e -in user.ini -out user_config.ini (Per criptare)

Attenzione!
Se a seguito dell’uso di questi comandi, vi ritroverete davanti con questo errore:
digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:529:
Il file user_config.ini decriptato presenterà alle ultime righe questi caratteri
Per risolvere basterà eliminare tutto ciò che è sottostante [ endofarch ]
Non contiene nulla è solo sporcizia creatosi da qualche errore di criptazione del programma sul modem

Una volta decriptato il file di configurazione vi troverete davanti a un file di testo strutturato per sezioni, che contiene tutti comandi che il modem utilizza all’avvio per configurare l’hardware, i servizi, le periferiche e i permessi.

Per attivare un utente con ruolo root e quindi avere accesso alla shell interna, la cosa più semplice è copiare la riga dell’utente Administrator, che è quello di cui conosciamo la password (di default admin), dare un nuovo nome all’utente copiato (ad esempio r00t) e modificare il ruolo da Administrator a root nel file user.ini.

Ricordiamo a tal proposito che  il nome utente root vero e proprio, essendo l’amministratore del sistema linux sottostante, resta ovviamente riservato e non può essere utilizzato.

Purtroppo però dalla versione 1.0.4, il firmware non accetta più valori di user con ruolo root. Eventuali utenti di questo tipo vengono eliminati. Per aggirare questa ulteriore protezione aggiungiamo manualmente un ruolo che abbia gli stessi diritti del ruolo root:

Guida passo passo allo sblocco

  1. Una volta decriptato il file aggiungete questi due user nella sezione mlpuser.ini:
    add
    name=Unlock
    password=_CYP2_53e2ac63e7b839c0708ec54912d3a36c87d6655ade7089b8
    role=BHSAdmin hash2=d77b2bd8ab60bf664ac7d6151215b9f4 crypt=GiD5FRyGAVFGI


    add name=R00t
    password=_CYP2_53e2ac63e7b839c0708ec54912d3a36c87d6655ade7089b8 role=ALL
    hash2=d77b2bd8ab60bf664ac7d6151215b9f4 crypt=GiD5FRyGAVFGI

     
  2. Cercate questo testo e modificate da disabled ad enabled
    modify name=TELNET state=disabled natpmweight=10
    modify name=FTP state=disabled natpmweight=10

  3. Cercate questo testo nella sezione cwmp.ini e modificate da full a read-only
    config state=enabled mode=full periodicInform=disabled periodicInfInt=43200 sessionTimeout=60 noIpTimeout=180 maxEnvelopes=1 connectionRequest=enabled connectionReqAuth=digest bootdelayrange=0 persistentSubscription=enabled connectionReqThrotNumber=1 connectionReqThrotTime=0 activeNotifThrotTime=0 maxWriteBufferSize=4096 showPasswords=enabled

Terminate queste operazioni avrete il vostro nuovo file di configurazione  è pronto per essere caricato nuovamente nel modem.

Spiegazione estensiva modifica n.3
Settando il cwmp in read-only renderete il modem ugualmente accessibile dal gestore, ma con la particolarità che esso non potrà effettuare alcun comando (reset configurazione, aggiornamenti firmware). Così facendo, saranno tranquillamente visualizzabili i propri dati dalla app MyTimFisso in remoto senza alcun problema, esclusa la non possibilità di eseguire comandi in remoto quali per esempio il riavvio o lo spegnimento del wifi. 

La procedura è la seguente

  1. Criptate il file user.ini con il comando SSL sopra indicato, otterrete il nuovo user_config.ini;
  2. Caricare il file config_user.ini da interfaccia TIM dal menù Manutenzione;
  3. Il modem si riavvierà;
  4. Accedete in FTP al modem (con un qualsiasi client FTP come FileZilla o WinSCP)
    IP: quello che usate per accedere all’interfaccia, di norma 192.168.1.1
    User: Unlock
    Password: root
  5. Sovrascrivete il file security.cfg con il mio file presente nel repository;
  6. Ricaricate nuovamente lo stesso file config_user.ini precedentemente criptato da interfaccia TIM dal menù Manutenzione;
  7. Il modem si riavvierà.

A termine della procedura avrete accesso con privilegi root al modem

Nome utente: R00t

Password: root

Da questo momento avete accesso alla shell interna, e avendo disattivando la telegestione, siete finalmente “possessori” del vostro modem e potete usarlo al massimo delle sue potenzialità.
Si specifica che questa procedura non arreca cambiamenti all’interfaccia del modem, è normale che nella pagina del login rimanga come unico utente di accesso l’Administrator, quello è un limite della pagina e non può essere modificato!

Seguiranno nuove guide per spiegarvi come effettuare modifiche specifiche alla configurazione, quali il routing, i server DNS, il fuso orario, le modalità only bridge, le sessioni PPP, il WiFi, e altro ancora !

Vi invitiamo a partecipare al topic ufficiale dell’articolo sul forum, in cui potete scrivere anche in caso di dubbi o domande.

Comandi per telecamera wanscam HW0045

VIDEO

rtsp://admin:instar@IP-Address:RTSP-Port/11 :: VLC Stream

http://admin:instar@IP-Address:Port/iphone/11 :: Quicktime Stream

http://IP-Address:Port/tmpfs/snap.jpg?usr=admin&pwd=instar :: Snapshot (720p / 1280×720 Pixel)

http://IP-Address:Port/tmpfs/auto.jpg?usr=admin&pwd=instar :: Snapshot (352p or 176p)

http://IP-Address:Port/cgi-bin/hi3510/mjpegstream.cgi?-chn=11&-usr=admin&-pwd=instar :: MJPEG Stream
also note the additional SDK documentation for accessing video / audio

PTZ

http://IP-Address:Port/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=right :: Moves continuously right

http://IP-Address:Port/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=left :: Moves continuously left

http://IP-Address:Port/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=up :: Moves continuously up

http://IP-Address:Port/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=down :: Moves continuously down

http://IP-Address:Port/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=stop :: Stops moving camera-head

http://IP-Address:Port/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=right :: Moves one step right

http://IP-Address:Port/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=left :: Moves one step left

http://IP-Address:Port/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=up :: Moves one step up

http://IP-Address:Port/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=down :: Moves one step down

http://IP-Address:Port/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=home :: Go to Center Position

http://IP-Address:Port/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=hscan :: Scan horizontal

http://IP-Address:Port/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=vscan :: Scan vertical

http://IP-Address:Port/cgi-bin/hi3510/preset.cgi?-act=set&-status=1&-number=[0-7] :: set a position

http://IP-Address:Port/cgi-bin/hi3510/preset.cgi?-act=set&-status=0&-number=[0-7] :: unset a position

http://IP-Address:Port/cgi-bin/hi3510/preset.cgi?-act=goto&-status=1&-number=[0-7] :: goto to a set position

IMAGE

http://IP-Address:Port/cgi-bin/hi3510/param.cgi?cmd=setimageattr :: Sets the Image Parameter
You can set the following parameters:

brightness :: [0 – 255] the bigger the value the brighter the image

saturation :: [0 – 255] the bigger the value the more saturation the image has

contrast :: [0 – 255] the bigger the value the more contrast the image has

hue :: [0 – 127] the bigger the value the more hue the image has

flip :: (on , off) flips the image

mirror :: (on , off) flips the image

scene :: (auto , indoor , outdoor) sets the white balance mode
http://IP-Address:Port/cgi-bin/hi3510/param.cgi?cmd=setimageattr&-brightness=0&-saturation=0&-contrast=0&-hue=0&-flip=off&-mirror=off&-scene=auto

WLAN

reset the parameter values

http://192.168.xxx.xxx./cgi-bin/hi3510/param.cgi?cmd=setwirelessattr&-wf_ssid=SSID&-wf_enable=0&-wf_auth=2&-wf_key=1234&-wf_enc=1&-wf_mode=0

IR-LED

http://192.168.178.87/cgi-bin/hi3510/param.cgi?cmd=setinfrared&-infraredstat=auto :: Sets IR LED’s to auto mode

http://192.168.178.87/cgi-bin/hi3510/param.cgi?cmd=setinfrared&-infraredstat=open :: Sets IR LED’s always active :: only IN-6011

http://192.168.178.87/cgi-bin/hi3510/param.cgi?cmd=setinfrared&-infraredstat=close :: Sets IR LED’s always inactive

ALARM

http://admin:instar@192.168.xxx.xxx/cgi-bin/hi3510/param.cgi?cmd=setmdattr&-enable=1&-name=1 :: enables the md area 1

http://admin:instar@192.168.xxx.xxx/cgi-bin/hi3510/param.cgi?cmd=setmdattr&-enable=0&-name=1 :: disables the md area 1

http://192.168.x.x/cgi-bin/hi3510/param.cgi?cmd=setioattr&-io_enable=1&-io_flag=1 :: enable / disable external alarm in to trigger recording
http://admin:instar@192.168.xxx.xxx/cgi-bin/hi3510/param.cgi?cmd=setmdattr&-enable=0&-name=1&cmd=setmdattr&-enable=0&-name=2&cmd=setmdattr&-enable=0&-name=3&cmd=setmdattr&-enable=0&-name=4

Download INSTAR_CGI_H264_Chipset_English Guide

Download FI9821W-CGI-Commands

http://community.ispyconnect.com/ispybb2/viewtopic.php?t=1442

/cgi-bin/hi3510/ptzgotopoint.cgi?&-chn=0&-point=0

      /cgi-bin/hi3510/ptzctrl.cgi?&-chn=0&-act=left&-speed=10
      /cgi-bin/hi3510/ptzctrl.cgi?&-chn=0&-act=upleft&-speed=10
      /cgi-bin/hi3510/ptzctrl.cgi?&-chn=0&-act=right&-speed=10
      /cgi-bin/hi3510/ptzctrl.cgi?&-chn=0&-act=upright&-speed=10
      /cgi-bin/hi3510/ptzctrl.cgi?&-chn=0?&-act=up&-speed=10
      /cgi-bin/hi3510/ptzctrl.cgi?&-chn=0&-act=down&-speed=10
      /cgi-bin/hi3510/ptzctrl.cgi?&-chn=0&-act=downleft&-speed=10
      /cgi-bin/hi3510/ptzctrl.cgi?&-chn=0&-act=downright&-speed=10
      /cgi-bin/hi3510/ptzstop.cgi?&-chn=0&-speed=0
 
 
 
 
      <command />/cgi-bin/hi3510/ptzgotopoint.cgi?&amp;-chn=0&amp;-point=0
      <command />/cgi-bin/hi3510/ptzgotopoint.cgi?&amp;-chn=0&amp;-point=1
      <command />/cgi-bin/hi3510/ptzgotopoint.cgi?&amp;-chn=0&amp;-point=2
      <command />/cgi-bin/hi3510/ptzgotopoint.cgi?&amp;-chn=0&amp;-point=3
      <command />/cgi-bin/hi3510/ptzgotopoint.cgi?&amp;-chn=0&amp;-point=4
      <command />/cgi-bin/hi3510/ptzgotopoint.cgi?&amp;-chn=0&amp;-point=5
      <command />/cgi-bin/hi3510/ptzgotopoint.cgi?&amp;-chn=0&amp;-point=6
      <command />/cgi-bin/hi3510/ptzgotopoint.cgi?&amp;-chn=0&amp;-point=7
      <command />/cgi-bin/hi3510/ptzgotopoint.cgi?&amp;-chn=0&amp;-point=8
      <command />/cgi-bin/hi3510/ptzsetpoint.cgi?&amp;-chn=0&amp;-point=1
      <command />/cgi-bin/hi3510/ptzsetpoint.cgi?&amp;-chn=0&amp;-point=2
      <command />/cgi-bin/hi3510/ptzsetpoint.cgi?&amp;-chn=0&amp;-point=3
      <command />/cgi-bin/hi3510/ptzsetpoint.cgi?&amp;-chn=0&amp;-point=4
      <command />/cgi-bin/hi3510/ptzsetpoint.cgi?&amp;-chn=0&amp;-point=5
      <command />/cgi-bin/hi3510/ptzsetpoint.cgi?&amp;-chn=0&amp;-point=6
      <command />/cgi-bin/hi3510/ptzsetpoint.cgi?&amp;-chn=0&amp;-point=7
      <command />/cgi-bin/hi3510/ptzsetpoint.cgi?&amp;-chn=0&amp;-point=8
      <command />/cgi-bin/hi3510/ptzstarttour.cgi?&amp;-tour=0
      <command />/cgi-bin/hi3510/ptzstarttour.cgi?&amp;-tour=1
      <command />/cgi-bin/hi3510/ptzstarttour.cgi?&amp;-tour=2
      <command />/cgi-bin/hi3510/ptzstarttour.cgi?&amp;-tour=3
      <command />/cgi-bin/hi3510/ptzctrl.cgi?&amp;-step=0&amp;-speed=10&amp;-act=hscan
      <command />/cgi-bin/hi3510/ptzctrl.cgi?&amp;-step=0&amp;-speed=10&amp;-a

Installare su domoticz Aeotec ZW090 Z-Stick Gen5 EU

Ho comprato questa chiavetta Aeotec ZW090 Z-Stick Gen5 EU per il mercato europeo circa 60 euro importata dalla Cina. L’installazione è stata molto semplice ho su una raspberry installato domoticz e ho ricompilato la versione disponibile su Git di openzwave qui trovate le informazioni necessarie per la gestione: https://www.domoticz.com/wiki/Installing_and_running_Domoticz_on_a_Raspberry_PI Molto semplice basta entrare in /home/pi e dare il comando

git clone https://github.com/OpenZWave/open-zwave open-zwave-read-only

poi compilare con

cd open-zwave-read-only
git pull
make -j 3

Il controller si sincronizza con un device z-wave (io ho preso quelli prodotti dalla WIDOM, UME304 Energy Driven Switch) premendo il bottone della chiavetta ed aspettare che diventi blu lampeggiante e contemporaneamente  cliccare sul bottone del dispositivo una volta. Sul menu dei dispositivi troverete tutte le risorse informative che mette a disposizione il device delle WIDOM. Se la sincronizzazione non avviene il colore è giallo altrimenti è blu fisso.

Inviare dati da un form usando php bash ed Aruba

Per eseguire uno script php su hosting aruba che richiama uno script bash devi inserire lo script nella dir

/web/htdocs/www.recapriata.gov.it/home/cgi-bin/ciao.sh

Il codice dello script bash è (esegue la somma degli argomenti passati tramite form):

#!/bin/bash
a=$1
b=$2
echo ‘somma = ‘$((a+b))

exit 1

Il codice del pagine php che contiene il form è (pagina.php):

<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Add new customer </title>
</head>

<body>

<h1>Inserimento dati</h1>

<form method=”post” action=”web-add_new_customer.php”>

Primo numero: <br />
<input type=”text” name=”NUMERO_UNO” size=”35″ />
<br />

Secondo numero: <br />
<input type=”text” name=”NUMERO_DUE” size=”35″ />
<br /> <br />

<input type=”submit” value=”Invia” />
<br />
</form>

</body>
</html>

Il codice della script richiamato è (calcola_con_script_bash.php):

<?php
$NUMERO_UNO = $_POST[‘NUMERO_UNO’];
$NUMERO_DUE = $_POST[‘NUMERO_DUE’];

if(empty($NUMERO_UNO ) || empty($NUMERO_DUE )) {
echo “<h2>Compila tutti i campi</h2>\n” ;
die (“Torna indietro per compilare.”);
}

echo “<h2>Inserisci le informazioni necessarie:</h2>”;
echo “<b>Il primo numero inserito è:</b><br><br>”;
echo $NUMERO_UNO;
echo “<br><br><b>Il secondo numero inserito è:</b><br><br>”;
echo $NUMERO_DUE;
echo “<br><br/>”;
echo “<b>Comando:</b><br><br/>”;

$cmd = “/web/htdocs/www.dominiosito.it/home/cgi-bin/ciao.sh escapeshellarg($NUMERO_UNO) escapeshellarg($NUMERO_DUE)”;

echo(“Commando testuale = ” . $cmd . “<br/>\n”);
echo(“<b>Dump della variabile con var_dump</b><br/>\n”);
var_dump($cmd);

echo(“<br/>\n”);

exec(“/web/htdocs/www.dominiosito.it/home/cgi-bin/ciao.sh $NUMERO_UNO $NUMERO_DUE”, $output, $output2);

echo(“<br/>\n”);
echo(“Uscita array = ” . print_r($output) . “<br/>\n”);
echo(“Uscita = ” . $output2 . “<br/>\n”);
?>

Uscita array stampa l’array che contiene il risultato contenuta in $output

output2 contiene un valore numerico che segan se lo script è stato eseguito correttamente in questo caso restituisce 1 (vedi script bash)

 

 

 

 

Eseguire script bash su hosting linux Aruba

Ho avuto questa necessità…. come faccio?

Segue script bash hello.sh

#!/bin/bash
echo “Hello World!”

Segue script prova.php messo dentro la dir cgi-bin

<?php
$result=exec(“/web/htdocs/www.dominio.ext/home/cgi-bin/hello.sh”);
echo($result);
?>

I files vanno messi nella cartella cgi-bin con i permessi 0755 eseguire il tutto richizmando dal browser il file

https://www.dominio.ext/cgi-bin/prova.php

Vi faccio notare che lo script bash può essere richiamato anche passando dei parametri

<?php
$result=exec(“/web/htdocs/www.dominio.ext/home/cgi-bin/hello.sh abc bng”);
echo($result);
?>

Rendere PDF che contiene del testo inserito in una immagine ricercabile con Tesseract e script bash

A volte ci sono dei pdf che non sono ricercabili. Per permettere la ricerca di una parola o di una frase (anche con l’uso del mio script pubblicato in una altro link) ho trovato questo script chiamato pdfocr.sh

#! /bin/bash

INPUT=
declare -a INPUT_FILES
ARGUMENTS=( “$@” )
OUTPUT=
OUT_FINAL=
TESS_CONFIG=pdf
TESS_LANG=ita
RES=300
IMG_FMT=
MODE=full
TESS_PARAMS=
KEEP_TMP=false
MODE=full
PARALLEL=false
JOBS=1
GSDEV=jpeg
INPUT_BASENAME=
TMPDIR_PATH=~/tmp
VERBOSE=false

RESET=”\e[0m”
PENDING=”\e[1;91m”
ERROR=”\e[1;31m”
DONE=”\e[1;36m”
MSG=”\e[1;36m”

#regexes
shopt -s extglob

#kill child processes on error
trap ‘end_jobs’ EXIT

function pdfocr {

if [ ${#ARGUMENTS[@]} -eq 0 ]; then
print_usage
exit
fi

parse_args

check_req

for input_file in “${INPUT_FILES[@]}”; do
echo -e “${MSG}Input file:$RESET” `basename “$input_file”`

if [[ $MODE = clean ]]; then
echo Cleaning temp files…
fi

check_file “$input_file”

init “$input_file”

pdfocr_proc “$input_file”

echo

done

echo -e “${DONE}Finished$RESET”

}

function pdfocr_proc {

local input_file=$1

split “$input_file”

local IN_P=”$TMPDIR_PATH/$INPUT_BASENAME”

if [[ -n $PREPROCESSOR ]]; then
preprocess “$IN_P” “$IMG_FMT”
fi

ocr “$IN_P” “$IMG_FMT”

merge “$IN_P”

clean_tmp “$IN_P” “$IMG_FMT”
}

function split {

if ! [[ $MODE = @(full|split) ]];then
return
fi

echo -e ${PENDING}Running$RESET ghostscript

local IN_F=$1

local GS_OUT=”$TMPDIR_PATH/$INPUT_BASENAME%04d_gs.$IMG_FMT”
gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=$GSDEV -r$RES -dTextAlphaBits=4 \
-o “$GS_OUT” -f “$IN_F” > /dev/null

try “Error while converting $IN_F”
}

function preprocess {

if [ $PARALLEL = true ]; then
echo -e ${PENDING}Running$RESET preprocessor in parallel
export -f run_preproc
export -f try
local PRE4PARA=`parallel –shellquote ::: “$PREPROCESSOR”`
parallel -n 1 -d ::: -j $JOBS -m run_preproc “$PRE4PARA” {} ::: “$1″*_gs.”$2”
try “Error during parallel preprocessing!”
else
echo -e ${PENDING}Running$RESET preprocessor
for f in “$1″*_gs.”$2”;do
run_preproc “$PREPROCESSOR” “$f”
done
fi

}

function ocr {

if ! [[ $MODE = @(full|ocr) ]]; then
return
fi

local IN_P=”$TMPDIR_PATH/$INPUT_BASENAME”
if [ $PARALLEL = true ]; then
echo -e ${PENDING}Running$RESET tesseract in parallel
if [ “$VERBOSE” = false ];then
run_wait
fi

export -f run_tess
export -f try
export -f print_errors

if [ -z “$TESS_PARAMS” ]; then
TESS_PARAMS=” ”
fi

local ESC=`echo $TESS_PARAMS| sed ‘s/-/__-/’`
ESC=`parallel –shellquote ::: “$ESC”`
parallel -n1 -j $JOBS -m run_tess {} “$TESS_LANG” “$ESC” “$TESS_CONFIG” “$VERBOSE” ::: “$1″*_gs.”$2”
try “Error while running parallel tesseract jobs!”

if [ “$VERBOSE” = false ]; then
kill -INT $!
fi

else
echo -e ${PENDING}Running$RESET tesseract
if [ “$VERBOSE” = false ];then
run_wait
fi

for f in “$1″*_gs.”$2”; do
run_tess “$f” “$TESS_LANG” “$TESS_PARAMS” “$TESS_CONFIG” “$VERBOSE”
done

if [ “$VERBOSE” = false ]; then
kill -INT $!
fi
fi
}

function merge {

if ! [[ $MODE = @(full|merge) ]]; then
return
fi

# local IN_P=”$TMPDIR_PATH/$INPUT_BASENAME”
local file_count=`ls -1 “$1″*_gs_tess.pdf | wc -l`
echo -e ${PENDING}Merging$RESET into $OUT_FINAL
if [[ $file_count -gt 1 ]]; then
pdfunite “$1″*_gs_tess.pdf “$OUT_FINAL”
else
cp “$1″*_gs_tess.pdf “$OUT_FINAL”
fi
try “Error while merging $1″*”$2 into $OUT_FINAL”
}

function clean_tmp {
if [ $KEEP_TMP = true ]; then
return
fi

if [[ $MODE != split ]]; then
rm “$1″*_gs.”$2”
fi
if [[ $MODE != ocr ]]; then
rm “$1″*_gs_tess.pdf
fi
}
function run_wait {

export -f wait_anim
wait_anim &

}

function run_tess {
local IN=$1
local TESS_LANG=$2
local TESS_PARAMS=$3
TESS_PARAMS=`echo $TESS_PARAMS | sed ‘s/__-/-/’`
local TESS_CONFIG=$4
local VERBOSE=$5
local tess_o=
if [ “$VERBOSE” = true ]; then
echo tesseract “$IN” “${IN%.*}_tess” -l $TESS_LANG -psm 3 $TESS_PARAMS $TESS_CONFIG
fi

tess_o=$(tesseract “$IN” “${IN%.*}_tess” -l $TESS_LANG -psm 3 $TESS_PARAMS $TESS_CONFIG 2>&1)
try “Error while performing ocr!” “$tess_o”

if [ “$VERBOSE” = true ]; then
echo $tess_o
echo Tesseract input $1
echo Tesseract output ${1%.*}_tess.pdf
fi
}

function run_preproc {
local PAGE_NUM=`echo $2|gawk ‘match($0,/.+([0-9]{4})_gs.*/,arr) { print arr[1]}’`
$1 “$2” $PAGE_NUM
try “Error while preprocessing!” “Preprocessor: $1” “Input file: $2”
}

function init {

local INPUT=$1

INPUT_BASENAME=$(basename “$INPUT”)
INPUT_BASENAME=${INPUT_BASENAME%.*}

if [ -z “$OUTPUT” ]; then

local INPUT_DIR=$(dirname “$INPUT”)
OUT_FINAL=”$INPUT_DIR/$INPUT_BASENAME”_ocr.pdf

else

if [[ “$OUTPUT” =~ INPUT_BASENAME ]]; then
OUT_FINAL=”${OUTPUT/INPUT_BASENAME/$INPUT_BASENAME}”
elif [[ “${OUTPUT: -1}” == “/” ]]; then
OUT_FINAL=”$OUTPUT$INPUT_BASENAME”_ocr.pdf
OUTPUT_DIR=$OUTPUT
else
OUT_FINAL=$OUTPUT
fi

if [ -z $OUTPUT_DIR ]; then
local OUTPUT_DIR=$(dirname $OUTPUT)
fi

if [ ! -d “$OUTPUT_DIR” ]; then
mkdir -p “$OUTPUT_DIR”
try “Failed creating the output directory: $OUTPUT_DIR”
fi

fi

if [ ! -d “TMPDIR_PATH” ]; then
mkdir -p “$TMPDIR_PATH”
try “Failed creating the temporary directory: $TMPDIR_PATH”
fi

case $GSDEV in
jpeg)
IMG_FMT=jpg
;;
ppm)
;;
png*)
IMG_FMT=png
;;
tiff*)
IMG_FMT=tiff
;;
*)
throw “$IMG_FMT not supported”
;;
esac
}

function parse_args {

local let in_c=0
local let v_c=0

local LANGS_ARR=()
local IN_ARG=

while [[ $v_c -lt ${#ARGUMENTS[@]} ]]; do

key=${ARGUMENTS[$v_c]}

if (( v_c < ${#ARGUMENTS[@]} ));then
local val=”${ARGUMENTS[$((v_c+1))]}”
if [[ $val == -* ]]; then
val=
fi

fi
case $key in
-*)
IN_ARG=
let in_c=0
;;&
-i|–input)
IN_ARG=INPUT
;;
-o|–output)
OUTPUT=”$val”
;;
-t|–tempdir)
TMPDIR_PATH=”$val”
;;
–tess-config)
TESS_CONFIG=”$val”
;;
-l|–language)
IN_ARG=TESS_LANG
;;
-r|–resolution)
RES=”$val”
;;
-f|–img-format)
GSDEV=”$val”
;;
-c|–tess-param)
TESS_PARAMS=”$TESS_PARAMS -c $val”
;;
–keep-tmp)
KEEP_TMP=true
;;
-m|–mode)
MODE=”$val”
;;
-p|–parallel)
if hash parallel 2>/dev/null; then
PARALLEL=true
if [[ -n $val ]]; then
JOBS=$val
else
JOBS=`parallel –number-of-cores`
fi
fi
;;
-s|–preprocessor)
PREPROCESSOR=$val
;;
-v|–verbose)
VERBOSE=true
;;
-h|–help)
print_help
exit
;;
*)
case $IN_ARG in
INPUT)
INPUT_FILES[$in_c]=$key
let in_c++
;;
TESS_LANG)
LANGS_ARR[$in_c]=$key
let in_c++
esac
;;
esac
let v_c++
done

if [[ ${#LANGS_ARR} -gt 0 ]]; then
TESS_LANG=”${LANGS_ARR[@]}”
TESS_LANG=`echo “$TESS_LANG”|sed ‘s/ /+/’`
fi

if ! [[ $MODE = @(split|full|ocr|merge|clean) ]];then
echo “Invalid mode: $MODE”
print_usage
exit
fi

}

function check_req {

if ! hash pdfunite 2> /dev/null; then
throw “pdfunite missing!”
fi

if ! hash tesseract 2> /dev/null; then
throw “tesseract missing!”
fi

if ! hash gs 2> /dev/null; then
throw “ghostscript missing!”
fi

if [ ${#INPUT_FILES[@]} -eq 0 ]; then
throw “pdf input path is missing!”
fi
}

function check_file {
if ! [ -f “$1” ]; then
throw “No such file: $1”
fi
}

function try {
if [[ $? -ne 0 ]] ; then
throw “$@”
fi
return 0
}

function throw {
print_errors “$@”
exit 1
}

function print_errors {
for msg; do
echo -e “$ERROR$msg$RESET”
done
}

function print_help {

cat << END
pdfocr script

Description:

A convenience script that implements a pipeline for creating a searchable
pdf file. The pipeline involves three parts:
-pdf splitting and conversion to images
-character recognition
-merging into the final pdf
Each step can be performed separately of others. You can split pdf, preprocess
images (e.g. with ImageMagick) and then perform ocr and merging.

Requirements:

The following software applications are required:
gs (Ghostscript)
tesseract
pdfunite

Optional:
parallel (speeds up ocr on multiple cores)

Usage:

pdfocr -i|–input input.pdf [options…]

Options:

-l, –lang LANGS set the language(s) for tesseract; check available
languages with:
tesseract –list-langs

-o, –output OUTPUT_PATH set the output path; it can be explicit or use the
INPUT_BASENAME variable to construct it dynamically
e.g. , -o INPUT_BASENAME_ocr.pdf
Default: INPUT_BASENAME_ocr.pdf

-t, –tempdir TMPDIR_PATH set the path to directory with intermediate
files; Default: ~/tmp

-s, –preprocessor PROC_PATH set the path to an image preprocessor;
the preprocessor shall be executed for the image of
each page like this:
preprocessor img_path page_num
the preprocessor should overwrite the original image

-m, –mode MODE set the mode to perform only the part of processing;
MODE can be one of:
split
ocr
merge
full
Default: full
note: it is assumed that required files are in the
TMPDIR_PATH; modes ‘split’ and ‘ocr’ don’t delete
their output intermediate files

–tess-config CONFIG set the tesseract configuration; default: pdf

-p, –parallel [JOBS] use GNU parallel if available; limit the number
of jobs to JOBS

-v, –verbose allow verbose output

–keep-tmp keep the intermediate files; deleted by default

-f, –img-format the format of the intermediate images;
possible values:
jpeg png* ppm tiff*
any format supported by Ghostscript that matches
the above values is valid;
note: the image format makes a difference for
tesseract, so experiment with different values
Default: jpeg

-r, –resolution RES set the resolution of intermediate images to RES;
default: 300

-c, –tess-param key=val set a tesseract parameter
e.g., -c textord_min_linesize=2.5

-h, –help print this
END
}

function print_usage {
cat << END
pdfocr script

Usage:

pdfocr -i|–input input.pdf [options…]

Options:

-h, –help print help
-l, –lang LANGS set the language(s) for tesseract
-o, –output OUTPUT_PATH set the output path
-t, –tempdir TMPDIR_PATH set the path to tempdir (def: ~/tmp)
-m, –mode MODE set the mode (split,ocr,merge,full)
–tess-config CONFIG set the tesseract configuration; default: pdf
-f, –img-format FMT the format of the intermediate images;
jpeg png* ppm tiff*
-r, –resolution NUM set the resolution of the intermediate images
-c, –tess-param key=val set a tesseract parameter
–keep-tmp keep the intermediate files; deleted by default
-p, –parallel [JOBS] use GNU parallel if available
-v, –verbose allow verbose output
-s, –preprocessor PROC_PATH set the path to images preprocessor

END

}

function wait_anim {

trap “__STOP_PRINT=true” SIGINT
local move=r
local let length=5
local let pos=0
while [[ $__STOP_PRINT != true ]]; do

echo -en ” |”

for ((i=0;i<pos;i++));do
echo -n ” ”
done

echo -en “$PENDING*$RESET”

for ((i=0;i<length-pos;i++));do
echo -n ” ”
done

echo -en “|”
echo -ne \\r
if [[ $move == r ]]; then
let pos++
if ((pos>=length)); then
move=l
fi
else
let pos–
if ((pos<=0)); then
move=r
fi
fi

sleep 0.07
done
}

function end_jobs {

local job_n=`jobs -p | wc -l`
if ((job_n>0)); then
jobs -p | xargs kill
fi

}

pdfocr
trap ” EXIT SIGINT

# vim: ts=2 sw=2